@shohojdhara/atomix 0.3.14 → 0.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +43 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +67 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +203 -90
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +3 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +43 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +67 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +9 -61
  53. package/dist/index.esm.js +237 -286
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +250 -299
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/package.json +23 -8
  60. package/scripts/atomix-cli.js +170 -73
  61. package/scripts/cli/__tests__/README.md +81 -0
  62. package/scripts/cli/__tests__/basic.test.js +115 -0
  63. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  64. package/scripts/cli/__tests__/integration.test.js +327 -0
  65. package/scripts/cli/__tests__/test-setup.js +133 -0
  66. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  67. package/scripts/cli/__tests__/utils.test.js +161 -0
  68. package/scripts/cli/component-generator.js +253 -299
  69. package/scripts/cli/dependency-checker.js +355 -0
  70. package/scripts/cli/interactive-init.js +46 -5
  71. package/scripts/cli/template-manager.js +0 -2
  72. package/scripts/cli/templates/common-templates.js +636 -0
  73. package/scripts/cli/templates/composable-templates.js +148 -126
  74. package/scripts/cli/templates/index.js +23 -16
  75. package/scripts/cli/templates/project-templates.js +151 -23
  76. package/scripts/cli/templates/react-templates.js +280 -210
  77. package/scripts/cli/templates/scss-templates.js +90 -91
  78. package/scripts/cli/templates/testing-templates.js +206 -27
  79. package/scripts/cli/templates/testing-utils.js +278 -0
  80. package/scripts/cli/templates/types-templates.js +70 -56
  81. package/scripts/cli/theme-bridge.js +8 -2
  82. package/scripts/cli/token-manager.js +318 -206
  83. package/scripts/cli/utils.js +0 -1
  84. package/src/components/Accordion/Accordion.stories.tsx +369 -870
  85. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  86. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  87. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  88. package/src/components/AtomixGlass/glass-utils.ts +2 -2
  89. package/src/components/AtomixGlass/shader-utils.ts +5 -0
  90. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  91. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  92. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  93. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  94. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  95. package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -35
  96. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
  97. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  98. package/src/components/Avatar/Avatar.stories.tsx +213 -1
  99. package/src/components/Badge/Badge.stories.tsx +121 -362
  100. package/src/components/Block/Block.stories.tsx +21 -12
  101. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
  102. package/src/components/Button/Button.stories.tsx +463 -1126
  103. package/src/components/Button/Button.test.tsx +107 -0
  104. package/src/components/Button/Button.tsx +46 -50
  105. package/src/components/Button/ButtonGroup.stories.tsx +373 -217
  106. package/src/components/Callout/Callout.stories.tsx +289 -634
  107. package/src/components/Card/Card.stories.tsx +248 -68
  108. package/src/components/Chart/Chart.stories.tsx +150 -8
  109. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
  110. package/src/components/Countdown/Countdown.stories.tsx +115 -8
  111. package/src/components/DataTable/DataTable.stories.tsx +346 -146
  112. package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
  113. package/src/components/Dropdown/Dropdown.stories.tsx +153 -33
  114. package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
  115. package/src/components/Footer/Footer.stories.tsx +392 -328
  116. package/src/components/Form/Checkbox.stories.tsx +140 -6
  117. package/src/components/Form/Checkbox.test.tsx +63 -0
  118. package/src/components/Form/Checkbox.tsx +87 -51
  119. package/src/components/Form/Form.stories.tsx +119 -20
  120. package/src/components/Form/FormGroup.stories.tsx +127 -4
  121. package/src/components/Form/Radio.stories.tsx +140 -5
  122. package/src/components/Form/Select.stories.tsx +140 -8
  123. package/src/components/Form/Textarea.stories.tsx +149 -6
  124. package/src/components/Hero/Hero.stories.tsx +333 -32
  125. package/src/components/List/List.stories.tsx +141 -3
  126. package/src/components/Modal/Modal.stories.tsx +181 -42
  127. package/src/components/Popover/Popover.stories.tsx +448 -98
  128. package/src/components/Progress/Progress.stories.tsx +167 -5
  129. package/src/components/River/River.stories.tsx +1 -1
  130. package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
  131. package/src/components/Spinner/Spinner.stories.tsx +102 -8
  132. package/src/components/Steps/Steps.stories.tsx +172 -43
  133. package/src/components/Tabs/Tabs.stories.tsx +136 -10
  134. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  135. package/src/components/Todo/Todo.stories.tsx +198 -9
  136. package/src/components/Toggle/Toggle.stories.tsx +126 -39
  137. package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
  138. package/src/components/Upload/Upload.stories.tsx +113 -24
  139. package/src/lib/README.md +2 -2
  140. package/src/lib/__tests__/theme-tools.test.ts +193 -0
  141. package/src/lib/composables/index.ts +2 -2
  142. package/src/lib/composables/useAtomixGlass.ts +28 -56
  143. package/src/lib/composables/useChartExport.ts +2 -7
  144. package/src/lib/composables/useDataTable.ts +46 -29
  145. package/src/lib/constants/components.ts +9 -32
  146. package/src/lib/theme/devtools/CLI.ts +1 -1
  147. package/src/lib/types/components.ts +1 -1
  148. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  149. package/src/lib/utils/csv.ts +17 -0
  150. package/src/lib/utils/dataTableExport.ts +1 -10
  151. package/src/styles/01-settings/_index.scss +2 -1
  152. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  153. package/src/styles/01-settings/_settings.colors.scss +11 -11
  154. package/src/styles/01-settings/_settings.typography.scss +5 -5
  155. package/src/styles/02-tools/_tools.utility-api.scss +14 -0
  156. package/src/styles/06-components/_components.accordion.scss +56 -14
  157. package/src/styles/06-components/_components.checkbox.scss +23 -17
  158. package/src/styles/99-utilities/_index.scss +2 -0
  159. package/src/styles/99-utilities/_utilities.scss +3 -1
  160. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  161. package/themes/dark-complementary/README.md +98 -0
  162. package/themes/dark-complementary/index.scss +158 -0
  163. package/themes/default-light/README.md +81 -0
  164. package/themes/default-light/index.scss +154 -0
  165. package/themes/high-contrast/README.md +105 -0
  166. package/themes/high-contrast/index.scss +172 -0
  167. package/themes/test-theme/README.md +38 -0
  168. package/themes/test-theme/index.scss +47 -0
  169. package/scripts/cli/templates-original-backup.js +0 -1655
  170. package/scripts/cli/templates_backup.js +0 -684
  171. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  172. package/src/lib/composables/useButton.ts +0 -93
  173. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import { Checkbox } from './Checkbox';
