@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
|
@@ -39,7 +39,7 @@ const smoothStep = (a: number, b: number, t: number): number => {
|
|
|
39
39
|
if (typeof a !== 'number' || typeof b !== 'number' || typeof t !== 'number') {
|
|
40
40
|
return 0;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
const clamped = Math.max(0, Math.min(1, (t - a) / (b - a)));
|
|
44
44
|
return clamped * clamped * (3 - 2 * clamped);
|
|
45
45
|
};
|
|
@@ -49,11 +49,11 @@ const calculateLength = (x: number, y: number): number => {
|
|
|
49
49
|
if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) {
|
|
50
50
|
return 0;
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
// Prevent potential overflow
|
|
54
54
|
const maxX = Math.max(Math.abs(x), Math.abs(y));
|
|
55
55
|
if (maxX === 0) return 0;
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
const scaledX = x / maxX;
|
|
58
58
|
const scaledY = y / maxX;
|
|
59
59
|
return maxX * Math.sqrt(scaledX * scaledX + scaledY * scaledY);
|
|
@@ -67,12 +67,16 @@ const roundedRectSDF = (
|
|
|
67
67
|
radius: number
|
|
68
68
|
): number => {
|
|
69
69
|
// Add input validation
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
if (
|
|
71
|
+
typeof x !== 'number' ||
|
|
72
|
+
typeof y !== 'number' ||
|
|
73
|
+
typeof width !== 'number' ||
|
|
74
|
+
typeof height !== 'number' ||
|
|
75
|
+
typeof radius !== 'number'
|
|
76
|
+
) {
|
|
73
77
|
return 0;
|
|
74
78
|
}
|
|
75
|
-
|
|
79
|
+
|
|
76
80
|
const qx = Math.abs(x) - width + radius;
|
|
77
81
|
const qy = Math.abs(y) - height + radius;
|
|
78
82
|
return Math.min(Math.max(qx, qy), 0) + calculateLength(Math.max(qx, 0), Math.max(qy, 0)) - radius;
|
|
@@ -97,11 +101,11 @@ const clampValue = (value: number, min: number, max: number): number => {
|
|
|
97
101
|
if (typeof value !== 'number' || typeof min !== 'number' || typeof max !== 'number') {
|
|
98
102
|
return min;
|
|
99
103
|
}
|
|
100
|
-
|
|
104
|
+
|
|
101
105
|
if (isNaN(value)) return min;
|
|
102
106
|
if (isNaN(min)) return 0;
|
|
103
107
|
if (isNaN(max)) return 1;
|
|
104
|
-
|
|
108
|
+
|
|
105
109
|
return Math.max(min, Math.min(max, value));
|
|
106
110
|
};
|
|
107
111
|
|
|
@@ -111,9 +115,11 @@ const easeInOutCubic = (t: number): number => {
|
|
|
111
115
|
if (typeof t !== 'number' || isNaN(t)) {
|
|
112
116
|
return 0;
|
|
113
117
|
}
|
|
114
|
-
|
|
118
|
+
|
|
115
119
|
const clampedT = Math.max(0, Math.min(1, t));
|
|
116
|
-
return clampedT < 0.5
|
|
120
|
+
return clampedT < 0.5
|
|
121
|
+
? 4 * clampedT * clampedT * clampedT
|
|
122
|
+
: 1 - Math.pow(-2 * clampedT + 2, 3) / 2;
|
|
117
123
|
};
|
|
118
124
|
|
|
119
125
|
const easeOutQuart = (t: number): number => {
|
|
@@ -121,7 +127,7 @@ const easeOutQuart = (t: number): number => {
|
|
|
121
127
|
if (typeof t !== 'number' || isNaN(t)) {
|
|
122
128
|
return 0;
|
|
123
129
|
}
|
|
124
|
-
|
|
130
|
+
|
|
125
131
|
const clampedT = Math.max(0, Math.min(1, t));
|
|
126
132
|
return 1 - Math.pow(1 - clampedT, 4);
|
|
127
133
|
};
|
|
@@ -132,7 +138,7 @@ const noise2D = (x: number, y: number): number => {
|
|
|
132
138
|
if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) {
|
|
133
139
|
return 0;
|
|
134
140
|
}
|
|
135
|
-
|
|
141
|
+
|
|
136
142
|
const X = Math.floor(x) & 255;
|
|
137
143
|
const Y = Math.floor(y) & 255;
|
|
138
144
|
|
|
@@ -148,7 +154,7 @@ const noise2D = (x: number, y: number): number => {
|
|
|
148
154
|
if (typeof i !== 'number' || typeof j !== 'number') {
|
|
149
155
|
return 0;
|
|
150
156
|
}
|
|
151
|
-
|
|
157
|
+
|
|
152
158
|
const n = i + j * 57;
|
|
153
159
|
// Use a more stable hash function
|
|
154
160
|
const hashed = Math.sin(n * 12.9898 + 78.233) * 43758.5453;
|
|
@@ -172,10 +178,10 @@ const fbm = (x: number, y: number, octaves: number = 4): number => {
|
|
|
172
178
|
if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) {
|
|
173
179
|
return 0;
|
|
174
180
|
}
|
|
175
|
-
|
|
181
|
+
|
|
176
182
|
// Clamp octaves to prevent performance issues
|
|
177
183
|
const clampedOctaves = Math.max(1, Math.min(8, Math.floor(octaves)));
|
|
178
|
-
|
|
184
|
+
|
|
179
185
|
let value = 0;
|
|
180
186
|
let amplitude = 0.5;
|
|
181
187
|
let frequency = 1;
|
|
@@ -192,11 +198,17 @@ const fbm = (x: number, y: number, octaves: number = 4): number => {
|
|
|
192
198
|
// Radial distortion for glass-like refraction
|
|
193
199
|
const calculateRadialDistortion = (x: number, y: number, strength: number): Vec2 => {
|
|
194
200
|
// Add input validation
|
|
195
|
-
if (
|
|
196
|
-
|
|
201
|
+
if (
|
|
202
|
+
typeof x !== 'number' ||
|
|
203
|
+
typeof y !== 'number' ||
|
|
204
|
+
typeof strength !== 'number' ||
|
|
205
|
+
isNaN(x) ||
|
|
206
|
+
isNaN(y) ||
|
|
207
|
+
isNaN(strength)
|
|
208
|
+
) {
|
|
197
209
|
return { x: 0, y: 0 };
|
|
198
210
|
}
|
|
199
|
-
|
|
211
|
+
|
|
200
212
|
const distance = calculateLength(x, y);
|
|
201
213
|
const distortion = Math.pow(Math.min(distance, 10), 2) * strength; // Limit distance to prevent extreme values
|
|
202
214
|
|
|
@@ -209,17 +221,23 @@ const calculateRadialDistortion = (x: number, y: number, strength: number): Vec2
|
|
|
209
221
|
// Chromatic aberration calculation
|
|
210
222
|
const calculateChromaticOffset = (x: number, y: number, intensity: number): Vec2 => {
|
|
211
223
|
// Add input validation
|
|
212
|
-
if (
|
|
213
|
-
|
|
224
|
+
if (
|
|
225
|
+
typeof x !== 'number' ||
|
|
226
|
+
typeof y !== 'number' ||
|
|
227
|
+
typeof intensity !== 'number' ||
|
|
228
|
+
isNaN(x) ||
|
|
229
|
+
isNaN(y) ||
|
|
230
|
+
isNaN(intensity)
|
|
231
|
+
) {
|
|
214
232
|
return { x: 0, y: 0 };
|
|
215
233
|
}
|
|
216
|
-
|
|
234
|
+
|
|
217
235
|
const distance = calculateLength(x, y);
|
|
218
236
|
// Prevent division by zero and extreme values
|
|
219
237
|
if (distance === 0) {
|
|
220
238
|
return { x: 0, y: 0 };
|
|
221
239
|
}
|
|
222
|
-
|
|
240
|
+
|
|
223
241
|
const angle = Math.atan2(y, x);
|
|
224
242
|
|
|
225
243
|
return {
|
|
@@ -231,11 +249,19 @@ const calculateChromaticOffset = (x: number, y: number, intensity: number): Vec2
|
|
|
231
249
|
// Advanced caustic pattern generator for glass refraction
|
|
232
250
|
const calculateCaustics = (x: number, y: number, time: number, intensity: number = 1): number => {
|
|
233
251
|
// Add input validation
|
|
234
|
-
if (
|
|
235
|
-
|
|
252
|
+
if (
|
|
253
|
+
typeof x !== 'number' ||
|
|
254
|
+
typeof y !== 'number' ||
|
|
255
|
+
typeof time !== 'number' ||
|
|
256
|
+
typeof intensity !== 'number' ||
|
|
257
|
+
isNaN(x) ||
|
|
258
|
+
isNaN(y) ||
|
|
259
|
+
isNaN(time) ||
|
|
260
|
+
isNaN(intensity)
|
|
261
|
+
) {
|
|
236
262
|
return 0.5; // Return middle value on error
|
|
237
263
|
}
|
|
238
|
-
|
|
264
|
+
|
|
239
265
|
const scale = 8;
|
|
240
266
|
const speed = 2;
|
|
241
267
|
|
|
@@ -263,15 +289,23 @@ const calculateSpectralDispersion = (
|
|
|
263
289
|
intensity: number
|
|
264
290
|
): { r: Vec2; g: Vec2; b: Vec2 } => {
|
|
265
291
|
// Add input validation
|
|
266
|
-
if (
|
|
267
|
-
|
|
292
|
+
if (
|
|
293
|
+
typeof x !== 'number' ||
|
|
294
|
+
typeof y !== 'number' ||
|
|
295
|
+
typeof angle !== 'number' ||
|
|
296
|
+
typeof intensity !== 'number' ||
|
|
297
|
+
isNaN(x) ||
|
|
298
|
+
isNaN(y) ||
|
|
299
|
+
isNaN(angle) ||
|
|
300
|
+
isNaN(intensity)
|
|
301
|
+
) {
|
|
268
302
|
return {
|
|
269
303
|
r: { x: 0, y: 0 },
|
|
270
304
|
g: { x: 0, y: 0 },
|
|
271
|
-
b: { x: 0, y: 0 }
|
|
305
|
+
b: { x: 0, y: 0 },
|
|
272
306
|
};
|
|
273
307
|
}
|
|
274
|
-
|
|
308
|
+
|
|
275
309
|
const distance = calculateLength(x, y);
|
|
276
310
|
const dispersionStrength = Math.min(distance * intensity, 1); // Limit strength to prevent extreme values
|
|
277
311
|
|
|
@@ -305,12 +339,21 @@ const calculateParallaxOffset = (
|
|
|
305
339
|
mouseY: number = 0
|
|
306
340
|
): Vec2 => {
|
|
307
341
|
// Add input validation
|
|
308
|
-
if (
|
|
309
|
-
|
|
310
|
-
|
|
342
|
+
if (
|
|
343
|
+
typeof x !== 'number' ||
|
|
344
|
+
typeof y !== 'number' ||
|
|
345
|
+
typeof depth !== 'number' ||
|
|
346
|
+
typeof mouseX !== 'number' ||
|
|
347
|
+
typeof mouseY !== 'number' ||
|
|
348
|
+
isNaN(x) ||
|
|
349
|
+
isNaN(y) ||
|
|
350
|
+
isNaN(depth) ||
|
|
351
|
+
isNaN(mouseX) ||
|
|
352
|
+
isNaN(mouseY)
|
|
353
|
+
) {
|
|
311
354
|
return { x: 0, y: 0 };
|
|
312
355
|
}
|
|
313
|
-
|
|
356
|
+
|
|
314
357
|
const parallaxStrength = Math.min(0.02 * depth, 0.1); // Limit strength to prevent extreme values
|
|
315
358
|
|
|
316
359
|
// Calculate offset based on view angle (simulated by mouse position)
|
|
@@ -323,11 +366,19 @@ const calculateParallaxOffset = (
|
|
|
323
366
|
// Volumetric density for depth perception and scattering
|
|
324
367
|
const calculateVolumetricDensity = (x: number, y: number, depth: number, time: number): number => {
|
|
325
368
|
// Add input validation
|
|
326
|
-
if (
|
|
327
|
-
|
|
369
|
+
if (
|
|
370
|
+
typeof x !== 'number' ||
|
|
371
|
+
typeof y !== 'number' ||
|
|
372
|
+
typeof depth !== 'number' ||
|
|
373
|
+
typeof time !== 'number' ||
|
|
374
|
+
isNaN(x) ||
|
|
375
|
+
isNaN(y) ||
|
|
376
|
+
isNaN(depth) ||
|
|
377
|
+
isNaN(time)
|
|
378
|
+
) {
|
|
328
379
|
return 0.5; // Return middle value on error
|
|
329
380
|
}
|
|
330
|
-
|
|
381
|
+
|
|
331
382
|
const noiseValue = fbm(x * 5 + time * 0.5, y * 5 - time * 0.5, 3);
|
|
332
383
|
const depthFalloff = Math.exp(-Math.max(0, depth) * 2); // Ensure depth is not negative
|
|
333
384
|
|
|
@@ -337,14 +388,22 @@ const calculateVolumetricDensity = (x: number, y: number, depth: number, time: n
|
|
|
337
388
|
// Advanced turbulence for organic glass distortion
|
|
338
389
|
const calculateTurbulence = (x: number, y: number, time: number, octaves: number = 5): number => {
|
|
339
390
|
// Add input validation
|
|
340
|
-
if (
|
|
341
|
-
|
|
391
|
+
if (
|
|
392
|
+
typeof x !== 'number' ||
|
|
393
|
+
typeof y !== 'number' ||
|
|
394
|
+
typeof time !== 'number' ||
|
|
395
|
+
typeof octaves !== 'number' ||
|
|
396
|
+
isNaN(x) ||
|
|
397
|
+
isNaN(y) ||
|
|
398
|
+
isNaN(time) ||
|
|
399
|
+
isNaN(octaves)
|
|
400
|
+
) {
|
|
342
401
|
return 0;
|
|
343
402
|
}
|
|
344
|
-
|
|
403
|
+
|
|
345
404
|
// Clamp octaves to prevent performance issues
|
|
346
405
|
const clampedOctaves = Math.max(1, Math.min(8, Math.floor(octaves)));
|
|
347
|
-
|
|
406
|
+
|
|
348
407
|
let turbulence = 0;
|
|
349
408
|
let amplitude = 1;
|
|
350
409
|
let frequency = 1;
|
|
@@ -362,11 +421,17 @@ const calculateTurbulence = (x: number, y: number, time: number, octaves: number
|
|
|
362
421
|
// Micro-surface detail for high-quality glass texture
|
|
363
422
|
const calculateMicroSurface = (x: number, y: number, time: number): number => {
|
|
364
423
|
// Add input validation
|
|
365
|
-
if (
|
|
366
|
-
|
|
424
|
+
if (
|
|
425
|
+
typeof x !== 'number' ||
|
|
426
|
+
typeof y !== 'number' ||
|
|
427
|
+
typeof time !== 'number' ||
|
|
428
|
+
isNaN(x) ||
|
|
429
|
+
isNaN(y) ||
|
|
430
|
+
isNaN(time)
|
|
431
|
+
) {
|
|
367
432
|
return 0.5; // Return middle value on error
|
|
368
433
|
}
|
|
369
|
-
|
|
434
|
+
|
|
370
435
|
const highFreqNoise = fbm(x * 40 + time * 0.3, y * 40 - time * 0.3, 6);
|
|
371
436
|
const microDetail = fbm(x * 80, y * 80, 4);
|
|
372
437
|
|
|
@@ -721,6 +786,11 @@ export const fragmentShaders = {
|
|
|
721
786
|
|
|
722
787
|
return createTexture(clampValue(finalX + 0.5, 0, 1), clampValue(finalY + 0.5, 0, 1));
|
|
723
788
|
},
|
|
789
|
+
|
|
790
|
+
// Aliases for compatibility
|
|
791
|
+
plasma: (uv: Vec2, mousePosition?: Vec2): Vec2 => fragmentShaders.premiumGlass(uv, mousePosition),
|
|
792
|
+
waves: (uv: Vec2, mousePosition?: Vec2): Vec2 => fragmentShaders.liquidMetal(uv, mousePosition),
|
|
793
|
+
noise: (uv: Vec2, mousePosition?: Vec2): Vec2 => fragmentShaders.appleFluid(uv, mousePosition),
|
|
724
794
|
};
|
|
725
795
|
|
|
726
796
|
export type FragmentShaderType = keyof typeof fragmentShaders;
|
|
@@ -737,12 +807,20 @@ export class ShaderDisplacementGenerator {
|
|
|
737
807
|
|
|
738
808
|
this.canvas = document.createElement('canvas');
|
|
739
809
|
// Enhanced validation for canvas dimensions
|
|
740
|
-
this.canvas.width = Math.max(
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
810
|
+
this.canvas.width = Math.max(
|
|
811
|
+
MIN_CANVAS_DIMENSION,
|
|
812
|
+
Math.min(
|
|
813
|
+
MAX_CANVAS_DIMENSION,
|
|
814
|
+
Math.round(options.width * this.canvasDPI || DEFAULT_CANVAS_WIDTH)
|
|
815
|
+
)
|
|
816
|
+
);
|
|
817
|
+
this.canvas.height = Math.max(
|
|
818
|
+
MIN_CANVAS_DIMENSION,
|
|
819
|
+
Math.min(
|
|
820
|
+
MAX_CANVAS_DIMENSION,
|
|
821
|
+
Math.round(options.height * this.canvasDPI || DEFAULT_CANVAS_HEIGHT)
|
|
822
|
+
)
|
|
823
|
+
);
|
|
746
824
|
this.canvas.style.display = 'none';
|
|
747
825
|
|
|
748
826
|
const context = this.canvas.getContext('2d');
|
|
@@ -844,7 +922,10 @@ export class ShaderDisplacementGenerator {
|
|
|
844
922
|
return this.canvas.toDataURL();
|
|
845
923
|
} catch (error) {
|
|
846
924
|
// Graceful fallback on error
|
|
847
|
-
console.warn(
|
|
925
|
+
console.warn(
|
|
926
|
+
'ShaderDisplacementGenerator: Error generating shader map, using fallback',
|
|
927
|
+
error
|
|
928
|
+
);
|
|
848
929
|
return ''; // Return empty string as fallback
|
|
849
930
|
}
|
|
850
931
|
}
|
|
@@ -869,4 +950,4 @@ export class ShaderDisplacementGenerator {
|
|
|
869
950
|
getScale(): number {
|
|
870
951
|
return this.canvasDPI;
|
|
871
952
|
}
|
|
872
|
-
}
|
|
953
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Customization.stories.tsx
|
|
3
|
+
*
|
|
4
|
+
* Stories showcasing customization options and integration with other components.
|
|
5
|
+
*
|
|
6
|
+
* @package Atomix
|
|
7
|
+
* @component AtomixGlass
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
12
|
+
import AtomixGlass from '../AtomixGlass';
|
|
13
|
+
import Button from '../../Button/Button';
|
|
14
|
+
import Badge from '../../Badge/Badge';
|
|
15
|
+
import { BackgroundWrapper, backgroundImages } from './shared-components';
|
|
16
|
+
import { Icon } from '../../Icon/Icon'; // Assuming Icon is used or might be useful, added from Examples
|
|
17
|
+
|
|
18
|
+
const meta: Meta<typeof AtomixGlass> = {
|
|
19
|
+
title: 'Components/AtomixGlass/Features/Customization',
|
|
20
|
+
component: AtomixGlass,
|
|
21
|
+
parameters: {
|
|
22
|
+
layout: 'fullscreen',
|
|
23
|
+
docs: {
|
|
24
|
+
description: {
|
|
25
|
+
component:
|
|
26
|
+
'Examples of how to customize AtomixGlass with styles and integrate it with other Atomix components.',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default meta;
|
|
33
|
+
type Story = StoryObj<typeof AtomixGlass>;
|
|
34
|
+
|
|
35
|
+
export const WithCustomStyling: Story = {
|
|
36
|
+
args: {
|
|
37
|
+
children: (
|
|
38
|
+
<div className="u-text-center">
|
|
39
|
+
<h2 className="u-text-4 u-font-semibold u-mb-4 u-text-white">Custom Styled Glass</h2>
|
|
40
|
+
<p className="u-text-base u-mb-6 u-text-white">
|
|
41
|
+
This glass uses custom styling properties.
|
|
42
|
+
</p>
|
|
43
|
+
<Button
|
|
44
|
+
variant="primary"
|
|
45
|
+
className="u-rounded-lg u-py-3 u-px-6"
|
|
46
|
+
style={{ boxShadow: '0 5px 15px rgba(0,0,0,0.2)' }}
|
|
47
|
+
>
|
|
48
|
+
Premium Effect
|
|
49
|
+
</Button>
|
|
50
|
+
</div>
|
|
51
|
+
),
|
|
52
|
+
displacementScale: 70,
|
|
53
|
+
blurAmount: 0.4,
|
|
54
|
+
saturation: 160,
|
|
55
|
+
aberrationIntensity: 1.8,
|
|
56
|
+
cornerRadius: 30,
|
|
57
|
+
padding: '40px',
|
|
58
|
+
style: {
|
|
59
|
+
width: '100%',
|
|
60
|
+
maxWidth: '400px',
|
|
61
|
+
margin: '0 auto',
|
|
62
|
+
boxShadow: '0 10px 30px rgba(0,0,0,0.3)',
|
|
63
|
+
transition: 'transform 0.3s ease-in-out',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
render: args => (
|
|
67
|
+
<BackgroundWrapper backgroundImage={backgroundImages[2]}>
|
|
68
|
+
<div className="u-flex u-justify-center u-items-center u-w-full u-h-full">
|
|
69
|
+
<AtomixGlass {...args} />
|
|
70
|
+
</div>
|
|
71
|
+
</BackgroundWrapper>
|
|
72
|
+
),
|
|
73
|
+
parameters: {
|
|
74
|
+
docs: {
|
|
75
|
+
description: {
|
|
76
|
+
story:
|
|
77
|
+
'Shows how to customize the AtomixGlass component with additional CSS styles and enhanced interactivity.',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const WithOtherComponents: Story = {
|
|
84
|
+
parameters: {
|
|
85
|
+
docs: {
|
|
86
|
+
description: {
|
|
87
|
+
story:
|
|
88
|
+
'Demonstrates how AtomixGlass integrates with other components in the design system.',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
render: () => {
|
|
93
|
+
return (
|
|
94
|
+
<BackgroundWrapper backgroundImage={backgroundImages[0]}>
|
|
95
|
+
<div className="u-flex u-items-center u-justify-center u-w-full u-h-full">
|
|
96
|
+
<AtomixGlass
|
|
97
|
+
displacementScale={85}
|
|
98
|
+
blurAmount={0.6}
|
|
99
|
+
saturation={170}
|
|
100
|
+
aberrationIntensity={2.2}
|
|
101
|
+
elasticity={0.18}
|
|
102
|
+
cornerRadius={28}
|
|
103
|
+
padding="36px"
|
|
104
|
+
className="u-w-11/12 u-max-w-2xl"
|
|
105
|
+
>
|
|
106
|
+
<div className="u-mb-6">
|
|
107
|
+
<h2 className="u-m-0 u-text-white u-text-28 u-mb-2">Integrated UI</h2>
|
|
108
|
+
<p className="u-m-0 u-text-white u-opacity-90">
|
|
109
|
+
Glass effect with multiple components
|
|
110
|
+
</p>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div className="u-flex u-flex-col u-gap-4 u-items-center">
|
|
114
|
+
<Button variant="primary" glass className="u-w-full">
|
|
115
|
+
Primary Action
|
|
116
|
+
</Button>
|
|
117
|
+
<Button variant="secondary" glass className="u-w-full">
|
|
118
|
+
Secondary Action
|
|
119
|
+
</Button>
|
|
120
|
+
|
|
121
|
+
<div className="u-flex u-gap-3 u-mt-4">
|
|
122
|
+
<Badge variant="success" label="Success" glass />
|
|
123
|
+
<Badge variant="warning" label="Warning" glass />
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</AtomixGlass>
|
|
127
|
+
</div>
|
|
128
|
+
</BackgroundWrapper>
|
|
129
|
+
);
|
|
130
|
+
},
|
|
131
|
+
};
|