@shohojdhara/atomix 0.3.14 → 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/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +44 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +50 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +21044 -2618
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +77 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +44 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +50 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +152 -78
- package/dist/index.esm.js +346 -340
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +359 -353
- 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 +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +358 -850
- 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/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +6 -5
- package/src/components/AtomixGlass/shader-utils.ts +133 -52
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +195 -0
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +122 -352
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +30 -11
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +454 -1126
- package/src/components/Button/Button.test.tsx +123 -0
- package/src/components/Button/Button.tsx +88 -60
- package/src/components/Button/ButtonGroup.stories.tsx +376 -215
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +316 -568
- package/src/components/Card/Card.stories.tsx +292 -81
- 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 +153 -16
- 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 +152 -66
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +114 -7
- package/src/components/DataTable/DataTable.stories.tsx +349 -144
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +396 -327
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +122 -78
- package/src/components/Form/Form.stories.tsx +110 -19
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- 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 +146 -17
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +372 -38
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +183 -43
- 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 +354 -97
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +160 -7
- package/src/components/River/River.stories.tsx +3 -2
- package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +104 -8
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +173 -42
- package/src/components/Tabs/Tabs.stories.tsx +141 -12
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +137 -36
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +241 -150
- 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/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +219 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +126 -97
- package/src/lib/composables/useChartExport.ts +3 -8
- package/src/lib/composables/useDataTable.ts +72 -43
- 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/components.ts +9 -32
- 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 +107 -105
- 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 +45 -0
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +19 -0
- package/src/lib/utils/dataTableExport.ts +2 -15
- 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 +1 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.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 +4 -4
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +38 -12
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.accordion.scss +56 -14
- 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 +25 -17
- 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/_index.scss +2 -0
- 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 +2 -0
- 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 +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
|
@@ -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
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
3
4
|
import { Radio } from './Radio';
|
|
4
5
|
|
|
5
6
|
const meta = {
|
|
@@ -9,8 +10,79 @@ const meta = {
|
|
|
9
10
|
layout: 'centered',
|
|
10
11
|
docs: {
|
|
11
12
|
description: {
|
|
12
|
-
component:
|
|
13
|
-
|
|
13
|
+
component: `
|
|
14
|
+
# Radio
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
Radio component allows users to select a single option from a group of mutually exclusive options. Radio buttons are typically used in groups where only one selection is allowed. They provide clear visual feedback and support keyboard navigation.
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
- Single selection from mutually exclusive options
|
|
23
|
+
- Label support
|
|
24
|
+
- Disabled state
|
|
25
|
+
- Validation states (valid/invalid)
|
|
26
|
+
- Glass morphism effect
|
|
27
|
+
- Accessible design
|
|
28
|
+
- Responsive behavior
|
|
29
|
+
|
|
30
|
+
## Accessibility
|
|
31
|
+
|
|
32
|
+
- Keyboard support: Navigate and toggle with keyboard
|
|
33
|
+
- Screen reader: State and label announced properly
|
|
34
|
+
- ARIA support: Proper roles and properties for radio components
|
|
35
|
+
- Focus management: Visible focus indicators maintained
|
|
36
|
+
|
|
37
|
+
## Usage Examples
|
|
38
|
+
|
|
39
|
+
### Basic Usage
|
|
40
|
+
|
|
41
|
+
\`\`\`tsx
|
|
42
|
+
<Radio
|
|
43
|
+
label="Option label"
|
|
44
|
+
name="groupName"
|
|
45
|
+
value="optionValue"
|
|
46
|
+
checked={isSelected}
|
|
47
|
+
onChange={setSelected}
|
|
48
|
+
/>
|
|
49
|
+
\`\`\`
|
|
50
|
+
|
|
51
|
+
### Radio Group
|
|
52
|
+
|
|
53
|
+
\`\`\`tsx
|
|
54
|
+
<Radio
|
|
55
|
+
label="Option 1"
|
|
56
|
+
name="group"
|
|
57
|
+
value="opt1"
|
|
58
|
+
checked={selected === 'opt1'}
|
|
59
|
+
onChange={() => setSelected('opt1')}
|
|
60
|
+
/>
|
|
61
|
+
<Radio
|
|
62
|
+
label="Option 2"
|
|
63
|
+
name="group"
|
|
64
|
+
value="opt2"
|
|
65
|
+
checked={selected === 'opt2'}
|
|
66
|
+
onChange={() => setSelected('opt2')}
|
|
67
|
+
/>
|
|
68
|
+
\`\`\`
|
|
69
|
+
|
|
70
|
+
## API Reference
|
|
71
|
+
|
|
72
|
+
### Props
|
|
73
|
+
|
|
74
|
+
| Prop | Type | Default | Description |
|
|
75
|
+
| ---- | ---- | ------- | ----------- |
|
|
76
|
+
| label | string | - | Radio button label text |
|
|
77
|
+
| checked | boolean | false | Whether the radio button is checked |
|
|
78
|
+
| disabled | boolean | false | Whether the radio button is disabled |
|
|
79
|
+
| invalid | boolean | false | Whether the radio button is invalid |
|
|
80
|
+
| valid | boolean | false | Whether the radio button is valid |
|
|
81
|
+
| glass | boolean | false | Enable glass morphism effect |
|
|
82
|
+
| name | string | - | Name of the radio button group |
|
|
83
|
+
| value | string | - | Value of the radio button |
|
|
84
|
+
| onChange | (value: string) => void | - | Callback when radio button state changes |
|
|
85
|
+
`,
|
|
14
86
|
},
|
|
15
87
|
},
|
|
16
88
|
},
|
|
@@ -19,26 +91,70 @@ const meta = {
|
|
|
19
91
|
label: {
|
|
20
92
|
control: 'text',
|
|
21
93
|
description: 'Radio button label text',
|
|
94
|
+
table: {
|
|
95
|
+
type: { summary: 'string' },
|
|
96
|
+
defaultValue: { summary: '-' },
|
|
97
|
+
},
|
|
22
98
|
},
|
|
23
99
|
checked: {
|
|
24
100
|
control: 'boolean',
|
|
25
101
|
description: 'Whether the radio button is checked',
|
|
102
|
+
table: {
|
|
103
|
+
type: { summary: 'boolean' },
|
|
104
|
+
defaultValue: { summary: false },
|
|
105
|
+
},
|
|
26
106
|
},
|
|
27
107
|
disabled: {
|
|
28
108
|
control: 'boolean',
|
|
29
109
|
description: 'Whether the radio button is disabled',
|
|
110
|
+
table: {
|
|
111
|
+
type: { summary: 'boolean' },
|
|
112
|
+
defaultValue: { summary: false },
|
|
113
|
+
},
|
|
30
114
|
},
|
|
31
115
|
invalid: {
|
|
32
116
|
control: 'boolean',
|
|
33
117
|
description: 'Whether the radio button is invalid',
|
|
118
|
+
table: {
|
|
119
|
+
type: { summary: 'boolean' },
|
|
120
|
+
defaultValue: { summary: false },
|
|
121
|
+
},
|
|
34
122
|
},
|
|
35
123
|
valid: {
|
|
36
124
|
control: 'boolean',
|
|
37
125
|
description: 'Whether the radio button is valid',
|
|
126
|
+
table: {
|
|
127
|
+
type: { summary: 'boolean' },
|
|
128
|
+
defaultValue: { summary: false },
|
|
129
|
+
},
|
|
38
130
|
},
|
|
39
131
|
glass: {
|
|
40
132
|
control: 'boolean',
|
|
41
133
|
description: 'Enable glass morphism effect',
|
|
134
|
+
table: {
|
|
135
|
+
type: { summary: 'boolean' },
|
|
136
|
+
defaultValue: { summary: false },
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
name: {
|
|
140
|
+
control: 'text',
|
|
141
|
+
description: 'Name of the radio button group',
|
|
142
|
+
table: {
|
|
143
|
+
type: { summary: 'string' },
|
|
144
|
+
defaultValue: { summary: '-' },
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
value: {
|
|
148
|
+
control: 'text',
|
|
149
|
+
description: 'Value of the radio button',
|
|
150
|
+
table: {
|
|
151
|
+
type: { summary: 'string' },
|
|
152
|
+
defaultValue: { summary: '-' },
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
onChange: {
|
|
156
|
+
action: 'changed',
|
|
157
|
+
description: 'Callback when radio button state changes',
|
|
42
158
|
},
|
|
43
159
|
},
|
|
44
160
|
} satisfies Meta<typeof Radio>;
|
|
@@ -47,12 +163,18 @@ export default meta;
|
|
|
47
163
|
type Story = StoryObj<typeof meta>;
|
|
48
164
|
|
|
49
165
|
// Basic radio button
|
|
50
|
-
export const
|
|
166
|
+
export const BasicUsage: Story = {
|
|
51
167
|
args: {
|
|
52
168
|
label: 'Option 1',
|
|
53
169
|
name: 'option',
|
|
54
170
|
value: 'option1',
|
|
55
|
-
|
|
171
|
+
},
|
|
172
|
+
parameters: {
|
|
173
|
+
docs: {
|
|
174
|
+
description: {
|
|
175
|
+
story: 'Basic radio button with label.',
|
|
176
|
+
},
|
|
177
|
+
},
|
|
56
178
|
},
|
|
57
179
|
};
|
|
58
180
|
|
|
@@ -63,7 +185,13 @@ export const Checked: Story = {
|
|
|
63
185
|
name: 'option',
|
|
64
186
|
value: 'option1',
|
|
65
187
|
checked: true,
|
|
66
|
-
|
|
188
|
+
},
|
|
189
|
+
parameters: {
|
|
190
|
+
docs: {
|
|
191
|
+
description: {
|
|
192
|
+
story: 'Checked radio button state.',
|
|
193
|
+
},
|
|
194
|
+
},
|
|
67
195
|
},
|
|
68
196
|
};
|
|
69
197
|
|
|
@@ -98,6 +226,13 @@ export const RadioGroup: Story = {
|
|
|
98
226
|
</div>
|
|
99
227
|
);
|
|
100
228
|
},
|
|
229
|
+
parameters: {
|
|
230
|
+
docs: {
|
|
231
|
+
description: {
|
|
232
|
+
story: 'Group of radio buttons demonstrating mutual exclusivity.',
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
},
|
|
101
236
|
};
|
|
102
237
|
|
|
103
238
|
// Radio button states
|
|
@@ -121,20 +256,14 @@ export const States: Story = {
|
|
|
121
256
|
checked={selectedValue === 'checked'}
|
|
122
257
|
onChange={() => setSelectedValue('checked')}
|
|
123
258
|
/>
|
|
124
|
-
<Radio
|
|
125
|
-
label="Disabled radio"
|
|
126
|
-
name="states"
|
|
127
|
-
value="disabled"
|
|
128
|
-
disabled
|
|
129
|
-
onChange={() => { }}
|
|
130
|
-
/>
|
|
259
|
+
<Radio label="Disabled radio" name="states" value="disabled" disabled onChange={() => {}} />
|
|
131
260
|
<Radio
|
|
132
261
|
label="Disabled and checked radio"
|
|
133
262
|
name="states"
|
|
134
263
|
value="disabledChecked"
|
|
135
264
|
disabled
|
|
136
265
|
checked
|
|
137
|
-
onChange={() => {
|
|
266
|
+
onChange={() => {}}
|
|
138
267
|
/>
|
|
139
268
|
<Radio
|
|
140
269
|
label="Valid radio"
|
|
@@ -163,7 +292,7 @@ export const WithoutLabel: Story = {
|
|
|
163
292
|
name: 'noLabel',
|
|
164
293
|
value: 'noLabel',
|
|
165
294
|
'aria-label': 'Radio button without visible label',
|
|
166
|
-
onChange: () => {
|
|
295
|
+
onChange: () => {},
|
|
167
296
|
},
|
|
168
297
|
};
|
|
169
298
|
|
|
@@ -174,7 +303,7 @@ export const Glass: Story = {
|
|
|
174
303
|
name: 'glass',
|
|
175
304
|
value: 'glass',
|
|
176
305
|
glass: true,
|
|
177
|
-
onChange: () => {
|
|
306
|
+
onChange: () => {},
|
|
178
307
|
},
|
|
179
308
|
render: (args: any) => (
|
|
180
309
|
<div
|
|
@@ -206,7 +335,7 @@ export const GlassCustom: Story = {
|
|
|
206
335
|
aberrationIntensity: 0.8,
|
|
207
336
|
cornerRadius: 12,
|
|
208
337
|
} as any,
|
|
209
|
-
onChange: () => {
|
|
338
|
+
onChange: () => {},
|
|
210
339
|
},
|
|
211
340
|
render: (args: any) => (
|
|
212
341
|
<div
|
|
@@ -385,4 +514,4 @@ export const GlassStates: Story = {
|
|
|
385
514
|
</div>
|
|
386
515
|
);
|
|
387
516
|
},
|
|
388
|
-
};
|
|
517
|
+
};
|
|
@@ -6,78 +6,80 @@ import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
|
|
|
6
6
|
/**
|
|
7
7
|
* Radio - A component for radio button inputs
|
|
8
8
|
*/
|
|
9
|
-
export const Radio: React.FC<RadioProps> = memo(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
9
|
+
export const Radio: React.FC<RadioProps> = memo(
|
|
10
|
+
({
|
|
11
|
+
label,
|
|
12
|
+
checked = false,
|
|
13
|
+
onChange,
|
|
14
|
+
className = '',
|
|
15
|
+
style,
|
|
16
|
+
disabled = false,
|
|
17
|
+
required = false,
|
|
18
|
+
id,
|
|
19
|
+
name,
|
|
20
|
+
value,
|
|
21
|
+
invalid = false,
|
|
22
|
+
valid = false,
|
|
23
|
+
'aria-label': ariaLabel,
|
|
24
|
+
'aria-describedby': ariaDescribedBy,
|
|
25
|
+
glass,
|
|
26
|
+
}) => {
|
|
27
|
+
const { generateRadioClass } = useRadio({
|
|
28
|
+
disabled,
|
|
29
|
+
invalid,
|
|
30
|
+
valid,
|
|
31
|
+
});
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
const radioClass = generateRadioClass({
|
|
34
|
+
className: `${className} ${glass ? 'c-radio--glass' : ''}`.trim(),
|
|
35
|
+
disabled,
|
|
36
|
+
invalid,
|
|
37
|
+
valid,
|
|
38
|
+
});
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
40
|
+
const radioContent = (
|
|
41
|
+
<div className={radioClass} style={style}>
|
|
42
|
+
<input
|
|
43
|
+
type="radio"
|
|
44
|
+
className="c-radio__input"
|
|
45
|
+
checked={checked}
|
|
46
|
+
onChange={onChange}
|
|
47
|
+
disabled={disabled}
|
|
48
|
+
required={required}
|
|
49
|
+
id={id}
|
|
50
|
+
name={name}
|
|
51
|
+
value={value}
|
|
52
|
+
aria-label={!label ? ariaLabel : undefined}
|
|
53
|
+
aria-describedby={ariaDescribedBy}
|
|
54
|
+
aria-invalid={invalid}
|
|
55
|
+
/>
|
|
56
|
+
{label && (
|
|
57
|
+
<label className="c-radio__label" htmlFor={id}>
|
|
58
|
+
{label}
|
|
59
|
+
</label>
|
|
60
|
+
)}
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
64
|
+
if (glass) {
|
|
65
|
+
// Default glass settings for radio buttons
|
|
66
|
+
const defaultGlassProps = {
|
|
67
|
+
displacementScale: 40,
|
|
68
|
+
blurAmount: 1,
|
|
69
|
+
saturation: 160,
|
|
70
|
+
aberrationIntensity: 0.3,
|
|
71
|
+
cornerRadius: 6,
|
|
72
|
+
mode: 'shader' as const,
|
|
73
|
+
};
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
return <AtomixGlass {...glassProps}>{radioContent}</AtomixGlass>;
|
|
78
|
+
}
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
}
|
|
80
|
+
return radioContent;
|
|
81
|
+
}
|
|
82
|
+
);
|
|
81
83
|
|
|
82
84
|
export type { RadioProps };
|
|
83
85
|
|