3
4
  import { FormGroup } from './FormGroup';
4
5
  import { Input } from './Input';
@@ -14,8 +15,73 @@ const meta = {
14
15
  layout: 'centered',
15
16
  docs: {
16
17
  description: {
17
- component:
18
- 'The FormGroup component provides a structured wrapper for form fields, including labels, inputs, helper text, and error messages. It ensures proper accessibility, consistent spacing, and validation state display. FormGroups are essential for creating well-organized and accessible forms.',
18
+ component: `
19
+ # FormGroup
20
+
21
+ ## Overview
22
+
23
+ FormGroup component provides a structured wrapper for form fields, including labels, inputs, helper text, and error messages. It ensures proper accessibility, consistent spacing, and validation state display. FormGroups are essential for creating well-organized and accessible forms.
24
+
25
+ ## Features
26
+
27
+ - Structured form field wrapper
28
+ - Label support
29
+ - Helper text display
30
+ - Validation states (valid/invalid)
31
+ - Required field indicator
32
+ - Consistent spacing
33
+ - Accessible design
34
+ - Responsive behavior
35
+
36
+ ## Accessibility
37
+
38
+ - Screen reader: Labels and form controls announced properly
39
+ - ARIA support: Proper associations between labels and controls
40
+ - Keyboard support: Navigate form with keyboard
41
+ - Focus management: Maintains focus on interactive elements
42
+
43
+ ## Usage Examples
44
+
45
+ ### Basic Usage
46
+
47
+ \`\`\`tsx
48
+ <FormGroup
49
+ label="Field Label"
50
+ htmlFor="fieldId"
51
+ helperText="Helper text"
52
+ >
53
+ <Input id="fieldId" placeholder="Placeholder" />
54
+ </FormGroup>
55
+ \`\`\`
56
+
57
+ ### With Validation
58
+
59
+ \`\`\`tsx
60
+ <FormGroup
61
+ label="Field Label"
62
+ htmlFor="fieldId"
63
+ required={true}
64
+ valid={isValid}
65
+ >
66
+ <Input id="fieldId" placeholder="Placeholder" />
67
+ </FormGroup>
68
+ \`\`\`
69
+
70
+ ## API Reference
71
+
72
+ ### Props
73
+
74
+ | Prop | Type | Default | Description |
75
+ | ---- | ---- | ------- | ----------- |
76
+ | label | string | - | Label for the form group |
77
+ | helperText | string | - | Helper text displayed below the input |
78
+ | htmlFor | string | - | ID of the form control this label is for |
79
+ | required | boolean | false | Whether the field is required |
80
+ | invalid | boolean | false | Whether the field is invalid |
81
+ | valid | boolean | false | Whether the field is valid |
82
+ | size | 'sm' \\| 'md' \\| 'lg' | 'md' | Size variant |
83
+ | children | ReactNode | - | Form control element to wrap |
84
+ `,
19
85
  },
20
86
  },
21
87
  },
