diff --git a/app/javascript/mastodon/components/form_fields/index.ts b/app/javascript/mastodon/components/form_fields/index.ts
new file mode 100644
index 0000000000..2aa8764514
--- /dev/null
+++ b/app/javascript/mastodon/components/form_fields/index.ts
@@ -0,0 +1,3 @@
+export { TextInputField } from './text_input_field';
+export { TextAreaField } from './text_area_field';
+export { SelectField } from './select_field';
diff --git a/app/javascript/mastodon/components/form_fields/select_field.stories.tsx b/app/javascript/mastodon/components/form_fields/select_field.stories.tsx
new file mode 100644
index 0000000000..30897adda1
--- /dev/null
+++ b/app/javascript/mastodon/components/form_fields/select_field.stories.tsx
@@ -0,0 +1,55 @@
+import type { Meta, StoryObj } from '@storybook/react-vite';
+
+import { SelectField } from './select_field';
+
+const meta = {
+ title: 'Components/Form Fields/SelectField',
+ component: SelectField,
+ args: {
+ label: 'Fruit preference',
+ hint: 'Select your favourite fruit or not. Up to you.',
+ },
+ render(args) {
+ // Component styles require a wrapper class at the moment
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ },
+} satisfies Meta;
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Simple: Story = {};
+
+export const Required: Story = {
+ args: {
+ required: true,
+ },
+};
+
+export const Optional: Story = {
+ args: {
+ required: false,
+ },
+};
+
+export const WithError: Story = {
+ args: {
+ required: false,
+ hasError: true,
+ },
+};
diff --git a/app/javascript/mastodon/components/form_fields/select_field.tsx b/app/javascript/mastodon/components/form_fields/select_field.tsx
new file mode 100644
index 0000000000..aa058fc782
--- /dev/null
+++ b/app/javascript/mastodon/components/form_fields/select_field.tsx
@@ -0,0 +1,38 @@
+import type { ComponentPropsWithoutRef } from 'react';
+import { forwardRef } from 'react';
+
+import { FormFieldWrapper } from './wrapper';
+import type { CommonFieldWrapperProps } from './wrapper';
+
+interface Props
+ extends ComponentPropsWithoutRef<'select'>, CommonFieldWrapperProps {}
+
+/**
+ * A simple form field for single-item selections.
+ * Provide selectable items via nested `