diff --git a/src/components/form/primitive/Checkbox/Checkbox.stories.mdx b/src/components/form/primitive/Checkbox/Checkbox.stories.mdx
deleted file mode 100644
index b215cab0..00000000
--- a/src/components/form/primitive/Checkbox/Checkbox.stories.mdx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../../.storybook/components'
-import { Checkbox } from './Checkbox'
-
-
-
-# Checkbox
-
-A themed `checkbox` element.
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
-
-### With long text
-
-export const TemplateWithLongText = () => (
-
-)
-
-
diff --git a/src/components/form/primitive/Checkbox/Checkbox.stories.tsx b/src/components/form/primitive/Checkbox/Checkbox.stories.tsx
new file mode 100644
index 00000000..f331a7e3
--- /dev/null
+++ b/src/components/form/primitive/Checkbox/Checkbox.stories.tsx
@@ -0,0 +1,49 @@
+import { Meta, StoryObj } from '@storybook/react'
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Theme } from '../../../../../.storybook/components'
+import { Checkbox } from './Checkbox'
+
+const meta = {
+ component: Checkbox,
+ args: {
+ name: 'name',
+ label: 'Accept privacy policy',
+ disabled: false,
+ },
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
+
+export const WithLongMessage: Story = {
+ args: {
+ name: 'checkbox-w-long-text',
+ label:
+ 'This checkbox has a very long text to show the behavior of a line break within the checkbox component. Adjust the width of the window to see the positioning of the elements within the component.',
+ },
+}
diff --git a/src/components/form/primitive/FieldSet.stories.mdx b/src/components/form/primitive/FieldSet.stories.mdx
deleted file mode 100644
index fab7fa41..00000000
--- a/src/components/form/primitive/FieldSet.stories.mdx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../.storybook/components'
-import { FieldSet } from './FieldSet'
-
-
-
-# FieldSet
-
-A themed fieldset.
-
-It inherits styles from the [InputLabel](../?path=/docs/components-form-primitive-inputlabel--docs).
-
-The `indent` property can be used to control the indentation of the component (which may depend on its position and the components it contains).
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
diff --git a/src/components/form/primitive/FieldSet.stories.tsx b/src/components/form/primitive/FieldSet.stories.tsx
new file mode 100644
index 00000000..1bd76f7a
--- /dev/null
+++ b/src/components/form/primitive/FieldSet.stories.tsx
@@ -0,0 +1,44 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../.storybook/components'
+import { FieldSet } from './index'
+
+const meta = {
+ component: FieldSet,
+ args: {
+ label: 'Label',
+ children: <>FieldSet Content>,
+ },
+ argTypes: {
+ disabled: { type: 'boolean' },
+ children: { control: { disable: true } },
+ },
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
diff --git a/src/components/form/primitive/Input.stories.mdx b/src/components/form/primitive/Input.stories.mdx
deleted file mode 100644
index 6523198d..00000000
--- a/src/components/form/primitive/Input.stories.mdx
+++ /dev/null
@@ -1,148 +0,0 @@
-import IconBadge from '@aboutbits/react-material-icons/dist/IconBadge'
-import IconSearch from '@aboutbits/react-material-icons/dist/IconSearch'
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../.storybook/components'
-import { FormVariant, FormTone } from '../types'
-import { Input } from './Input'
-
-
-
-# Input
-
-A themed `input` element.
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
-
-## Variants
-
-The `Variant` defines the background and the border.
-
-
-
-## Tones
-
-The `Tone` defines the background and the border.
-
-
-
-## Icons
-
-
diff --git a/src/components/form/primitive/Input.stories.tsx b/src/components/form/primitive/Input.stories.tsx
new file mode 100644
index 00000000..d8ad959e
--- /dev/null
+++ b/src/components/form/primitive/Input.stories.tsx
@@ -0,0 +1,99 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import IconSearch from '@aboutbits/react-material-icons/dist/IconSearch'
+import IconBadge from '@aboutbits/react-material-icons/dist/IconBadge'
+import { Theme } from '../../../../.storybook/components'
+import { FormTone, FormVariant } from '../types'
+import { Input } from './Input'
+
+const meta = {
+ component: Input,
+ args: {
+ name: 'name',
+ placeholder: '',
+ disabled: false,
+ iconStart: undefined,
+ iconEnd: undefined,
+ },
+ argTypes: {
+ iconStart: {
+ options: ['None', 'Search', 'Badge'],
+ mapping: {
+ None: undefined,
+ Search: IconSearch,
+ Badge: IconBadge,
+ },
+ control: { type: 'select' },
+ },
+ iconEnd: {
+ options: ['None', 'Search', 'Badge'],
+ mapping: {
+ None: undefined,
+ Search: IconSearch,
+ Badge: IconBadge,
+ },
+ control: { type: 'select' },
+ },
+ },
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
+
+export const Variant: Story = {
+ render: (args) => (
+
+
+
+
+
+
+ ),
+}
+
+export const Tone: Story = {
+ render: (args) => (
+
+
+
+
+ ),
+}
+
+export const Icons: Story = {
+ render: (args) => (
+
+
+
+
+ ),
+}
diff --git a/src/components/form/primitive/InputIcon/InputIcon.stories.mdx b/src/components/form/primitive/InputIcon/InputIcon.stories.mdx
deleted file mode 100644
index 8cd5508c..00000000
--- a/src/components/form/primitive/InputIcon/InputIcon.stories.mdx
+++ /dev/null
@@ -1,44 +0,0 @@
-import IconBadge from '@aboutbits/react-material-icons/dist/IconBadge'
-import IconSearch from '@aboutbits/react-material-icons/dist/IconSearch'
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../../.storybook/components'
-import { InputIcon } from './InputIcon'
-import { IconPosition } from './types'
-
-
-
-# InputIcon
-
-A themed `Icon` component to be used with field components.
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
diff --git a/src/components/form/primitive/InputIcon/InputIcon.stories.tsx b/src/components/form/primitive/InputIcon/InputIcon.stories.tsx
new file mode 100644
index 00000000..de87c1f1
--- /dev/null
+++ b/src/components/form/primitive/InputIcon/InputIcon.stories.tsx
@@ -0,0 +1,53 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import IconBadge from '@aboutbits/react-material-icons/dist/IconBadge'
+import IconSearch from '@aboutbits/react-material-icons/dist/IconSearch'
+import { Theme } from '../../../../../.storybook/components'
+import { InputIcon } from './InputIcon'
+import { IconPosition } from './types'
+
+const meta = {
+ component: InputIcon,
+ args: {
+ icon: IconSearch,
+ position: IconPosition.Start,
+ },
+ argTypes: {
+ icon: {
+ options: ['Search', 'Badge'],
+ mapping: {
+ Search: IconSearch,
+ Badge: IconBadge,
+ },
+ control: { type: 'select' },
+ },
+ },
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
diff --git a/src/components/form/primitive/InputLabel.stories.mdx b/src/components/form/primitive/InputLabel.stories.mdx
deleted file mode 100644
index ceeb409b..00000000
--- a/src/components/form/primitive/InputLabel.stories.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../.storybook/components'
-import { InputLabel } from './InputLabel'
-
-
-
-# InputLabel
-
-A themed `label` element.
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
diff --git a/src/components/form/primitive/InputLabel.stories.tsx b/src/components/form/primitive/InputLabel.stories.tsx
new file mode 100644
index 00000000..df2cc202
--- /dev/null
+++ b/src/components/form/primitive/InputLabel.stories.tsx
@@ -0,0 +1,40 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../.storybook/components'
+import { InputLabel } from './InputLabel'
+
+const meta = {
+ component: InputLabel,
+ args: {
+ children: 'Label',
+ },
+
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
diff --git a/src/components/form/primitive/InputMessage.stories.mdx b/src/components/form/primitive/InputMessage.stories.mdx
deleted file mode 100644
index a80b2f53..00000000
--- a/src/components/form/primitive/InputMessage.stories.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../.storybook/components'
-import { InputMessage } from './InputMessage'
-
-
-
-# InputMessage
-
-A themed message to be used with field components.
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
diff --git a/src/components/form/primitive/InputMessage.stories.tsx b/src/components/form/primitive/InputMessage.stories.tsx
new file mode 100644
index 00000000..256ca495
--- /dev/null
+++ b/src/components/form/primitive/InputMessage.stories.tsx
@@ -0,0 +1,40 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../.storybook/components'
+import { InputMessage } from './InputMessage'
+
+const meta = {
+ component: InputMessage,
+ args: {
+ message: 'Message',
+ },
+
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
diff --git a/src/components/form/primitive/Option.stories.mdx b/src/components/form/primitive/Option.stories.mdx
deleted file mode 100644
index 9faf3dd1..00000000
--- a/src/components/form/primitive/Option.stories.mdx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../.storybook/components'
-import { Option } from './Option'
-import { Select } from './Select'
-
-
-
-# Option
-
-A custom themed `option` element to be used with [Select](../?path=/docs/components-form-primitive-select--docs).
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
diff --git a/src/components/form/primitive/Option.stories.tsx b/src/components/form/primitive/Option.stories.tsx
new file mode 100644
index 00000000..8dc92c8c
--- /dev/null
+++ b/src/components/form/primitive/Option.stories.tsx
@@ -0,0 +1,49 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../.storybook/components'
+import { Option } from './Option'
+import { Select } from './Select'
+const meta = {
+ component: Option,
+ args: {
+ children: 'Example option',
+ },
+ argTypes: {
+ disabled: { type: 'boolean' },
+ },
+ decorators: [
+ (Story) => (
+
+ ),
+ ],
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
diff --git a/src/components/form/primitive/Radio/Radio.stories.mdx b/src/components/form/primitive/Radio/Radio.stories.mdx
deleted file mode 100644
index 1206fc99..00000000
--- a/src/components/form/primitive/Radio/Radio.stories.mdx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../../.storybook/components'
-import { Radio } from './Radio'
-
-
-
-# Radio
-
-A themed `radio` element.
-
-export const Template = ({ ...args }) => (
-
-
-
-
-
-)
-
-
-
-### Props
-
-
-
-
-
-
-
-### With long text
-
-export const TemplateWithLongText = () => (
-
-)
-
-
diff --git a/src/components/form/primitive/Radio/Radio.stories.tsx b/src/components/form/primitive/Radio/Radio.stories.tsx
new file mode 100644
index 00000000..45bc3750
--- /dev/null
+++ b/src/components/form/primitive/Radio/Radio.stories.tsx
@@ -0,0 +1,55 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../../.storybook/components'
+import { Radio } from './Radio'
+
+const meta = {
+ component: Radio,
+ args: {
+ name: 'name',
+ label: 'Option 1',
+ },
+ render: (args) => (
+
+
+
+
+
+ ),
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
+
+export const WithLongTex: Story = {
+ args: {
+ name: 'radio-w-long-text',
+ label:
+ 'This radio has a very long text to show the behavior of a line break within the radio component. Adjust the width of the window to see the positioning of the elements within the component.',
+ },
+}
diff --git a/src/components/form/primitive/Select.stories.mdx b/src/components/form/primitive/Select.stories.mdx
deleted file mode 100644
index 4bfd72a0..00000000
--- a/src/components/form/primitive/Select.stories.mdx
+++ /dev/null
@@ -1,172 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../.storybook/components'
-import { FormVariant, FormTone } from '../types'
-import { Option } from './Option'
-import { Select } from './Select'
-
-
-
-# Select
-
-A themed `select` element.
-
-It inherits styles from the primitive [Input](../?path=/docs/components-form-primitive-input--docs).
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
-
-## Variants
-
-The `Variant` defines the background and the border.
-
-
-
-## Tones
-
-The `Tone` defines the background and the border.
-
-
-
-## Initial placeholder
-
-To initially show a placeholder before the user selects an option, add a `hidden` option with an empty value.
-
-
diff --git a/src/components/form/primitive/Select.stories.tsx b/src/components/form/primitive/Select.stories.tsx
new file mode 100644
index 00000000..8ccc8697
--- /dev/null
+++ b/src/components/form/primitive/Select.stories.tsx
@@ -0,0 +1,86 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../.storybook/components'
+import { FormTone, FormVariant } from '../types'
+import { Select } from './Select'
+import { Option } from './Option'
+
+const meta = {
+ component: Select,
+ args: {
+ children: (
+ <>
+
+
+
+ >
+ ),
+ },
+ argTypes: {
+ disabled: { type: 'boolean' },
+ },
+
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
+
+export const Variants: Story = {
+ render: (args) => (
+
+
+
+
+
+
+ ),
+}
+
+export const Tone: Story = {
+ render: (args) => (
+
+
+
+
+ ),
+}
+
+export const initialPlaceholder: Story = {
+ args: {
+ children: (
+ <>
+
+
+
+
+ >
+ ),
+ },
+}
diff --git a/src/components/form/primitive/TextArea.stories.mdx b/src/components/form/primitive/TextArea.stories.mdx
deleted file mode 100644
index ead7f428..00000000
--- a/src/components/form/primitive/TextArea.stories.mdx
+++ /dev/null
@@ -1,98 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { FormVariant, FormTone } from '../types'
-import { TextArea } from './TextArea'
-
-
-
-# TextArea
-
-A themed `textarea` element.
-
-It inherits styles from the primitive [Input](../?path=/docs/components-form-primitive-input--docs).
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-## Variants
-
-The `Variant` defines the background and the border.
-
-
-
-## Tones
-
-The `Tone` defines the background and the border.
-
-
diff --git a/src/components/form/primitive/TextArea.stories.tsx b/src/components/form/primitive/TextArea.stories.tsx
new file mode 100644
index 00000000..66c69f0e
--- /dev/null
+++ b/src/components/form/primitive/TextArea.stories.tsx
@@ -0,0 +1,68 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { FormTone, FormVariant } from '../types'
+import { TextArea } from './TextArea'
+
+const meta = {
+ component: TextArea,
+ args: {
+ placeholder: 'Placeholder',
+ disabled: false,
+ rows: 4,
+ },
+ argTypes: {
+ disabled: { type: 'boolean' },
+ },
+
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
+
+export const Variants: Story = {
+ render: (args) => (
+
+
+
+
+
+
+ ),
+}
+
+export const Tones: Story = {
+ render: (args) => (
+
+
+
+
+ ),
+}
diff --git a/src/components/form/primitive/ToggleSwitch/ToggleSwitch.stories.mdx b/src/components/form/primitive/ToggleSwitch/ToggleSwitch.stories.mdx
deleted file mode 100644
index 5be81331..00000000
--- a/src/components/form/primitive/ToggleSwitch/ToggleSwitch.stories.mdx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'
-import { Theme } from '../../../../../.storybook/components'
-import { ToggleSwitch } from './ToggleSwitch'
-
-
-
-# ToggleSwitch
-
-A toggle switch input that can be used in controlled or uncontrolled mode.
-
-export const Template = ({ ...args }) =>
-
-
-
-### Props
-
-
-
-
-
-
-
-### With long text
-
-export const TemplateWithLongText = () => (
-
-)
-
-
diff --git a/src/components/form/primitive/ToggleSwitch/ToggleSwitch.stories.tsx b/src/components/form/primitive/ToggleSwitch/ToggleSwitch.stories.tsx
new file mode 100644
index 00000000..0bd9a45a
--- /dev/null
+++ b/src/components/form/primitive/ToggleSwitch/ToggleSwitch.stories.tsx
@@ -0,0 +1,52 @@
+import {
+ Controls,
+ Description,
+ Primary,
+ Stories,
+ Subheading,
+ Title,
+} from '@storybook/addon-docs'
+import { Meta, StoryObj } from '@storybook/react'
+import { Theme } from '../../../../../.storybook/components'
+import { ToggleSwitch } from './ToggleSwitch'
+
+const meta = {
+ component: ToggleSwitch,
+ args: {
+ name: 'name',
+ label: 'Airplane mode',
+ },
+ argTypes: {
+ disabled: { type: 'boolean' },
+ required: { type: 'boolean' },
+ },
+ parameters: {
+ docs: {
+ page: () => (
+ <>
+
+
+
+ Props
+
+
+
+ >
+ ),
+ },
+ },
+} satisfies Meta
+
+export default meta
+
+type Story = StoryObj
+
+export const Default: Story = {}
+
+export const WithLongText: Story = {
+ args: {
+ name: 'toggle-switch-w-long-text',
+ label:
+ 'This toggle switch has a very long text to show the behavior of a line break within the toggle switch component. Adjust the width of the window to see the positioning of the elements within the component.',
+ },
+}