@@ -24,31 +90,67 @@ const meta = {
24
90
  label: {
25
91
  control: 'text',
26
92
  description: 'Label for the form group',
93
+ table: {
94
+ type: { summary: 'string' },
95
+ defaultValue: { summary: '-' },
96
+ },
27
97
  },
28
98
  helperText: {
29
99
  control: 'text',
30
100
  description: 'Helper text displayed below the input',
101
+ table: {
102
+ type: { summary: 'string' },
103
+ defaultValue: { summary: '-' },
104
+ },
31
105
  },
32
106
  htmlFor: {
33
107
  control: 'text',
34
108
  description: 'ID of the form control this label is for',
109
+ table: {
110
+ type: { summary: 'string' },
111
+ defaultValue: { summary: '-' },
112
+ },
35
113
  },
36
114
  required: {
37
115
  control: 'boolean',
38
116
  description: 'Whether the field is required',
117
+ table: {
118
+ type: { summary: 'boolean' },
119
+ defaultValue: { summary: false },
120
+ },
39
121
  },
40
122
  invalid: {
41
123
  control: 'boolean',
42
124
  description: 'Whether the field is invalid',
125
+ table: {
126
+ type: { summary: 'boolean' },
127
+ defaultValue: { summary: false },
128
+ },
43
129
  },
44
130
  valid: {
45
131
  control: 'boolean',
46
132
  description: 'Whether the field is valid',
133
+ table: {
134
+ type: { summary: 'boolean' },
135
+ defaultValue: { summary: false },
136
+ },
47
137
  },
48
138
  size: {
49
139
  control: { type: 'select' },
50
140
  options: SIZES,
51
141
  description: 'Size variant',
142
+ table: {
143
+ type: { summary: '"sm" | "md" | "lg"' },
144
+ defaultValue: { summary: 'md' },
145
+ },
146
+ },
147
+ children: {
148
+ control: 'object',
149
+ description: 'Form control element to wrap',
150
+ table: {
151
+ type: { summary: 'ReactNode' },
152
+ defaultValue: { summary: '-' },
153
+ },
52
154
  },
53
155
  },
