@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.
- package/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +43 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +67 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +203 -90
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +3 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +43 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +67 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +9 -61
- package/dist/index.esm.js +237 -286
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +250 -299
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +369 -870
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +2 -2
- package/src/components/AtomixGlass/shader-utils.ts +5 -0
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -35
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +213 -1
- package/src/components/Badge/Badge.stories.tsx +121 -362
- package/src/components/Block/Block.stories.tsx +21 -12
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
- package/src/components/Button/Button.stories.tsx +463 -1126
- package/src/components/Button/Button.test.tsx +107 -0
- package/src/components/Button/Button.tsx +46 -50
- package/src/components/Button/ButtonGroup.stories.tsx +373 -217
- package/src/components/Callout/Callout.stories.tsx +289 -634
- package/src/components/Card/Card.stories.tsx +248 -68
- package/src/components/Chart/Chart.stories.tsx +150 -8
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
- package/src/components/Countdown/Countdown.stories.tsx +115 -8
- package/src/components/DataTable/DataTable.stories.tsx +346 -146
- package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -33
- package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
- package/src/components/Footer/Footer.stories.tsx +392 -328
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +87 -51
- package/src/components/Form/Form.stories.tsx +119 -20
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- package/src/components/Form/Radio.stories.tsx +140 -5
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Hero/Hero.stories.tsx +333 -32
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/Modal/Modal.stories.tsx +181 -42
- package/src/components/Popover/Popover.stories.tsx +448 -98
- package/src/components/Progress/Progress.stories.tsx +167 -5
- package/src/components/River/River.stories.tsx +1 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
- package/src/components/Spinner/Spinner.stories.tsx +102 -8
- package/src/components/Steps/Steps.stories.tsx +172 -43
- package/src/components/Tabs/Tabs.stories.tsx +136 -10
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +126 -39
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
- package/src/components/Upload/Upload.stories.tsx +113 -24
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +193 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/useAtomixGlass.ts +28 -56
- package/src/lib/composables/useChartExport.ts +2 -7
- package/src/lib/composables/useDataTable.ts +46 -29
- package/src/lib/constants/components.ts +9 -32
- package/src/lib/theme/devtools/CLI.ts +1 -1
- package/src/lib/types/components.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/csv.ts +17 -0
- package/src/lib/utils/dataTableExport.ts +1 -10
- package/src/styles/01-settings/_index.scss +2 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.typography.scss +5 -5
- package/src/styles/02-tools/_tools.utility-api.scss +14 -0
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.checkbox.scss +23 -17
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.scss +3 -1
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- 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
|
-
|
|
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
|
|
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="
|
|
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
|
-
|
|
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
|
|
166
|
+
export const BasicUsage: Story = {
|
|
51
167
|
args: {
|
|
52
168
|
label: 'Option 1',
|
|
53
169
|
name: 'option',
|
|
54
170
|
value: 'option1',
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|