@shohojdhara/atomix 0.3.13 → 0.3.14

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 (151) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -0
  3. package/dist/atomix.css +95 -77
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +2 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/charts.d.ts +1 -1
  8. package/dist/charts.js +1 -1
  9. package/dist/core.d.ts +41 -11
  10. package/dist/core.js +39 -23
  11. package/dist/core.js.map +1 -1
  12. package/dist/forms.d.ts +28 -11
  13. package/dist/forms.js +8 -5
  14. package/dist/forms.js.map +1 -1
  15. package/dist/heavy.d.ts +1 -1
  16. package/dist/heavy.js +15 -6
  17. package/dist/heavy.js.map +1 -1
  18. package/dist/index.d.ts +122 -46
  19. package/dist/index.esm.js +849 -182
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/index.js +854 -186
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.min.js +1 -1
  24. package/dist/index.min.js.map +1 -1
  25. package/dist/theme.d.ts +27 -2
  26. package/dist/theme.js +721 -108
  27. package/dist/theme.js.map +1 -1
  28. package/package.json +1 -1
  29. package/scripts/atomix-cli.js +610 -1111
  30. package/scripts/cli/component-generator.js +610 -0
  31. package/scripts/cli/documentation-sync.js +542 -0
  32. package/scripts/cli/interactive-init.js +84 -288
  33. package/scripts/cli/mappings.js +211 -0
  34. package/scripts/cli/migration-tools.js +95 -288
  35. package/scripts/cli/template-manager.js +107 -0
  36. package/scripts/cli/templates/README.md +123 -0
  37. package/scripts/cli/templates/composable-templates.js +149 -0
  38. package/scripts/cli/templates/config-templates.js +126 -0
  39. package/scripts/cli/templates/index.js +95 -0
  40. package/scripts/cli/templates/project-templates.js +214 -0
  41. package/scripts/cli/templates/react-templates.js +261 -0
  42. package/scripts/cli/templates/scss-templates.js +156 -0
  43. package/scripts/cli/templates/storybook-templates.js +236 -0
  44. package/scripts/cli/templates/testing-templates.js +45 -0
  45. package/scripts/cli/templates/token-templates.js +447 -0
  46. package/scripts/cli/templates/types-templates.js +133 -0
  47. package/scripts/cli/templates-original-backup.js +1655 -0
  48. package/scripts/cli/templates.js +35 -0
  49. package/scripts/cli/templates_backup.js +684 -0
  50. package/scripts/cli/theme-bridge.js +20 -14
  51. package/scripts/cli/token-manager.js +150 -77
  52. package/scripts/cli/utils.js +37 -25
  53. package/src/components/Accordion/Accordion.stories.tsx +5 -5
  54. package/src/components/Accordion/Accordion.test.tsx +57 -0
  55. package/src/components/Accordion/Accordion.tsx +4 -0
  56. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -1
  57. package/src/components/AtomixGlass/stories/Examples.stories.tsx +37 -37
  58. package/src/components/AtomixGlass/stories/Playground.stories.tsx +50 -51
  59. package/src/components/Avatar/Avatar.stories.tsx +26 -26
  60. package/src/components/Badge/Badge.stories.tsx +31 -31
  61. package/src/components/Badge/Badge.test.tsx +51 -0
  62. package/src/components/Badge/Badge.tsx +20 -1
  63. package/src/components/Block/Block.stories.tsx +5 -5
  64. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  65. package/src/components/Breadcrumb/Breadcrumb.tsx +2 -2
  66. package/src/components/Button/Button.stories.tsx +13 -13
  67. package/src/components/Button/Button.tsx +4 -4
  68. package/src/components/Button/ButtonGroup.stories.tsx +2 -2
  69. package/src/components/Button/README.md +5 -0
  70. package/src/components/Callout/Callout.stories.tsx +11 -11
  71. package/src/components/Callout/Callout.test.tsx +10 -10
  72. package/src/components/Callout/Callout.tsx +7 -7
  73. package/src/components/Callout/README.md +9 -8
  74. package/src/components/Card/Card.tsx +2 -2
  75. package/src/components/Chart/Chart.stories.tsx +6 -6
  76. package/src/components/Chart/Chart.tsx +1 -1
  77. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +1 -1
  78. package/src/components/DataTable/DataTable.tsx +14 -12
  79. package/src/components/DatePicker/DatePicker.stories.tsx +6 -6
  80. package/src/components/Dropdown/Dropdown.stories.tsx +4 -4
  81. package/src/components/Form/Checkbox.stories.tsx +3 -3
  82. package/src/components/Form/Checkbox.tsx +4 -2
  83. package/src/components/Form/Form.stories.tsx +3 -3
  84. package/src/components/Form/FormGroup.stories.tsx +1 -1
  85. package/src/components/Form/Input.stories.tsx +28 -16
  86. package/src/components/Form/Input.test.tsx +59 -0
  87. package/src/components/Form/Input.tsx +97 -95
  88. package/src/components/Form/Radio.stories.tsx +94 -94
  89. package/src/components/Form/Radio.tsx +2 -2
  90. package/src/components/Form/Select.stories.tsx +4 -4
  91. package/src/components/Form/Select.tsx +2 -2
  92. package/src/components/Form/Textarea.stories.tsx +22 -7
  93. package/src/components/Form/Textarea.test.tsx +45 -0
  94. package/src/components/Form/Textarea.tsx +88 -86
  95. package/src/components/List/List.stories.tsx +2 -2
  96. package/src/components/Modal/Modal.stories.tsx +4 -4
  97. package/src/components/Navigation/Navbar/Navbar.stories.tsx +5 -5
  98. package/src/components/Navigation/Navbar/Navbar.tsx +1 -1
  99. package/src/components/Navigation/README.md +1 -1
  100. package/src/components/Pagination/Pagination.stories.tsx +5 -2
  101. package/src/components/Pagination/Pagination.tsx +1 -1
  102. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -10
  103. package/src/components/Popover/Popover.stories.tsx +1 -1
  104. package/src/components/ProductReview/ProductReview.tsx +1 -1
  105. package/src/components/Progress/Progress.tsx +46 -46
  106. package/src/components/Rating/Rating.stories.tsx +4 -4
  107. package/src/components/Rating/Rating.tsx +8 -8
  108. package/src/components/Slider/Slider.stories.tsx +63 -63
  109. package/src/components/Spinner/Spinner.stories.tsx +2 -2
  110. package/src/components/Spinner/Spinner.test.tsx +35 -0
  111. package/src/components/Spinner/Spinner.tsx +9 -2
  112. package/src/components/Testimonial/Testimonial.stories.tsx +1 -1
  113. package/src/components/Toggle/Toggle.stories.tsx +32 -9
  114. package/src/components/Toggle/Toggle.test.tsx +91 -0
  115. package/src/components/Toggle/Toggle.tsx +44 -27
  116. package/src/components/Tooltip/Tooltip.tsx +1 -1
  117. package/src/layouts/Grid/Grid.stories.tsx +49 -49
  118. package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +2 -2
  119. package/src/lib/composables/useAccordion.ts +12 -3
  120. package/src/lib/composables/useBreadcrumb.ts +2 -2
  121. package/src/lib/composables/useCallout.ts +7 -7
  122. package/src/lib/composables/useNavbar.ts +1 -1
  123. package/src/lib/constants/components.ts +1 -1
  124. package/src/lib/storybook/InteractiveDemo.tsx +113 -0
  125. package/src/lib/storybook/PreviewContainer.tsx +36 -0
  126. package/src/lib/storybook/VariantsGrid.tsx +21 -0
  127. package/src/lib/storybook/index.ts +3 -0
  128. package/src/lib/theme/core/createThemeObject.ts +9 -5
  129. package/src/lib/theme/devtools/CLI.ts +155 -0
  130. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +213 -0
  131. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +566 -0
  132. package/src/lib/theme/devtools/LiveEditor.tsx +2 -1
  133. package/src/lib/theme/devtools/index.ts +3 -0
  134. package/src/lib/theme/errors/errors.ts +8 -0
  135. package/src/lib/theme/runtime/ThemeProvider.tsx +117 -57
  136. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +305 -0
  137. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +588 -0
  138. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +264 -0
  139. package/src/lib/theme/utils/index.ts +1 -0
  140. package/src/lib/theme/utils/themeValidation.ts +501 -0
  141. package/src/lib/theme-tools.ts +32 -3
  142. package/src/lib/types/components.ts +81 -26
  143. package/src/lib/utils/themeNaming.ts +1 -1
  144. package/src/styles/06-components/_components.callout.scss +29 -33
  145. package/src/styles/06-components/_index.scss +1 -1
  146. package/src/styles/99-utilities/_utilities.display.scss +14 -3
  147. package/src/styles/99-utilities/_utilities.flex.scss +10 -10
  148. package/src/styles/99-utilities/_utilities.text.scss +28 -8
  149. package/scripts/cli/__tests__/cli-commands.test.js +0 -204
  150. package/scripts/cli/__tests__/utils.test.js +0 -201
  151. package/scripts/cli/__tests__/vitest.config.js +0 -26