54
156
  } satisfies Meta<typeof FormGroup>;
@@ -57,7 +159,7 @@ export default meta;
57
159
  type Story = StoryObj<typeof meta>;
58
160
 
59
161
  // Basic form group with text
60
- export const Basic: Story = {
162
+ export const BasicUsage: Story = {
61
163
  args: {
62
164
  label: 'Username',
63
165
  htmlFor: 'username',
@@ -65,6 +167,13 @@ export const Basic: Story = {
65
167
  required: true,
66
168
  children: <Input id="username" placeholder="Enter username" />,
67
169
  },
170
+ parameters: {
171
+ docs: {
172
+ description: {
173
+ story: 'Basic form group with label, helper text and required indicator.',
174
+ },
175
+ },
176
+ },
68
177
  };
69
178
 
70
179
  // Required field
@@ -76,6 +185,13 @@ export const Required: Story = {
76
185
  helperText: 'We will never share your email',
77
186
  children: <Input id="email" type="email" placeholder="name@example.com" required />,
78
187
  },
188
+ parameters: {
189
+ docs: {
190
+ description: {
191
+ story: 'Form group with required field indicator.',
192
+ },
193
+ },
194
+ },
79
195
  };
80
196
 
81
197
  // With validation states
@@ -99,10 +215,17 @@ export const ValidationStates: Story = {
99
215
  helperText="Password must be at least 8 characters"
100
216
  invalid
101
217
  >
102
- <Input id="password" type="password" value="1234" invalid />
218
+ <Input id="password" type="password" value="123" invalid />
103
219
  </FormGroup>
104
220
  </div>
105
221
  ),
222
+ parameters: {
223
+ docs: {
224
+ description: {
225
+ story: 'Form group with different validation states.',
226
+ },
227
+ },
228
+ },
106
229
  };
107
230
 
108
231
  // Different form control types
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
+ import { fn } from '@storybook/test';
3
4
  import { Radio } from './Radio';
4
5
 
