@shohojdhara/atomix 0.3.15 → 0.4.1
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 +20234 -2027
- 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 +4 -5
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +87 -10
- package/dist/core.js +673 -480
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +15 -3
- package/dist/forms.js +530 -97
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js +5 -6
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +644 -277
- package/dist/index.esm.js +1948 -1347
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +3333 -2728
- 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 +2 -2
- package/scripts/atomix-cli.js +10 -1
- package/scripts/cli/__tests__/utils.test.js +6 -2
- package/scripts/cli/migration-tools.js +2 -2
- package/scripts/cli/theme-bridge.js +7 -9
- package/scripts/cli/utils.js +2 -1
- package/src/components/Accordion/Accordion.stories.tsx +72 -23
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +219 -96
- package/src/components/Accordion/AccordionCompound.test.tsx +70 -0
- 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 +173 -65
- package/src/components/Breadcrumb/BreadcrumbCompound.test.tsx +84 -0
- 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 +166 -918
- package/src/components/Callout/Callout.tsx +196 -84
- package/src/components/Callout/CalloutCompound.test.tsx +72 -0
- 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 +425 -298
- package/src/components/Dropdown/DropdownCompound.test.tsx +64 -0
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +163 -113
- package/src/components/EdgePanel/EdgePanelCompound.test.tsx +53 -0
- 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.stories.tsx +23 -0
- package/src/components/Form/Select.test.tsx +99 -0
- package/src/components/Form/Select.tsx +239 -186
- package/src/components/Form/SelectOption.tsx +88 -0
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +93 -23
- package/src/components/Hero/Hero.test.tsx +142 -0
- package/src/components/Hero/Hero.tsx +343 -58
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.test.tsx +62 -0
- package/src/components/List/List.tsx +32 -25
- package/src/components/List/ListItem.tsx +20 -0
- package/src/components/Modal/Modal.stories.tsx +67 -2
- package/src/components/Modal/Modal.tsx +208 -125
- package/src/components/Modal/ModalCompound.test.tsx +94 -0
- 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/Steps/Steps.tsx +124 -21
- package/src/components/Steps/StepsCompound.test.tsx +81 -0
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +230 -75
- package/src/components/Tabs/TabsCompound.test.tsx +64 -0
- 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/index.ts +0 -4
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +102 -60
- 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 +105 -111
- 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 +180 -73
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/componentUtils.test.ts +57 -2
- package/src/lib/utils/__tests__/csv.test.ts +1 -1
- package/src/lib/utils/__tests__/themeNaming.test.ts +117 -0
- 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 +3 -3
- 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.breakpoints.scss +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +36 -24
- 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 -47
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
|
|
@@ -331,7 +375,7 @@ export type StateModifier =
|
|
|
331
375
|
*/
|
|
332
376
|
export type IconPosition = 'left' | 'right';
|
|
333
377
|
|
|
334
|
-
export type listvariant = 'dash' | 'number' | 'text';
|
|
378
|
+
export type listvariant = 'dash' | 'number' | 'text' | 'default';
|
|
335
379
|
/**;
|
|
336
380
|
* List component properties
|
|
337
381
|
*/
|
|
@@ -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,23 @@ 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;
|
|
1143
|
+
|
|
1144
|
+
/**
|
|
1145
|
+
* Custom background element to render behind the content
|
|
1146
|
+
* @example <Hero.Background src="..." />
|
|
1147
|
+
*/
|
|
1148
|
+
backgroundElement?: ReactNode;
|
|
1042
1149
|
}
|
|
1043
1150
|
|
|
1044
1151
|
/**
|
|
@@ -1468,16 +1575,16 @@ export interface SideMenuProps extends BaseComponentProps {
|
|
|
1468
1575
|
active?: boolean | undefined;
|
|
1469
1576
|
disabled?: boolean | undefined;
|
|
1470
1577
|
as?:
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1578
|
+
| React.ComponentType<{
|
|
1579
|
+
href?: string;
|
|
1580
|
+
to?: string;
|
|
1581
|
+
children: React.ReactNode;
|
|
1582
|
+
className?: string;
|
|
1583
|
+
onClick?: (event: React.MouseEvent) => void;
|
|
1584
|
+
target?: string;
|
|
1585
|
+
rel?: string;
|
|
1586
|
+
}>
|
|
1587
|
+
| undefined;
|
|
1481
1588
|
}>;
|
|
1482
1589
|
}>;
|
|
1483
1590
|
}
|
|
@@ -2339,7 +2446,7 @@ export interface SelectProps extends BaseComponentProps {
|
|
|
2339
2446
|
/**
|
|
2340
2447
|
* Select options
|
|
2341
2448
|
*/
|
|
2342
|
-
options
|
|
2449
|
+
options?: SelectOption[];
|
|
2343
2450
|
|
|
2344
2451
|
/**
|
|
2345
2452
|
* Selected value(s)
|
|
@@ -3677,17 +3784,17 @@ export interface VideoPlayerProps extends BaseComponentProps {
|
|
|
3677
3784
|
* - object: Custom glass configuration
|
|
3678
3785
|
*/
|
|
3679
3786
|
glass?:
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
3690
|
-
|
|
3787
|
+
| boolean
|
|
3788
|
+
| {
|
|
3789
|
+
displacementScale?: number;
|
|
3790
|
+
blurAmount?: number;
|
|
3791
|
+
saturation?: number;
|
|
3792
|
+
aberrationIntensity?: number;
|
|
3793
|
+
elasticity?: number;
|
|
3794
|
+
cornerRadius?: number;
|
|
3795
|
+
mode?: 'standard' | 'polar' | 'prominent' | 'shader';
|
|
3796
|
+
overLight?: boolean;
|
|
3797
|
+
};
|
|
3691
3798
|
|
|
3692
3799
|
/**
|
|
3693
3800
|
* Glass overlay opacity (0-1) when glass variant is enabled
|
|
@@ -5075,23 +5182,23 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5075
5182
|
* Whether to enable mouse wheel control
|
|
5076
5183
|
*/
|
|
5077
5184
|
mousewheel?:
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5185
|
+
| boolean
|
|
5186
|
+
| {
|
|
5187
|
+
forceToAxis?: boolean;
|
|
5188
|
+
sensitivity?: number;
|
|
5189
|
+
releaseOnEdges?: boolean;
|
|
5190
|
+
};
|
|
5084
5191
|
|
|
5085
5192
|
/**
|
|
5086
5193
|
* Whether to enable keyboard control
|
|
5087
5194
|
*/
|
|
5088
5195
|
keyboard?:
|
|
5089
|
-
|
|
5090
|
-
|
|
5091
|
-
|
|
5092
|
-
|
|
5093
|
-
|
|
5094
|
-
|
|
5196
|
+
| boolean
|
|
5197
|
+
| {
|
|
5198
|
+
enabled?: boolean;
|
|
5199
|
+
onlyInViewport?: boolean;
|
|
5200
|
+
pageUpDown?: boolean;
|
|
5201
|
+
};
|
|
5095
5202
|
|
|
5096
5203
|
/**
|
|
5097
5204
|
* Whether to grab cursor on hover (default: true)
|
|
@@ -5154,16 +5261,16 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5154
5261
|
* Whether to free mode (no snap to slides)
|
|
5155
5262
|
*/
|
|
5156
5263
|
freeMode?:
|
|
5157
|
-
|
|
5158
|
-
|
|
5159
|
-
|
|
5160
|
-
|
|
5161
|
-
|
|
5162
|
-
|
|
5163
|
-
|
|
5164
|
-
|
|
5165
|
-
|
|
5166
|
-
|
|
5264
|
+
| boolean
|
|
5265
|
+
| {
|
|
5266
|
+
enabled?: boolean;
|
|
5267
|
+
sticky?: boolean;
|
|
5268
|
+
momentumRatio?: number;
|
|
5269
|
+
momentumVelocityRatio?: number;
|
|
5270
|
+
momentumBounce?: boolean;
|
|
5271
|
+
momentumBounceRatio?: number;
|
|
5272
|
+
minimumVelocity?: number;
|
|
5273
|
+
};
|
|
5167
5274
|
|
|
5168
5275
|
/**
|
|
5169
5276
|
* Whether to watch for slides and wrapper size changes
|
|
@@ -5199,23 +5306,23 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5199
5306
|
* Hash navigation
|
|
5200
5307
|
*/
|
|
5201
5308
|
hashNavigation?:
|
|
5202
|
-
|
|
5203
|
-
|
|
5204
|
-
|
|
5205
|
-
|
|
5206
|
-
|
|
5309
|
+
| boolean
|
|
5310
|
+
| {
|
|
5311
|
+
watchState?: boolean;
|
|
5312
|
+
replaceState?: boolean;
|
|
5313
|
+
};
|
|
5207
5314
|
|
|
5208
5315
|
/**
|
|
5209
5316
|
* History navigation
|
|
5210
5317
|
*/
|
|
5211
5318
|
history?:
|
|
5212
|
-
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5319
|
+
| boolean
|
|
5320
|
+
| {
|
|
5321
|
+
enabled?: boolean;
|
|
5322
|
+
root?: string;
|
|
5323
|
+
replaceState?: boolean;
|
|
5324
|
+
key?: string;
|
|
5325
|
+
};
|
|
5219
5326
|
|
|
5220
5327
|
/**
|
|
5221
5328
|
* Controller configuration
|
|
@@ -5230,16 +5337,16 @@ export interface SliderProps extends BaseComponentProps {
|
|
|
5230
5337
|
* A11y configuration
|
|
5231
5338
|
*/
|
|
5232
5339
|
a11y?:
|
|
5233
|
-
|
|
5234
|
-
|
|
5235
|
-
|
|
5236
|
-
|
|
5237
|
-
|
|
5238
|
-
|
|
5239
|
-
|
|
5240
|
-
|
|
5241
|
-
|
|
5242
|
-
|
|
5340
|
+
| boolean
|
|
5341
|
+
| {
|
|
5342
|
+
enabled?: boolean;
|
|
5343
|
+
prevSlideMessage?: string;
|
|
5344
|
+
nextSlideMessage?: string;
|
|
5345
|
+
firstSlideMessage?: string;
|
|
5346
|
+
lastSlideMessage?: string;
|
|
5347
|
+
paginationBulletMessage?: string;
|
|
5348
|
+
notificationClass?: string;
|
|
5349
|
+
};
|
|
5243
5350
|
|
|
5244
5351
|
/**
|
|
5245
5352
|
* Slide change callback
|
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
applyPartStyles,
|
|
5
5
|
createCSSVarStyle,
|
|
6
6
|
mergeComponentProps,
|
|
7
|
+
isYouTubeUrl,
|
|
8
|
+
extractYouTubeId,
|
|
7
9
|
} from '../componentUtils';
|
|
8
10
|
|
|
9
11
|
describe('componentUtils', () => {
|
|
@@ -58,6 +60,7 @@ describe('componentUtils', () => {
|
|
|
58
60
|
className: 'base custom',
|
|
59
61
|
id: 'test',
|
|
60
62
|
'data-test': 'value',
|
|
63
|
+
style: {},
|
|
61
64
|
});
|
|
62
65
|
});
|
|
63
66
|
});
|
|
@@ -94,8 +97,8 @@ describe('componentUtils', () => {
|
|
|
94
97
|
};
|
|
95
98
|
const result = createCSSVarStyle(cssVars);
|
|
96
99
|
expect(result).toEqual({
|
|
97
|
-
'--atomix-button-padding-x':
|
|
98
|
-
'--atomix-button-padding-y':
|
|
100
|
+
'--atomix-button-padding-x': '16px',
|
|
101
|
+
'--atomix-button-padding-y': '8px',
|
|
99
102
|
});
|
|
100
103
|
});
|
|
101
104
|
|
|
@@ -141,4 +144,56 @@ describe('componentUtils', () => {
|
|
|
141
144
|
expect(result).toEqual(baseProps);
|
|
142
145
|
});
|
|
143
146
|
});
|
|
147
|
+
|
|
148
|
+
describe('isYouTubeUrl', () => {
|
|
149
|
+
it('should return true for standard YouTube URLs', () => {
|
|
150
|
+
expect(isYouTubeUrl('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
|
|
151
|
+
expect(isYouTubeUrl('http://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
|
|
152
|
+
expect(isYouTubeUrl('www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
|
|
153
|
+
expect(isYouTubeUrl('youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should return true for shortened YouTube URLs', () => {
|
|
157
|
+
expect(isYouTubeUrl('https://youtu.be/dQw4w9WgXcQ')).toBe(true);
|
|
158
|
+
expect(isYouTubeUrl('http://youtu.be/dQw4w9WgXcQ')).toBe(true);
|
|
159
|
+
expect(isYouTubeUrl('youtu.be/dQw4w9WgXcQ')).toBe(true);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('should return true for embed YouTube URLs', () => {
|
|
163
|
+
expect(isYouTubeUrl('https://www.youtube.com/embed/dQw4w9WgXcQ')).toBe(true);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('should return false for non-YouTube URLs', () => {
|
|
167
|
+
expect(isYouTubeUrl('https://vimeo.com/12345')).toBe(false);
|
|
168
|
+
expect(isYouTubeUrl('https://google.com')).toBe(false);
|
|
169
|
+
expect(isYouTubeUrl('random string')).toBe(false);
|
|
170
|
+
expect(isYouTubeUrl('')).toBe(false);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe('extractYouTubeId', () => {
|
|
175
|
+
it('should extract ID from standard YouTube URLs', () => {
|
|
176
|
+
expect(extractYouTubeId('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe('dQw4w9WgXcQ');
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('should extract ID from shortened YouTube URLs', () => {
|
|
180
|
+
expect(extractYouTubeId('https://youtu.be/dQw4w9WgXcQ')).toBe('dQw4w9WgXcQ');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('should extract ID from embed YouTube URLs', () => {
|
|
184
|
+
expect(extractYouTubeId('https://www.youtube.com/embed/dQw4w9WgXcQ')).toBe('dQw4w9WgXcQ');
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('should extract ID with additional query parameters', () => {
|
|
188
|
+
expect(extractYouTubeId('https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be')).toBe(
|
|
189
|
+
'dQw4w9WgXcQ'
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should return null for non-YouTube URLs', () => {
|
|
194
|
+
expect(extractYouTubeId('https://vimeo.com/12345')).toBe(null);
|
|
195
|
+
expect(extractYouTubeId('https://google.com')).toBe(null);
|
|
196
|
+
expect(extractYouTubeId('')).toBe(null);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
144
199
|
});
|
|
@@ -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
|
});
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import { ThemeNaming } from '../themeNaming';
|
|
3
|
+
|
|
4
|
+
describe('ThemeNaming', () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
// Reset prefix to default after each test
|
|
7
|
+
ThemeNaming.setPrefix('atomix');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('setPrefix / getPrefix', () => {
|
|
11
|
+
it('should have default prefix "atomix"', () => {
|
|
12
|
+
expect(ThemeNaming.getPrefix()).toBe('atomix');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should update prefix', () => {
|
|
16
|
+
ThemeNaming.setPrefix('custom');
|
|
17
|
+
expect(ThemeNaming.getPrefix()).toBe('custom');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe('camelToKebab', () => {
|
|
22
|
+
it('should convert camelCase to kebab-case', () => {
|
|
23
|
+
expect(ThemeNaming.camelToKebab('camelCase')).toBe('camel-case');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should handle PascalCase', () => {
|
|
27
|
+
expect(ThemeNaming.camelToKebab('PascalCase')).toBe('pascal-case');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should handle simple strings', () => {
|
|
31
|
+
expect(ThemeNaming.camelToKebab('simple')).toBe('simple');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should handle empty string', () => {
|
|
35
|
+
expect(ThemeNaming.camelToKebab('')).toBe('');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('kebabToCamel', () => {
|
|
40
|
+
it('should convert kebab-case to camelCase', () => {
|
|
41
|
+
expect(ThemeNaming.kebabToCamel('kebab-case')).toBe('kebabCase');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should handle simple strings', () => {
|
|
45
|
+
expect(ThemeNaming.kebabToCamel('simple')).toBe('simple');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should handle empty string', () => {
|
|
49
|
+
expect(ThemeNaming.kebabToCamel('')).toBe('');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe('cssVar', () => {
|
|
54
|
+
it('should create CSS variable with default prefix', () => {
|
|
55
|
+
expect(ThemeNaming.cssVar('tokenName')).toBe('--atomix-token-name');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should create CSS variable with custom prefix', () => {
|
|
59
|
+
ThemeNaming.setPrefix('custom');
|
|
60
|
+
expect(ThemeNaming.cssVar('tokenName')).toBe('--custom-token-name');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('bemClass', () => {
|
|
65
|
+
it('should create block class', () => {
|
|
66
|
+
expect(ThemeNaming.bemClass('block')).toBe('c-block');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should create block element class', () => {
|
|
70
|
+
expect(ThemeNaming.bemClass('block', 'element')).toBe('c-block__element');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should create block modifier class', () => {
|
|
74
|
+
expect(ThemeNaming.bemClass('block', undefined, 'mod')).toBe('c-block--mod');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('should create block element modifier class', () => {
|
|
78
|
+
expect(ThemeNaming.bemClass('block', 'element', 'mod')).toBe('c-block__element--mod');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('variantClass', () => {
|
|
83
|
+
it('should create variant class', () => {
|
|
84
|
+
expect(ThemeNaming.variantClass('button', 'primary')).toBe('c-button--primary');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('sizeClass', () => {
|
|
89
|
+
it('should create size class', () => {
|
|
90
|
+
expect(ThemeNaming.sizeClass('button', 'lg')).toBe('c-button--lg');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('stateClass', () => {
|
|
95
|
+
it('should create state class', () => {
|
|
96
|
+
expect(ThemeNaming.stateClass('input', 'disabled')).toBe('c-input--disabled');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe('utilityClass', () => {
|
|
101
|
+
it('should create utility class', () => {
|
|
102
|
+
expect(ThemeNaming.utilityClass('flex')).toBe('u-flex');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('layoutClass', () => {
|
|
107
|
+
it('should create layout class', () => {
|
|
108
|
+
expect(ThemeNaming.layoutClass('grid')).toBe('l-grid');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe('objectClass', () => {
|
|
113
|
+
it('should create object class', () => {
|
|
114
|
+
expect(ThemeNaming.objectClass('container')).toBe('o-container');
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -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
|
}
|