@@ -8,108 +8,110 @@ import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
8
8
  */
9
9
  export const Input = memo(
10
10
  forwardRef<HTMLInputElement, InputProps>(
11
- (
12
- {
13
- type = 'text',
14
- value,
15
- onChange,
16
- onBlur,
17
- onFocus,
18
- placeholder,
19
- className = '',
20
- style,
21
- disabled = false,
22
- required = false,
23
- readOnly = false,
24
- id,
25
- name,
26
- autoComplete,
27
- autoFocus = false,
28
- size = 'md',
29
- variant,
30
- invalid = false,
31
- valid = false,
32
- maxLength,
33
- minLength,
34
- pattern,
35
- min,
36
- max,
37
- step,
38
- ariaLabel,
39
- ariaDescribedBy,
40
- glass,
41
- },
42
- ref
43
- ) => {
44
- const { generateInputClass } = useInput({
45
- size,
46
- variant,
47
- disabled,
48
- invalid,
49
- valid,
50
- });
11
+ (
12
+ {
13
+ type = 'text',
14
+ value,
15
+ defaultValue,
16
+ onChange,
17
+ onBlur,
18
+ onFocus,
19
+ placeholder,
20
+ className = '',
21
+ style,
22
+ disabled = false,
23
+ required = false,
24
+ readOnly = false,
25
+ id,
26
+ name,
27
+ autoComplete,
28
+ autoFocus = false,
29
+ size = 'md',
30
+ variant,
31
+ invalid = false,
32
+ valid = false,
33
+ maxLength,
34
+ minLength,
35
+ pattern,
36
+ min,
37
+ max,
38
+ step,
39
+ 'aria-label': ariaLabel,
40
+ 'aria-describedby': ariaDescribedBy,
41
+ glass,
42
+ },
43
+ ref
44
+ ) => {
45
+ const { generateInputClass } = useInput({
46
+ size,
47
+ variant,
48
+ disabled,
49
+ invalid,
50
+ valid,
51
+ });
51
52
 
52
- const inputClass = generateInputClass({
53
- className: `${className} ${glass ? 'c-input--glass' : ''}`.trim(),
54
- size,
55
- variant,
56
- disabled,
57
- invalid,
58
- valid,
59
- type,
60
- });
53
+ const inputClass = generateInputClass({
54
+ className: `${className} ${glass ? 'c-input--glass' : ''}`.trim(),
55
+ size,
56
+ variant,
57
+ disabled,
58
+ invalid,
59
+ valid,
60
+ type,
61
+ });
61
62
 
62
- // Custom styles for glass effect
63
- const glassStyles = glass ? {} : {};
63
+ // Custom styles for glass effect
64
+ const glassStyles = glass ? {} : {};
64
65
 
65
- const inputElement = (
66
- <input
67
- ref={ref}
68
- type={type}
69
- className={inputClass}
70
- value={value}
71
- onChange={onChange}
72
- onBlur={onBlur}
73
- onFocus={onFocus}
74
- placeholder={placeholder}
75
- disabled={disabled}
76
- required={required}
77
- readOnly={readOnly}
78
- id={id}
79
- name={name}
80
- autoComplete={autoComplete}
81
- autoFocus={autoFocus}
82
- maxLength={maxLength}
83
- minLength={minLength}
84
- pattern={pattern}
85
- min={min}
86
- max={max}
87
- step={step}
88
- aria-label={ariaLabel}
89
- aria-describedby={ariaDescribedBy}
90
- aria-invalid={invalid}
91
- style={glass ? { ...glassStyles, ...style } : style}
92
- />
93
- );
66
+ const inputElement = (
67
+ <input
68
+ ref={ref}
69
+ type={type}
70
+ className={inputClass}
71
+ value={value}
72
+ defaultValue={defaultValue}
73
+ onChange={onChange}
74
+ onBlur={onBlur}
75
+ onFocus={onFocus}
76
+ placeholder={placeholder}
77
+ disabled={disabled}
78
+ required={required}
79
+ readOnly={readOnly}
80
+ id={id}
81
+ name={name}
82
+ autoComplete={autoComplete}
83
+ autoFocus={autoFocus}
84
+ maxLength={maxLength}
85
+ minLength={minLength}
86
+ pattern={pattern}
87
+ min={min}
88
+ max={max}
89
+ step={step}
90
+ aria-label={ariaLabel}
91
+ aria-describedby={ariaDescribedBy}
92
+ aria-invalid={invalid}
93
+ style={glass ? { ...glassStyles, ...style } : style}
94
+ />
95
+ );
94
96
 
95
- if (glass) {
96
- // Default glass settings for inputs
97
- const defaultGlassProps = {
98
- displacementScale: 60,
99
- blurAmount: 1,
100
- saturation: 180,
101
- aberrationIntensity: 0.2,
102
- cornerRadius: 12,
103
- mode: 'shader' as const,
104
- };
97
+ if (glass) {
98
+ // Default glass settings for inputs
99
+ const defaultGlassProps = {
100
+ displacementScale: 60,
101
+ blurAmount: 1,
102
+ saturation: 180,
103
+ aberrationIntensity: 0.2,
104
+ cornerRadius: 12,
105
+ mode: 'shader' as const,
106
+ };
105
107
 
106
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
108
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
107
109
 
108
- return <AtomixGlass {...glassProps}>{inputElement}</AtomixGlass>;
109
- }
110
+ return <AtomixGlass {...glassProps}>{inputElement}</AtomixGlass>;
111
+ }
110
112
 
111
- return inputElement;
112
- }
113
+ return inputElement;
114
+ }
113
115
  )
114
116
  );