5
6
  const meta = {
@@ -9,8 +10,79 @@ const meta = {
9
10
  layout: 'centered',
10
11
  docs: {
11
12
  description: {
12
- component:
13
- 'The Radio component allows users to select a single option from a group of mutually exclusive options. Radio buttons are typically used in groups where only one selection is allowed. They provide clear visual feedback and support keyboard navigation.',
13
+ component: `
14
+ # Radio
15
+
16
+ ## Overview
17
+
18
+ Radio component allows users to select a single option from a group of mutually exclusive options. Radio buttons are typically used in groups where only one selection is allowed. They provide clear visual feedback and support keyboard navigation.
19
+
20
+ ## Features
21
+
22
+ - Single selection from mutually exclusive options
23
+ - Label support
24
+ - Disabled state
25
+ - Validation states (valid/invalid)
26
+ - Glass morphism effect
27
+ - Accessible design
28
+ - Responsive behavior
29
+
30
+ ## Accessibility
31
+
32
+ - Keyboard support: Navigate and toggle with keyboard
33
+ - Screen reader: State and label announced properly
34
+ - ARIA support: Proper roles and properties for radio components
35
+ - Focus management: Visible focus indicators maintained
36
+
37
+ ## Usage Examples
38
+
39
+ ### Basic Usage
40
+
41
+ \`\`\`tsx
42
+ <Radio
43
+ label="Option label"
44
+ name="groupName"
45
+ value="optionValue"
46
+ checked={isSelected}
47
+ onChange={setSelected}
48
+ />
49
+ \`\`\`
50
+
51
+ ### Radio Group
52
+
53
+ \`\`\`tsx
54
+ <Radio
55
+ label="Option 1"
56
+ name="group"
57
+ value="opt1"
58
+ checked={selected === 'opt1'}
59
+ onChange={() => setSelected('opt1')}
60
+ />
61
+ <Radio
62
+ label="Option 2"
63
+ name="group"
64
+ value="opt2"
65
+ checked={selected === 'opt2'}
66
+ onChange={() => setSelected('opt2')}
67
+ />
68
+ \`\`\`
69
+
70
+ ## API Reference
71
+
72
+ ### Props
73
+
74
+ | Prop | Type | Default | Description |
75
+ | ---- | ---- | ------- | ----------- |
76
+ | label | string | - | Radio button label text |
77
+ | checked | boolean | false | Whether the radio button is checked |
78
+ | disabled | boolean | false | Whether the radio button is disabled |
79
+ | invalid | boolean | false | Whether the radio button is invalid |
80
+ | valid | boolean | false | Whether the radio button is valid |
81
+ | glass | boolean | false | Enable glass morphism effect |
82
+ | name | string | - | Name of the radio button group |
83
+ | value | string | - | Value of the radio button |
84
+ | onChange | (value: string) => void | - | Callback when radio button state changes |
85
+ `,
14
86
  },
15
87
  },
16
88
  },
@@ -19,26 +91,70 @@ const meta = {
19
91
  label: {
20
92
  control: 'text',
21
93
  description: 'Radio button label text',
94
+ table: {
95
+ type: { summary: 'string' },
96
+ defaultValue: { summary: '-' },
97
+ },
22
98
  },
23
99
  checked: {
24
100
  control: 'boolean',
25
101
  description: 'Whether the radio button is checked',
102
+ table: {
103
+ type: { summary: 'boolean' },
104
+ defaultValue: { summary: false },
105
+ },
26
106
  },
27
107
  disabled: {
28
108
  control: 'boolean',
29
109
  description: 'Whether the radio button is disabled',
110
+ table: {
111
+ type: { summary: 'boolean' },
112
+ defaultValue: { summary: false },
113
+ },
30
114
  },
31
115
  invalid: {
32
116
  control: 'boolean',
33
117
  description: 'Whether the radio button is invalid',
118
+ table: {
119
+ type: { summary: 'boolean' },
120
+ defaultValue: { summary: false },
121
+ },
34
122
  },
35
123
  valid: {
36
124
  control: 'boolean',
37
125
  description: 'Whether the radio button is valid',
126
+ table: {
127
+ type: { summary: 'boolean' },
128
+ defaultValue: { summary: false },
129
+ },
38
130
  },
39
131
  glass: {
40
132
  control: 'boolean',
41
133
  description: 'Enable glass morphism effect',
134
+ table: {
135
+ type: { summary: 'boolean' },
136
+ defaultValue: { summary: false },
137
+ },
138
+ },
139
+ name: {
140
+ control: 'text',
141
+ description: 'Name of the radio button group',
142
+ table: {
143
+ type: { summary: 'string' },
144
+ defaultValue: { summary: '-' },
145
+ },
146
+ },
147
+ value: {
148
+ control: 'text',
149
+ description: 'Value of the radio button',
150
+ table: {
151
+ type: { summary: 'string' },
152
+ defaultValue: { summary: '-' },
153
+ },
154
+ },
155
+ onChange: {
156
+ action: 'changed',
157
+ description: 'Callback when radio button state changes',
42
158
  },
43
159
  },
44
160
  } satisfies Meta<typeof Radio>;
@@ -47,12 +163,18 @@ export default meta;
47
163
  type Story = StoryObj<typeof meta>;
48
164
 
49
165
  // Basic radio button
50
- export const Basic: Story = {
166
+ export const BasicUsage: Story = {
51
167
  args: {
52
168
  label: 'Option 1',
53
169
  name: 'option',
54
170
  value: 'option1',
55
- onChange: () => { },
171
+ },
172
+ parameters: {
173
+ docs: {
174
+ description: {
175
+ story: 'Basic radio button with label.',
176
+ },
177
+ },
56
178
  },
57
179
  };
58
180
 
@@ -63,7 +185,13 @@ export const Checked: Story = {
63
185
  name: 'option',
64
186
  value: 'option1',
65
187
  checked: true,
66
- onChange: () => { },
188
+ },
189
+ parameters: {
190
+ docs: {
191
+ description: {
192
+ story: 'Checked radio button state.',
193
+ },
194
+ },
67
195
  },
68
196
  };
