@shohojdhara/atomix 0.3.15 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build-tools/index.d.ts +31 -30
- package/build-tools/package.json +4 -21
- package/dist/atomix.css +20924 -2611
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +76 -2
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/index.d.ts +31 -30
- package/dist/build-tools/package.json +4 -21
- package/dist/charts.js.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +144 -18
- package/dist/index.esm.js +110 -55
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +110 -55
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.stories.tsx +32 -23
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/glass-utils.ts +4 -3
- package/src/components/AtomixGlass/shader-utils.ts +128 -52
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
- package/src/components/Avatar/Avatar.stories.tsx +45 -62
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +20 -9
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +14 -4
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +13 -22
- package/src/components/Button/Button.test.tsx +97 -81
- package/src/components/Button/Button.tsx +46 -14
- package/src/components/Button/ButtonGroup.stories.tsx +37 -32
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +109 -16
- package/src/components/Card/Card.stories.tsx +67 -36
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +4 -9
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +7 -7
- package/src/components/DataTable/DataTable.stories.tsx +43 -38
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +21 -16
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.test.tsx +49 -49
- package/src/components/Form/Checkbox.tsx +108 -100
- package/src/components/Form/Form.stories.tsx +2 -10
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +6 -12
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +56 -23
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +2 -1
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +99 -192
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +35 -44
- package/src/components/River/River.stories.tsx +2 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +3 -1
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +8 -6
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Toggle/Toggle.stories.tsx +27 -13
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +129 -127
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/__tests__/theme-tools.test.ts +32 -6
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +106 -49
- package/src/lib/composables/useChartExport.ts +1 -1
- package/src/lib/composables/useDataTable.ts +29 -17
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +106 -104
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +1 -1
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +3 -1
- package/src/lib/utils/dataTableExport.ts +1 -5
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +0 -1
- package/src/styles/01-settings/_settings.colors.scss +8 -8
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +30 -18
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +3 -1
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +1 -1
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
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
|
|
@@ -40,6 +40,6 @@ describe('sanitizeCSVCell', () => {
|
|
|
40
40
|
|
|
41
41
|
it('should handle mixed cases', () => {
|
|
42
42
|
// Dangerous character + quotes + newlines
|
|
43
|
-
expect(sanitizeCSVCell(
|
|
43
|
+
expect(sanitizeCSVCell("=cmd|' /C calc'!A0\n")).toBe("'=cmd|' /C calc'!A0 ");
|
|
44
44
|
});
|
|
45
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
|
}
|
package/src/lib/utils/csv.ts
CHANGED
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* to prevent formula injection.
|
|
11
11
|
*/
|
|
12
12
|
export function sanitizeCSVCell(cell: any): string {
|
|
13
|
-
const sanitized = String(cell ?? '')
|
|
13
|
+
const sanitized = String(cell ?? '')
|
|
14
|
+
.replace(/[\r\n\t]/g, ' ')
|
|
15
|
+
.replace(/"/g, '""');
|
|
14
16
|
// Prevent formula injection by prefixing dangerous characters
|
|
15
17
|
const dangerous = /^[=+\-@]/;
|
|
16
18
|
return dangerous.test(sanitized) ? `'${sanitized}` : sanitized;
|
|
@@ -46,10 +46,7 @@ export function exportToCSV(
|
|
|
46
46
|
/**
|
|
47
47
|
* Export data as JSON
|
|
48
48
|
*/
|
|
49
|
-
export function exportToJSON(
|
|
50
|
-
data: any[],
|
|
51
|
-
filename: string = 'data-table.json'
|
|
52
|
-
): void {
|
|
49
|
+
export function exportToJSON(data: any[], filename: string = 'data-table.json'): void {
|
|
53
50
|
if (!data.length) return;
|
|
54
51
|
|
|
55
52
|
const jsonContent = JSON.stringify(data, null, 2);
|
|
@@ -131,4 +128,3 @@ export function exportData(
|
|
|
131
128
|
console.warn(`Unsupported export format: ${format}`);
|
|
132
129
|
}
|
|
133
130
|
}
|
|
134
|
-
|
|
@@ -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';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Memory Monitoring Utilities
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Detects memory leaks and tracks component lifecycle memory usage
|
|
5
5
|
* Only available in development mode
|
|
6
6
|
*/
|
|
@@ -40,7 +40,7 @@ export function isMemoryMonitoringAvailable(): boolean {
|
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
* Get current memory usage snapshot
|
|
43
|
-
*
|
|
43
|
+
*
|
|
44
44
|
* @returns Memory snapshot or null if not available
|
|
45
45
|
*/
|
|
46
46
|
export function getMemorySnapshot(): MemorySnapshot | null {
|
|
@@ -60,7 +60,7 @@ export function getMemorySnapshot(): MemorySnapshot | null {
|
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
* Format bytes to human-readable string
|
|
63
|
-
*
|
|
63
|
+
*
|
|
64
64
|
* @param bytes - Number of bytes
|
|
65
65
|
* @returns Formatted string (e.g., "1.5 MB")
|
|
66
66
|
*/
|
|
@@ -76,7 +76,7 @@ export function formatBytes(bytes: number): string {
|
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
78
|
* Compare two memory snapshots and detect potential leaks
|
|
79
|
-
*
|
|
79
|
+
*
|
|
80
80
|
* @param before - Snapshot before operation
|
|
81
81
|
* @param after - Snapshot after operation
|
|
82
82
|
* @param threshold - Threshold in bytes to consider a leak (default: 5MB)
|
|
@@ -114,7 +114,7 @@ export function detectMemoryLeak(
|
|
|
114
114
|
|
|
115
115
|
/**
|
|
116
116
|
* Monitor memory usage over time
|
|
117
|
-
*
|
|
117
|
+
*
|
|
118
118
|
* @param interval - Interval in milliseconds to check memory
|
|
119
119
|
* @param callback - Callback function called with each snapshot
|
|
120
120
|
* @returns Function to stop monitoring
|
|
@@ -156,7 +156,7 @@ export function monitorMemoryUsage(
|
|
|
156
156
|
|
|
157
157
|
/**
|
|
158
158
|
* Track component lifecycle memory usage
|
|
159
|
-
*
|
|
159
|
+
*
|
|
160
160
|
* @param componentName - Name of the component
|
|
161
161
|
* @returns Object with start and end tracking functions
|
|
162
162
|
*/
|
|
@@ -175,7 +175,10 @@ export function trackComponentMemory(componentName: string) {
|
|
|
175
175
|
const after = getMemorySnapshot();
|
|
176
176
|
if (before && after) {
|
|
177
177
|
const leakInfo = detectMemoryLeak(before, after);
|
|
178
|
-
if (
|
|
178
|
+
if (
|
|
179
|
+
leakInfo.hasLeak &&
|
|
180
|
+
(typeof process === 'undefined' || process.env?.NODE_ENV === 'development')
|
|
181
|
+
) {
|
|
179
182
|
console.warn(
|
|
180
183
|
`[Memory Monitor] Potential memory leak detected in ${componentName}:`,
|
|
181
184
|
leakInfo
|
|
@@ -186,4 +189,3 @@ export function trackComponentMemory(componentName: string) {
|
|
|
186
189
|
},
|
|
187
190
|
};
|
|
188
191
|
}
|
|
189
|
-
|