@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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
2
3
|
import { useState } from 'react';
|
|
3
4
|
import type { AtomixGlassProps } from '../../lib/types/components';
|
|
4
5
|
import Modal from './Modal';
|
|
@@ -13,8 +14,75 @@ const meta = {
|
|
|
13
14
|
layout: 'centered',
|
|
14
15
|
docs: {
|
|
15
16
|
description: {
|
|
16
|
-
component:
|
|
17
|
-
|
|
17
|
+
component: `
|
|
18
|
+
# Modal
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
Modal displays content in a focused overlay dialog. It provides a way to present important information or actions that require user attention. Modals support various sizes, can include headers and footers, and support glass morphism effects.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- Multiple size options (sm, md, lg, xl)
|
|
27
|
+
- Backdrop click to close
|
|
28
|
+
- Keyboard (Escape) to close
|
|
29
|
+
- Close button visibility control
|
|
30
|
+
- Glass morphism effect
|
|
31
|
+
- Header and footer sections
|
|
32
|
+
- Accessible design
|
|
33
|
+
- Responsive behavior
|
|
34
|
+
|
|
35
|
+
## Accessibility
|
|
36
|
+
|
|
37
|
+
- Keyboard support: Close with Escape key, tab navigation within modal
|
|
38
|
+
- Screen reader: Modal content and purpose announced properly
|
|
39
|
+
- ARIA support: Proper roles and properties for modal dialogs
|
|
40
|
+
- Focus management: Traps focus within the modal during open state
|
|
41
|
+
|
|
42
|
+
## Usage Examples
|
|
43
|
+
|
|
44
|
+
### Basic Usage
|
|
45
|
+
|
|
46
|
+
\`\`\`tsx
|
|
47
|
+
<Modal
|
|
48
|
+
isOpen={isOpen}
|
|
49
|
+
onOpenChange={setIsOpen}
|
|
50
|
+
title="Modal Title"
|
|
51
|
+
>
|
|
52
|
+
<p>Modal content goes here</p>
|
|
53
|
+
</Modal>
|
|
54
|
+
\`\`\`
|
|
55
|
+
|
|
56
|
+
### With Glass Effect
|
|
57
|
+
|
|
58
|
+
\`\`\`tsx
|
|
59
|
+
<Modal
|
|
60
|
+
isOpen={isOpen}
|
|
61
|
+
onOpenChange={setIsOpen}
|
|
62
|
+
title="Modal Title"
|
|
63
|
+
glass={true}
|
|
64
|
+
>
|
|
65
|
+
<p>Modal content goes here</p>
|
|
66
|
+
</Modal>
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
## API Reference
|
|
70
|
+
|
|
71
|
+
### Props
|
|
72
|
+
|
|
73
|
+
| Prop | Type | Default | Description |
|
|
74
|
+
| ---- | ---- | ------- | ----------- |
|
|
75
|
+
| size | 'sm' \\| 'md' \\| 'lg' \\| 'xl' | 'md' | Size of the modal |
|
|
76
|
+
| backdrop | boolean | true | Whether clicking the backdrop closes the modal |
|
|
77
|
+
| keyboard | boolean | true | Whether pressing Escape key closes the modal |
|
|
78
|
+
| closeButton | boolean | true | Whether to show the close button |
|
|
79
|
+
| glass | boolean \\| GlassProps | false | Enable glass morphism effect |
|
|
80
|
+
| title | string | - | Title of the modal |
|
|
81
|
+
| subtitle | string | - | Subtitle of the modal |
|
|
82
|
+
| isOpen | boolean | false | Whether the modal is open |
|
|
83
|
+
| onOpenChange | (open: boolean) => void | - | Callback when open state changes |
|
|
84
|
+
| children | ReactNode | - | Content of the modal |
|
|
85
|
+
`,
|
|
18
86
|
},
|
|
19
87
|
},
|
|
20
88
|
},
|
|
@@ -24,26 +92,70 @@ const meta = {
|
|
|
24
92
|
control: { type: 'select' },
|
|
25
93
|
options: ['sm', 'md', 'lg', 'xl'],
|
|
26
94
|
description: 'Size of the modal',
|
|
27
|
-
|
|
95
|
+
table: {
|
|
96
|
+
type: { summary: '"sm" | "md" | "lg" | "xl"' },
|
|
97
|
+
defaultValue: { summary: 'md' },
|
|
98
|
+
},
|
|
28
99
|
},
|
|
29
100
|
backdrop: {
|
|
30
101
|
control: 'boolean',
|
|
31
102
|
description: 'Whether clicking the backdrop closes the modal',
|
|
32
|
-
|
|
103
|
+
table: {
|
|
104
|
+
type: { summary: 'boolean' },
|
|
105
|
+
defaultValue: { summary: true },
|
|
106
|
+
},
|
|
33
107
|
},
|
|
34
108
|
keyboard: {
|
|
35
109
|
control: 'boolean',
|
|
36
110
|
description: 'Whether pressing Escape key closes the modal',
|
|
37
|
-
|
|
111
|
+
table: {
|
|
112
|
+
type: { summary: 'boolean' },
|
|
113
|
+
defaultValue: { summary: true },
|
|
114
|
+
},
|
|
38
115
|
},
|
|
39
116
|
closeButton: {
|
|
40
117
|
control: 'boolean',
|
|
41
118
|
description: 'Whether to show the close button',
|
|
42
|
-
|
|
119
|
+
table: {
|
|
120
|
+
type: { summary: 'boolean' },
|
|
121
|
+
defaultValue: { summary: true },
|
|
122
|
+
},
|
|
43
123
|
},
|
|
44
124
|
glass: {
|
|
45
125
|
control: 'boolean',
|
|
46
126
|
description: 'Enable glass morphism effect',
|
|
127
|
+
table: {
|
|
128
|
+
type: { summary: 'boolean | GlassProps' },
|
|
129
|
+
defaultValue: { summary: false },
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
title: {
|
|
133
|
+
control: 'text',
|
|
134
|
+
description: 'Title of the modal',
|
|
135
|
+
table: {
|
|
136
|
+
type: { summary: 'string' },
|
|
137
|
+
defaultValue: { summary: '-' },
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
subtitle: {
|
|
141
|
+
control: 'text',
|
|
142
|
+
description: 'Subtitle of the modal',
|
|
143
|
+
table: {
|
|
144
|
+
type: { summary: 'string' },
|
|
145
|
+
defaultValue: { summary: '-' },
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
isOpen: {
|
|
149
|
+
control: 'boolean',
|
|
150
|
+
description: 'Whether the modal is open',
|
|
151
|
+
table: {
|
|
152
|
+
type: { summary: 'boolean' },
|
|
153
|
+
defaultValue: { summary: false },
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
onOpenChange: {
|
|
157
|
+
action: 'open state changed',
|
|
158
|
+
description: 'Callback when open state changes',
|
|
47
159
|
},
|
|
48
160
|
},
|
|
49
161
|
} satisfies Meta<typeof Modal>;
|
|
@@ -51,10 +163,7 @@ const meta = {
|
|
|
51
163
|
export default meta;
|
|
52
164
|
type Story = StoryObj<typeof meta>;
|
|
53
165
|
|
|
54
|
-
|
|
55
|
-
* Basic modal example with a button to trigger opening.
|
|
56
|
-
*/
|
|
57
|
-
export const Basic: Story = {
|
|
166
|
+
export const BasicUsage: Story = {
|
|
58
167
|
render: args => {
|
|
59
168
|
const [isOpen, setIsOpen] = useState(false);
|
|
60
169
|
|
|
@@ -85,11 +194,15 @@ export const Basic: Story = {
|
|
|
85
194
|
</>
|
|
86
195
|
);
|
|
87
196
|
},
|
|
197
|
+
parameters: {
|
|
198
|
+
docs: {
|
|
199
|
+
description: {
|
|
200
|
+
story: 'Basic modal example with a button to trigger opening.',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
88
204
|
};
|
|
89
205
|
|
|
90
|
-
/**
|
|
91
|
-
* Modal with a title, subtitle, and footer actions.
|
|
92
|
-
*/
|
|
93
206
|
export const WithFooter: Story = {
|
|
94
207
|
render: args => {
|
|
95
208
|
const [isOpen, setIsOpen] = useState(false);
|
|
@@ -109,40 +222,66 @@ export const WithFooter: Story = {
|
|
|
109
222
|
isOpen={isOpen}
|
|
110
223
|
onOpenChange={setIsOpen}
|
|
111
224
|
title="Modal with Footer"
|
|
112
|
-
subtitle="This
|
|
113
|
-
footer={
|
|
114
|
-
<>
|
|
115
|
-
<div
|
|
116
|
-
className="c-btn c-btn--outline-secondary"
|
|
117
|
-
onClick={() => setIsOpen(false)}
|
|
118
|
-
style={{
|
|
119
|
-
cursor: 'pointer',
|
|
120
|
-
padding: '8px 16px',
|
|
121
|
-
display: 'inline-block',
|
|
122
|
-
marginRight: '8px',
|
|
123
|
-
}}
|
|
124
|
-
>
|
|
125
|
-
Cancel
|
|
126
|
-
</div>
|
|
127
|
-
<div
|
|
128
|
-
className="c-btn c-btn--primary"
|
|
129
|
-
onClick={() => {
|
|
130
|
-
alert('Action confirmed!');
|
|
131
|
-
setIsOpen(false);
|
|
132
|
-
}}
|
|
133
|
-
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
134
|
-
>
|
|
135
|
-
Confirm
|
|
136
|
-
</div>
|
|
137
|
-
</>
|
|
138
|
-
}
|
|
225
|
+
subtitle="This modal includes footer actions for user interaction."
|
|
139
226
|
>
|
|
140
|
-
<p>
|
|
141
|
-
|
|
227
|
+
<p>
|
|
228
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam auctor, odio vitae
|
|
229
|
+
faucibus luctus, elit nisi tincidunt justo, in malesuada enim nisl eget nisl.
|
|
230
|
+
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
|
|
231
|
+
egestas.
|
|
232
|
+
</p>
|
|
142
233
|
</Modal>
|
|
143
234
|
</>
|
|
144
235
|
);
|
|
145
236
|
},
|
|
237
|
+
parameters: {
|
|
238
|
+
docs: {
|
|
239
|
+
description: {
|
|
240
|
+
story: 'Modal with a title, subtitle, and footer actions.',
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
export const WithGlassEffect: Story = {
|
|
247
|
+
render: args => {
|
|
248
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
249
|
+
|
|
250
|
+
return (
|
|
251
|
+
<>
|
|
252
|
+
<div
|
|
253
|
+
className="c-btn c-btn--primary"
|
|
254
|
+
onClick={() => setIsOpen(true)}
|
|
255
|
+
style={{ cursor: 'pointer', padding: '8px 16px', display: 'inline-block' }}
|
|
256
|
+
>
|
|
257
|
+
Open Glass Modal
|
|
258
|
+
</div>
|
|
259
|
+
|
|
260
|
+
<Modal
|
|
261
|
+
{...args}
|
|
262
|
+
isOpen={isOpen}
|
|
263
|
+
onOpenChange={setIsOpen}
|
|
264
|
+
title="Glass Modal"
|
|
265
|
+
subtitle="This modal has a glass morphism effect applied."
|
|
266
|
+
glass={true}
|
|
267
|
+
>
|
|
268
|
+
<p>
|
|
269
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam auctor, odio vitae
|
|
270
|
+
faucibus luctus, elit nisi tincidunt justo, in malesuada enim nisl eget nisl.
|
|
271
|
+
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
|
|
272
|
+
egestas.
|
|
273
|
+
</p>
|
|
274
|
+
</Modal>
|
|
275
|
+
</>
|
|
276
|
+
);
|
|
277
|
+
},
|
|
278
|
+
parameters: {
|
|
279
|
+
docs: {
|
|
280
|
+
description: {
|
|
281
|
+
story: 'Modal with glass morphism effect applied.',
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
},
|
|
146
285
|
};
|
|
147
286
|
|
|
148
287
|
/**
|
|
@@ -510,7 +649,8 @@ export const GlassModalSizes: Story = {
|
|
|
510
649
|
The glass effect adapts to different modal sizes while maintaining its visual appeal.
|
|
511
650
|
</p>
|
|
512
651
|
<p>
|
|
513
|
-
The glass effect enhances the modal's appearance, making it visually appealing and
|
|
652
|
+
The glass effect enhances the modal's appearance, making it visually appealing and
|
|
653
|
+
easier to read.
|
|
514
654
|
</p>
|
|
515
655
|
</Modal>
|
|
516
656
|
</div>
|
|
@@ -76,144 +76,147 @@ function useModal({
|
|
|
76
76
|
/**
|
|
77
77
|
* Modal component for displaying overlay content
|
|
78
78
|
*/
|
|
79
|
-
export const Modal: React.FC<ModalProps> = memo(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
onClose,
|
|
84
|
-
onOpen,
|
|
85
|
-
title,
|
|
86
|
-
subtitle,
|
|
87
|
-
size = 'md',
|
|
88
|
-
backdrop = true,
|
|
89
|
-
keyboard = true,
|
|
90
|
-
className = '',
|
|
91
|
-
style,
|
|
92
|
-
closeButton = true,
|
|
93
|
-
footer,
|
|
94
|
-
glass,
|
|
95
|
-
...props
|
|
96
|
-
}) => {
|
|
97
|
-
const modalRef = useRef<HTMLDivElement>(null);
|
|
98
|
-
const dialogRef = useRef<HTMLDivElement>(null);
|
|
99
|
-
const backdropRef = useRef<HTMLDivElement>(null);
|
|
100
|
-
|
|
101
|
-
const {
|
|
102
|
-
isOpen: isOpenState,
|
|
103
|
-
open,
|
|
104
|
-
close,
|
|
105
|
-
} = useModal({
|
|
106
|
-
isOpen,
|
|
79
|
+
export const Modal: React.FC<ModalProps> = memo(
|
|
80
|
+
({
|
|
81
|
+
children,
|
|
82
|
+
isOpen = false,
|
|
107
83
|
onOpenChange,
|
|
108
84
|
onClose,
|
|
109
85
|
onOpen,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
86
|
+
title,
|
|
87
|
+
subtitle,
|
|
88
|
+
size = 'md',
|
|
89
|
+
backdrop = true,
|
|
90
|
+
keyboard = true,
|
|
91
|
+
className = '',
|
|
92
|
+
style,
|
|
93
|
+
closeButton = true,
|
|
94
|
+
footer,
|
|
95
|
+
glass,
|
|
96
|
+
...props
|
|
97
|
+
}) => {
|
|
98
|
+
const modalRef = useRef<HTMLDivElement>(null);
|
|
99
|
+
const dialogRef = useRef<HTMLDivElement>(null);
|
|
100
|
+
const backdropRef = useRef<HTMLDivElement>(null);
|
|
101
|
+
|
|
102
|
+
const {
|
|
103
|
+
isOpen: isOpenState,
|
|
104
|
+
open,
|
|
105
|
+
close,
|
|
106
|
+
} = useModal({
|
|
107
|
+
isOpen,
|
|
108
|
+
onOpenChange,
|
|
109
|
+
onClose,
|
|
110
|
+
onOpen,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Handle keyboard events for Escape key
|
|
114
|
+
useEffect(() => {
|
|
115
|
+
if (!keyboard) return undefined;
|
|
116
|
+
|
|
117
|
+
const handleKeydown = (event: KeyboardEvent) => {
|
|
118
|
+
if (event.key === 'Escape' && isOpenState) {
|
|
119
|
+
close();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
document.addEventListener('keydown', handleKeydown);
|
|
124
|
+
return () => {
|
|
125
|
+
document.removeEventListener('keydown', handleKeydown);
|
|
126
|
+
};
|
|
127
|
+
}, [isOpenState, close, keyboard]);
|
|
128
|
+
|
|
129
|
+
// Handle backdrop click
|
|
130
|
+
const handleBackdropClick = (event: React.MouseEvent<HTMLDivElement>) => {
|
|
131
|
+
if (backdrop && event.target === event.currentTarget) {
|
|
118
132
|
close();
|
|
119
133
|
}
|
|
120
134
|
};
|
|
121
135
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
<div className="c-modal__content">
|
|
148
|
-
{(title || closeButton) && (
|
|
149
|
-
<div className="c-modal__header">
|
|
150
|
-
<div className="c-modal__header-content">
|
|
151
|
-
{title && <h3 className="c-modal__title">{title}</h3>}
|
|
152
|
-
{subtitle && <p className="c-modal__sub">{subtitle}</p>}
|
|
153
|
-
</div>
|
|
154
|
-
{closeButton && (
|
|
155
|
-
<button
|
|
156
|
-
type="button"
|
|
157
|
-
className="c-modal__close c-btn js-modal-close"
|
|
158
|
-
onClick={close}
|
|
159
|
-
aria-label="Close modal"
|
|
160
|
-
>
|
|
161
|
-
<svg
|
|
162
|
-
width="20"
|
|
163
|
-
height="20"
|
|
164
|
-
viewBox="0 0 20 20"
|
|
165
|
-
fill="none"
|
|
166
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
136
|
+
// Assemble classes
|
|
137
|
+
const modalClasses = [
|
|
138
|
+
'c-modal',
|
|
139
|
+
isOpenState ? MODAL.CLASSES.IS_OPEN : '',
|
|
140
|
+
size ? `c-modal--${size}` : '',
|
|
141
|
+
glass ? 'c-modal--glass' : '',
|
|
142
|
+
className,
|
|
143
|
+
]
|
|
144
|
+
.filter(Boolean)
|
|
145
|
+
.join(' ');
|
|
146
|
+
|
|
147
|
+
const modalContent = (
|
|
148
|
+
<div className="c-modal__content">
|
|
149
|
+
{(title || closeButton) && (
|
|
150
|
+
<div className="c-modal__header">
|
|
151
|
+
<div className="c-modal__header-content">
|
|
152
|
+
{title && <h3 className="c-modal__title">{title}</h3>}
|
|
153
|
+
{subtitle && <p className="c-modal__sub">{subtitle}</p>}
|
|
154
|
+
</div>
|
|
155
|
+
{closeButton && (
|
|
156
|
+
<button
|
|
157
|
+
type="button"
|
|
158
|
+
className="c-modal__close c-btn js-modal-close"
|
|
159
|
+
onClick={close}
|
|
160
|
+
aria-label="Close modal"
|
|
167
161
|
>
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
162
|
+
<svg
|
|
163
|
+
width="20"
|
|
164
|
+
height="20"
|
|
165
|
+
viewBox="0 0 20 20"
|
|
166
|
+
fill="none"
|
|
167
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
168
|
+
>
|
|
169
|
+
<path
|
|
170
|
+
d="M16.0672 15.1828C16.1253 15.2409 16.1713 15.3098 16.2028 15.3857C16.2342 15.4615 16.2504 15.5429 16.2504 15.625C16.2504 15.7071 16.2342 15.7884 16.2028 15.8643C16.1713 15.9402 16.1253 16.0091 16.0672 16.0672C16.0091 16.1252 15.9402 16.1713 15.8643 16.2027C15.7885 16.2342 15.7071 16.2503 15.625 16.2503C15.5429 16.2503 15.4616 16.2342 15.3857 16.2027C15.3098 16.1713 15.2409 16.1252 15.1828 16.0672L10 10.8836L4.8172 16.0672C4.69992 16.1844 4.54086 16.2503 4.37501 16.2503C4.20916 16.2503 4.0501 16.1844 3.93282 16.0672C3.81555 15.9499 3.74966 15.7908 3.74966 15.625C3.74966 15.4591 3.81555 15.3001 3.93282 15.1828L9.11642 9.99998L3.93282 4.81717C3.81555 4.69989 3.74966 4.54083 3.74966 4.37498C3.74966 4.20913 3.81555 4.05007 3.93282 3.93279C4.0501 3.81552 4.20916 3.74963 4.37501 3.74963C4.54086 3.74963 4.69992 3.81552 4.8172 3.93279L10 9.11639L15.1828 3.93279C15.3001 3.81552 15.4592 3.74963 15.625 3.74963C15.7909 3.74963 15.9499 3.81552 16.0672 3.93279C16.1845 4.05007 16.2504 4.20913 16.2504 4.37498C16.2504 4.54083 16.1845 4.69989 16.0672 4.81717L10.8836 9.99998L16.0672 15.1828Z"
|
|
171
|
+
fill="#141414"
|
|
172
|
+
/>
|
|
173
|
+
</svg>
|
|
174
|
+
</button>
|
|
175
|
+
)}
|
|
176
|
+
</div>
|
|
177
|
+
)}
|
|
179
178
|
|
|
180
|
-
|
|
181
|
-
</div>
|
|
182
|
-
);
|
|
179
|
+
<div className="c-modal__body">{children}</div>
|
|
183
180
|
|
|
184
|
-
|
|
185
|
-
<div
|
|
186
|
-
ref={modalRef}
|
|
187
|
-
className={modalClasses}
|
|
188
|
-
style={{ display: isOpenState ? 'block' : 'none', ...style }}
|
|
189
|
-
role="dialog"
|
|
190
|
-
aria-modal="true"
|
|
191
|
-
aria-hidden={!isOpenState}
|
|
192
|
-
{...props}
|
|
193
|
-
>
|
|
194
|
-
<div ref={backdropRef} className="c-modal__backdrop" onClick={handleBackdropClick} />
|
|
195
|
-
<div ref={dialogRef} className="c-modal__dialog">
|
|
196
|
-
{glass
|
|
197
|
-
? // Default glass settings for modals
|
|
198
|
-
(() => {
|
|
199
|
-
const defaultGlassProps = {
|
|
200
|
-
displacementScale: document.querySelector('.c-modal---glass .c-modal__content')?.clientHeight,
|
|
201
|
-
blurAmount: 2.2,
|
|
202
|
-
elasticity: 0,
|
|
203
|
-
mode: 'shader' as const,
|
|
204
|
-
shaderMode: 'premiumGlass'
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
const glassProps =
|
|
208
|
-
glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
|
|
209
|
-
|
|
210
|
-
return <AtomixGlass {...glassProps}>{modalContent}</AtomixGlass>;
|
|
211
|
-
})()
|
|
212
|
-
: modalContent}
|
|
181
|
+
{footer && <div className="c-modal__footer">{footer}</div>}
|
|
213
182
|
</div>
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<div
|
|
187
|
+
ref={modalRef}
|
|
188
|
+
className={modalClasses}
|
|
189
|
+
style={{ display: isOpenState ? 'block' : 'none', ...style }}
|
|
190
|
+
role="dialog"
|
|
191
|
+
aria-modal="true"
|
|
192
|
+
aria-hidden={!isOpenState}
|
|
193
|
+
{...props}
|
|
194
|
+
>
|
|
195
|
+
<div ref={backdropRef} className="c-modal__backdrop" onClick={handleBackdropClick} />
|
|
196
|
+
<div ref={dialogRef} className="c-modal__dialog">
|
|
197
|
+
{glass
|
|
198
|
+
? // Default glass settings for modals
|
|
199
|
+
(() => {
|
|
200
|
+
const defaultGlassProps = {
|
|
201
|
+
displacementScale: document.querySelector('.c-modal---glass .c-modal__content')
|
|
202
|
+
?.clientHeight,
|
|
203
|
+
blurAmount: 2.2,
|
|
204
|
+
elasticity: 0,
|
|
205
|
+
mode: 'shader' as const,
|
|
206
|
+
shaderMode: 'premiumGlass',
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
const glassProps =
|
|
210
|
+
glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
|
|
211
|
+
|
|
212
|
+
return <AtomixGlass {...glassProps}>{modalContent}</AtomixGlass>;
|
|
213
|
+
})()
|
|
214
|
+
: modalContent}
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
);
|
|
217
220
|
|
|
218
221
|
Modal.displayName = 'Modal';
|
|
219
222
|
|