69
197
 
@@ -98,6 +226,13 @@ export const RadioGroup: Story = {
98
226
  </div>
99
227
  );
100
228
  },
229
+ parameters: {
230
+ docs: {
231
+ description: {
232
+ story: 'Group of radio buttons demonstrating mutual exclusivity.',
233
+ },
234
+ },
235
+ },
101
236
  };
102
237
 
103
238
  // Radio button states
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import { useState } from 'react';
3
4
  import { Select } from './Select';
4
5
  import { SIZES } from '../../lib/constants/components';
@@ -10,41 +11,155 @@ const meta = {
10
11
  layout: 'centered',
11
12
  docs: {
12
13
  description: {
13
- component:
14
- 'The Select component provides a dropdown menu for selecting one or more options from a list. It supports single and multiple selection modes, validation states, and can be customized with different sizes. Select components are essential for forms requiring user choice from predefined options.',
14
+ component: `
15
+ # Select
16
+
17
+ ## Overview
18
+
19
+ Select component provides a dropdown menu for selecting one or more options from a list. It supports single and multiple selection modes, validation states, and can be customized with different sizes. Select components are essential for forms requiring user choice from predefined options.
20
+
21
+ ## Features
22
+
23
+ - Single and multiple selection modes
24
+ - Various size options
25
+ - Validation states (valid/invalid)
26
+ - Placeholder support
27
+ - Disabled state
28
+ - Glass morphism effect
29
+ - Accessible design
30
+ - Responsive behavior
31
+
32
+ ## Accessibility
33
+
34
+ - Keyboard support: Navigate and select options with keyboard
35
+ - Screen reader: Options and selection announced properly
36
+ - ARIA support: Proper roles and properties for select components
37
+ - Focus management: Visible focus indicators maintained
38
+
39
+ ## Usage Examples
40
+
41
+ ### Basic Usage
42
+
43
+ \`\`\`tsx
44
+ <Select
45
+ options={[
46
+ { value: 'option1', label: 'Option 1' },
47
+ { value: 'option2', label: 'Option 2' },
48
+ ]}
49
+ placeholder="Select an option"
50
+ onChange={handleChange}
51
+ />
52
+ \`\`\`
53
+
54
+ ### Multiple Selection
55
+
56
+ \`\`\`tsx
57
+ <Select
58
+ options={options}
59
+ multiple={true}
60
+ placeholder="Select options"
61
+ onChange={handleChange}
62
+ />
63
+ \`\`\`
64
+
65
+ ## API Reference
66
+
67
+ ### Props
68
+
69
+ | Prop | Type | Default | Description |
70
+ | ---- | ---- | ------- | ----------- |
71
+ | options | Option[] | [] | Array of options to select from |
72
+ | size | 'sm' \\| 'md' \\| 'lg' | 'md' | Size of the select |
73
+ | disabled | boolean | false | Whether the select is disabled |
74
+ | invalid | boolean | false | Whether the select is invalid |
75
+ | valid | boolean | false | Whether the select is valid |
76
+ | placeholder | string | - | Placeholder text |
77
+ | multiple | boolean | false | Whether multiple options can be selected |
78
+ | glass | boolean | false | Enable glass morphism effect |
79
+ | value | string \\| string[] | - | Selected value(s) |
80
+ | onChange | (event: ChangeEvent) => void | - | Callback when selection changes |
81
+ `,
15
82
  },
16
83
  },
17
84
  },
18
85
  tags: ['autodocs'],
