@shohojdhara/atomix 0.3.15 → 0.4.0

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 (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. package/src/styles/99-utilities/_utilities.text.scss +67 -46
@@ -10,116 +10,124 @@ const CHECKBOX_CLASSES = {
10
10
  MIXED: 'c-checkbox--mixed',
11
11
  };
12
12
 
13
- export const Checkbox = React.memo(forwardRef<HTMLInputElement, CheckboxProps>(({
14
- label,
15
- checked,
16
- onChange,
17
- className = '',
18
- style,
19
- disabled = false,
20
- required = false,
21
- id,
22
- name,
23
- value,
24
- invalid = false,
25
- valid = false,
26
- indeterminate = false,
27
- 'aria-label': ariaLabel,
28
- 'aria-describedby': ariaDescribedBy,
29
- onClick,
30
- glass,
31
- ...props
32
- }, ref) => {
33
- // Local ref to handle indeterminate state
34
- const localRef = useRef<HTMLInputElement>(null);
13
+ export const Checkbox = React.memo(
14
+ forwardRef<HTMLInputElement, CheckboxProps>(
15
+ (
16
+ {
17
+ label,
18
+ checked,
19
+ onChange,
20
+ className = '',
21
+ style,
22
+ disabled = false,
23
+ required = false,
24
+ id,
25
+ name,
26
+ value,
27
+ invalid = false,
28
+ valid = false,
29
+ indeterminate = false,
30
+ 'aria-label': ariaLabel,
31
+ 'aria-describedby': ariaDescribedBy,
32
+ onClick,
33
+ glass,
34
+ ...props
35
+ },
36
+ ref
37
+ ) => {
38
+ // Local ref to handle indeterminate state
39
+ const localRef = useRef<HTMLInputElement>(null);
35
40
 
36
- // Merge refs
37
- useImperativeHandle(ref, () => localRef.current as HTMLInputElement);
41
+ // Merge refs
42
+ useImperativeHandle(ref, () => localRef.current as HTMLInputElement);
38
43
 
39
- // Handle indeterminate
40
- useEffect(() => {
41
- if (localRef.current) {
42
- localRef.current.indeterminate = Boolean(indeterminate);
43
- }
44
- }, [indeterminate]);
44
+ // Handle indeterminate
45
+ useEffect(() => {
46
+ if (localRef.current) {
47
+ localRef.current.indeterminate = Boolean(indeterminate);
48
+ }
49
+ }, [indeterminate]);
45
50
 
46
- // Generate classes
47
- let validationClass = '';
48
- if (invalid) {
49
- validationClass = CHECKBOX_CLASSES.INVALID;
50
- } else if (valid) {
51
- validationClass = CHECKBOX_CLASSES.VALID;
52
- }
51
+ // Generate classes
52
+ let validationClass = '';
53
+ if (invalid) {
54
+ validationClass = CHECKBOX_CLASSES.INVALID;
55
+ } else if (valid) {
56
+ validationClass = CHECKBOX_CLASSES.VALID;
57
+ }
53
58
 
54
- const disabledClass = disabled ? CHECKBOX_CLASSES.DISABLED : '';
55
- const indeterminateClass = indeterminate ? CHECKBOX_CLASSES.MIXED : '';
56
- const glassClass = glass ? 'c-checkbox--glass' : '';
59
+ const disabledClass = disabled ? CHECKBOX_CLASSES.DISABLED : '';
60
+ const indeterminateClass = indeterminate ? CHECKBOX_CLASSES.MIXED : '';
61
+ const glassClass = glass ? 'c-checkbox--glass' : '';
57
62
 
58
- const checkboxClass = `${CHECKBOX_CLASSES.BASE} ${validationClass} ${disabledClass} ${indeterminateClass} ${glassClass} ${className}`.trim();
63
+ const checkboxClass =
64
+ `${CHECKBOX_CLASSES.BASE} ${validationClass} ${disabledClass} ${indeterminateClass} ${glassClass} ${className}`.trim();
59
65
 
60
- const inputElement = (
61
- <input
62
- ref={localRef}
63
- type="checkbox"
64
- className="c-checkbox__input"
65
- checked={checked}
66
- onChange={onChange}
67
- onClick={onClick}
68
- disabled={disabled}
69
- required={required}
70
- id={id}
71
- name={name}
72
- value={value}
73
- aria-label={!label ? ariaLabel : undefined}
74
- aria-describedby={ariaDescribedBy}
75
- aria-invalid={invalid}
76
- {...props}
77
- />
78
- );
66
+ const inputElement = (
67
+ <input
68
+ ref={localRef}
69
+ type="checkbox"
70
+ className="c-checkbox__input"
71
+ checked={checked}
72
+ onChange={onChange}
73
+ onClick={onClick}
74
+ disabled={disabled}
75
+ required={required}
76
+ id={id}
77
+ name={name}
78
+ value={value}
79
+ aria-label={!label ? ariaLabel : undefined}
80
+ aria-describedby={ariaDescribedBy}
81
+ aria-invalid={invalid}
82
+ {...props}
83
+ />
84
+ );
79
85
 
80
- let content: React.ReactNode;
86
+ let content: React.ReactNode;
81
87
 
82
- if (id && label) {
83
- content = (
84
- <div className={checkboxClass} style={style}>
85
- {inputElement}
86
- <label className="c-checkbox__label" htmlFor={id}>
87
- {label}
88
- </label>
89
- </div>
90
- );
91
- } else if (label) {
92
- // Wrap input in label for accessibility when no ID is provided
93
- content = (
94
- <label className={checkboxClass} style={style}>
95
- {inputElement}
96
- <span className="c-checkbox__label">{label}</span>
97
- </label>
98
- );
99
- } else {
100
- // No label
101
- content = (
102
- <div className={checkboxClass} style={style}>
103
- {inputElement}
104
- </div>
105
- );
106
- }
88
+ if (id && label) {
89
+ content = (
90
+ <div className={checkboxClass} style={style}>
91
+ {inputElement}
92
+ <label className="c-checkbox__label" htmlFor={id}>
93
+ {label}
94
+ </label>
95
+ </div>
96
+ );
97
+ } else if (label) {
98
+ // Wrap input in label for accessibility when no ID is provided
99
+ content = (
100
+ <label className={checkboxClass} style={style}>
101
+ {inputElement}
102
+ <span className="c-checkbox__label">{label}</span>
103
+ </label>
104
+ );
105
+ } else {
106
+ // No label
107
+ content = (
108
+ <div className={checkboxClass} style={style}>
109
+ {inputElement}
110
+ </div>
111
+ );
112
+ }
107
113
 
108
- if (glass) {
109
- const defaultGlassProps = {
110
- displacementScale: 40,
111
- blurAmount: 1,
112
- saturation: 160,
113
- aberrationIntensity: 0.3,
114
- cornerRadius: 6,
115
- mode: 'shader' as const,
116
- };
117
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
118
- return <AtomixGlass {...glassProps}>{content}</AtomixGlass>;
119
- }
114
+ if (glass) {
115
+ const defaultGlassProps = {
116
+ displacementScale: 40,
117
+ blurAmount: 1,
118
+ saturation: 160,
119
+ aberrationIntensity: 0.3,
120
+ cornerRadius: 6,
121
+ mode: 'shader' as const,
122
+ };
123
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
124
+ return <AtomixGlass {...glassProps}>{content}</AtomixGlass>;
125
+ }
120
126
 
121
- return content;
122
- }));
127
+ return content;
128
+ }
129
+ )
130
+ );
123
131
 
124
132
  Checkbox.displayName = 'Checkbox';
125
133
 
@@ -211,19 +211,11 @@ export const CompleteForm: Story = {
211
211
  </FormGroup>
212
212
 
213
213
  <FormGroup label="Bio" htmlFor="bio">
214
- <Textarea
215
- id="bio"
216
- name="bio"
217
- placeholder="Tell us about yourself"
218
- rows={4}
219
- />
214
+ <Textarea id="bio" name="bio" placeholder="Tell us about yourself" rows={4} />
220
215
  </FormGroup>
221
216
 
222
217
  <FormGroup label="Subscribe to newsletter">
223
- <Checkbox
224
- name="newsletter"
225
- label="Yes, I would like to receive updates"
226
- />
218
+ <Checkbox name="newsletter" label="Yes, I would like to receive updates" />
227
219
  </FormGroup>
228
220
 
229
221
  <div className="u-flex u-gap-3 u-mt-4">
@@ -167,25 +167,14 @@ export const States: Story = {
167
167
  export const WithIcons: Story = {
168
168
  render: () => (
169
169
  <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
170
- <Input
171
- placeholder="Search..."
172
- prefixIcon={<MagnifyingGlass size={18} />}
173
- />
174
- <Input
175
- placeholder="Email address"
176
- type="email"
177
- prefixIcon={<Envelope size={18} />}
178
- />
170
+ <Input placeholder="Search..." prefixIcon={<MagnifyingGlass size={18} />} />
171
+ <Input placeholder="Email address" type="email" prefixIcon={<Envelope size={18} />} />
179
172
  <Input
180
173
  placeholder="Username"
181
174
  prefixIcon={<User size={18} />}
182
175
  suffixIcon={<span style={{ color: 'green' }}>✓</span>}
183
176
  />
184
- <Input
185
- placeholder="Phone number"
186
- type="tel"
187
- prefixIcon={<Phone size={18} />}
188
- />
177
+ <Input placeholder="Phone number" type="tel" prefixIcon={<Phone size={18} />} />
189
178
  </div>
190
179
  ),
191
180
  };
@@ -201,14 +190,14 @@ export const Clearable: Story = {
201
190
  <Input
202
191
  placeholder="Type to see clear button"
203
192
  value={value}
204
- onChange={(e) => setValue(e.target.value)}
193
+ onChange={e => setValue(e.target.value)}
205
194
  clearable
206
195
  />
207
196
  <Input
208
197
  placeholder="With prefix icon"
209
198
  prefixIcon={<MagnifyingGlass size={18} />}
210
199
  value={value}
211
- onChange={(e) => setValue(e.target.value)}
200
+ onChange={e => setValue(e.target.value)}
212
201
  clearable
213
202
  />
214
203
  </div>
@@ -227,14 +216,14 @@ export const WithCounter: Story = {
227
216
  <Input
228
217
  placeholder="Type here (max 50 characters)"
229
218
  value={value}
230
- onChange={(e) => setValue(e.target.value)}
219
+ onChange={e => setValue(e.target.value)}
231
220
  maxLength={50}
232
221
  showCounter
233
222
  />
234
223
  <Input
235
224
  placeholder="With custom max count"
236
225
  value={value}
237
- onChange={(e) => setValue(e.target.value)}
226
+ onChange={e => setValue(e.target.value)}
238
227
  maxCount={100}
239
228
  showCounter
240
229
  />
@@ -255,7 +244,7 @@ export const PasswordToggle: Story = {
255
244
  type="password"
256
245
  placeholder="Enter password"
257
246
  value={password}
258
- onChange={(e) => setPassword(e.target.value)}
247
+ onChange={e => setPassword(e.target.value)}
259
248
  showPasswordToggle
260
249
  />
261
250
  <Input
@@ -263,7 +252,7 @@ export const PasswordToggle: Story = {
263
252
  placeholder="Password with prefix icon"
264
253
  prefixIcon={<Lock size={18} />}
265
254
  value={password}
266
- onChange={(e) => setPassword(e.target.value)}
255
+ onChange={e => setPassword(e.target.value)}
267
256
  showPasswordToggle
268
257
  />
269
258
  </div>
@@ -287,22 +276,18 @@ export const WithMessages: Story = {
287
276
  type="email"
288
277
  placeholder="Email address"
289
278
  value={email}
290
- onChange={(e) => setEmail(e.target.value)}
279
+ onChange={e => setEmail(e.target.value)}
291
280
  invalid={isInvalidEmail}
292
281
  errorMessage={isInvalidEmail ? 'Please enter a valid email address' : undefined}
293
- helperText={!isInvalidEmail ? 'We\'ll never share your email' : undefined}
282
+ helperText={!isInvalidEmail ? "We'll never share your email" : undefined}
294
283
  />
295
284
  <Input
296
285
  placeholder="Username"
297
286
  value={username}
298
- onChange={(e) => setUsername(e.target.value)}
287
+ onChange={e => setUsername(e.target.value)}
299
288
  helperText="Choose a unique username"
300
289
  />
301
- <Input
302
- placeholder="Required field"
303
- required
304
- helperText="This field is required"
305
- />
290
+ <Input placeholder="Required field" required helperText="This field is required" />
306
291
  </div>
307
292
  );
308
293
  },
@@ -331,7 +316,8 @@ export const Comprehensive: Story = {
331
316
  parameters: {
332
317
  docs: {
333
318
  description: {
334
- story: 'A comprehensive example demonstrating multiple input features including icons, clearable functionality, password toggle, character counter, and helper text in a form-like layout.',
319
+ story:
320
+ 'A comprehensive example demonstrating multiple input features including icons, clearable functionality, password toggle, character counter, and helper text in a form-like layout.',
335
321
  },
336
322
  },
337
323
  },
@@ -343,13 +329,11 @@ export const Comprehensive: Story = {
343
329
  return (
344
330
  <div className="u-flex u-flex-column u-gap-4" style={{ width: '400px' }}>
345
331
  <div>
346
- <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>
347
- Search
348
- </label>
332
+ <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>Search</label>
349
333
  <Input
350
334
  placeholder="Search products..."
351
335
  value={search}
352
- onChange={(e) => setSearch(e.target.value)}
336
+ onChange={e => setSearch(e.target.value)}
353
337
  prefixIcon={<MagnifyingGlass size={18} />}
354
338
  clearable
355
339
  fullWidth
@@ -364,7 +348,7 @@ export const Comprehensive: Story = {
364
348
  type="password"
365
349
  placeholder="Enter your password"
366
350
  value={password}
367
- onChange={(e) => setPassword(e.target.value)}
351
+ onChange={e => setPassword(e.target.value)}
368
352
  prefixIcon={<Lock size={18} />}
369
353
  showPasswordToggle
370
354
  fullWidth
@@ -373,13 +357,11 @@ export const Comprehensive: Story = {
373
357
  </div>
374
358
 
375
359
  <div>
376
- <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>
377
- Bio
378
- </label>
360
+ <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>Bio</label>
379
361
  <Input
380
362
  placeholder="Tell us about yourself"
381
363
  value={bio}
382
- onChange={(e) => setBio(e.target.value)}
364
+ onChange={e => setBio(e.target.value)}
383
365
  maxLength={200}
384
366
  showCounter
385
367
  fullWidth
@@ -465,7 +447,8 @@ export const GlassShowcase: Story = {
465
447
  parameters: {
466
448
  docs: {
467
449
  description: {
468
- story: 'Demonstrates glass morphism effects on inputs with different modes and configurations, showing how inputs look over colorful backgrounds.',
450
+ story:
451
+ 'Demonstrates glass morphism effects on inputs with different modes and configurations, showing how inputs look over colorful backgrounds.',
469
452
  },
470
453
  },
471
454
  },
@@ -4,56 +4,50 @@ import { Input } from './Input';
4
4
 
5
5
  // Mock AtomixGlass component
6
6
  vi.mock('../AtomixGlass/AtomixGlass', () => ({
7
- AtomixGlass: ({ children, ...props }: any) => (
8
- <div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
9
- {children}
10
- </div>
11
- ),
7
+ AtomixGlass: ({ children, ...props }: any) => (
8
+ <div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
9
+ {children}
10
+ </div>
11
+ ),
12
12
  }));
13
13
 
14
14
  describe('Input Component', () => {
15
- it('renders correctly', () => {
16
- render(<Input placeholder="Test Input" />);
17
- expect(screen.getByPlaceholderText('Test Input')).toBeInTheDocument();
18
- });
15
+ it('renders correctly', () => {
16
+ render(<Input placeholder="Test Input" />);
17
+ expect(screen.getByPlaceholderText('Test Input')).toBeInTheDocument();
18
+ });
19
19
 
20
- it('handles controlled value', () => {
21
- render(<Input value="Controlled Value" onChange={() => { }} />);
22
- const input = screen.getByDisplayValue('Controlled Value');
23
- expect(input).toBeInTheDocument();
24
- expect(input).toHaveValue('Controlled Value');
25
- });
20
+ it('handles controlled value', () => {
21
+ render(<Input value="Controlled Value" onChange={() => {}} />);
22
+ const input = screen.getByDisplayValue('Controlled Value');
23
+ expect(input).toBeInTheDocument();
24
+ expect(input).toHaveValue('Controlled Value');
25
+ });
26
26
 
27
- it('handles uncontrolled defaultValue', () => {
28
- render(<Input defaultValue="Default Value" />);
29
- const input = screen.getByDisplayValue('Default Value');
30
- expect(input).toBeInTheDocument();
31
- expect(input).toHaveValue('Default Value');
32
- });
27
+ it('handles uncontrolled defaultValue', () => {
28
+ render(<Input defaultValue="Default Value" />);
29
+ const input = screen.getByDisplayValue('Default Value');
30
+ expect(input).toBeInTheDocument();
31
+ expect(input).toHaveValue('Default Value');
32
+ });
33
33
 
34
- it('calls onChange when typing', () => {
35
- const handleChange = vi.fn();
36
- render(<Input onChange={handleChange} />);
37
- const input = screen.getByRole('textbox');
38
- fireEvent.change(input, { target: { value: 'New Value' } });
39
- expect(handleChange).toHaveBeenCalledTimes(1);
40
- });
34
+ it('calls onChange when typing', () => {
35
+ const handleChange = vi.fn();
36
+ render(<Input onChange={handleChange} />);
37
+ const input = screen.getByRole('textbox');
38
+ fireEvent.change(input, { target: { value: 'New Value' } });
39
+ expect(handleChange).toHaveBeenCalledTimes(1);
40
+ });
41
41
 
42
- it('applies accessibility attributes', () => {
43
- render(
44
- <Input
45
- aria-label="Accessible Label"
46
- aria-describedby="description-id"
47
- invalid
48
- />
49
- );
50
- const input = screen.getByLabelText('Accessible Label');
51
- expect(input).toHaveAttribute('aria-describedby', 'description-id');
52
- expect(input).toHaveAttribute('aria-invalid', 'true');
53
- });
42
+ it('applies accessibility attributes', () => {
43
+ render(<Input aria-label="Accessible Label" aria-describedby="description-id" invalid />);
44
+ const input = screen.getByLabelText('Accessible Label');
45
+ expect(input).toHaveAttribute('aria-describedby', 'description-id');
46
+ expect(input).toHaveAttribute('aria-invalid', 'true');
47
+ });
54
48
 
55
- it('renders as glass when enabled', () => {
56
- render(<Input glass placeholder="Glass Input" />);
57
- expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
58
- });
49
+ it('renders as glass when enabled', () => {
50
+ render(<Input glass placeholder="Glass Input" />);
51
+ expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
52
+ });
59
53
  });
@@ -256,20 +256,14 @@ export const States: Story = {
256
256
  checked={selectedValue === 'checked'}
257
257
  onChange={() => setSelectedValue('checked')}
258
258
  />
259
- <Radio
260
- label="Disabled radio"
261
- name="states"
262
- value="disabled"
263
- disabled
264
- onChange={() => { }}
265
- />
259
+ <Radio label="Disabled radio" name="states" value="disabled" disabled onChange={() => {}} />
266
260
  <Radio
267
261
  label="Disabled and checked radio"
268
262
  name="states"
269
263
  value="disabledChecked"
270
264
  disabled
271
265
  checked
272
- onChange={() => { }}
266
+ onChange={() => {}}
273
267
  />
274
268
  <Radio
275
269
  label="Valid radio"
@@ -298,7 +292,7 @@ export const WithoutLabel: Story = {
298
292
  name: 'noLabel',
299
293
  value: 'noLabel',
300
294
  'aria-label': 'Radio button without visible label',
301
- onChange: () => { },
295
+ onChange: () => {},
302
296
  },
303
297
  };
304
298
 
@@ -309,7 +303,7 @@ export const Glass: Story = {
309
303
  name: 'glass',
310
304
  value: 'glass',
311
305
  glass: true,
312
- onChange: () => { },
306
+ onChange: () => {},
313
307
  },
314
308
  render: (args: any) => (
315
309
  <div
@@ -341,7 +335,7 @@ export const GlassCustom: Story = {
341
335
  aberrationIntensity: 0.8,
342
336
  cornerRadius: 12,
343
337
  } as any,
344
- onChange: () => { },
338
+ onChange: () => {},
345
339
  },
346
340
  render: (args: any) => (
347
341
  <div
@@ -520,4 +514,4 @@ export const GlassStates: Story = {
520
514
  </div>
521
515
  );
522
516
  },
523
- };
517
+ };