@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
package/src/lib/theme-tools.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme Tools for Library Users
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Developer-friendly utilities for working with Atomix themes
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -49,7 +49,7 @@ export function createDarkVariant(lightTheme: Theme): Theme {
|
|
|
49
49
|
},
|
|
50
50
|
},
|
|
51
51
|
};
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
// Create a new theme by extending the light theme with the dark variant
|
|
54
54
|
const extendedTheme: Theme = {
|
|
55
55
|
...lightTheme,
|
|
@@ -67,7 +67,7 @@ export function createDarkVariant(lightTheme: Theme): Theme {
|
|
|
67
67
|
},
|
|
68
68
|
},
|
|
69
69
|
};
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
return extendedTheme;
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -125,9 +125,11 @@ export function getThemeMetadata(theme: Theme): ThemeMetadata {
|
|
|
125
125
|
* Check if theme supports dark mode
|
|
126
126
|
*/
|
|
127
127
|
export function supportsDarkMode(theme: Theme): boolean {
|
|
128
|
-
return
|
|
128
|
+
return (
|
|
129
|
+
theme.palette?.mode === 'dark' ||
|
|
129
130
|
theme.supportsDarkMode === true ||
|
|
130
|
-
Boolean(theme.a11y?.modes?.includes('dark'))
|
|
131
|
+
Boolean(theme.a11y?.modes?.includes('dark'))
|
|
132
|
+
);
|
|
131
133
|
}
|
|
132
134
|
|
|
133
135
|
/**
|
|
@@ -150,4 +152,4 @@ export function importTheme(json: string): Theme {
|
|
|
150
152
|
|
|
151
153
|
// Note: createTheme, extendTheme, mergeTheme, and generateCSSVariables
|
|
152
154
|
// are already exported from './theme' module. Import them directly from there.
|
|
153
|
-
// This file only exports theme-tools specific utilities.
|
|
155
|
+
// This file only exports theme-tools specific utilities.
|
|
@@ -1,7 +1,44 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import type {
|
|
3
|
+
ButtonParts,
|
|
4
|
+
CardParts,
|
|
5
|
+
InputParts,
|
|
6
|
+
ModalParts,
|
|
7
|
+
DropdownParts,
|
|
8
|
+
BadgeParts,
|
|
9
|
+
ProgressParts,
|
|
10
|
+
CheckboxParts,
|
|
11
|
+
RadioParts,
|
|
12
|
+
} from './partProps';
|
|
13
|
+
import type {
|
|
14
|
+
SlotProps,
|
|
15
|
+
ButtonRootSlotProps,
|
|
16
|
+
ButtonIconSlotProps,
|
|
17
|
+
ButtonLabelSlotProps,
|
|
18
|
+
ButtonSpinnerSlotProps,
|
|
19
|
+
BadgeRootSlotProps,
|
|
20
|
+
BadgeIconSlotProps,
|
|
21
|
+
BadgeLabelSlotProps,
|
|
22
|
+
ProgressRootSlotProps,
|
|
23
|
+
ProgressBarSlotProps,
|
|
24
|
+
CheckboxRootSlotProps,
|
|
25
|
+
CheckboxInputSlotProps,
|
|
26
|
+
CheckboxLabelSlotProps,
|
|
27
|
+
RadioRootSlotProps,
|
|
28
|
+
RadioInputSlotProps,
|
|
29
|
+
RadioLabelSlotProps,
|
|
30
|
+
} from '../patterns/slots';
|
|
31
|
+
import type {
|
|
32
|
+
ButtonCSSVariable,
|
|
33
|
+
CardCSSVariable,
|
|
34
|
+
InputCSSVariable,
|
|
35
|
+
ModalCSSVariable,
|
|
36
|
+
DropdownCSSVariable,
|
|
37
|
+
BadgeCSSVariable,
|
|
38
|
+
ProgressCSSVariable,
|
|
39
|
+
CheckboxCSSVariable,
|
|
40
|
+
RadioCSSVariable,
|
|
41
|
+
} from '../constants/cssVariables';
|
|
5
42
|
|
|
6
43
|
// ============================================================================
|
|
7
44
|
// AtomixGlass Types
|
|
@@ -199,7 +236,14 @@ export interface AtomixGlassProps {
|
|
|
199
236
|
/**
|
|
200
237
|
* Shader variant for shader mode
|
|
201
238
|
*/
|
|
202
|
-
shaderVariant?:
|
|
239
|
+
shaderVariant?:
|
|
240
|
+
| 'liquidGlass'
|
|
241
|
+
| 'premiumGlass'
|
|
242
|
+
| 'appleFluid'
|
|
243
|
+
| 'liquidMetal'
|
|
244
|
+
| 'plasma'
|
|
245
|
+
| 'waves'
|
|
246
|
+
| 'noise';
|
|
203
247
|
|
|
204
248
|
/**
|
|
205
249
|
* Accessibility props
|
|
@@ -914,14 +958,40 @@ export interface HeroBackgroundSliderConfig {
|
|
|
914
958
|
customTransition?: (currentIndex: number, nextIndex: number) => string | React.CSSProperties;
|
|
915
959
|
}
|
|
916
960
|
|
|
961
|
+
/**
|
|
962
|
+
* Hero component parts for granular styling
|
|
963
|
+
*/
|
|
964
|
+
export interface HeroParts {
|
|
965
|
+
root?: { className?: string; style?: React.CSSProperties };
|
|
966
|
+
container?: { className?: string; style?: React.CSSProperties };
|
|
967
|
+
grid?: { className?: string; style?: React.CSSProperties };
|
|
968
|
+
content?: { className?: string; style?: React.CSSProperties };
|
|
969
|
+
title?: { className?: string; style?: React.CSSProperties };
|
|
970
|
+
subtitle?: { className?: string; style?: React.CSSProperties };
|
|
971
|
+
text?: { className?: string; style?: React.CSSProperties };
|
|
972
|
+
actions?: { className?: string; style?: React.CSSProperties };
|
|
973
|
+
imageWrapper?: { className?: string; style?: React.CSSProperties };
|
|
974
|
+
image?: { className?: string; style?: React.CSSProperties };
|
|
975
|
+
background?: { className?: string; style?: React.CSSProperties };
|
|
976
|
+
overlay?: { className?: string; style?: React.CSSProperties };
|
|
977
|
+
}
|
|
978
|
+
|
|
917
979
|
/**
|
|
918
980
|
* Hero component properties
|
|
919
981
|
*/
|
|
920
|
-
export interface HeroProps
|
|
982
|
+
export interface HeroProps
|
|
983
|
+
extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'content'>,
|
|
984
|
+
BaseComponentProps {
|
|
921
985
|
/**
|
|
922
986
|
* Hero title
|
|
923
987
|
*/
|
|
924
|
-
title:
|
|
988
|
+
title: ReactNode;
|
|
989
|
+
|
|
990
|
+
/**
|
|
991
|
+
* HTML Heading level for the title
|
|
992
|
+
* @default 'h1'
|
|
993
|
+
*/
|
|
994
|
+
headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'div';
|
|
925
995
|
|
|
926
996
|
/**
|
|
927
997
|
* Hero subtitle
|
|
@@ -973,11 +1043,31 @@ export interface HeroProps extends BaseComponentProps {
|
|
|
973
1043
|
*/
|
|
974
1044
|
imageColSize?: number;
|
|
975
1045
|
|
|
1046
|
+
/**
|
|
1047
|
+
* Custom grid column class name for image
|
|
1048
|
+
*/
|
|
1049
|
+
imageColClassName?: string;
|
|
1050
|
+
|
|
1051
|
+
/**
|
|
1052
|
+
* Custom inline style for image column
|
|
1053
|
+
*/
|
|
1054
|
+
imageColStyle?: React.CSSProperties;
|
|
1055
|
+
|
|
976
1056
|
/**
|
|
977
1057
|
* Custom grid column size for content (default is 5)
|
|
978
1058
|
*/
|
|
979
1059
|
contentColSize?: number;
|
|
980
1060
|
|
|
1061
|
+
/**
|
|
1062
|
+
* Custom grid column class name for content
|
|
1063
|
+
*/
|
|
1064
|
+
contentColClassName?: string;
|
|
1065
|
+
|
|
1066
|
+
/**
|
|
1067
|
+
* Custom inline style for content column
|
|
1068
|
+
*/
|
|
1069
|
+
contentColStyle?: React.CSSProperties;
|
|
1070
|
+
|
|
981
1071
|
/**
|
|
982
1072
|
* Custom width for the hero content (overrides the default CSS variable)
|
|
983
1073
|
*/
|
|
@@ -1039,6 +1129,17 @@ export interface HeroProps extends BaseComponentProps {
|
|
|
1039
1129
|
* Takes precedence over backgroundImageSrc and videoBackground props
|
|
1040
1130
|
*/
|
|
1041
1131
|
backgroundSlider?: HeroBackgroundSliderConfig;
|
|
1132
|
+
|
|
1133
|
+
/**
|
|
1134
|
+
* Reverse the stacking order of content and image on mobile devices
|
|
1135
|
+
* @default false
|
|
1136
|
+
*/
|
|
1137
|
+
reverseOnMobile?: boolean;
|
|
1138
|
+
|
|
1139
|
+
/**
|
|
1140
|
+
* Granular part-based styling
|
|
1141
|
+
*/
|
|
1142
|
+
parts?: HeroParts;
|
|
1042
1143
|
}
|
|
1043
1144
|
|
|
1044
1145
|
/**
|
|
@@ -1468,16 +1569,16 @@ export interface SideMenuProps extends BaseComponentProps {
|
|
|
1468
1569
|
active?: boolean | undefined;
|
|
1469
1570
|
disabled?: boolean | undefined;
|
|
1470
1571
|
as?:
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1572
|
+
| React.ComponentType<{
|
|
1573
|
+
href?: string;
|
|
1574
|
+
to?: string;
|
|
1575
|
+
children: React.ReactNode;
|
|
1576
|
+
className?: string;
|
|
1577
|
+
onClick?: (event: React.MouseEvent) => void;
|
|
1578
|
+
target?: string;
|
|
1579
|
+
rel?: string;
|
|
1580
|
+
}>
|
|
1581
|
+
| undefined;
|
|
1481
1582
|
}>;
|
|
1482
1583
|
}>;
|
|
1483
1584
|
}
|
|
@@ -3677,17 +3778,17 @@ export interface VideoPlayerProps extends BaseComponentProps {
|
|
|
3677
3778
|
* - object: Custom glass configuration
|
|
3678
3779
|
*/
|
|
3679
3780
|
glass?:
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
3690
|
-
|
|
3781
|
+
| boolean
|
|
3782
|
+
| {
|
|
3783
|
+
displacementScale?: number;
|
|
3784
|
+
blurAmount?: number;
|
|
3785
|
+
saturation?: number;
|
|
3786
|
+
aberrationIntensity?: number;
|
|
3787
|
+
elasticity?: number;
|
|
3788
|
+
cornerRadius?: number;
|
|
3789
|
+
mode?: 'standard' | 'polar' | 'prominent' | 'shader';
|
|
3790
|
+
overLight?: boolean;
|
|
3791
|
+
};
|
|
3691
3792
|
|
|
3692
3793
|
/**
|
|
3693
3794
|
* Glass overlay opacity (0-1) when glass variant is enabled
|
|
@@ -5075,23 +5176,23 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5075
5176
|
* Whether to enable mouse wheel control
|
|
5076
5177
|
*/
|
|
5077
5178
|
mousewheel?:
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5179
|
+
| boolean
|
|
5180
|
+
| {
|
|
5181
|
+
forceToAxis?: boolean;
|
|
5182
|
+
sensitivity?: number;
|
|
5183
|
+
releaseOnEdges?: boolean;
|
|
5184
|
+
};
|
|
5084
5185
|
|
|
5085
5186
|
/**
|
|
5086
5187
|
* Whether to enable keyboard control
|
|
5087
5188
|
*/
|
|
5088
5189
|
keyboard?:
|
|
5089
|
-
|
|
5090
|
-
|
|
5091
|
-
|
|
5092
|
-
|
|
5093
|
-
|
|
5094
|
-
|
|
5190
|
+
| boolean
|
|
5191
|
+
| {
|
|
5192
|
+
enabled?: boolean;
|
|
5193
|
+
onlyInViewport?: boolean;
|
|
5194
|
+
pageUpDown?: boolean;
|
|
5195
|
+
};
|
|
5095
5196
|
|
|
5096
5197
|
/**
|
|
5097
5198
|
* Whether to grab cursor on hover (default: true)
|
|
@@ -5154,16 +5255,16 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5154
5255
|
* Whether to free mode (no snap to slides)
|
|
5155
5256
|
*/
|
|
5156
5257
|
freeMode?:
|
|
5157
|
-
|
|
5158
|
-
|
|
5159
|
-
|
|
5160
|
-
|
|
5161
|
-
|
|
5162
|
-
|
|
5163
|
-
|
|
5164
|
-
|
|
5165
|
-
|
|
5166
|
-
|
|
5258
|
+
| boolean
|
|
5259
|
+
| {
|
|
5260
|
+
enabled?: boolean;
|
|
5261
|
+
sticky?: boolean;
|
|
5262
|
+
momentumRatio?: number;
|
|
5263
|
+
momentumVelocityRatio?: number;
|
|
5264
|
+
momentumBounce?: boolean;
|
|
5265
|
+
momentumBounceRatio?: number;
|
|
5266
|
+
minimumVelocity?: number;
|
|
5267
|
+
};
|
|
5167
5268
|
|
|
5168
5269
|
/**
|
|
5169
5270
|
* Whether to watch for slides and wrapper size changes
|
|
@@ -5199,23 +5300,23 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5199
5300
|
* Hash navigation
|
|
5200
5301
|
*/
|
|
5201
5302
|
hashNavigation?:
|
|
5202
|
-
|
|
5203
|
-
|
|
5204
|
-
|
|
5205
|
-
|
|
5206
|
-
|
|
5303
|
+
| boolean
|
|
5304
|
+
| {
|
|
5305
|
+
watchState?: boolean;
|
|
5306
|
+
replaceState?: boolean;
|
|
5307
|
+
};
|
|
5207
5308
|
|
|
5208
5309
|
/**
|
|
5209
5310
|
* History navigation
|
|
5210
5311
|
*/
|
|
5211
5312
|
history?:
|
|
5212
|
-
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5313
|
+
| boolean
|
|
5314
|
+
| {
|
|
5315
|
+
enabled?: boolean;
|
|
5316
|
+
root?: string;
|
|
5317
|
+
replaceState?: boolean;
|
|
5318
|
+
key?: string;
|
|
5319
|
+
};
|
|
5219
5320
|
|
|
5220
5321
|
/**
|
|
5221
5322
|
* Controller configuration
|
|
@@ -5230,16 +5331,16 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5230
5331
|
* A11y configuration
|
|
5231
5332
|
*/
|
|
5232
5333
|
a11y?:
|
|
5233
|
-
|
|
5234
|
-
|
|
5235
|
-
|
|
5236
|
-
|
|
5237
|
-
|
|
5238
|
-
|
|
5239
|
-
|
|
5240
|
-
|
|
5241
|
-
|
|
5242
|
-
|
|
5334
|
+
| boolean
|
|
5335
|
+
| {
|
|
5336
|
+
enabled?: boolean;
|
|
5337
|
+
prevSlideMessage?: string;
|
|
5338
|
+
nextSlideMessage?: string;
|
|
5339
|
+
firstSlideMessage?: string;
|
|
5340
|
+
lastSlideMessage?: string;
|
|
5341
|
+
paginationBulletMessage?: string;
|
|
5342
|
+
notificationClass?: string;
|
|
5343
|
+
};
|
|
5243
5344
|
|
|
5244
5345
|
/**
|
|
5245
5346
|
* Slide change callback
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { sanitizeCSVCell } from '../csv';
|
|
3
|
+
|
|
4
|
+
describe('sanitizeCSVCell', () => {
|
|
5
|
+
it('should handle normal strings', () => {
|
|
6
|
+
expect(sanitizeCSVCell('Hello World')).toBe('Hello World');
|
|
7
|
+
expect(sanitizeCSVCell('123')).toBe('123');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('should handle numbers', () => {
|
|
11
|
+
expect(sanitizeCSVCell(123)).toBe('123');
|
|
12
|
+
expect(sanitizeCSVCell(0)).toBe('0');
|
|
13
|
+
// Negative numbers are prefixed with ' to prevent potential formula injection
|
|
14
|
+
expect(sanitizeCSVCell(-1)).toBe("'-1");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should handle null and undefined', () => {
|
|
18
|
+
expect(sanitizeCSVCell(null)).toBe('');
|
|
19
|
+
expect(sanitizeCSVCell(undefined)).toBe('');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('should replace newlines and tabs with spaces', () => {
|
|
23
|
+
expect(sanitizeCSVCell('Hello\nWorld')).toBe('Hello World');
|
|
24
|
+
expect(sanitizeCSVCell('Hello\rWorld')).toBe('Hello World');
|
|
25
|
+
expect(sanitizeCSVCell('Hello\tWorld')).toBe('Hello World');
|
|
26
|
+
expect(sanitizeCSVCell('Hello\r\nWorld')).toBe('Hello World');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should escape double quotes', () => {
|
|
30
|
+
expect(sanitizeCSVCell('Hello "World"')).toBe('Hello ""World""');
|
|
31
|
+
expect(sanitizeCSVCell('"')).toBe('""');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should prevent formula injection', () => {
|
|
35
|
+
expect(sanitizeCSVCell('=SUM(A1:B1)')).toBe("'=SUM(A1:B1)");
|
|
36
|
+
expect(sanitizeCSVCell('+SUM(A1:B1)')).toBe("'+SUM(A1:B1)");
|
|
37
|
+
expect(sanitizeCSVCell('-SUM(A1:B1)')).toBe("'-SUM(A1:B1)");
|
|
38
|
+
expect(sanitizeCSVCell('@SUM(A1:B1)')).toBe("'@SUM(A1:B1)");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should handle mixed cases', () => {
|
|
42
|
+
// Dangerous character + quotes + newlines
|
|
43
|
+
expect(sanitizeCSVCell("=cmd|' /C calc'!A0\n")).toBe("'=cmd|' /C calc'!A0 ");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Component Utilities
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Helper functions for component development with the new customization system
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -39,7 +39,7 @@ export function createCSSVarStyle(
|
|
|
39
39
|
baseStyle?: React.CSSProperties
|
|
40
40
|
): React.CSSProperties {
|
|
41
41
|
if (!cssVars) return baseStyle || {};
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
const varStyle = cssVarsToStyle(cssVars);
|
|
44
44
|
return { ...varStyle, ...baseStyle };
|
|
45
45
|
}
|
|
@@ -102,11 +102,7 @@ export function createPartProps<T extends { className?: string; style?: React.CS
|
|
|
102
102
|
/**
|
|
103
103
|
* Check if component has customization
|
|
104
104
|
*/
|
|
105
|
-
export function hasCustomization(props: {
|
|
106
|
-
parts?: any;
|
|
107
|
-
cssVars?: any;
|
|
108
|
-
slots?: any;
|
|
109
|
-
}): boolean {
|
|
105
|
+
export function hasCustomization(props: { parts?: any; cssVars?: any; slots?: any }): boolean {
|
|
110
106
|
return Boolean(props.parts || props.cssVars || props.slots);
|
|
111
107
|
}
|
|
112
108
|
|
|
@@ -115,7 +111,7 @@ export function hasCustomization(props: {
|
|
|
115
111
|
*/
|
|
116
112
|
export function createDebugAttrs(componentName: string, variant?: string): Record<string, string> {
|
|
117
113
|
if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'development') return {};
|
|
118
|
-
|
|
114
|
+
|
|
119
115
|
return {
|
|
120
116
|
'data-component': componentName,
|
|
121
117
|
...(variant && { 'data-variant': variant }),
|
|
@@ -126,7 +122,7 @@ export function createDebugAttrs(componentName: string, variant?: string): Recor
|
|
|
126
122
|
* Generate a UUID v4
|
|
127
123
|
*/
|
|
128
124
|
export function generateUUID(): string {
|
|
129
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
|
|
125
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
|
130
126
|
const r = (Math.random() * 16) | 0;
|
|
131
127
|
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
132
128
|
return v.toString(16);
|
|
@@ -146,18 +142,18 @@ export function isYouTubeUrl(url: string): boolean {
|
|
|
146
142
|
*/
|
|
147
143
|
export function extractYouTubeId(url: string): string | null {
|
|
148
144
|
if (!isYouTubeUrl(url)) return null;
|
|
149
|
-
|
|
145
|
+
|
|
150
146
|
const patterns = [
|
|
151
147
|
/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\n?#]+)/,
|
|
152
148
|
/youtube\.com\/.*[?&]v=([^&\n?#]+)/,
|
|
153
149
|
];
|
|
154
|
-
|
|
150
|
+
|
|
155
151
|
for (const pattern of patterns) {
|
|
156
152
|
const match = url.match(pattern);
|
|
157
153
|
if (match && match[1]) {
|
|
158
154
|
return match[1];
|
|
159
155
|
}
|
|
160
156
|
}
|
|
161
|
-
|
|
157
|
+
|
|
162
158
|
return null;
|
|
163
159
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV Utility Functions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize cell content to prevent CSV injection
|
|
7
|
+
*
|
|
8
|
+
* Replaces newlines and tabs with spaces, escapes double quotes,
|
|
9
|
+
* and prefixes dangerous characters (=, +, -, @) with a single quote
|
|
10
|
+
* to prevent formula injection.
|
|
11
|
+
*/
|
|
12
|
+
export function sanitizeCSVCell(cell: any): string {
|
|
13
|
+
const sanitized = String(cell ?? '')
|
|
14
|
+
.replace(/[\r\n\t]/g, ' ')
|
|
15
|
+
.replace(/"/g, '""');
|
|
16
|
+
// Prevent formula injection by prefixing dangerous characters
|
|
17
|
+
const dangerous = /^[=+\-@]/;
|
|
18
|
+
return dangerous.test(sanitized) ? `'${sanitized}` : sanitized;
|
|
19
|
+
}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import { DataTableColumn, ExportFormat } from '../types/components';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Sanitize cell content to prevent CSV injection
|
|
5
|
-
*/
|
|
6
|
-
function sanitizeCSVCell(cell: any): string {
|
|
7
|
-
const sanitized = String(cell ?? '').replace(/[\r\n\t]/g, ' ').replace(/"/g, '""');
|
|
8
|
-
// Prevent formula injection by prefixing dangerous characters
|
|
9
|
-
const dangerous = /^[=+\-@]/;
|
|
10
|
-
return dangerous.test(sanitized) ? `'${sanitized}` : sanitized;
|
|
11
|
-
}
|
|
2
|
+
import { sanitizeCSVCell } from './csv';
|
|
12
3
|
|
|
13
4
|
/**
|
|
14
5
|
* Export data as CSV
|
|
@@ -55,10 +46,7 @@ export function exportToCSV(
|
|
|
55
46
|
/**
|
|
56
47
|
* Export data as JSON
|
|
57
48
|
*/
|
|
58
|
-
export function exportToJSON(
|
|
59
|
-
data: any[],
|
|
60
|
-
filename: string = 'data-table.json'
|
|
61
|
-
): void {
|
|
49
|
+
export function exportToJSON(data: any[], filename: string = 'data-table.json'): void {
|
|
62
50
|
if (!data.length) return;
|
|
63
51
|
|
|
64
52
|
const jsonContent = JSON.stringify(data, null, 2);
|
|
@@ -140,4 +128,3 @@ export function exportData(
|
|
|
140
128
|
console.warn(`Unsupported export format: ${format}`);
|
|
141
129
|
}
|
|
142
130
|
}
|
|
143
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Font Preloading Utilities
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Provides utilities for preloading fonts to improve performance
|
|
5
5
|
* and prevent Flash of Invisible Text (FOIT).
|
|
6
6
|
*/
|
|
@@ -34,10 +34,10 @@ export interface FontPreloadConfig {
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Creates a preload link element for a font
|
|
37
|
-
*
|
|
37
|
+
*
|
|
38
38
|
* @param config - Font preload configuration
|
|
39
39
|
* @returns HTML link element for preloading
|
|
40
|
-
*
|
|
40
|
+
*
|
|
41
41
|
* @example
|
|
42
42
|
* ```tsx
|
|
43
43
|
* const preloadLink = createFontPreloadLink({
|
|
@@ -49,11 +49,7 @@ export interface FontPreloadConfig {
|
|
|
49
49
|
* ```
|
|
50
50
|
*/
|
|
51
51
|
export function createFontPreloadLink(config: FontPreloadConfig): HTMLLinkElement {
|
|
52
|
-
const {
|
|
53
|
-
path,
|
|
54
|
-
format = 'woff2',
|
|
55
|
-
crossorigin = 'anonymous',
|
|
56
|
-
} = config;
|
|
52
|
+
const { path, format = 'woff2', crossorigin = 'anonymous' } = config;
|
|
57
53
|
|
|
58
54
|
const link = document.createElement('link');
|
|
59
55
|
link.rel = 'preload';
|
|
@@ -67,10 +63,10 @@ export function createFontPreloadLink(config: FontPreloadConfig): HTMLLinkElemen
|
|
|
67
63
|
|
|
68
64
|
/**
|
|
69
65
|
* Preloads multiple fonts
|
|
70
|
-
*
|
|
66
|
+
*
|
|
71
67
|
* @param fonts - Array of font configurations to preload
|
|
72
68
|
* @returns Array of created link elements
|
|
73
|
-
*
|
|
69
|
+
*
|
|
74
70
|
* @example
|
|
75
71
|
* ```tsx
|
|
76
72
|
* const links = preloadFonts([
|
|
@@ -87,10 +83,10 @@ export function preloadFonts(fonts: FontPreloadConfig[]): HTMLLinkElement[] {
|
|
|
87
83
|
/**
|
|
88
84
|
* Generates preload link HTML tags as strings
|
|
89
85
|
* Useful for server-side rendering or static HTML generation
|
|
90
|
-
*
|
|
86
|
+
*
|
|
91
87
|
* @param fonts - Array of font configurations
|
|
92
88
|
* @returns Array of HTML string representations
|
|
93
|
-
*
|
|
89
|
+
*
|
|
94
90
|
* @example
|
|
95
91
|
* ```tsx
|
|
96
92
|
* const htmlTags = generateFontPreloadTags([
|
|
@@ -100,12 +96,8 @@ export function preloadFonts(fonts: FontPreloadConfig[]): HTMLLinkElement[] {
|
|
|
100
96
|
* ```
|
|
101
97
|
*/
|
|
102
98
|
export function generateFontPreloadTags(fonts: FontPreloadConfig[]): string[] {
|
|
103
|
-
return fonts.map(
|
|
104
|
-
const {
|
|
105
|
-
path,
|
|
106
|
-
format = 'woff2',
|
|
107
|
-
crossorigin = 'anonymous',
|
|
108
|
-
} = config;
|
|
99
|
+
return fonts.map(config => {
|
|
100
|
+
const { path, format = 'woff2', crossorigin = 'anonymous' } = config;
|
|
109
101
|
|
|
110
102
|
return `<link rel="preload" as="font" href="${path}" type="font/${format}" crossorigin="${crossorigin}">`;
|
|
111
103
|
});
|
|
@@ -145,4 +137,3 @@ export const DEFAULT_ATOMIX_FONTS: FontPreloadConfig[] = [
|
|
|
145
137
|
format: 'woff2',
|
|
146
138
|
},
|
|
147
139
|
];
|
|
148
|
-
|
package/src/lib/utils/icons.ts
CHANGED
|
@@ -35,7 +35,10 @@ export function createPhosphorIcon(name: string, size: number = 16): string {
|
|
|
35
35
|
const path = ICON_PATHS[name] || '';
|
|
36
36
|
|
|
37
37
|
if (!path) {
|
|
38
|
-
console.warn(
|
|
38
|
+
console.warn(
|
|
39
|
+
'Icon not found in icon library:',
|
|
40
|
+
typeof name === 'string' ? name.replace(/[^a-zA-Z0-9_-]/g, '_') : 'invalid_name'
|
|
41
|
+
);
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" fill="currentColor" viewBox="0 0 256 256">
|
package/src/lib/utils/index.ts
CHANGED
|
@@ -16,9 +16,7 @@ export {
|
|
|
16
16
|
extractYouTubeId,
|
|
17
17
|
} from './componentUtils';
|
|
18
18
|
|
|
19
|
-
export type {
|
|
20
|
-
MergePropsOptions,
|
|
21
|
-
} from './componentUtils';
|
|
19
|
+
export type { MergePropsOptions } from './componentUtils';
|
|
22
20
|
|
|
23
21
|
export {
|
|
24
22
|
createFontPreloadLink,
|
|
@@ -27,6 +25,4 @@ export {
|
|
|
27
25
|
DEFAULT_ATOMIX_FONTS,
|
|
28
26
|
} from './fontPreloader';
|
|
29
27
|
|
|
30
|
-
export type {
|
|
31
|
-
FontPreloadConfig,
|
|
32
|
-
} from './fontPreloader';
|
|
28
|
+
export type { FontPreloadConfig } from './fontPreloader';
|