115
117
 
@@ -52,7 +52,7 @@ export const Basic: Story = {
52
52
  label: 'Option 1',
53
53
  name: 'option',
54
54
  value: 'option1',
55
- onChange: () => {},
55
+ onChange: () => { },
56
56
  },
57
57
  };
58
58
 
@@ -63,7 +63,7 @@ export const Checked: Story = {
63
63
  name: 'option',
64
64
  value: 'option1',
65
65
  checked: true,
66
- onChange: () => {},
66
+ onChange: () => { },
67
67
  },
68
68
  };
69
69
 
@@ -71,27 +71,27 @@ export const Checked: Story = {
71
71
  export const RadioGroup: Story = {
72
72
  render: (args: any) => {
73
73
  const [selectedValue, setSelectedValue] = React.useState('option1');
74
-
74
+
75
75
  return (
76
- <div className="u-d-flex u-flex-column u-gap-2">
77
- <Radio
78
- label="Option 1"
79
- name="radioGroup"
80
- value="option1"
76
+ <div className="u-flex u-flex-column u-gap-2">
77
+ <Radio
78
+ label="Option 1"
79
+ name="radioGroup"
80
+ value="option1"
81
81
  checked={selectedValue === 'option1'}
82
82
  onChange={() => setSelectedValue('option1')}
83
83
  />
84
- <Radio
85
- label="Option 2"
86
- name="radioGroup"
87
- value="option2"
84
+ <Radio
85
+ label="Option 2"
86
+ name="radioGroup"
87
+ value="option2"
88
88
  checked={selectedValue === 'option2'}
89
89
  onChange={() => setSelectedValue('option2')}
90
90
  />
91
- <Radio
92
- label="Option 3"
93
- name="radioGroup"
94
- value="option3"
91
+ <Radio
92
+ label="Option 3"
93
+ name="radioGroup"
94
+ value="option3"
95
95
  checked={selectedValue === 'option3'}
96
96
  onChange={() => setSelectedValue('option3')}
97
97
  />
@@ -104,29 +104,29 @@ export const RadioGroup: Story = {
104
104
  export const States: Story = {
105
105
  render: (args: any) => {
106
106
  const [selectedValue, setSelectedValue] = React.useState('default');
107
-
107
+
108
108
  return (
109
- <div className="u-d-flex u-flex-column u-gap-2">
110
- <Radio
111
- label="Default radio"
112
- name="states"
113
- value="default"
109
+ <div className="u-flex u-flex-column u-gap-2">
110
+ <Radio
111
+ label="Default radio"
112
+ name="states"
113
+ value="default"
114
114
  checked={selectedValue === 'default'}
115
- onChange={() => setSelectedValue('default')}
115
+ onChange={() => setSelectedValue('default')}
116
116
  />
117
- <Radio
118
- label="Checked radio"
119
- name="states"
120
- value="checked"
117
+ <Radio
118
+ label="Checked radio"
119
+ name="states"
120
+ value="checked"
121
121
  checked={selectedValue === 'checked'}
122
- onChange={() => setSelectedValue('checked')}
122
+ onChange={() => setSelectedValue('checked')}
123
123
  />
124
- <Radio
125
- label="Disabled radio"
126
- name="states"
127
- value="disabled"
124
+ <Radio
125
+ label="Disabled radio"
126
+ name="states"
127
+ value="disabled"
128
128
  disabled
129
- onChange={() => {}}
129
+ onChange={() => { }}
130
130
  />
131
131
  <Radio
132
132
  label="Disabled and checked radio"
@@ -134,21 +134,21 @@ export const States: Story = {
134
134
  value="disabledChecked"
135
135
  disabled
136
136
  checked
137
- onChange={() => {}}
137
+ onChange={() => { }}
138
138
  />
139
- <Radio
140
- label="Valid radio"
141
- name="states"
142
- value="valid"
143
- valid
139
+ <Radio
140
+ label="Valid radio"
141
+ name="states"
142
+ value="valid"
143
+ valid
144
144
  checked={selectedValue === 'valid'}
145
145
  onChange={() => setSelectedValue('valid')}
146
146
  />
147
- <Radio
148
- label="Invalid radio"
149
- name="states"
150
- value="invalid"
151
- invalid
147
+ <Radio
148
+ label="Invalid radio"
149
+ name="states"
150
+ value="invalid"
151
+ invalid
152
152
  checked={selectedValue === 'invalid'}
153
153
  onChange={() => setSelectedValue('invalid')}
154
154
  />
@@ -162,8 +162,8 @@ export const WithoutLabel: Story = {
162
162
  args: {
163
163
  name: 'noLabel',
164
164
  value: 'noLabel',
165
- ariaLabel: 'Radio button without visible label',
166
- onChange: () => {},
165
+ 'aria-label': 'Radio button without visible label',
166
+ onChange: () => { },
167
167
  },
168
168
  };
169
169
 
@@ -174,7 +174,7 @@ export const Glass: Story = {
174
174
  name: 'glass',
175
175
  value: 'glass',
176
176
  glass: true,
177
- onChange: () => {},
177
+ onChange: () => { },
178
178
  },
179
179
  render: (args: any) => (
180
180
  <div
@@ -206,7 +206,7 @@ export const GlassCustom: Story = {
206
206
  aberrationIntensity: 0.8,
207
207
  cornerRadius: 12,
208
208
  } as any,
209
- onChange: () => {},
209
+ onChange: () => { },
210
210
  },
211
211
  render: (args: any) => (
212
212
  <div
@@ -232,7 +232,7 @@ export const GlassCustom: Story = {
232
232
  export const GlassGroup: Story = {
233
233
  render: () => {
234
234
  const [selectedValue, setSelectedValue] = React.useState('option1');
235
-
235
+
236
236
  return (
237
237
  <div
238
238
  style={{
@@ -256,30 +256,30 @@ export const GlassGroup: Story = {
256
256
  >
257
257
  Glass Radio Group
258
258
  </h3>
259
- <div className="u-d-flex u-flex-column u-gap-2">
260
- <Radio
261
- label="Glass Option 1"
262
- name="glassGroup"
263
- value="option1"
259
+ <div className="u-flex u-flex-column u-gap-2">
260
+ <Radio
261
+ label="Glass Option 1"
262
+ name="glassGroup"
263
+ value="option1"
264
264
  checked={selectedValue === 'option1'}
265
265
  onChange={() => setSelectedValue('option1')}
266
- glass
266
+ glass
267
267
  />
268
- <Radio
269
- label="Glass Option 2"
270
- name="glassGroup"
271
- value="option2"
268
+ <Radio
269
+ label="Glass Option 2"
270
+ name="glassGroup"
271
+ value="option2"
272
272
  checked={selectedValue === 'option2'}
273
273
  onChange={() => setSelectedValue('option2')}
274
- glass
274
+ glass
275
275
  />
276
- <Radio
277
- label="Glass Option 3"
278
- name="glassGroup"
279
- value="option3"
276
+ <Radio
277
+ label="Glass Option 3"
278
+ name="glassGroup"
279
+ value="option3"
280
280
  checked={selectedValue === 'option3'}
281
281
  onChange={() => setSelectedValue('option3')}
282
- glass
282
+ glass
283
283
  />
284
284
  </div>
285
285
  </div>
@@ -292,7 +292,7 @@ export const GlassGroup: Story = {
292
292
  export const GlassStates: Story = {
293
293
  render: () => {
294
294
  const [selectedValue, setSelectedValue] = React.useState('default');
295
-
295
+
296
296
  return (
297
297
  <div
298
298
  style={{
@@ -327,31 +327,31 @@ export const GlassStates: Story = {
327
327
  >
328
328
  Glass Radio States
329
329
  </h3>
330
- <div className="u-d-flex u-flex-column u-gap-2">
331
- <Radio
332
- label="Glass Default"
333
- name="glassStates"
334
- value="default"
330
+ <div className="u-flex u-flex-column u-gap-2">
331
+ <Radio
332
+ label="Glass Default"
333
+ name="glassStates"
334
+ value="default"
335
335
  checked={selectedValue === 'default'}
336
336
  onChange={() => setSelectedValue('default')}
337
- glass
337
+ glass
338
338
  />
339
- <Radio
340
- label="Glass Checked"
341
- name="glassStates"
342
- value="checked"
339
+ <Radio
340
+ label="Glass Checked"
341
+ name="glassStates"
342
+ value="checked"
343
343
  checked={selectedValue === 'checked'}
344
344
  onChange={() => setSelectedValue('checked')}
345
- glass
345
+ glass
346
346
  />
347
- <Radio
348
- label="Glass Disabled"
349
- name="glassStates"
350
- value="disabled"
347
+ <Radio
348
+ label="Glass Disabled"
349
+ name="glassStates"
350
+ value="disabled"
351
351
  disabled
352
352
  checked={selectedValue === 'disabled'}
353
353
  onChange={() => setSelectedValue('disabled')}
354
- glass
354
+ glass
355
355
  />
356
356
  <Radio
357
357
  label="Glass Disabled and Checked"
@@ -362,23 +362,23 @@ export const GlassStates: Story = {
362
362
  onChange={() => setSelectedValue('disabledChecked')}
363
363
  glass
364
364
  />
365
- <Radio
366
- label="Glass Valid"
367
- name="glassStates"
368
- value="valid"
369
- valid
365
+ <Radio
366
+ label="Glass Valid"
367
+ name="glassStates"
368
+ value="valid"
369
+ valid
370
370
  checked={selectedValue === 'valid'}
371
371
  onChange={() => setSelectedValue('valid')}
372
- glass
372
+ glass
373
373
  />
374
- <Radio
375
- label="Glass Invalid"
376
- name="glassStates"
377
- value="invalid"
378
- invalid
374
+ <Radio
375
+ label="Glass Invalid"
376
+ name="glassStates"
377
+ value="invalid"
378
+ invalid
379
379
  checked={selectedValue === 'invalid'}
380
380
  onChange={() => setSelectedValue('invalid')}
381
- glass
381
+ glass
382
382
  />
383
383
  </div>
384
384
  </div>
@@ -19,8 +19,8 @@ export const Radio: React.FC<RadioProps> = memo(({
19
19
  value,
20
20
  invalid = false,
21
21
  valid = false,
22
- ariaLabel,
23
- ariaDescribedBy,
22
+ 'aria-label': ariaLabel,
23
+ 'aria-describedby': ariaDescribedBy,
24
24
  glass,
25
25
  }) => {
26
26
  const { generateRadioClass } = useRadio({
@@ -93,7 +93,7 @@ export const Interactive: Story = {
93
93
  };
94
94
 
95
95
  return (
96
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
96
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
97
97
  <Select
98
98
  options={countries}
99
99
  placeholder="Select a country"
@@ -116,7 +116,7 @@ export const Sizes: Story = {
116
116
  options: countries,
117
117
  },
118
118
  render: () => (
119
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
119
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
120
120
  <Select size="sm" options={countries} placeholder="Small select" />
121
121
  <Select size="md" options={countries} placeholder="Medium select (default)" />
122
122
  <Select size="lg" options={countries} placeholder="Large select" />
@@ -130,7 +130,7 @@ export const States: Story = {
130
130
  options: countries,
131
131
  },
132
132
  render: () => (
133
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
133
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
134
134
  <Select options={countries} placeholder="Default select" />
135
135
  <Select options={countries} placeholder="Disabled select" disabled />
136
136
  <Select options={countries} placeholder="Valid select" valid value="us" />
@@ -272,7 +272,7 @@ export const GlassStates: Story = {
272
272
  >
273
273
  Glass Select States
274
274
  </h3>
275
- <div className="u-d-flex u-flex-column u-gap-3">
275
+ <div className="u-flex u-flex-column u-gap-3">
276
276
  <Select options={args.options} placeholder="Glass Select" glass />
277
277
  <Select options={args.options} placeholder="Glass Disabled" disabled glass />
278
278
  <Select options={args.options} placeholder="Glass Valid" valid value="us" glass />
@@ -24,8 +24,8 @@ export const Select: React.FC<SelectProps> = memo(({
24
24
  invalid = false,
25
25
  valid = false,
26
26
  multiple = false,
27
- ariaLabel,
28
- ariaDescribedBy,
27
+ 'aria-label': ariaLabel,
28
+ 'aria-describedby': ariaDescribedBy,
29
29
  glass,
30
30
  }) => {
31
31
  const { generateSelectClass } = useSelect({
@@ -58,6 +58,10 @@ const meta = {
58
58
  control: 'boolean',
59
59
  description: 'Enable glass morphism effect',
60
60
  },
61
+ defaultValue: {
62
+ control: 'text',
63
+ description: 'Initial value for uncontrolled textarea',
64
+ },
61
65
  },
62
66
  } satisfies Meta<typeof Textarea>;
63
67
 
@@ -72,6 +76,17 @@ export const Basic: Story = {
72
76
  },
73
77
  };
74
78
 
79
+ /**
80
+ * Textarea using defaultValue for uncontrolled component pattern.
81
+ */
82
+ export const Uncontrolled: Story = {
83
+ args: {
84
+ defaultValue: 'Initial value',
85
+ placeholder: 'Type something...',
86
+ rows: 4,
87
+ },
88
+ };
89
+
75
90
  // With value
76
91
  export const WithValue: Story = {
77
92
  args: {
@@ -83,7 +98,7 @@ export const WithValue: Story = {
83
98
  // Textarea sizes
84
99
  export const Sizes: Story = {
85
100
  render: () => (
86
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
101
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
87
102
  <Textarea size="sm" placeholder="Small textarea" rows={3} />
88
103
  <Textarea size="md" placeholder="Medium textarea (default)" rows={3} />
89
104
  <Textarea size="lg" placeholder="Large textarea" rows={3} />
@@ -94,7 +109,7 @@ export const Sizes: Story = {
94
109
  // Textarea rows
95
110
  export const Rows: Story = {
96
111
  render: () => (
97
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
112
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
98
113
  <Textarea placeholder="2 rows" rows={2} />
99
114
  <Textarea placeholder="4 rows" rows={4} />
100
115
  <Textarea placeholder="6 rows" rows={6} />
@@ -105,7 +120,7 @@ export const Rows: Story = {
105
120
  // Textarea variants
106
121
  export const Variants: Story = {
107
122
  render: () => (
108
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
123
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
109
124
  <Textarea variant="primary" placeholder="Primary textarea" rows={2} />
110
125
  <Textarea variant="secondary" placeholder="Secondary textarea" rows={2} />
111
126
  <Textarea variant="success" placeholder="Success textarea" rows={2} />
@@ -119,7 +134,7 @@ export const Variants: Story = {
119
134
  // States
120
135
  export const States: Story = {
121
136
  render: () => (
122
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
137
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
123
138
  <Textarea placeholder="Default textarea" rows={2} />
124
139
  <Textarea placeholder="Disabled textarea" disabled rows={2} />
125
140
  <Textarea placeholder="Valid textarea" valid rows={2} />
@@ -171,7 +186,7 @@ export const GlassVariants: Story = {
171
186
  <h3 style={{ color: 'white', marginBottom: '1rem', fontSize: '1.2rem' }}>
172
187
  Glass Textarea Variants
173
188
  </h3>
174
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
189
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
175
190
  <Textarea placeholder="Small Glass" size="sm" rows={3} glass />
176
191
  <Textarea placeholder="Medium Glass" size="md" rows={3} glass />
177
192
  <Textarea placeholder="Large Glass" size="lg" rows={3} glass />
@@ -210,7 +225,7 @@ export const GlassShowcase: Story = {
210
225
  <h3 style={{ color: 'white', marginBottom: '1rem', fontSize: '1.2rem' }}>
211
226
  Glass Textarea on Background
212
227
  </h3>
213
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
228
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
214
229
  <Textarea placeholder="Write your message..." rows={4} glass />
215
230
  <Textarea placeholder="Additional notes..." rows={3} glass />
216
231
  </div>
@@ -225,7 +240,7 @@ export const GlassShowcase: Story = {
225
240
  }}
226
241
  >
227
242
  <h3 style={{ color: 'white', marginBottom: '1rem', fontSize: '1.2rem' }}>Glass Modes</h3>
228
- <div className="u-d-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
243
+ <div className="u-flex u-flex-column u-gap-3" style={{ width: '400px' }}>
229
244
  <Textarea placeholder="Standard Mode" rows={3} glass={{ mode: 'standard' }} />
230
245
  <Textarea placeholder="Polar Mode" rows={3} glass={{ mode: 'polar' }} />
231
246
  <Textarea placeholder="Prominent Mode" rows={3} glass={{ mode: 'prominent' }} />