19
86
  argTypes: {
87
+ options: {
88
+ control: 'object',
89
+ description: 'Array of options to select from',
90
+ table: {
91
+ type: { summary: 'Option[]' },
92
+ defaultValue: { summary: '[]' },
93
+ },
94
+ },
20
95
  size: {
21
96
  control: { type: 'select' },
22
97
  options: SIZES,
23
98
  description: 'Size of the select',
99
+ table: {
100
+ type: { summary: '"sm" | "md" | "lg"' },
101
+ defaultValue: { summary: 'md' },
102
+ },
24
103
  },
25
104
  disabled: {
26
105
  control: 'boolean',
27
106
  description: 'Whether the select is disabled',
107
+ table: {
108
+ type: { summary: 'boolean' },
109
+ defaultValue: { summary: false },
110
+ },
28
111
  },
29
112
  invalid: {
30
113
  control: 'boolean',
31
114
  description: 'Whether the select is invalid',
115
+ table: {
116
+ type: { summary: 'boolean' },
117
+ defaultValue: { summary: false },
118
+ },
32
119
  },
33
120
  valid: {
34
121
  control: 'boolean',
35
122
  description: 'Whether the select is valid',
123
+ table: {
124
+ type: { summary: 'boolean' },
125
+ defaultValue: { summary: false },
126
+ },
36
127
  },
37
128
  placeholder: {
38
129
  control: 'text',
39
130
  description: 'Placeholder text',
131
+ table: {
132
+ type: { summary: 'string' },
133
+ defaultValue: { summary: '-' },
134
+ },
40
135
  },
41
136
  multiple: {
42
137
  control: 'boolean',
43
138
  description: 'Whether multiple options can be selected',
139
+ table: {
140
+ type: { summary: 'boolean' },
141
+ defaultValue: { summary: false },
142
+ },
44
143
  },
45
144
  glass: {
46
145
  control: 'boolean',
47
146
  description: 'Enable glass morphism effect',
147
+ table: {
148
+ type: { summary: 'boolean' },
149
+ defaultValue: { summary: false },
150
+ },
151
+ },
152
+ value: {
153
+ control: 'text',
154
+ description: 'Selected value(s)',
155
+ table: {
156
+ type: { summary: 'string | string[]' },
157
+ defaultValue: { summary: '-' },
158
+ },
159
+ },
160
+ onChange: {
161
+ action: 'changed',
162
+ description: 'Callback when selection changes',
48
163
  },
49
164
  },
50
165
  } satisfies Meta<typeof Select>;
@@ -64,11 +179,18 @@ const countries = [
64
179
  ];
65
180
 
66
181
  // Basic select
67
- export const Basic: Story = {
182
+ export const BasicUsage: Story = {
68
183
  args: {
69
184
  options: countries,
70
185
  placeholder: 'Select a country',
71
186
  },
187
+ parameters: {
188
+ docs: {
189
+ description: {
190
+ story: 'Basic select component with placeholder.',
191
+ },
192
+ },
193
+ },
72
194
  };
73
195
 
74
196
  // With selected value
@@ -78,6 +200,13 @@ export const WithValue: Story = {
78
200
  value: 'ca',
79
201
  placeholder: 'Select a country',
80
202
  },
203
+ parameters: {
204
+ docs: {
205
+ description: {
206
+ story: 'Select component with a pre-selected value.',
207
+ },
208
+ },
209
+ },
81
210
  };
82
211
 
83
212
  // Interactive select
@@ -100,14 +229,17 @@ export const Interactive: Story = {
100
229
  value={selectedValue}
101
230
  onChange={handleChange}
102
231
  />
103
- {selectedValue && (
104
- <div className="u-mt-3">
105
- Selected value: <strong>{selectedValue}</strong>
106
- </div>
107
- )}
232
+ <div>Selected: {selectedValue || 'Nothing selected'}</div>
108
233
  </div>
109
234
  );
110
235
  },
236
+ parameters: {
237
+ docs: {
238
+ description: {
239
+ story: 'Interactive select component with state management.',
240
+ },
241
+ },
242
+ },
111
243
  };
112
244
 
113
245
  // Select sizes