@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.
- package/build-tools/index.d.ts +31 -30
- package/build-tools/package.json +4 -21
- package/dist/atomix.css +20924 -2611
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +76 -2
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/index.d.ts +31 -30
- package/dist/build-tools/package.json +4 -21
- package/dist/charts.js.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +144 -18
- package/dist/index.esm.js +110 -55
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +110 -55
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.stories.tsx +32 -23
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/glass-utils.ts +4 -3
- package/src/components/AtomixGlass/shader-utils.ts +128 -52
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
- package/src/components/Avatar/Avatar.stories.tsx +45 -62
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +20 -9
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +14 -4
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +13 -22
- package/src/components/Button/Button.test.tsx +97 -81
- package/src/components/Button/Button.tsx +46 -14
- package/src/components/Button/ButtonGroup.stories.tsx +37 -32
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +109 -16
- package/src/components/Card/Card.stories.tsx +67 -36
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +4 -9
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +7 -7
- package/src/components/DataTable/DataTable.stories.tsx +43 -38
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +21 -16
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.test.tsx +49 -49
- package/src/components/Form/Checkbox.tsx +108 -100
- package/src/components/Form/Form.stories.tsx +2 -10
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +6 -12
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +56 -23
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +2 -1
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +99 -192
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +35 -44
- package/src/components/River/River.stories.tsx +2 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +3 -1
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +8 -6
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Toggle/Toggle.stories.tsx +27 -13
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +129 -127
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/__tests__/theme-tools.test.ts +32 -6
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +106 -49
- package/src/lib/composables/useChartExport.ts +1 -1
- package/src/lib/composables/useDataTable.ts +29 -17
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +106 -104
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +1 -1
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +3 -1
- package/src/lib/utils/dataTableExport.ts +1 -5
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +0 -1
- package/src/styles/01-settings/_settings.colors.scss +8 -8
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +30 -18
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +3 -1
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +1 -1
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
- 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(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
37
|
-
|
|
41
|
+
// Merge refs
|
|
42
|
+
useImperativeHandle(ref, () => localRef.current as HTMLInputElement);
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
// Handle indeterminate
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (localRef.current) {
|
|
47
|
+
localRef.current.indeterminate = Boolean(indeterminate);
|
|
48
|
+
}
|
|
49
|
+
}, [indeterminate]);
|
|
45
50
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
const disabledClass = disabled ? CHECKBOX_CLASSES.DISABLED : '';
|
|
60
|
+
const indeterminateClass = indeterminate ? CHECKBOX_CLASSES.MIXED : '';
|
|
61
|
+
const glassClass = glass ? 'c-checkbox--glass' : '';
|
|
57
62
|
|
|
58
|
-
|
|
63
|
+
const checkboxClass =
|
|
64
|
+
`${CHECKBOX_CLASSES.BASE} ${validationClass} ${disabledClass} ${indeterminateClass} ${glassClass} ${className}`.trim();
|
|
59
65
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
86
|
+
let content: React.ReactNode;
|
|
81
87
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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 ?
|
|
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={
|
|
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:
|
|
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={
|
|
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={
|
|
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={
|
|
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:
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
it('renders correctly', () => {
|
|
16
|
+
render(<Input placeholder="Test Input" />);
|
|
17
|
+
expect(screen.getByPlaceholderText('Test Input')).toBeInTheDocument();
|
|
18
|
+
});
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
+
};
|