@shohojdhara/atomix 0.3.4 → 0.3.5
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/dist/atomix.css +9 -10
- package/dist/atomix.css.map +1 -0
- package/dist/atomix.min.css +15108 -11
- package/dist/atomix.min.css.map +1 -0
- package/dist/charts.d.ts +1929 -0
- package/dist/charts.js +6482 -0
- package/dist/charts.js.map +1 -0
- package/dist/core.d.ts +1289 -0
- package/dist/core.js +3357 -0
- package/dist/core.js.map +1 -0
- package/dist/forms.d.ts +1085 -0
- package/dist/forms.js +2450 -0
- package/dist/forms.js.map +1 -0
- package/dist/heavy.d.ts +636 -0
- package/dist/heavy.js +4550 -0
- package/dist/heavy.js.map +1 -0
- package/dist/index.d.ts +5161 -4990
- package/dist/index.esm.js +1457 -784
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1473 -790
- 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.d.ts +300 -0
- package/dist/layout.js +336 -0
- package/dist/layout.js.map +1 -0
- package/dist/theme.d.ts +1992 -0
- package/dist/theme.js +5348 -0
- package/dist/theme.js.map +1 -0
- package/package.json +66 -20
- package/scripts/atomix-cli.js +544 -16
- package/scripts/cli/__tests__/cli-commands.test.js +204 -0
- package/scripts/cli/__tests__/utils.test.js +201 -0
- package/scripts/cli/__tests__/vitest.config.js +26 -0
- package/scripts/cli/interactive-init.js +1 -1
- package/scripts/cli/token-manager.js +32 -7
- package/scripts/cli/utils.js +347 -0
- package/src/components/Accordion/Accordion.tsx +5 -54
- package/src/components/Accordion/index.ts +1 -1
- package/src/components/Avatar/Avatar.tsx +3 -3
- package/src/components/Badge/Badge.tsx +3 -3
- package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
- package/src/components/Card/ElevationCard.tsx +1 -1
- package/src/components/Chart/AnimatedChart.tsx +19 -17
- package/src/components/Chart/AreaChart.tsx +5 -1
- package/src/components/Chart/BarChart.tsx +1 -0
- package/src/components/Chart/BubbleChart.tsx +6 -5
- package/src/components/Chart/ChartToolbar.tsx +1 -0
- package/src/components/Chart/FunnelChart.tsx +1 -1
- package/src/components/Chart/RadarChart.tsx +19 -12
- package/src/components/Chart/ScatterChart.tsx +3 -3
- package/src/components/Chart/TreemapChart.tsx +2 -1
- package/src/components/Chart/WaterfallChart.tsx +0 -1
- package/src/components/Chart/types.ts +12 -2
- package/src/components/Chart/utils.ts +4 -3
- package/src/components/DataTable/DataTable.tsx +3 -3
- package/src/components/Dropdown/Dropdown.tsx +12 -9
- package/src/components/Footer/FooterSection.tsx +3 -3
- package/src/components/Form/Checkbox.tsx +3 -3
- package/src/components/Form/Input.tsx +4 -2
- package/src/components/Form/Radio.tsx +3 -3
- package/src/components/Form/Select.tsx +3 -3
- package/src/components/Form/Textarea.tsx +4 -2
- package/src/components/List/List.stories.tsx +3 -3
- package/src/components/List/List.tsx +3 -3
- package/src/components/List/ListGroup.tsx +3 -1
- package/src/components/Modal/Modal.tsx +3 -3
- package/src/components/Navigation/Menu/MegaMenu.tsx +9 -3
- package/src/components/Navigation/Menu/Menu.tsx +9 -3
- package/src/components/Pagination/Pagination.tsx +6 -5
- package/src/components/PhotoViewer/PhotoViewerImage.tsx +2 -2
- package/src/components/Popover/Popover.tsx +4 -4
- package/src/components/Progress/Progress.tsx +6 -2
- package/src/components/Rating/Rating.tsx +5 -2
- package/src/components/Slider/Slider.tsx +10 -9
- package/src/components/Spinner/Spinner.tsx +3 -3
- package/src/components/Tabs/Tabs.tsx +3 -3
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/index.ts +5 -2
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +2 -2
- package/src/lib/composables/useChartPerformance.ts +102 -78
- package/src/lib/composables/useChartScale.ts +10 -0
- package/src/lib/composables/useHero.ts +9 -2
- package/src/lib/composables/useHeroBackgroundSlider.ts +5 -3
- package/src/lib/composables/useSideMenu.ts +1 -0
- package/src/lib/composables/useVideoPlayer.ts +3 -2
- package/src/lib/config/loader.ts +55 -13
- package/src/lib/hooks/index.ts +0 -1
- package/src/lib/hooks/useComponentCustomization.ts +10 -14
- package/src/lib/hooks/usePerformanceMonitor.ts +149 -0
- package/src/lib/patterns/index.ts +2 -2
- package/src/lib/patterns/slots.tsx +2 -2
- package/src/lib/theme/composeTheme.ts +1 -1
- package/src/lib/theme/core/ThemeEngine.ts +8 -0
- package/src/lib/theme/core/ThemeValidator.ts +5 -2
- package/src/lib/theme/devtools/Inspector.tsx +1 -1
- package/src/lib/theme/devtools/LiveEditor.tsx +11 -5
- package/src/lib/theme/generateCSSVariables.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +2 -1
- package/src/lib/theme/runtime/ThemeApplicator.ts +28 -11
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +3 -3
- package/src/lib/theme/runtime/ThemeManager.ts +4 -0
- package/src/lib/theme-tools.ts +1 -1
- package/src/lib/types/components.ts +183 -34
- package/src/lib/types/partProps.ts +0 -16
- package/src/lib/utils/fontPreloader.ts +148 -0
- package/src/lib/utils/index.ts +11 -0
- package/src/lib/utils/memoryMonitor.ts +189 -0
- package/src/styles/01-settings/_settings.fonts.scss +2 -5
- package/src/styles/03-generic/_generated-root.css +22 -1
- package/src/styles/06-components/_components.navbar.scss +0 -6
- package/src/themes/themes.config.js +37 -4
- package/scripts/build-themes.js +0 -208
- package/src/components/AtomixGlass/atomixGLass.old.tsx +0 -1263
package/dist/index.esm.js
CHANGED
|
@@ -1542,14 +1542,14 @@ function useAccordion(initialProps) {
|
|
|
1542
1542
|
};
|
|
1543
1543
|
// Controlled/uncontrolled open state
|
|
1544
1544
|
/**
|
|
1545
|
-
|
|
1546
|
-
|
|
1545
|
+
* Effect to update panel height when open state changes
|
|
1546
|
+
*/
|
|
1547
1547
|
return useEffect((() => {
|
|
1548
1548
|
updatePanelHeight();
|
|
1549
1549
|
}), [ isOpen ]),
|
|
1550
1550
|
/**
|
|
1551
|
-
|
|
1552
|
-
|
|
1551
|
+
* Effect to handle window resize and update panel height
|
|
1552
|
+
*/
|
|
1553
1553
|
useEffect((() => {
|
|
1554
1554
|
const handleResize = () => {
|
|
1555
1555
|
isOpen && updatePanelHeight();
|
|
@@ -1638,7 +1638,7 @@ const {CONSTANTS: CONSTANTS$1} = ATOMIX_GLASS, calculateDistance = (pos1, pos2)
|
|
|
1638
1638
|
const childArray = React.Children.toArray(children);
|
|
1639
1639
|
for (let i = 0; i < childArray.length; i++) {
|
|
1640
1640
|
const child = childArray[i];
|
|
1641
|
-
if (React.isValidElement(child)) {
|
|
1641
|
+
if ( React.isValidElement(child)) {
|
|
1642
1642
|
const radius = extractBorderRadiusFromElement(child);
|
|
1643
1643
|
if (null !== radius) return radius;
|
|
1644
1644
|
}
|
|
@@ -1806,7 +1806,7 @@ const {CONSTANTS: CONSTANTS$1} = ATOMIX_GLASS, calculateDistance = (pos1, pos2)
|
|
|
1806
1806
|
*/ GlassFilterComponent.displayName = "GlassFilter";
|
|
1807
1807
|
|
|
1808
1808
|
// Memoize component to prevent unnecessary re-renders
|
|
1809
|
-
const GlassFilter =
|
|
1809
|
+
const GlassFilter = memo(GlassFilterComponent, ((prevProps, nextProps) => prevProps.id === nextProps.id && prevProps.displacementScale === nextProps.displacementScale && prevProps.aberrationIntensity === nextProps.aberrationIntensity && prevProps.mode === nextProps.mode && prevProps.shaderMapUrl === nextProps.shaderMapUrl && prevProps.blurAmount === nextProps.blurAmount)), sharedShaderCache = new Map, AtomixGlassContainer = forwardRef((({children: children, className: className = "", style: style, displacementScale: displacementScale = 25, blurAmount: blurAmount = .0625, saturation: saturation = 180, aberrationIntensity: aberrationIntensity = 2, mouseOffset: mouseOffset = {
|
|
1810
1810
|
x: 0,
|
|
1811
1811
|
y: 0
|
|
1812
1812
|
}, globalMousePosition: globalMousePosition = {
|
|
@@ -2068,8 +2068,8 @@ class {
|
|
|
2068
2068
|
y: 0
|
|
2069
2069
|
}, this.rafId = null, this.lastEvent = null, this.isTracking = !1,
|
|
2070
2070
|
/**
|
|
2071
|
-
|
|
2072
|
-
|
|
2071
|
+
* Handle mouse move event
|
|
2072
|
+
*/
|
|
2073
2073
|
this.handleMouseMove = e => {
|
|
2074
2074
|
this.lastEvent = e,
|
|
2075
2075
|
// Use requestAnimationFrame to throttle updates
|
|
@@ -2090,10 +2090,10 @@ class {
|
|
|
2090
2090
|
};
|
|
2091
2091
|
}
|
|
2092
2092
|
/**
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2093
|
+
* Subscribe to mouse position updates
|
|
2094
|
+
* @param callback Function to call when mouse position changes
|
|
2095
|
+
* @returns Unsubscribe function
|
|
2096
|
+
*/ subscribe(callback) {
|
|
2097
2097
|
// Return unsubscribe function
|
|
2098
2098
|
return this.listeners.add(callback),
|
|
2099
2099
|
// Start tracking if this is the first subscriber
|
|
@@ -2104,15 +2104,15 @@ class {
|
|
|
2104
2104
|
};
|
|
2105
2105
|
}
|
|
2106
2106
|
/**
|
|
2107
|
-
|
|
2108
|
-
|
|
2107
|
+
* Unsubscribe from mouse position updates
|
|
2108
|
+
*/ unsubscribe(callback) {
|
|
2109
2109
|
this.listeners.delete(callback),
|
|
2110
2110
|
// Stop tracking if no more subscribers
|
|
2111
2111
|
0 === this.listeners.size && this.stopTracking();
|
|
2112
2112
|
}
|
|
2113
2113
|
/**
|
|
2114
|
-
|
|
2115
|
-
|
|
2114
|
+
* Start tracking mouse movement
|
|
2115
|
+
*/ startTracking() {
|
|
2116
2116
|
this.isTracking || (this.isTracking = !0,
|
|
2117
2117
|
// Use document-level listener for global tracking
|
|
2118
2118
|
document.addEventListener("mousemove", this.handleMouseMove, {
|
|
@@ -2120,22 +2120,22 @@ class {
|
|
|
2120
2120
|
}));
|
|
2121
2121
|
}
|
|
2122
2122
|
/**
|
|
2123
|
-
|
|
2124
|
-
|
|
2123
|
+
* Stop tracking mouse movement
|
|
2124
|
+
*/ stopTracking() {
|
|
2125
2125
|
this.isTracking && (this.isTracking = !1, document.removeEventListener("mousemove", this.handleMouseMove),
|
|
2126
2126
|
// Cancel any pending RAF
|
|
2127
2127
|
null !== this.rafId && (cancelAnimationFrame(this.rafId), this.rafId = null), this.lastEvent = null);
|
|
2128
2128
|
}
|
|
2129
2129
|
/**
|
|
2130
|
-
|
|
2131
|
-
|
|
2130
|
+
* Get current mouse position (synchronous)
|
|
2131
|
+
*/ getPosition() {
|
|
2132
2132
|
return {
|
|
2133
2133
|
...this.position
|
|
2134
2134
|
};
|
|
2135
2135
|
}
|
|
2136
2136
|
/**
|
|
2137
|
-
|
|
2138
|
-
|
|
2137
|
+
* Get number of active subscribers (for debugging)
|
|
2138
|
+
*/ getSubscriberCount() {
|
|
2139
2139
|
return this.listeners.size;
|
|
2140
2140
|
}
|
|
2141
2141
|
}, {CONSTANTS: CONSTANTS} = ATOMIX_GLASS, backgroundDetectionCache = new WeakMap, setCachedBackgroundDetection = (parentElement, overLightConfig, result, threshold) => {
|
|
@@ -2479,11 +2479,11 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
2479
2479
|
}), [ effectiveCornerRadius, glassRef ]);
|
|
2480
2480
|
// OverLight config
|
|
2481
2481
|
/**
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2482
|
+
* Get effective overLight value based on configuration
|
|
2483
|
+
* - boolean: returns the boolean value directly
|
|
2484
|
+
* - 'auto': returns detectedOverLight (auto-detected from background)
|
|
2485
|
+
* - object: returns detectedOverLight (auto-detected, but config object provides customization)
|
|
2486
|
+
*/
|
|
2487
2487
|
const getEffectiveOverLight = useCallback((() => "boolean" == typeof overLight ? overLight : ("auto" === overLight || "object" == typeof overLight && null !== overLight) && detectedOverLight), [ overLight, detectedOverLight ]), validateConfigValue = useCallback(((value, min, max, defaultValue) => "number" != typeof value || isNaN(value) || !isFinite(value) ? defaultValue : Math.min(max, Math.max(min, value))), []), overLightConfig = useMemo((() => {
|
|
2488
2488
|
const isOverLight = getEffectiveOverLight(), mouseInfluence = calculateMouseInfluence(mouseOffset), hoverIntensity = isHovered ? 1.4 : 1, activeIntensity = isActive ? 1.6 : 1, baseConfig = {
|
|
2489
2489
|
isOverLight: isOverLight,
|
|
@@ -2513,13 +2513,13 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
2513
2513
|
!onClick || "Enter" !== e.key && " " !== e.key || (e.preventDefault(), onClick());
|
|
2514
2514
|
}), [ onClick ]), handleMouseMove = useCallback((_e => {}), []);
|
|
2515
2515
|
/**
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2516
|
+
* Validate and clamp a numeric config value
|
|
2517
|
+
* @param value - The value to validate
|
|
2518
|
+
* @param min - Minimum allowed value
|
|
2519
|
+
* @param max - Maximum allowed value
|
|
2520
|
+
* @param defaultValue - Default value if validation fails
|
|
2521
|
+
* @returns Validated and clamped value
|
|
2522
|
+
*/ return {
|
|
2523
2523
|
// State
|
|
2524
2524
|
isHovered: isHovered,
|
|
2525
2525
|
isActive: isActive,
|
|
@@ -2852,7 +2852,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
|
|
|
2852
2852
|
});
|
|
2853
2853
|
}
|
|
2854
2854
|
|
|
2855
|
-
const Accordion =
|
|
2855
|
+
const Accordion = memo((({title: title, children: children, defaultOpen: defaultOpen = !1, isOpen: controlledOpen, onOpenChange: onOpenChange, disabled: disabled = !1, iconPosition: iconPosition = "right", icon: icon, className: className = "", style: style, glass: glass}) => {
|
|
2856
2856
|
// Generate unique IDs for accessibility
|
|
2857
2857
|
const instanceId = useId(), buttonId = `accordion-header-${instanceId}`, panelId = `accordion-panel-${instanceId}`, {state: state, toggle: toggle, updatePanelHeight: updatePanelHeight, panelRef: panelRef, contentRef: contentRef, generateClassNames: generateClassNames, generateHeaderClassNames: generateHeaderClassNames} = useAccordion({
|
|
2858
2858
|
defaultOpen: defaultOpen,
|
|
@@ -2923,7 +2923,7 @@ const Accordion = ({title: title, children: children, defaultOpen: defaultOpen =
|
|
|
2923
2923
|
});
|
|
2924
2924
|
}
|
|
2925
2925
|
return accordionContent;
|
|
2926
|
-
};
|
|
2926
|
+
}));
|
|
2927
2927
|
|
|
2928
2928
|
// Set display name for debugging
|
|
2929
2929
|
Accordion.displayName = "Accordion";
|
|
@@ -3257,7 +3257,7 @@ const AtomixLogo = ({height: height = 24, width: width = 24, color: color = "cur
|
|
|
3257
3257
|
// Constants
|
|
3258
3258
|
Icon.displayName = "Icon";
|
|
3259
3259
|
|
|
3260
|
-
const Avatar =
|
|
3260
|
+
const Avatar = memo((({src: src, alt: alt = "Avatar", initials: initials, icon: icon, size: size = "md", circle: circle = !1, className: className = "", disabled: disabled = !1, onClick: onClick, style: style, glass: glass}) => {
|
|
3261
3261
|
const [imageError, setImageError] = useState(!1), avatarClasses = [ AVATAR.CLASSES.BASE, "md" !== size && `c-avatar--${size}`, circle && AVATAR.CLASSES.CIRCLE, disabled && "is-disabled", className ].filter(Boolean).join(" ");
|
|
3262
3262
|
return jsx("div", {
|
|
3263
3263
|
className: avatarClasses,
|
|
@@ -3289,18 +3289,18 @@ const Avatar = ({src: src, alt: alt = "Avatar", initials: initials, icon: icon,
|
|
|
3289
3289
|
})
|
|
3290
3290
|
})
|
|
3291
3291
|
});
|
|
3292
|
-
};
|
|
3292
|
+
}));
|
|
3293
3293
|
|
|
3294
3294
|
Avatar.displayName = "Avatar";
|
|
3295
3295
|
|
|
3296
3296
|
const AvatarGroup = ({children: children, max: max, stacked: stacked = !1, className: className = "", style: style, moreText: moreText}) => {
|
|
3297
3297
|
// Generate CSS classes
|
|
3298
|
-
const avatarGroupClasses = [ AVATAR_GROUP.CLASSES.BASE, stacked && AVATAR_GROUP.CLASSES.STACKED, className ].filter(Boolean).join(" "), avatarChildren = Children.toArray(children).filter((child =>
|
|
3298
|
+
const avatarGroupClasses = [ AVATAR_GROUP.CLASSES.BASE, stacked && AVATAR_GROUP.CLASSES.STACKED, className ].filter(Boolean).join(" "), avatarChildren = Children.toArray(children).filter((child => isValidElement(child) && child.type === Avatar)), showMoreIndicator = void 0 !== max && avatarChildren.length > max, visibleAvatars = showMoreIndicator ? avatarChildren.slice(0, max) : avatarChildren, hiddenAvatarCount = avatarChildren.length - (max || 0), firstAvatar = isValidElement(avatarChildren[0]) ? avatarChildren[0].props : null, avatarSize = firstAvatar?.size || "md", isCircle = firstAvatar?.circle || !1, moreClasses = [ AVATAR.CLASSES.BASE, AVATAR_GROUP.CLASSES.MORE, "md" !== avatarSize && `c-avatar--${avatarSize}`, isCircle && "c-avatar--circle" ].filter(Boolean).join(" ");
|
|
3299
3299
|
// Get valid Avatar children
|
|
3300
3300
|
return jsxs("div", {
|
|
3301
3301
|
className: avatarGroupClasses,
|
|
3302
3302
|
style: style,
|
|
3303
|
-
children: [ visibleAvatars.map(((child, index) =>
|
|
3303
|
+
children: [ visibleAvatars.map(((child, index) => isValidElement(child) ? cloneElement(child, {
|
|
3304
3304
|
key: index,
|
|
3305
3305
|
...child.props
|
|
3306
3306
|
}) : null)), showMoreIndicator && jsx("div", {
|
|
@@ -3324,10 +3324,10 @@ function useBadge(initialProps) {
|
|
|
3324
3324
|
...initialProps
|
|
3325
3325
|
};
|
|
3326
3326
|
/**
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3327
|
+
* Generate badge class based on properties
|
|
3328
|
+
* @param props - Badge properties
|
|
3329
|
+
* @returns Class string
|
|
3330
|
+
*/ return {
|
|
3331
3331
|
defaultProps: defaultProps,
|
|
3332
3332
|
generateBadgeClass: props => {
|
|
3333
3333
|
const {variant: variant = defaultProps.variant, size: size = defaultProps.size, disabled: disabled = defaultProps.disabled, className: className = ""} = props;
|
|
@@ -3338,7 +3338,7 @@ function useBadge(initialProps) {
|
|
|
3338
3338
|
|
|
3339
3339
|
AvatarGroup.displayName = "AvatarGroup";
|
|
3340
3340
|
|
|
3341
|
-
const Badge =
|
|
3341
|
+
const Badge = memo((({label: label, variant: variant = "primary", size: size = "md", disabled: disabled = !1, icon: icon, className: className = "", glass: glass, style: style}) => {
|
|
3342
3342
|
const {generateBadgeClass: generateBadgeClass} = useBadge({
|
|
3343
3343
|
variant: variant,
|
|
3344
3344
|
size: size,
|
|
@@ -3377,7 +3377,7 @@ const Badge = ({label: label, variant: variant = "primary", size: size = "md", d
|
|
|
3377
3377
|
});
|
|
3378
3378
|
}
|
|
3379
3379
|
return badgeElement;
|
|
3380
|
-
};
|
|
3380
|
+
}));
|
|
3381
3381
|
|
|
3382
3382
|
Badge.displayName = "Badge";
|
|
3383
3383
|
|
|
@@ -3400,7 +3400,7 @@ Badge.displayName = "Badge";
|
|
|
3400
3400
|
* </Container>
|
|
3401
3401
|
* ```
|
|
3402
3402
|
*/
|
|
3403
|
-
const Container =
|
|
3403
|
+
const Container = forwardRef((({children: children, className: className = "", type: type, ...props}, ref) => {
|
|
3404
3404
|
let containerClass = "o-container";
|
|
3405
3405
|
return type && (containerClass = `o-container-${type}`), jsx("div", {
|
|
3406
3406
|
ref: ref,
|
|
@@ -3431,7 +3431,7 @@ const useBlock = () => ({
|
|
|
3431
3431
|
// Add custom className
|
|
3432
3432
|
className && classes.push(className), classes.filter(Boolean).join(" ");
|
|
3433
3433
|
}
|
|
3434
|
-
}), Block =
|
|
3434
|
+
}), Block = forwardRef((({children: children, as: Component = "section", spacing: spacing = "md", container: container = {}, fullWidth: fullWidth = !1, className: className = "", style: style, background: background = "", ...props}, ref) => {
|
|
3435
3435
|
const {generateBlockClass: generateBlockClass} = useBlock(), blockClasses = generateBlockClass({
|
|
3436
3436
|
spacing: spacing,
|
|
3437
3437
|
background: background,
|
|
@@ -3485,7 +3485,7 @@ const useBlock = () => ({
|
|
|
3485
3485
|
* ```
|
|
3486
3486
|
*/ Block.displayName = "Block";
|
|
3487
3487
|
|
|
3488
|
-
const Breadcrumb =
|
|
3488
|
+
const Breadcrumb = memo((({items: items, divider: divider, className: className = "", ariaLabel: ariaLabel = "Breadcrumb", LinkComponent: LinkComponent, style: style}) => {
|
|
3489
3489
|
const breadcrumbClasses = [ BREADCRUMB.CLASSES.BASE, className ].filter(Boolean).join(" ");
|
|
3490
3490
|
return jsx("nav", {
|
|
3491
3491
|
"aria-label": ariaLabel,
|
|
@@ -3518,7 +3518,7 @@ const Breadcrumb = ({items: items, divider: divider, className: className = "",
|
|
|
3518
3518
|
}))
|
|
3519
3519
|
})
|
|
3520
3520
|
});
|
|
3521
|
-
};
|
|
3521
|
+
}));
|
|
3522
3522
|
|
|
3523
3523
|
/**
|
|
3524
3524
|
* Button state and functionality
|
|
@@ -3540,10 +3540,10 @@ function useButton(initialProps) {
|
|
|
3540
3540
|
...initialProps
|
|
3541
3541
|
};
|
|
3542
3542
|
/**
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3543
|
+
* Generate button class based on properties
|
|
3544
|
+
* @param props - Button properties
|
|
3545
|
+
* @returns Class string
|
|
3546
|
+
*/ return {
|
|
3547
3547
|
defaultProps: defaultProps,
|
|
3548
3548
|
generateButtonClass: props => {
|
|
3549
3549
|
const {variant: variant = defaultProps.variant, size: size = defaultProps.size, disabled: disabled = defaultProps.disabled, rounded: rounded = defaultProps.rounded, iconOnly: iconOnly = !1, glass: glass = defaultProps.glass, loading: loading = defaultProps.loading, fullWidth: fullWidth = defaultProps.fullWidth, block: block = defaultProps.block, active: active = defaultProps.active, selected: selected = defaultProps.selected, className: className = ""} = props, sizeClass = "md" === size ? "" : `c-btn--${size}`, iconOnlyClass = iconOnly ? "c-btn--icon" : "", roundedClass = rounded ? "c-btn--rounded" : "", disabledClass = disabled ? "c-btn--disabled" : "", glassClass = glass ? "c-btn--glass" : "", loadingClass = loading ? BUTTON.CLASSES.LOADING : "", fullWidthClass = fullWidth ? BUTTON.CLASSES.FULL_WIDTH : "", blockClass = block ? BUTTON.CLASSES.BLOCK : "", activeClass = active ? BUTTON.CLASSES.ACTIVE : "", selectedClass = selected ? BUTTON.CLASSES.SELECTED : "";
|
|
@@ -3568,10 +3568,10 @@ function useButton(initialProps) {
|
|
|
3568
3568
|
...initialProps
|
|
3569
3569
|
};
|
|
3570
3570
|
/**
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3571
|
+
* Generate spinner class based on properties
|
|
3572
|
+
* @param props - Spinner properties
|
|
3573
|
+
* @returns Class string
|
|
3574
|
+
*/ return {
|
|
3575
3575
|
defaultProps: defaultProps,
|
|
3576
3576
|
generateSpinnerClass: props => {
|
|
3577
3577
|
const {variant: variant = defaultProps.variant, size: size = defaultProps.size, fullscreen: fullscreen = defaultProps.fullscreen, className: className = ""} = props;
|
|
@@ -3582,7 +3582,7 @@ function useButton(initialProps) {
|
|
|
3582
3582
|
|
|
3583
3583
|
Breadcrumb.displayName = "Breadcrumb";
|
|
3584
3584
|
|
|
3585
|
-
const Spinner =
|
|
3585
|
+
const Spinner = memo((({size: size = "md", variant: variant = "primary", fullscreen: fullscreen = !1, className: className = "", style: style, glass: glass}) => {
|
|
3586
3586
|
const {generateSpinnerClass: generateSpinnerClass} = useSpinner({
|
|
3587
3587
|
size: size,
|
|
3588
3588
|
variant: variant,
|
|
@@ -3617,11 +3617,11 @@ const Spinner = ({size: size = "md", variant: variant = "primary", fullscreen: f
|
|
|
3617
3617
|
});
|
|
3618
3618
|
}
|
|
3619
3619
|
return spinnerContent;
|
|
3620
|
-
};
|
|
3620
|
+
}));
|
|
3621
3621
|
|
|
3622
3622
|
Spinner.displayName = "Spinner";
|
|
3623
3623
|
|
|
3624
|
-
const Button =
|
|
3624
|
+
const Button = React.memo( forwardRef((({label: label, children: children, onClick: onClick, variant: variant = "primary", size: size = "md", disabled: disabled = !1, loading: loading = !1, loadingText: loadingText, icon: icon, iconName: iconName, iconSize: iconSize = "sm", iconPosition: iconPosition = "start", iconOnly: iconOnly = !1, rounded: rounded = !1, fullWidth: fullWidth = !1, block: block = !1, active: active = !1, selected: selected = !1, type: type = "button", className: className = "", as: Component = "button", href: href, target: target, glass: glass, onHover: onHover, onFocus: onFocus, onBlur: onBlur, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, ariaExpanded: ariaExpanded, ariaControls: ariaControls, tabIndex: tabIndex, style: style, LinkComponent: LinkComponent, ...props}, ref) => {
|
|
3625
3625
|
const isDisabled = disabled || loading, shouldRenderAsLink = Boolean(href && !isDisabled), iconElement = useMemo((() => loading ? null : iconName ? jsx(Icon, {
|
|
3626
3626
|
name: iconName,
|
|
3627
3627
|
size: iconSize
|
|
@@ -3787,10 +3787,379 @@ const Button = React.memo(forwardRef((({label: label, children: children, onClic
|
|
|
3787
3787
|
|
|
3788
3788
|
Button.displayName = "Button";
|
|
3789
3789
|
|
|
3790
|
-
|
|
3791
|
-
|
|
3792
|
-
|
|
3793
|
-
|
|
3790
|
+
var commonjsGlobal = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {};
|
|
3791
|
+
|
|
3792
|
+
function getDefaultExportFromCjs(x) {
|
|
3793
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x.default : x;
|
|
3794
|
+
}
|
|
3795
|
+
|
|
3796
|
+
var fails$9 = function(exec) {
|
|
3797
|
+
try {
|
|
3798
|
+
return !!exec();
|
|
3799
|
+
} catch (error) {
|
|
3800
|
+
return !0;
|
|
3801
|
+
}
|
|
3802
|
+
}, functionBindNative = !fails$9((function() {
|
|
3803
|
+
// eslint-disable-next-line es/no-function-prototype-bind -- safe
|
|
3804
|
+
var test = function() {/* empty */}.bind();
|
|
3805
|
+
// eslint-disable-next-line no-prototype-builtins -- safe
|
|
3806
|
+
return "function" != typeof test || test.hasOwnProperty("prototype");
|
|
3807
|
+
})), NATIVE_BIND$3 = functionBindNative, FunctionPrototype$1 = Function.prototype, call$5 = FunctionPrototype$1.call, uncurryThisWithBind = NATIVE_BIND$3 && FunctionPrototype$1.bind.bind(call$5, call$5), functionUncurryThis = NATIVE_BIND$3 ? uncurryThisWithBind : function(fn) {
|
|
3808
|
+
return function() {
|
|
3809
|
+
return call$5.apply(fn, arguments);
|
|
3810
|
+
};
|
|
3811
|
+
}, objectIsPrototypeOf = functionUncurryThis({}.isPrototypeOf), check = function(it) {
|
|
3812
|
+
return it && it.Math === Math && it;
|
|
3813
|
+
}, globalThis_1 =
|
|
3814
|
+
// eslint-disable-next-line es/no-global-this -- safe
|
|
3815
|
+
check("object" == typeof globalThis && globalThis) || check("object" == typeof window && window) ||
|
|
3816
|
+
// eslint-disable-next-line no-restricted-globals -- safe
|
|
3817
|
+
check("object" == typeof self && self) || check("object" == typeof commonjsGlobal && commonjsGlobal) || check("object" == typeof commonjsGlobal && commonjsGlobal) ||
|
|
3818
|
+
// eslint-disable-next-line no-new-func -- fallback
|
|
3819
|
+
function() {
|
|
3820
|
+
return this;
|
|
3821
|
+
}() || Function("return this")(), NATIVE_BIND$2 = functionBindNative, FunctionPrototype = Function.prototype, apply$1 = FunctionPrototype.apply, call$4 = FunctionPrototype.call, functionApply = "object" == typeof Reflect && Reflect.apply || (NATIVE_BIND$2 ? call$4.bind(apply$1) : function() {
|
|
3822
|
+
return call$4.apply(apply$1, arguments);
|
|
3823
|
+
}), uncurryThis$7 = functionUncurryThis, toString$3 = uncurryThis$7({}.toString), stringSlice = uncurryThis$7("".slice), classofRaw$2 = function(it) {
|
|
3824
|
+
return stringSlice(toString$3(it), 8, -1);
|
|
3825
|
+
}, classofRaw$1 = classofRaw$2, uncurryThis$6 = functionUncurryThis, functionUncurryThisClause = function(fn) {
|
|
3826
|
+
// Nashorn bug:
|
|
3827
|
+
// https://github.com/zloirock/core-js/issues/1128
|
|
3828
|
+
// https://github.com/zloirock/core-js/issues/1130
|
|
3829
|
+
if ("Function" === classofRaw$1(fn)) return uncurryThis$6(fn);
|
|
3830
|
+
}, documentAll = "object" == typeof document && document.all, isCallable$8 = void 0 === documentAll && void 0 !== documentAll ? function(argument) {
|
|
3831
|
+
return "function" == typeof argument || argument === documentAll;
|
|
3832
|
+
} : function(argument) {
|
|
3833
|
+
return "function" == typeof argument;
|
|
3834
|
+
}, objectGetOwnPropertyDescriptor = {}, descriptors = !fails$9((function() {
|
|
3835
|
+
// eslint-disable-next-line es/no-object-defineproperty -- required for testing
|
|
3836
|
+
return 7 !== Object.defineProperty({}, 1, {
|
|
3837
|
+
get: function() {
|
|
3838
|
+
return 7;
|
|
3839
|
+
}
|
|
3840
|
+
})[1];
|
|
3841
|
+
})), NATIVE_BIND$1 = functionBindNative, call$3 = Function.prototype.call, functionCall = NATIVE_BIND$1 ? call$3.bind(call$3) : function() {
|
|
3842
|
+
return call$3.apply(call$3, arguments);
|
|
3843
|
+
}, objectPropertyIsEnumerable = {}, $propertyIsEnumerable = {}.propertyIsEnumerable, getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor, NASHORN_BUG = getOwnPropertyDescriptor$1 && !$propertyIsEnumerable.call({
|
|
3844
|
+
1: 2
|
|
3845
|
+
}, 1);
|
|
3846
|
+
|
|
3847
|
+
// `Object.prototype.propertyIsEnumerable` method implementation
|
|
3848
|
+
// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
|
|
3849
|
+
objectPropertyIsEnumerable.f = NASHORN_BUG ? function(V) {
|
|
3850
|
+
var descriptor = getOwnPropertyDescriptor$1(this, V);
|
|
3851
|
+
return !!descriptor && descriptor.enumerable;
|
|
3852
|
+
} : $propertyIsEnumerable;
|
|
3853
|
+
|
|
3854
|
+
var match, version, createPropertyDescriptor$2 = function(bitmap, value) {
|
|
3855
|
+
return {
|
|
3856
|
+
enumerable: !(1 & bitmap),
|
|
3857
|
+
configurable: !(2 & bitmap),
|
|
3858
|
+
writable: !(4 & bitmap),
|
|
3859
|
+
value: value
|
|
3860
|
+
};
|
|
3861
|
+
}, fails$6 = fails$9, classof$4 = classofRaw$2, $Object$3 = Object, split = functionUncurryThis("".split), indexedObject = fails$6((function() {
|
|
3862
|
+
// throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
|
|
3863
|
+
// eslint-disable-next-line no-prototype-builtins -- safe
|
|
3864
|
+
return !$Object$3("z").propertyIsEnumerable(0);
|
|
3865
|
+
})) ? function(it) {
|
|
3866
|
+
return "String" === classof$4(it) ? split(it, "") : $Object$3(it);
|
|
3867
|
+
} : $Object$3, isNullOrUndefined$2 = function(it) {
|
|
3868
|
+
return null == it;
|
|
3869
|
+
}, isNullOrUndefined$1 = isNullOrUndefined$2, $TypeError$7 = TypeError, requireObjectCoercible$3 = function(it) {
|
|
3870
|
+
if (isNullOrUndefined$1(it)) throw new $TypeError$7("Can't call method on " + it);
|
|
3871
|
+
return it;
|
|
3872
|
+
}, IndexedObject$1 = indexedObject, requireObjectCoercible$2 = requireObjectCoercible$3, toIndexedObject$2 = function(it) {
|
|
3873
|
+
return IndexedObject$1(requireObjectCoercible$2(it));
|
|
3874
|
+
}, isCallable$7 = isCallable$8, isObject$6 = function(it) {
|
|
3875
|
+
return "object" == typeof it ? null !== it : isCallable$7(it);
|
|
3876
|
+
}, path$3 = {}, path$2 = path$3, globalThis$b = globalThis_1, isCallable$6 = isCallable$8, aFunction = function(variable) {
|
|
3877
|
+
return isCallable$6(variable) ? variable : void 0;
|
|
3878
|
+
}, navigator$1 = globalThis_1.navigator, userAgent$2 = navigator$1 && navigator$1.userAgent, environmentUserAgent = userAgent$2 ? String(userAgent$2) : "", globalThis$9 = globalThis_1, userAgent$1 = environmentUserAgent, process$1 = globalThis$9.process, Deno$1 = globalThis$9.Deno, versions = process$1 && process$1.versions || Deno$1 && Deno$1.version, v8 = versions && versions.v8;
|
|
3879
|
+
|
|
3880
|
+
v8 && (
|
|
3881
|
+
// in old Chrome, versions of V8 isn't V8 = Chrome / 10
|
|
3882
|
+
// but their correct versions are not interesting for us
|
|
3883
|
+
version = (match = v8.split("."))[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1])),
|
|
3884
|
+
// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
|
|
3885
|
+
// so check `userAgent` even if `.v8` exists, but 0
|
|
3886
|
+
!version && userAgent$1 && (!(match = userAgent$1.match(/Edge\/(\d+)/)) || match[1] >= 74) && (match = userAgent$1.match(/Chrome\/(\d+)/)) && (version = +match[1]);
|
|
3887
|
+
|
|
3888
|
+
var environmentV8Version = version, V8_VERSION = environmentV8Version, fails$5 = fails$9, $String$3 = globalThis_1.String, symbolConstructorDetection = !!Object.getOwnPropertySymbols && !fails$5((function() {
|
|
3889
|
+
var symbol = Symbol("symbol detection");
|
|
3890
|
+
// Chrome 38 Symbol has incorrect toString conversion
|
|
3891
|
+
// `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
|
|
3892
|
+
// nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,
|
|
3893
|
+
// of course, fail.
|
|
3894
|
+
return !$String$3(symbol) || !(Object(symbol) instanceof Symbol) ||
|
|
3895
|
+
// Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
|
|
3896
|
+
!Symbol.sham && V8_VERSION && V8_VERSION < 41;
|
|
3897
|
+
})), useSymbolAsUid = symbolConstructorDetection && !Symbol.sham && "symbol" == typeof Symbol.iterator, isCallable$5 = isCallable$8, isPrototypeOf$2 = objectIsPrototypeOf, $Object$2 = Object, isSymbol$2 = useSymbolAsUid ? function(it) {
|
|
3898
|
+
return "symbol" == typeof it;
|
|
3899
|
+
} : function(it) {
|
|
3900
|
+
var $Symbol = function(namespace, method) {
|
|
3901
|
+
return arguments.length < 2 ? aFunction(path$2[namespace]) || aFunction(globalThis$b[namespace]) : path$2[namespace] && path$2[namespace][method] || globalThis$b[namespace] && globalThis$b[namespace][method];
|
|
3902
|
+
}("Symbol");
|
|
3903
|
+
return isCallable$5($Symbol) && isPrototypeOf$2($Symbol.prototype, $Object$2(it));
|
|
3904
|
+
}, $String$2 = String, isCallable$4 = isCallable$8, $TypeError$6 = TypeError, aCallable$3 = function(argument) {
|
|
3905
|
+
if (isCallable$4(argument)) return argument;
|
|
3906
|
+
throw new $TypeError$6(function(argument) {
|
|
3907
|
+
try {
|
|
3908
|
+
return $String$2(argument);
|
|
3909
|
+
} catch (error) {
|
|
3910
|
+
return "Object";
|
|
3911
|
+
}
|
|
3912
|
+
}(argument) + " is not a function");
|
|
3913
|
+
}, aCallable$2 = aCallable$3, isNullOrUndefined = isNullOrUndefined$2, call$2 = functionCall, isCallable$3 = isCallable$8, isObject$5 = isObject$6, $TypeError$5 = TypeError, sharedStore = {
|
|
3914
|
+
exports: {}
|
|
3915
|
+
}, globalThis$7 = globalThis_1, defineProperty = Object.defineProperty, globalThis$6 = globalThis_1, store$1 = sharedStore.exports = globalThis$6["__core-js_shared__"] || function(key, value) {
|
|
3916
|
+
try {
|
|
3917
|
+
defineProperty(globalThis$7, key, {
|
|
3918
|
+
value: value,
|
|
3919
|
+
configurable: !0,
|
|
3920
|
+
writable: !0
|
|
3921
|
+
});
|
|
3922
|
+
} catch (error) {
|
|
3923
|
+
globalThis$7[key] = value;
|
|
3924
|
+
}
|
|
3925
|
+
return value;
|
|
3926
|
+
}("__core-js_shared__", {});
|
|
3927
|
+
|
|
3928
|
+
/* eslint-disable es/no-symbol -- required for testing */ (store$1.versions || (store$1.versions = [])).push({
|
|
3929
|
+
version: "3.43.0",
|
|
3930
|
+
mode: "pure",
|
|
3931
|
+
copyright: "© 2014-2025 Denis Pushkarev (zloirock.ru)",
|
|
3932
|
+
license: "https://github.com/zloirock/core-js/blob/v3.43.0/LICENSE",
|
|
3933
|
+
source: "https://github.com/zloirock/core-js"
|
|
3934
|
+
});
|
|
3935
|
+
|
|
3936
|
+
var key, value, store = sharedStore.exports, requireObjectCoercible$1 = requireObjectCoercible$3, $Object$1 = Object, toObject$2 = function(argument) {
|
|
3937
|
+
return $Object$1(requireObjectCoercible$1(argument));
|
|
3938
|
+
}, toObject$1 = toObject$2, hasOwnProperty = functionUncurryThis({}.hasOwnProperty), hasOwnProperty_1 = Object.hasOwn || function(it, key) {
|
|
3939
|
+
return hasOwnProperty(toObject$1(it), key);
|
|
3940
|
+
}, uncurryThis$3 = functionUncurryThis, id = 0, postfix = Math.random(), toString$2 = uncurryThis$3(1.1.toString), hasOwn$2 = hasOwnProperty_1, NATIVE_SYMBOL = symbolConstructorDetection, USE_SYMBOL_AS_UID = useSymbolAsUid, Symbol$1 = globalThis_1.Symbol, WellKnownSymbolsStore = store[key = "wks"] || (store[key] = value || {}), createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol$1.for || Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || function(key) {
|
|
3941
|
+
return "Symbol(" + (void 0 === key ? "" : key) + ")_" + toString$2(++id + postfix, 36);
|
|
3942
|
+
}, wellKnownSymbol$5 = function(name) {
|
|
3943
|
+
return hasOwn$2(WellKnownSymbolsStore, name) || (WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn$2(Symbol$1, name) ? Symbol$1[name] : createWellKnownSymbol("Symbol." + name)),
|
|
3944
|
+
WellKnownSymbolsStore[name];
|
|
3945
|
+
}, call$1 = functionCall, isObject$4 = isObject$6, isSymbol$1 = isSymbol$2, $TypeError$4 = TypeError, TO_PRIMITIVE = wellKnownSymbol$5("toPrimitive"), toPrimitive = function(input, pref) {
|
|
3946
|
+
if (!isObject$4(input) || isSymbol$1(input)) return input;
|
|
3947
|
+
var result, func, exoticToPrim = (func = input[TO_PRIMITIVE], isNullOrUndefined(func) ? void 0 : aCallable$2(func));
|
|
3948
|
+
if (exoticToPrim) {
|
|
3949
|
+
if (void 0 === pref && (pref = "default"), result = call$1(exoticToPrim, input, pref),
|
|
3950
|
+
!isObject$4(result) || isSymbol$1(result)) return result;
|
|
3951
|
+
throw new $TypeError$4("Can't convert object to primitive value");
|
|
3952
|
+
}
|
|
3953
|
+
return void 0 === pref && (pref = "number"), function(input, pref) {
|
|
3954
|
+
var fn, val;
|
|
3955
|
+
if ("string" === pref && isCallable$3(fn = input.toString) && !isObject$5(val = call$2(fn, input))) return val;
|
|
3956
|
+
if (isCallable$3(fn = input.valueOf) && !isObject$5(val = call$2(fn, input))) return val;
|
|
3957
|
+
if ("string" !== pref && isCallable$3(fn = input.toString) && !isObject$5(val = call$2(fn, input))) return val;
|
|
3958
|
+
throw new $TypeError$5("Can't convert object to primitive value");
|
|
3959
|
+
}(input, pref);
|
|
3960
|
+
}, isSymbol = isSymbol$2, toPropertyKey$2 = function(argument) {
|
|
3961
|
+
var key = toPrimitive(argument, "string");
|
|
3962
|
+
return isSymbol(key) ? key : key + "";
|
|
3963
|
+
}, isObject$3 = isObject$6, document$1 = globalThis_1.document, EXISTS = isObject$3(document$1) && isObject$3(document$1.createElement), ie8DomDefine = !descriptors && !fails$9((function() {
|
|
3964
|
+
// eslint-disable-next-line es/no-object-defineproperty -- required for testing
|
|
3965
|
+
return 7 !== Object.defineProperty((it = "div", EXISTS ? document$1.createElement(it) : {}), "a", {
|
|
3966
|
+
get: function() {
|
|
3967
|
+
return 7;
|
|
3968
|
+
}
|
|
3969
|
+
}).a;
|
|
3970
|
+
var it;
|
|
3971
|
+
})), DESCRIPTORS$3 = descriptors, call = functionCall, propertyIsEnumerableModule = objectPropertyIsEnumerable, createPropertyDescriptor$1 = createPropertyDescriptor$2, toIndexedObject$1 = toIndexedObject$2, toPropertyKey$1 = toPropertyKey$2, hasOwn$1 = hasOwnProperty_1, IE8_DOM_DEFINE$1 = ie8DomDefine, $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;
|
|
3972
|
+
|
|
3973
|
+
// `Object.getOwnPropertyDescriptor` method
|
|
3974
|
+
// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
|
|
3975
|
+
objectGetOwnPropertyDescriptor.f = DESCRIPTORS$3 ? $getOwnPropertyDescriptor$1 : function(O, P) {
|
|
3976
|
+
if (O = toIndexedObject$1(O), P = toPropertyKey$1(P), IE8_DOM_DEFINE$1) try {
|
|
3977
|
+
return $getOwnPropertyDescriptor$1(O, P);
|
|
3978
|
+
} catch (error) {/* empty */}
|
|
3979
|
+
if (hasOwn$1(O, P)) return createPropertyDescriptor$1(!call(propertyIsEnumerableModule.f, O, P), O[P]);
|
|
3980
|
+
};
|
|
3981
|
+
|
|
3982
|
+
var fails$3 = fails$9, isCallable$2 = isCallable$8, replacement = /#|\.prototype\./, isForced$1 = function(feature, detection) {
|
|
3983
|
+
var value = data[normalize(feature)];
|
|
3984
|
+
return value === POLYFILL || value !== NATIVE && (isCallable$2(detection) ? fails$3(detection) : !!detection);
|
|
3985
|
+
}, normalize = isForced$1.normalize = function(string) {
|
|
3986
|
+
return String(string).replace(replacement, ".").toLowerCase();
|
|
3987
|
+
}, data = isForced$1.data = {}, NATIVE = isForced$1.NATIVE = "N", POLYFILL = isForced$1.POLYFILL = "P", isForced_1 = isForced$1, aCallable$1 = aCallable$3, NATIVE_BIND = functionBindNative, bind$1 = functionUncurryThisClause(functionUncurryThisClause.bind), objectDefineProperty = {}, v8PrototypeDefineBug = descriptors && fails$9((function() {
|
|
3988
|
+
// eslint-disable-next-line es/no-object-defineproperty -- required for testing
|
|
3989
|
+
return 42 !== Object.defineProperty((function() {/* empty */}), "prototype", {
|
|
3990
|
+
value: 42,
|
|
3991
|
+
writable: !1
|
|
3992
|
+
}).prototype;
|
|
3993
|
+
})), isObject$2 = isObject$6, $String$1 = String, $TypeError$3 = TypeError, DESCRIPTORS$1 = descriptors, IE8_DOM_DEFINE = ie8DomDefine, V8_PROTOTYPE_DEFINE_BUG = v8PrototypeDefineBug, anObject = function(argument) {
|
|
3994
|
+
if (isObject$2(argument)) return argument;
|
|
3995
|
+
throw new $TypeError$3($String$1(argument) + " is not an object");
|
|
3996
|
+
}, toPropertyKey = toPropertyKey$2, $TypeError$2 = TypeError, $defineProperty = Object.defineProperty, $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
3997
|
+
|
|
3998
|
+
// `Object.defineProperty` method
|
|
3999
|
+
// https://tc39.es/ecma262/#sec-object.defineproperty
|
|
4000
|
+
objectDefineProperty.f = DESCRIPTORS$1 ? V8_PROTOTYPE_DEFINE_BUG ? function(O, P, Attributes) {
|
|
4001
|
+
if (anObject(O), P = toPropertyKey(P), anObject(Attributes), "function" == typeof O && "prototype" === P && "value" in Attributes && "writable" in Attributes && !Attributes.writable) {
|
|
4002
|
+
var current = $getOwnPropertyDescriptor(O, P);
|
|
4003
|
+
current && current.writable && (O[P] = Attributes.value, Attributes = {
|
|
4004
|
+
configurable: "configurable" in Attributes ? Attributes.configurable : current.configurable,
|
|
4005
|
+
enumerable: "enumerable" in Attributes ? Attributes.enumerable : current.enumerable,
|
|
4006
|
+
writable: !1
|
|
4007
|
+
});
|
|
4008
|
+
}
|
|
4009
|
+
return $defineProperty(O, P, Attributes);
|
|
4010
|
+
} : $defineProperty : function(O, P, Attributes) {
|
|
4011
|
+
if (anObject(O), P = toPropertyKey(P), anObject(Attributes), IE8_DOM_DEFINE) try {
|
|
4012
|
+
return $defineProperty(O, P, Attributes);
|
|
4013
|
+
} catch (error) {/* empty */}
|
|
4014
|
+
if ("get" in Attributes || "set" in Attributes) throw new $TypeError$2("Accessors not supported");
|
|
4015
|
+
return "value" in Attributes && (O[P] = Attributes.value), O;
|
|
4016
|
+
};
|
|
4017
|
+
|
|
4018
|
+
var definePropertyModule = objectDefineProperty, createPropertyDescriptor = createPropertyDescriptor$2, createNonEnumerableProperty$1 = descriptors ? function(object, key, value) {
|
|
4019
|
+
return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
|
|
4020
|
+
} : function(object, key, value) {
|
|
4021
|
+
return object[key] = value, object;
|
|
4022
|
+
}, globalThis$3 = globalThis_1, apply = functionApply, uncurryThis$1 = functionUncurryThisClause, isCallable$1 = isCallable$8, getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f, isForced = isForced_1, path$1 = path$3, bind = function(fn, that) {
|
|
4023
|
+
return aCallable$1(fn), void 0 === that ? fn : NATIVE_BIND ? bind$1(fn, that) : function() {
|
|
4024
|
+
return fn.apply(that, arguments);
|
|
4025
|
+
};
|
|
4026
|
+
}, createNonEnumerableProperty = createNonEnumerableProperty$1, hasOwn = hasOwnProperty_1, wrapConstructor = function(NativeConstructor) {
|
|
4027
|
+
var Wrapper = function(a, b, c) {
|
|
4028
|
+
if (this instanceof Wrapper) {
|
|
4029
|
+
switch (arguments.length) {
|
|
4030
|
+
case 0:
|
|
4031
|
+
return new NativeConstructor;
|
|
4032
|
+
|
|
4033
|
+
case 1:
|
|
4034
|
+
return new NativeConstructor(a);
|
|
4035
|
+
|
|
4036
|
+
case 2:
|
|
4037
|
+
return new NativeConstructor(a, b);
|
|
4038
|
+
}
|
|
4039
|
+
return new NativeConstructor(a, b, c);
|
|
4040
|
+
}
|
|
4041
|
+
return apply(NativeConstructor, this, arguments);
|
|
4042
|
+
};
|
|
4043
|
+
return Wrapper.prototype = NativeConstructor.prototype, Wrapper;
|
|
4044
|
+
}, _export = function(options, source) {
|
|
4045
|
+
var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE, key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor, TARGET = options.target, GLOBAL = options.global, STATIC = options.stat, PROTO = options.proto, nativeSource = GLOBAL ? globalThis$3 : STATIC ? globalThis$3[TARGET] : globalThis$3[TARGET] && globalThis$3[TARGET].prototype, target = GLOBAL ? path$1 : path$1[TARGET] || createNonEnumerableProperty(path$1, TARGET, {})[TARGET], targetPrototype = target.prototype;
|
|
4046
|
+
for (key in source)
|
|
4047
|
+
// contains in native
|
|
4048
|
+
USE_NATIVE = !(FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? "." : "#") + key, options.forced)) && nativeSource && hasOwn(nativeSource, key),
|
|
4049
|
+
targetProperty = target[key], USE_NATIVE && (nativeProperty = options.dontCallGetSet ? (descriptor = getOwnPropertyDescriptor(nativeSource, key)) && descriptor.value : nativeSource[key]),
|
|
4050
|
+
// export native or implementation
|
|
4051
|
+
sourceProperty = USE_NATIVE && nativeProperty ? nativeProperty : source[key], (FORCED || PROTO || typeof targetProperty != typeof sourceProperty) && (
|
|
4052
|
+
// bind methods to global for calling from export context
|
|
4053
|
+
resultProperty = options.bind && USE_NATIVE ? bind(sourceProperty, globalThis$3) : options.wrap && USE_NATIVE ? wrapConstructor(sourceProperty) : PROTO && isCallable$1(sourceProperty) ? uncurryThis$1(sourceProperty) : sourceProperty,
|
|
4054
|
+
// add a flag to not completely full polyfills
|
|
4055
|
+
(options.sham || sourceProperty && sourceProperty.sham || targetProperty && targetProperty.sham) && createNonEnumerableProperty(resultProperty, "sham", !0),
|
|
4056
|
+
createNonEnumerableProperty(target, key, resultProperty), PROTO && (hasOwn(path$1, VIRTUAL_PROTOTYPE = TARGET + "Prototype") || createNonEnumerableProperty(path$1, VIRTUAL_PROTOTYPE, {}),
|
|
4057
|
+
// export virtual prototype methods
|
|
4058
|
+
createNonEnumerableProperty(path$1[VIRTUAL_PROTOTYPE], key, sourceProperty),
|
|
4059
|
+
// export real prototype methods
|
|
4060
|
+
options.real && targetPrototype && (FORCED || !targetPrototype[key]) && createNonEnumerableProperty(targetPrototype, key, sourceProperty)));
|
|
4061
|
+
}, ceil = Math.ceil, floor = Math.floor, trunc = Math.trunc || function(x) {
|
|
4062
|
+
var n = +x;
|
|
4063
|
+
return (n > 0 ? floor : ceil)(n);
|
|
4064
|
+
}, toIntegerOrInfinity$2 = function(argument) {
|
|
4065
|
+
var number = +argument;
|
|
4066
|
+
// eslint-disable-next-line no-self-compare -- NaN check
|
|
4067
|
+
return number != number || 0 === number ? 0 : trunc(number);
|
|
4068
|
+
}, toIntegerOrInfinity$1 = toIntegerOrInfinity$2, max = Math.max, min$1 = Math.min, toIntegerOrInfinity = toIntegerOrInfinity$2, min = Math.min, lengthOfArrayLike$2 = function(obj) {
|
|
4069
|
+
return argument = obj.length, (len = toIntegerOrInfinity(argument)) > 0 ? min(len, 9007199254740991) : 0;
|
|
4070
|
+
var argument, len;
|
|
4071
|
+
}, toIndexedObject = toIndexedObject$2, lengthOfArrayLike$1 = lengthOfArrayLike$2, createMethod$1 = function(IS_INCLUDES) {
|
|
4072
|
+
return function($this, el, fromIndex) {
|
|
4073
|
+
var O = toIndexedObject($this), length = lengthOfArrayLike$1(O);
|
|
4074
|
+
if (0 === length) return !IS_INCLUDES && -1;
|
|
4075
|
+
var value, index = function(index, length) {
|
|
4076
|
+
var integer = toIntegerOrInfinity$1(index);
|
|
4077
|
+
return integer < 0 ? max(integer + length, 0) : min$1(integer, length);
|
|
4078
|
+
}(fromIndex, length);
|
|
4079
|
+
// Array#includes uses SameValueZero equality algorithm
|
|
4080
|
+
// eslint-disable-next-line no-self-compare -- NaN check
|
|
4081
|
+
if (IS_INCLUDES && el != el) {
|
|
4082
|
+
for (;length > index; )
|
|
4083
|
+
// eslint-disable-next-line no-self-compare -- NaN check
|
|
4084
|
+
if ((value = O[index++]) != value) return !0;
|
|
4085
|
+
// Array#indexOf ignores holes, Array#includes - not
|
|
4086
|
+
} else for (;length > index; index++) if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
|
|
4087
|
+
return !IS_INCLUDES && -1;
|
|
4088
|
+
};
|
|
4089
|
+
}, $includes = [ createMethod$1(!0), createMethod$1(!1) ][0];
|
|
4090
|
+
|
|
4091
|
+
// `Array.prototype.includes` method
|
|
4092
|
+
// https://tc39.es/ecma262/#sec-array.prototype.includes
|
|
4093
|
+
_export({
|
|
4094
|
+
target: "Array",
|
|
4095
|
+
proto: !0,
|
|
4096
|
+
forced: fails$9((function() {
|
|
4097
|
+
// eslint-disable-next-line es/no-array-prototype-includes -- detection
|
|
4098
|
+
return !Array(1).includes();
|
|
4099
|
+
}))
|
|
4100
|
+
}, {
|
|
4101
|
+
includes: function(el /* , fromIndex = 0 */) {
|
|
4102
|
+
return $includes(this, el, arguments.length > 1 ? arguments[1] : void 0);
|
|
4103
|
+
}
|
|
4104
|
+
});
|
|
4105
|
+
|
|
4106
|
+
var globalThis$2 = globalThis_1, path = path$3, getBuiltInPrototypeMethod$3 = function(CONSTRUCTOR, METHOD) {
|
|
4107
|
+
var Namespace = path[CONSTRUCTOR + "Prototype"], pureMethod = Namespace && Namespace[METHOD];
|
|
4108
|
+
if (pureMethod) return pureMethod;
|
|
4109
|
+
var NativeConstructor = globalThis$2[CONSTRUCTOR], NativePrototype = NativeConstructor && NativeConstructor.prototype;
|
|
4110
|
+
return NativePrototype && NativePrototype[METHOD];
|
|
4111
|
+
}, includes$4 = getBuiltInPrototypeMethod$3("Array", "includes"), isObject$1 = isObject$6, classof$3 = classofRaw$2, MATCH$1 = wellKnownSymbol$5("match"), $TypeError$1 = TypeError, test = {};
|
|
4112
|
+
|
|
4113
|
+
test[wellKnownSymbol$5("toStringTag")] = "z";
|
|
4114
|
+
|
|
4115
|
+
var TO_STRING_TAG_SUPPORT = "[object z]" === String(test), isCallable = isCallable$8, classofRaw = classofRaw$2, TO_STRING_TAG = wellKnownSymbol$5("toStringTag"), $Object = Object, CORRECT_ARGUMENTS = "Arguments" === classofRaw(function() {
|
|
4116
|
+
return arguments;
|
|
4117
|
+
}()), classof$1 = TO_STRING_TAG_SUPPORT ? classofRaw : function(it) {
|
|
4118
|
+
var O, tag, result;
|
|
4119
|
+
return void 0 === it ? "Undefined" : null === it ? "Null" : "string" == typeof (tag = function(it, key) {
|
|
4120
|
+
try {
|
|
4121
|
+
return it[key];
|
|
4122
|
+
} catch (error) {/* empty */}
|
|
4123
|
+
}(O = $Object(it), TO_STRING_TAG)) ? tag : CORRECT_ARGUMENTS ? classofRaw(O) : "Object" === (result = classofRaw(O)) && isCallable(O.callee) ? "Arguments" : result;
|
|
4124
|
+
}, $String = String, MATCH = wellKnownSymbol$5("match"), $$1 = _export, notARegExp = function(it) {
|
|
4125
|
+
if (function(it) {
|
|
4126
|
+
var isRegExp;
|
|
4127
|
+
return isObject$1(it) && (void 0 !== (isRegExp = it[MATCH$1]) ? !!isRegExp : "RegExp" === classof$3(it));
|
|
4128
|
+
}(it)) throw new $TypeError$1("The method doesn't accept regular expressions");
|
|
4129
|
+
return it;
|
|
4130
|
+
}, requireObjectCoercible = requireObjectCoercible$3, toString = function(argument) {
|
|
4131
|
+
if ("Symbol" === classof$1(argument)) throw new TypeError("Cannot convert a Symbol value to a string");
|
|
4132
|
+
return $String(argument);
|
|
4133
|
+
}, stringIndexOf = functionUncurryThis("".indexOf);
|
|
4134
|
+
|
|
4135
|
+
// `String.prototype.includes` method
|
|
4136
|
+
// https://tc39.es/ecma262/#sec-string.prototype.includes
|
|
4137
|
+
$$1({
|
|
4138
|
+
target: "String",
|
|
4139
|
+
proto: !0,
|
|
4140
|
+
forced: !function(METHOD_NAME) {
|
|
4141
|
+
var regexp = /./;
|
|
4142
|
+
try {
|
|
4143
|
+
"/./"[METHOD_NAME](regexp);
|
|
4144
|
+
} catch (error1) {
|
|
4145
|
+
try {
|
|
4146
|
+
return regexp[MATCH] = !1, "/./"[METHOD_NAME](regexp);
|
|
4147
|
+
} catch (error2) {/* empty */}
|
|
4148
|
+
}
|
|
4149
|
+
return !1;
|
|
4150
|
+
}("includes")
|
|
4151
|
+
}, {
|
|
4152
|
+
includes: function(searchString /* , position = 0 */) {
|
|
4153
|
+
return !!~stringIndexOf(toString(requireObjectCoercible(this)), toString(notARegExp(searchString)), arguments.length > 1 ? arguments[1] : void 0);
|
|
4154
|
+
}
|
|
4155
|
+
});
|
|
4156
|
+
|
|
4157
|
+
var includes$3 = getBuiltInPrototypeMethod$3("String", "includes"), isPrototypeOf$1 = objectIsPrototypeOf, arrayMethod = includes$4, stringMethod = includes$3, ArrayPrototype$1 = Array.prototype, StringPrototype = String.prototype;
|
|
4158
|
+
|
|
4159
|
+
const _includesInstanceProperty = getDefaultExportFromCjs((function(it) {
|
|
4160
|
+
var own = it.includes;
|
|
4161
|
+
return it === ArrayPrototype$1 || isPrototypeOf$1(ArrayPrototype$1, it) && own === ArrayPrototype$1.includes ? arrayMethod : "string" == typeof it || it === StringPrototype || isPrototypeOf$1(StringPrototype, it) && own === StringPrototype.includes ? stringMethod : own;
|
|
4162
|
+
})), Callout = ({title: title, children: children, icon: icon, variant: variant = "primary", onClose: onClose, actions: actions, oneLine: oneLine = !1, toast: toast = !1, glass: glass, className: className, style: style, ...props}) => {
|
|
3794
4163
|
const {generateCalloutClass: generateCalloutClass, handleClose: handleClose} =
|
|
3795
4164
|
/**
|
|
3796
4165
|
* Callout state and functionality
|
|
@@ -3807,10 +4176,10 @@ const Callout = ({title: title, children: children, icon: icon, variant: variant
|
|
|
3807
4176
|
...initialProps
|
|
3808
4177
|
};
|
|
3809
4178
|
/**
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
4179
|
+
* Generate callout class based on properties
|
|
4180
|
+
* @param props - Callout properties
|
|
4181
|
+
* @returns Class string
|
|
4182
|
+
*/ return {
|
|
3814
4183
|
defaultProps: defaultProps,
|
|
3815
4184
|
generateCalloutClass: props => {
|
|
3816
4185
|
const {variant: variant = defaultProps.variant, oneLine: oneLine = defaultProps.oneLine, toast: toast = defaultProps.toast, glass: glass = defaultProps.glass, className: className = ""} = props;
|
|
@@ -3820,7 +4189,10 @@ const Callout = ({title: title, children: children, icon: icon, variant: variant
|
|
|
3820
4189
|
handler && handler();
|
|
3821
4190
|
}
|
|
3822
4191
|
};
|
|
3823
|
-
}
|
|
4192
|
+
}
|
|
4193
|
+
/**
|
|
4194
|
+
* Callout component for displaying important messages, notifications, or alerts
|
|
4195
|
+
*/ ({
|
|
3824
4196
|
variant: variant,
|
|
3825
4197
|
oneLine: oneLine,
|
|
3826
4198
|
toast: toast,
|
|
@@ -3828,12 +4200,13 @@ const Callout = ({title: title, children: children, icon: icon, variant: variant
|
|
|
3828
4200
|
className: className,
|
|
3829
4201
|
style: style
|
|
3830
4202
|
}), getAriaAttributes = () => {
|
|
4203
|
+
var _context, _context2;
|
|
3831
4204
|
const baseAttributes = {
|
|
3832
4205
|
role: "region"
|
|
3833
4206
|
};
|
|
3834
4207
|
// For toast notifications or alerts, use appropriate role and live region
|
|
3835
|
-
return toast ? (baseAttributes.role = "alert", baseAttributes["aria-live"] = "polite") : [ "warning", "error" ].
|
|
3836
|
-
baseAttributes["aria-live"] = "assertive") : [ "info", "success" ].
|
|
4208
|
+
return toast ? (baseAttributes.role = "alert", baseAttributes["aria-live"] = "polite") : _includesInstanceProperty(_context = [ "warning", "error" ]).call(_context, variant) ? (baseAttributes.role = "alert",
|
|
4209
|
+
baseAttributes["aria-live"] = "assertive") : _includesInstanceProperty(_context2 = [ "info", "success" ]).call(_context2, variant) && (baseAttributes.role = "status",
|
|
3837
4210
|
baseAttributes["aria-live"] = "polite"), baseAttributes;
|
|
3838
4211
|
}, calloutContent = jsxs(Fragment, {
|
|
3839
4212
|
children: [ jsxs("div", {
|
|
@@ -3915,7 +4288,7 @@ const Callout = ({title: title, children: children, icon: icon, variant: variant
|
|
|
3915
4288
|
|
|
3916
4289
|
Callout.displayName = "Callout";
|
|
3917
4290
|
|
|
3918
|
-
const Card =
|
|
4291
|
+
const Card = React.memo( forwardRef((({
|
|
3919
4292
|
// Variants
|
|
3920
4293
|
size: size = "md", variant: variant = "", appearance: appearance = "filled", elevation: elevation = "none", hoverable: hoverable = !1, hoverElevation: hoverElevation = "md",
|
|
3921
4294
|
// Layout
|
|
@@ -4038,7 +4411,7 @@ className: className = "", style: style, ...rest}, ref) => {
|
|
|
4038
4411
|
|
|
4039
4412
|
Card.displayName = "Card";
|
|
4040
4413
|
|
|
4041
|
-
const CardHeader =
|
|
4414
|
+
const CardHeader = forwardRef((({title: title, subtitle: subtitle, action: action, icon: icon, children: children, className: className = "", ...props}, ref) => {
|
|
4042
4415
|
const headerClasses = `${CARD.SELECTORS.HEADER.substring(1)} ${className}`.trim();
|
|
4043
4416
|
return jsxs("div", {
|
|
4044
4417
|
ref: ref,
|
|
@@ -4064,7 +4437,7 @@ const CardHeader = forwardRef((({title: title, subtitle: subtitle, action: actio
|
|
|
4064
4437
|
|
|
4065
4438
|
CardHeader.displayName = "CardHeader";
|
|
4066
4439
|
|
|
4067
|
-
const CardBody =
|
|
4440
|
+
const CardBody = forwardRef((({scrollable: scrollable = !1, maxHeight: maxHeight, children: children, className: className = "", style: style, ...props}, ref) => {
|
|
4068
4441
|
const bodyClasses = `${CARD.SELECTORS.BODY.substring(1)} ${scrollable ? "c-card__body--scrollable" : ""} ${className}`.trim(), bodyStyle = {
|
|
4069
4442
|
...style,
|
|
4070
4443
|
...scrollable && maxHeight ? {
|
|
@@ -4083,7 +4456,7 @@ const CardBody = forwardRef((({scrollable: scrollable = !1, maxHeight: maxHeight
|
|
|
4083
4456
|
|
|
4084
4457
|
CardBody.displayName = "CardBody";
|
|
4085
4458
|
|
|
4086
|
-
const CardFooter =
|
|
4459
|
+
const CardFooter = forwardRef((({align: align, children: children, className: className = "", style: style, ...props}, ref) => {
|
|
4087
4460
|
const footerClasses = `${CARD.SELECTORS.FOOTER.substring(1)} ${align ? `c-card__footer--align-${align}` : ""} ${className}`.trim();
|
|
4088
4461
|
return jsx("div", {
|
|
4089
4462
|
ref: ref,
|
|
@@ -4175,12 +4548,67 @@ const useCard = (options = {}) => {
|
|
|
4175
4548
|
});
|
|
4176
4549
|
};
|
|
4177
4550
|
|
|
4551
|
+
ElevationCard.displayName = "ElevationCard";
|
|
4552
|
+
|
|
4553
|
+
var aCallable = aCallable$3, toObject = toObject$2, IndexedObject = indexedObject, lengthOfArrayLike = lengthOfArrayLike$2, $TypeError = TypeError, REDUCE_EMPTY = "Reduce of empty array with no initial value", createMethod = function(IS_RIGHT) {
|
|
4554
|
+
return function(that, callbackfn, argumentsLength, memo) {
|
|
4555
|
+
var O = toObject(that), self = IndexedObject(O), length = lengthOfArrayLike(O);
|
|
4556
|
+
if (aCallable(callbackfn), 0 === length && argumentsLength < 2) throw new $TypeError(REDUCE_EMPTY);
|
|
4557
|
+
var index = IS_RIGHT ? length - 1 : 0, i = IS_RIGHT ? -1 : 1;
|
|
4558
|
+
if (argumentsLength < 2) for (;;) {
|
|
4559
|
+
if (index in self) {
|
|
4560
|
+
memo = self[index], index += i;
|
|
4561
|
+
break;
|
|
4562
|
+
}
|
|
4563
|
+
if (index += i, IS_RIGHT ? index < 0 : length <= index) throw new $TypeError(REDUCE_EMPTY);
|
|
4564
|
+
}
|
|
4565
|
+
for (;IS_RIGHT ? index >= 0 : length > index; index += i) index in self && (memo = callbackfn(memo, self[index], index, O));
|
|
4566
|
+
return memo;
|
|
4567
|
+
};
|
|
4568
|
+
}, arrayReduce = {
|
|
4569
|
+
// `Array.prototype.reduce` method
|
|
4570
|
+
// https://tc39.es/ecma262/#sec-array.prototype.reduce
|
|
4571
|
+
left: createMethod(!1),
|
|
4572
|
+
// `Array.prototype.reduceRight` method
|
|
4573
|
+
// https://tc39.es/ecma262/#sec-array.prototype.reduceright
|
|
4574
|
+
right: createMethod(!0)
|
|
4575
|
+
}, fails = fails$9, globalThis$1 = globalThis_1, userAgent = environmentUserAgent, classof = classofRaw$2, userAgentStartsWith = function(string) {
|
|
4576
|
+
return userAgent.slice(0, string.length) === string;
|
|
4577
|
+
}, environment = userAgentStartsWith("Bun/") ? "BUN" : userAgentStartsWith("Cloudflare-Workers") ? "CLOUDFLARE" : userAgentStartsWith("Deno/") ? "DENO" : userAgentStartsWith("Node.js/") ? "NODE" : globalThis$1.Bun && "string" == typeof Bun.version ? "BUN" : globalThis$1.Deno && "object" == typeof Deno.version ? "DENO" : "process" === classof(globalThis$1.process) ? "NODE" : globalThis$1.window && globalThis$1.document ? "BROWSER" : "REST", $reduce = arrayReduce.left;
|
|
4578
|
+
|
|
4579
|
+
// `Array.prototype.reduce` method
|
|
4580
|
+
// https://tc39.es/ecma262/#sec-array.prototype.reduce
|
|
4581
|
+
_export({
|
|
4582
|
+
target: "Array",
|
|
4583
|
+
proto: !0,
|
|
4584
|
+
forced: !("NODE" === environment) && environmentV8Version > 79 && environmentV8Version < 83 || !function(METHOD_NAME, argument) {
|
|
4585
|
+
var method = [][METHOD_NAME];
|
|
4586
|
+
return !!method && fails((function() {
|
|
4587
|
+
// eslint-disable-next-line no-useless-call -- required for testing
|
|
4588
|
+
method.call(null, argument || function() {
|
|
4589
|
+
return 1;
|
|
4590
|
+
}, 1);
|
|
4591
|
+
}));
|
|
4592
|
+
}("reduce")
|
|
4593
|
+
}, {
|
|
4594
|
+
reduce: function(callbackfn /* , initialValue */) {
|
|
4595
|
+
var length = arguments.length;
|
|
4596
|
+
return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : void 0);
|
|
4597
|
+
}
|
|
4598
|
+
});
|
|
4599
|
+
|
|
4600
|
+
var reduce$3 = getBuiltInPrototypeMethod$3("Array", "reduce"), isPrototypeOf = objectIsPrototypeOf, method = reduce$3, ArrayPrototype = Array.prototype;
|
|
4601
|
+
|
|
4602
|
+
const _reduceInstanceProperty = getDefaultExportFromCjs((function(it) {
|
|
4603
|
+
var own = it.reduce;
|
|
4604
|
+
return it === ArrayPrototype || isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.reduce ? method : own;
|
|
4605
|
+
}));
|
|
4606
|
+
|
|
4178
4607
|
/**
|
|
4179
4608
|
* Comprehensive chart hook with shared functionality
|
|
4180
4609
|
* @param initialProps - Initial chart properties
|
|
4181
4610
|
* @returns Chart state and methods
|
|
4182
|
-
*/
|
|
4183
|
-
function useChart(initialProps) {
|
|
4611
|
+
*/ function useChart(initialProps) {
|
|
4184
4612
|
const [interactionState, setInteractionState] = useState({
|
|
4185
4613
|
hoveredPoint: null,
|
|
4186
4614
|
selectedPoints: [],
|
|
@@ -4216,8 +4644,8 @@ function useChart(initialProps) {
|
|
|
4216
4644
|
animationFrameRef.current && cancelAnimationFrame(animationFrameRef.current);
|
|
4217
4645
|
}), []);
|
|
4218
4646
|
/**
|
|
4219
|
-
|
|
4220
|
-
|
|
4647
|
+
* Point interaction handlers
|
|
4648
|
+
*/
|
|
4221
4649
|
const handlePointHover = useCallback(((datasetIndex, pointIndex, x, y, clientX, clientY) => {
|
|
4222
4650
|
setInteractionState((prev => ({
|
|
4223
4651
|
...prev,
|
|
@@ -4571,9 +4999,7 @@ function useChart(initialProps) {
|
|
|
4571
4999
|
|
|
4572
5000
|
/**
|
|
4573
5001
|
* Hook for chart data processing and transformation
|
|
4574
|
-
*/
|
|
4575
|
-
|
|
4576
|
-
const ChartToolbar = memo(forwardRef((({chartType: chartType = "line", groups: groups = [], enableDefaults: enableDefaults = !0, defaults: defaults = {
|
|
5002
|
+
*/ const ChartToolbar = memo( forwardRef((({chartType: chartType = "line", groups: groups = [], enableDefaults: enableDefaults = !0, defaults: defaults = {
|
|
4577
5003
|
refresh: !0,
|
|
4578
5004
|
export: !0,
|
|
4579
5005
|
fullscreen: !0,
|
|
@@ -4960,7 +5386,7 @@ const ChartToolbar = memo(forwardRef((({chartType: chartType = "line", groups: g
|
|
|
4960
5386
|
|
|
4961
5387
|
ChartToolbar.displayName = "ChartToolbar";
|
|
4962
5388
|
|
|
4963
|
-
const ChartContext =
|
|
5389
|
+
const ChartContext = createContext(null), Chart = memo( forwardRef((({children: children, type: type = "line", size: size = "md", variant: variant = "primary", title: title, subtitle: subtitle, loading: loading = !1, error: error, className: className = "", "aria-label": ariaLabel, onFullscreen: onFullscreen, onExport: onExport, onRefresh: onRefresh, showToolbar: showToolbar = !1, enableFullscreen: enableFullscreen = !1, enableExport: enableExport = !1, enableRefresh: enableRefresh = !1, exportFormats: exportFormats = [ "png", "svg", "csv" ], datasets: datasets, config: config,
|
|
4964
5390
|
// Destructure non-DOM props to prevent passing to DOM element
|
|
4965
5391
|
toolbarConfig: toolbarConfig, customToolbarActions: customToolbarActions, customToolbarGroups: customToolbarGroups, data: data, showLegend: showLegend, interactive: interactive, fullscreen: fullscreen, onDataPointClick: onDataPointClick, onLegendItemClick: onLegendItemClick, glass: glass, ...props}, ref) => {
|
|
4966
5392
|
const [isFullscreen, setIsFullscreen] = useState(!1), [isExporting, setIsExporting] = useState(!1), chartContainerRef = useRef(null), [zoomLevel, setZoomLevel] = useState(1), [panOffset, setPanOffset] = useState({
|
|
@@ -5579,7 +6005,7 @@ Chart.displayName = "Chart";
|
|
|
5579
6005
|
/**
|
|
5580
6006
|
* Enhanced chart renderer component with comprehensive functionality
|
|
5581
6007
|
*/
|
|
5582
|
-
const ChartRenderer =
|
|
6008
|
+
const ChartRenderer = memo( forwardRef((({datasets: datasets = [], config: config, width: width = CHART.DEFAULT_WIDTH, height: height = CHART.DEFAULT_HEIGHT, onDataPointClick: onDataPointClick, interactive: interactive = !0, enableRealTime: enableRealTime = !1, enableAccessibility: enableAccessibility = !0, enablePerformanceOptimization: enablePerformanceOptimization = !0, renderContent: renderContent}, ref) => {
|
|
5583
6009
|
// Get chart context (zoom/pan state from toolbar) - optional
|
|
5584
6010
|
// Always call useContext to maintain consistent hook order
|
|
5585
6011
|
const chartContext = useContext(ChartContext), {calculateScales: calculateScales, getChartColors: getChartColors} = useChart(), {processedData: processedData, isProcessing: isProcessing} = function(datasets, options) {
|
|
@@ -5595,14 +6021,15 @@ const ChartRenderer = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
5595
6021
|
}), [ enableDecimation ]), calculateMovingAverage = useCallback(((values, period) => {
|
|
5596
6022
|
const result = [];
|
|
5597
6023
|
for (let i = 0; i < values.length; i++) if (i < period - 1) result.push(null); else {
|
|
5598
|
-
|
|
6024
|
+
var _context;
|
|
6025
|
+
const sum = _reduceInstanceProperty(_context = values.slice(i - period + 1, i + 1)).call(_context, ((a, b) => a + b), 0);
|
|
5599
6026
|
result.push(sum / period);
|
|
5600
6027
|
}
|
|
5601
6028
|
return result;
|
|
5602
6029
|
}), []), calculateTrendLine = useCallback((values => {
|
|
5603
6030
|
const n = values.length;
|
|
5604
6031
|
if (n < 2) return values.map((() => null));
|
|
5605
|
-
const xSum = values.
|
|
6032
|
+
const xSum = _reduceInstanceProperty(values).call(values, ((sum, _, i) => sum + i), 0), ySum = _reduceInstanceProperty(values).call(values, ((sum, val) => sum + val), 0), slope = (n * _reduceInstanceProperty(values).call(values, ((sum, val, i) => sum + i * val), 0) - xSum * ySum) / (n * _reduceInstanceProperty(values).call(values, ((sum, _, i) => sum + i * i), 0) - xSum * xSum), intercept = (ySum - slope * xSum) / n;
|
|
5606
6033
|
return values.map(((_, i) => slope * i + intercept));
|
|
5607
6034
|
}), []);
|
|
5608
6035
|
// Process data when datasets change
|
|
@@ -5739,7 +6166,7 @@ const ChartRenderer = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
5739
6166
|
// Announce data changes
|
|
5740
6167
|
useEffect((() => {
|
|
5741
6168
|
if (!announceDataChanges || !datasets.length) return;
|
|
5742
|
-
const totalDataPoints = datasets.
|
|
6169
|
+
const totalDataPoints = _reduceInstanceProperty(datasets).call(datasets, ((sum, dataset) => sum + (dataset.data?.length || 0)), 0);
|
|
5743
6170
|
announceData(`Chart updated with ${datasets.length} datasets and ${totalDataPoints} data points`);
|
|
5744
6171
|
}), [ datasets, announceDataChanges, announceData ]);
|
|
5745
6172
|
// Generate accessible description
|
|
@@ -6018,7 +6445,7 @@ const ChartRenderer = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
6018
6445
|
|
|
6019
6446
|
ChartRenderer.displayName = "ChartRenderer";
|
|
6020
6447
|
|
|
6021
|
-
const BaseChart =
|
|
6448
|
+
const BaseChart = memo( forwardRef((({type: type, datasets: datasets = [], config: config = {}, renderContent: renderContent, interactive: interactive = !0, enableRealTime: enableRealTime = !1, enableAccessibility: enableAccessibility = !0, enablePerformanceOptimization: enablePerformanceOptimization = !0, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6022
6449
|
const renderChartContent = useCallback((params => renderContent(params)), [ renderContent ]);
|
|
6023
6450
|
return jsx(Chart, {
|
|
6024
6451
|
ref: ref,
|
|
@@ -6041,81 +6468,89 @@ const BaseChart = memo(forwardRef((({type: type, datasets: datasets = [], config
|
|
|
6041
6468
|
|
|
6042
6469
|
BaseChart.displayName = "BaseChart";
|
|
6043
6470
|
|
|
6044
|
-
const AnimatedChart =
|
|
6045
|
-
const animationRef = useRef(0), timeRef = useRef(0), particlesRef = useRef([])
|
|
6046
|
-
|
|
6047
|
-
|
|
6048
|
-
|
|
6049
|
-
|
|
6050
|
-
|
|
6051
|
-
|
|
6052
|
-
|
|
6053
|
-
|
|
6054
|
-
|
|
6055
|
-
|
|
6471
|
+
const AnimatedChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, chartType: chartType = "line", particleEffects: particleEffects, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6472
|
+
const animationRef = useRef(0), timeRef = useRef(0), particlesRef = useRef([]);
|
|
6473
|
+
// Animation time tracking - moved outside callback
|
|
6474
|
+
useEffect((() => {
|
|
6475
|
+
const animateFrame = timestamp => {
|
|
6476
|
+
timeRef.current = timestamp, animationRef.current = requestAnimationFrame(animateFrame);
|
|
6477
|
+
};
|
|
6478
|
+
return animationRef.current = requestAnimationFrame(animateFrame), () => {
|
|
6479
|
+
animationRef.current && cancelAnimationFrame(animationRef.current);
|
|
6480
|
+
};
|
|
6481
|
+
}), []);
|
|
6482
|
+
const renderContent = useCallback((({scales: scales, colors: colors, datasets: chartDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
|
|
6483
|
+
if (!chartDatasets.length) return null;
|
|
6056
6484
|
const chartWidth = scales.width - 80, chartHeight = scales.height - 80, elements = [];
|
|
6057
6485
|
// Particle effects
|
|
6058
6486
|
if (chartDatasets.forEach(((dataset, datasetIndex) => {
|
|
6059
6487
|
const color = dataset.color || colors[datasetIndex % colors.length];
|
|
6060
|
-
|
|
6061
|
-
|
|
6062
|
-
|
|
6063
|
-
|
|
6064
|
-
|
|
6065
|
-
|
|
6066
|
-
|
|
6067
|
-
|
|
6068
|
-
|
|
6069
|
-
|
|
6070
|
-
|
|
6071
|
-
|
|
6072
|
-
|
|
6073
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
6076
|
-
|
|
6077
|
-
|
|
6078
|
-
|
|
6079
|
-
|
|
6080
|
-
|
|
6081
|
-
|
|
6082
|
-
|
|
6083
|
-
const
|
|
6084
|
-
|
|
6085
|
-
|
|
6086
|
-
|
|
6087
|
-
|
|
6088
|
-
|
|
6089
|
-
|
|
6090
|
-
|
|
6488
|
+
switch (chartType) {
|
|
6489
|
+
case "bar":
|
|
6490
|
+
// Create animated bars
|
|
6491
|
+
dataset.data.forEach(((point, pointIndex) => {
|
|
6492
|
+
const barWidth = chartWidth / dataset.data.length * .8, x = 40 + pointIndex * (chartWidth / dataset.data.length) + (chartWidth / dataset.data.length - barWidth) / 2, height = point.value / 100 * chartHeight, y = 40 + chartHeight - height;
|
|
6493
|
+
elements.push(jsx("rect", {
|
|
6494
|
+
x: x,
|
|
6495
|
+
y: y,
|
|
6496
|
+
width: barWidth,
|
|
6497
|
+
height: height,
|
|
6498
|
+
fill: color,
|
|
6499
|
+
style: {
|
|
6500
|
+
transform: `scaleY(${.1 * Math.sin(.01 * timeRef.current + .2 * pointIndex) + .9})`,
|
|
6501
|
+
transformOrigin: "bottom"
|
|
6502
|
+
},
|
|
6503
|
+
onClick: () => handlers.onDataPointClick?.(point, datasetIndex, pointIndex)
|
|
6504
|
+
}, `bar-${datasetIndex}-${pointIndex}`));
|
|
6505
|
+
}));
|
|
6506
|
+
break;
|
|
6507
|
+
|
|
6508
|
+
default:
|
|
6509
|
+
{
|
|
6510
|
+
// Create animated line/area
|
|
6511
|
+
const points = dataset.data.map(((point, pointIndex) => ({
|
|
6512
|
+
x: 40 + pointIndex / (dataset.data.length - 1) * chartWidth,
|
|
6513
|
+
y: 40 + chartHeight - point.value / 100 * chartHeight
|
|
6514
|
+
})));
|
|
6515
|
+
if (points.length > 0) {
|
|
6516
|
+
const linePath = `M ${points.map((p => `${p.x},${p.y}`)).join(" L ")}`;
|
|
6517
|
+
// Area for area chart
|
|
6518
|
+
if ("area" === chartType) {
|
|
6519
|
+
const areaPath = `${linePath} L ${40 + chartWidth},${40 + chartHeight} L 40,${40 + chartHeight} Z`;
|
|
6520
|
+
elements.push(jsx("path", {
|
|
6521
|
+
d: areaPath,
|
|
6522
|
+
fill: color,
|
|
6523
|
+
fillOpacity: "0.3",
|
|
6524
|
+
style: {
|
|
6525
|
+
transform: `translateY(${2 * Math.sin(.01 * timeRef.current)}px)`
|
|
6526
|
+
}
|
|
6527
|
+
}, `area-${datasetIndex}`));
|
|
6528
|
+
}
|
|
6529
|
+
// Line
|
|
6530
|
+
elements.push(jsx("path", {
|
|
6531
|
+
d: linePath,
|
|
6532
|
+
stroke: color,
|
|
6533
|
+
fill: "none",
|
|
6534
|
+
className: "c-chart__data-line",
|
|
6091
6535
|
style: {
|
|
6092
6536
|
transform: `translateY(${2 * Math.sin(.01 * timeRef.current)}px)`
|
|
6093
6537
|
}
|
|
6094
|
-
}, `
|
|
6538
|
+
}, `line-${datasetIndex}`)),
|
|
6539
|
+
// Data points
|
|
6540
|
+
points.forEach(((point, pointIndex) => {
|
|
6541
|
+
elements.push(jsx("circle", {
|
|
6542
|
+
cx: point.x,
|
|
6543
|
+
cy: point.y,
|
|
6544
|
+
r: "4",
|
|
6545
|
+
fill: color,
|
|
6546
|
+
style: {
|
|
6547
|
+
transform: `scale(${1 + .2 * Math.sin(.01 * timeRef.current + pointIndex)})`
|
|
6548
|
+
},
|
|
6549
|
+
onClick: () => handlers.onDataPointClick?.(dataset.data[pointIndex], datasetIndex, pointIndex)
|
|
6550
|
+
}, `point-${datasetIndex}-${pointIndex}`));
|
|
6551
|
+
}));
|
|
6095
6552
|
}
|
|
6096
|
-
|
|
6097
|
-
elements.push(jsx("path", {
|
|
6098
|
-
d: linePath,
|
|
6099
|
-
stroke: color,
|
|
6100
|
-
fill: "none",
|
|
6101
|
-
className: "c-chart__data-line",
|
|
6102
|
-
style: {
|
|
6103
|
-
transform: `translateY(${2 * Math.sin(.01 * timeRef.current)}px)`
|
|
6104
|
-
}
|
|
6105
|
-
}, `line-${datasetIndex}`)),
|
|
6106
|
-
// Data points
|
|
6107
|
-
points.forEach(((point, pointIndex) => {
|
|
6108
|
-
elements.push(jsx("circle", {
|
|
6109
|
-
cx: point.x,
|
|
6110
|
-
cy: point.y,
|
|
6111
|
-
r: "4",
|
|
6112
|
-
fill: color,
|
|
6113
|
-
style: {
|
|
6114
|
-
transform: `scale(${1 + .2 * Math.sin(.01 * timeRef.current + pointIndex)})`
|
|
6115
|
-
},
|
|
6116
|
-
onClick: () => handlers.onDataPointClick?.(dataset.data[pointIndex], datasetIndex, pointIndex)
|
|
6117
|
-
}, `point-${datasetIndex}-${pointIndex}`));
|
|
6118
|
-
}));
|
|
6553
|
+
break;
|
|
6119
6554
|
}
|
|
6120
6555
|
}
|
|
6121
6556
|
})), particleEffects?.enabled) for (let i = 0; i < particleEffects.count; i++) {
|
|
@@ -6136,7 +6571,7 @@ const AnimatedChart = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
6136
6571
|
}), [ chartType, particleEffects ]);
|
|
6137
6572
|
return jsx(BaseChart, {
|
|
6138
6573
|
ref: ref,
|
|
6139
|
-
type: "
|
|
6574
|
+
type: "line",
|
|
6140
6575
|
datasets: datasets,
|
|
6141
6576
|
config: config,
|
|
6142
6577
|
renderContent: renderContent,
|
|
@@ -6147,7 +6582,7 @@ const AnimatedChart = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
6147
6582
|
|
|
6148
6583
|
AnimatedChart.displayName = "AnimatedChart";
|
|
6149
6584
|
|
|
6150
|
-
const ChartTooltip =
|
|
6585
|
+
const ChartTooltip = memo((({dataPoint: dataPoint, datasetLabel: datasetLabel, datasetColor: datasetColor, position: position, visible: visible, customRenderer: customRenderer}) => {
|
|
6151
6586
|
const tooltipRef = useRef(null), [adjustedPosition, setAdjustedPosition] = useState(position);
|
|
6152
6587
|
// Dynamic positioning to keep tooltip in viewport
|
|
6153
6588
|
return useEffect((() => {
|
|
@@ -6164,7 +6599,7 @@ const ChartTooltip = memo((({dataPoint: dataPoint, datasetLabel: datasetLabel, d
|
|
|
6164
6599
|
x: newX,
|
|
6165
6600
|
y: newY
|
|
6166
6601
|
});
|
|
6167
|
-
}), [ position, visible ]), visible && dataPoint ?
|
|
6602
|
+
}), [ position, visible ]), visible && dataPoint ? createPortal(jsx("div", {
|
|
6168
6603
|
ref: tooltipRef,
|
|
6169
6604
|
className: "c-chart__tooltip",
|
|
6170
6605
|
style: {
|
|
@@ -6218,7 +6653,7 @@ const ChartTooltip = memo((({dataPoint: dataPoint, datasetLabel: datasetLabel, d
|
|
|
6218
6653
|
|
|
6219
6654
|
ChartTooltip.displayName = "ChartTooltip";
|
|
6220
6655
|
|
|
6221
|
-
const AreaChart =
|
|
6656
|
+
const AreaChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, areaOptions: areaOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6222
6657
|
// Area chart is essentially a line chart with area fill enabled
|
|
6223
6658
|
const enhancedAreaOptions = {
|
|
6224
6659
|
showArea: !0,
|
|
@@ -6273,7 +6708,11 @@ const AreaChart = memo(forwardRef((({datasets: datasets = [], config: config = {
|
|
|
6273
6708
|
})) ]
|
|
6274
6709
|
}, `dataset-${datasetIndex}`);
|
|
6275
6710
|
})), showTooltips && hoveredPoint && jsx(ChartTooltip, {
|
|
6276
|
-
dataPoint: renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex]
|
|
6711
|
+
dataPoint: renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] ?? {
|
|
6712
|
+
label: "",
|
|
6713
|
+
value: 0,
|
|
6714
|
+
color: ""
|
|
6715
|
+
},
|
|
6277
6716
|
datasetLabel: renderedDatasets[hoveredPoint.datasetIndex]?.label,
|
|
6278
6717
|
datasetColor: renderedDatasets[hoveredPoint.datasetIndex]?.color || colors[hoveredPoint.datasetIndex],
|
|
6279
6718
|
position: {
|
|
@@ -6422,7 +6861,7 @@ function useBarChart(datasets, options = {}) {
|
|
|
6422
6861
|
|
|
6423
6862
|
AreaChart.displayName = "AreaChart";
|
|
6424
6863
|
|
|
6425
|
-
const BarChart =
|
|
6864
|
+
const BarChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, barOptions: barOptions = {}, horizontal: horizontal = !1, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6426
6865
|
const {calculateBarDimensions: calculateBarDimensions, handleBarHover: handleBarHover, handleBarLeave: handleBarLeave, hoveredBar: hoveredBar, formatValue: formatValue} = useBarChart(0, barOptions);
|
|
6427
6866
|
return jsx(BaseChart, {
|
|
6428
6867
|
ref: ref,
|
|
@@ -6435,7 +6874,9 @@ const BarChart = memo(forwardRef((({datasets: datasets = [], config: config = {}
|
|
|
6435
6874
|
const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, barDimensions = calculateBarDimensions(renderedDatasets, scales.width, scales.height, scales.padding, horizontal);
|
|
6436
6875
|
return jsxs(Fragment, {
|
|
6437
6876
|
children: [ barDimensions.map(((bar, index) => {
|
|
6438
|
-
const dataset = renderedDatasets[bar.datasetIndex]
|
|
6877
|
+
const dataset = renderedDatasets[bar.datasetIndex];
|
|
6878
|
+
if (!dataset) return null;
|
|
6879
|
+
const point = dataset.data?.[bar.pointIndex], color = dataset.color || colors[bar.datasetIndex], isHovered = hoveredPoint?.datasetIndex === bar.datasetIndex && hoveredPoint?.pointIndex === bar.pointIndex;
|
|
6439
6880
|
return jsxs("g", {
|
|
6440
6881
|
children: [ jsx("rect", {
|
|
6441
6882
|
x: bar.x,
|
|
@@ -6477,7 +6918,7 @@ const BarChart = memo(forwardRef((({datasets: datasets = [], config: config = {}
|
|
|
6477
6918
|
|
|
6478
6919
|
BarChart.displayName = "BarChart";
|
|
6479
6920
|
|
|
6480
|
-
const BubbleChart =
|
|
6921
|
+
const BubbleChart = memo( forwardRef((({bubbleData: bubbleData = [], config: config = {}, bubbleOptions: bubbleOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6481
6922
|
const {minBubbleSize: minBubbleSize = 5, maxBubbleSize: maxBubbleSize = 50, bubbleOpacity: bubbleOpacity = .7, showLabels: showLabels = !0, labelPosition: labelPosition = "center", enableAnimations: enableAnimations = !0, animationDuration: animationDuration = 1e3, showSizeLegend: showSizeLegend = !0, sizeLegendTitle: sizeLegendTitle = "Size", colorScheme: colorScheme = [ "var(--atomix-primary)", "var(--atomix-secondary)", "var(--atomix-success)", "var(--atomix-warning)", "var(--atomix-error)", "var(--atomix-info)" ], sizeBasedColoring: sizeBasedColoring = !1} = bubbleOptions;
|
|
6482
6923
|
return jsx(BaseChart, {
|
|
6483
6924
|
ref: ref,
|
|
@@ -6532,7 +6973,7 @@ const BubbleChart = memo(forwardRef((({bubbleData: bubbleData = [], config: conf
|
|
|
6532
6973
|
}));
|
|
6533
6974
|
// Calculate bubble sizes based on data
|
|
6534
6975
|
return jsxs(Fragment, {
|
|
6535
|
-
children: [ bubbles, showTooltips && hoveredPoint && hoveredPoint.pointIndex < bubbleData.length && jsx(ChartTooltip, {
|
|
6976
|
+
children: [ bubbles, showTooltips && hoveredPoint && hoveredPoint.pointIndex < bubbleData.length && bubbleData[hoveredPoint.pointIndex] && jsx(ChartTooltip, {
|
|
6536
6977
|
dataPoint: bubbleData[hoveredPoint.pointIndex],
|
|
6537
6978
|
datasetLabel: "Bubbles",
|
|
6538
6979
|
datasetColor: bubbleData[hoveredPoint.pointIndex]?.color || colorScheme[hoveredPoint.pointIndex % colorScheme.length],
|
|
@@ -6551,7 +6992,7 @@ const BubbleChart = memo(forwardRef((({bubbleData: bubbleData = [], config: conf
|
|
|
6551
6992
|
|
|
6552
6993
|
BubbleChart.displayName = "BubbleChart";
|
|
6553
6994
|
|
|
6554
|
-
const CandlestickChart =
|
|
6995
|
+
const CandlestickChart = memo( forwardRef((({candlestickData: candlestickData = [], config: config = {}, candlestickOptions: candlestickOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6555
6996
|
const {showVolume: showVolume = !0, volumeHeightRatio: volumeHeightRatio = .2, upColor: upColor = "var(--atomix-success-bg-subtle)", downColor: downColor = "var(--atomix-error-bg-subtle)", wickColor: wickColor = "var(--atomix-brand-border-subtle)", borderColor: borderColor = "var(--atomix-primary-border-subtle)", showMovingAverages: showMovingAverages = !1, movingAveragePeriods: movingAveragePeriods = [ 7, 21 ], movingAverageColors: movingAverageColors = [ "var(--atomix-warning-bg-subtle)", "var(--atomix-warning-border-subtle)" ], dateFormat: dateFormat = "short", dateFormatter: dateFormatter, showGrid: showGrid = !0, gridColor: gridColor = "var(--atomix-brand-text-emphasis)", showTooltips: showTooltips = !0} = candlestickOptions;
|
|
6556
6997
|
// Calculate moving averages
|
|
6557
6998
|
return jsx(BaseChart, {
|
|
@@ -6658,11 +7099,12 @@ const CandlestickChart = memo(forwardRef((({candlestickData: candlestickData = [
|
|
|
6658
7099
|
const movingAverage = ((data, period) => {
|
|
6659
7100
|
const result = [];
|
|
6660
7101
|
for (let i = 0; i < data.length; i++) {
|
|
7102
|
+
var _context;
|
|
6661
7103
|
if (i < period - 1) {
|
|
6662
7104
|
result.push(NaN);
|
|
6663
7105
|
continue;
|
|
6664
7106
|
}
|
|
6665
|
-
const sum = data.slice(i - period + 1, i + 1).
|
|
7107
|
+
const sum = _reduceInstanceProperty(_context = data.slice(i - period + 1, i + 1)).call(_context, ((acc, item) => acc + item.close), 0);
|
|
6666
7108
|
result.push(sum / period);
|
|
6667
7109
|
}
|
|
6668
7110
|
return result;
|
|
@@ -6699,7 +7141,7 @@ const CandlestickChart = memo(forwardRef((({candlestickData: candlestickData = [
|
|
|
6699
7141
|
|
|
6700
7142
|
CandlestickChart.displayName = "CandlestickChart";
|
|
6701
7143
|
|
|
6702
|
-
const DonutChart =
|
|
7144
|
+
const DonutChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, pieOptions: pieOptions = {
|
|
6703
7145
|
showValues: !1,
|
|
6704
7146
|
showPercentages: !0,
|
|
6705
7147
|
showLabels: !1,
|
|
@@ -6732,9 +7174,10 @@ const DonutChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
6732
7174
|
datasets: datasets,
|
|
6733
7175
|
config: config,
|
|
6734
7176
|
renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
|
|
7177
|
+
var _context;
|
|
6735
7178
|
if (!chartData) return null;
|
|
6736
7179
|
// Use actual container dimensions from scales
|
|
6737
|
-
const width = scales.width, height = scales.height, outerRadius = Math.min(width, height) / 2 * .8, innerRadius = outerRadius * (donutOptions.innerRadiusRatio ?? .6), centerX = width / 2, centerY = height / 2, defaultColors = [ "var(--atomix-primary-2)", "var(--atomix-primary-3)", "var(--atomix-primary-4)", "var(--atomix-primary-5)", "var(--atomix-primary-6)", "var(--atomix-primary-7)", "var(--atomix-primary-8)", "var(--atomix-primary-9)" ], chartColors = dataset?.color ? [ dataset.color ] : dataset?.data?.map(((_, i) => defaultColors[i % defaultColors.length])) || defaultColors, total = chartData.validDataPoints.
|
|
7180
|
+
const width = scales.width, height = scales.height, outerRadius = Math.min(width, height) / 2 * .8, innerRadius = outerRadius * (donutOptions.innerRadiusRatio ?? .6), centerX = width / 2, centerY = height / 2, defaultColors = [ "var(--atomix-primary-2)", "var(--atomix-primary-3)", "var(--atomix-primary-4)", "var(--atomix-primary-5)", "var(--atomix-primary-6)", "var(--atomix-primary-7)", "var(--atomix-primary-8)", "var(--atomix-primary-9)" ], chartColors = dataset?.color ? [ dataset.color ] : dataset?.data?.map(((_, i) => defaultColors[i % defaultColors.length])) || defaultColors, total = _reduceInstanceProperty(_context = chartData.validDataPoints).call(_context, ((sum, point) => sum + point.value), 0), padAngleRad = (pieOptions.padAngle || 1) * Math.PI / 180;
|
|
6738
7181
|
let currentAngle = (pieOptions.startAngle || 0) * Math.PI / 180;
|
|
6739
7182
|
const slices = chartData.validDataPoints.map(((point, index) => {
|
|
6740
7183
|
const sliceAngle = point.value / total * (2 * Math.PI) - padAngleRad, startAngle = currentAngle, endAngle = currentAngle + sliceAngle, midAngle = (startAngle + endAngle) / 2, labelRadius = .75 * outerRadius, labelX = centerX + Math.cos(midAngle) * labelRadius, labelY = centerY + Math.sin(midAngle) * labelRadius, x1 = centerX + innerRadius * Math.cos(startAngle), y1 = centerY + innerRadius * Math.sin(startAngle), x2 = centerX + outerRadius * Math.cos(startAngle), y2 = centerY + outerRadius * Math.sin(startAngle), x3 = centerX + outerRadius * Math.cos(endAngle), y3 = centerY + outerRadius * Math.sin(endAngle), x4 = centerX + innerRadius * Math.cos(endAngle), y4 = centerY + innerRadius * Math.sin(endAngle), largeArcFlag = sliceAngle > Math.PI ? 1 : 0, path = [ `M ${x1} ${y1}`, `L ${x2} ${y2}`, `A ${outerRadius} ${outerRadius} 0 ${largeArcFlag} 1 ${x3} ${y3}`, `L ${x4} ${y4}`, `A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${x1} ${y1}`, "Z" ].join(" ");
|
|
@@ -6814,7 +7257,7 @@ const DonutChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
6814
7257
|
|
|
6815
7258
|
DonutChart.displayName = "DonutChart";
|
|
6816
7259
|
|
|
6817
|
-
const FunnelChart =
|
|
7260
|
+
const FunnelChart = memo( forwardRef((({funnelData: funnelData = [], config: config = {}, funnelOptions: funnelOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
6818
7261
|
const {direction: direction = "vertical", showLabels: showLabels = !0, showValues: showValues = !0, showPercentages: showPercentages = !1, labelPosition: labelPosition = "outside", neckWidth: neckWidth = .3, neckHeight: neckHeight = .2, segmentGap: segmentGap = 2, colorScheme: colorScheme = [ "var(--atomix-primary)", "var(--atomix-secondary)", "var(--atomix-success)", "var(--atomix-warning)", "var(--atomix-error)", "var(--atomix-info)" ], useGradient: useGradient = !0, animate: animate = !0, animationDuration: animationDuration = 1e3, animationDelay: animationDelay = 200, valueFormatter: valueFormatter = value => value.toLocaleString(), showConversionRates: showConversionRates = !0, conversionRatePosition: conversionRatePosition = "between", proportional: proportional = !0, minSegmentRatio: minSegmentRatio = .1} = funnelOptions;
|
|
6819
7262
|
return jsx(BaseChart, {
|
|
6820
7263
|
ref: ref,
|
|
@@ -6923,9 +7366,11 @@ const FunnelChart = memo(forwardRef((({funnelData: funnelData = [], config: conf
|
|
|
6923
7366
|
|
|
6924
7367
|
FunnelChart.displayName = "FunnelChart";
|
|
6925
7368
|
|
|
6926
|
-
const GaugeChart =
|
|
6927
|
-
const {startAngle: startAngle = 180, endAngle:
|
|
6928
|
-
|
|
7369
|
+
const GaugeChart = memo( forwardRef((({value: value, min: min = 0, max: max = 100, config: config = {}, gaugeOptions: gaugeOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
7370
|
+
const {startAngle: startAngle = 180, endAngle:
|
|
7371
|
+
// Default to left side (180 degrees)
|
|
7372
|
+
endAngle = 0, thickness:
|
|
7373
|
+
// Default to right side (0 degrees)
|
|
6929
7374
|
thickness = .2, showNeedle: showNeedle = !0, needleColor: needleColor = "var(--atomix-brand-text-emphasis)", showValue: showValue = !0, valueFormatter: valueFormatter = val => val.toFixed(1), showMinMaxLabels: showMinMaxLabels = !0, showTicks: showTicks = !0, majorTicks: majorTicks = 5, minorTicks: minorTicks = 4, colorZones: colorZones = [], animate: animate = !0, animationDuration: animationDuration = 1e3, animationEasing: animationEasing = "easeOutCubic", useGradient: useGradient = !1, label: label = "", labelPosition: labelPosition = "bottom"} = gaugeOptions;
|
|
6930
7375
|
return jsx(BaseChart, {
|
|
6931
7376
|
ref: ref,
|
|
@@ -7054,7 +7499,7 @@ const colorSchemes = {
|
|
|
7054
7499
|
reds: [ "var(--atomix-red-1)", "var(--atomix-red-2)", "var(--atomix-red-3)", "var(--atomix-red-4)", "var(--atomix-red-5)", "var(--atomix-red-6)", "var(--atomix-red-7)", "var(--atomix-red-8)", "var(--atomix-red-9)" ],
|
|
7055
7500
|
greens: [ "var(--atomix-green-1)", "var(--atomix-green-2)", "var(--atomix-green-3)", "var(--atomix-green-4)", "var(--atomix-green-5)", "var(--atomix-green-6)", "var(--atomix-green-7)", "var(--atomix-green-8)", "var(--atomix-green-9)" ],
|
|
7056
7501
|
github: [ "var(--atomix-gray-2)", "var(--atomix-green-3)", "var(--atomix-green-4)", "var(--atomix-green-5)", "var(--atomix-green-6)" ]
|
|
7057
|
-
}, HeatmapChart =
|
|
7502
|
+
}, HeatmapChart = memo( forwardRef((({data: data = [], config: config = {}, colorScale: colorScale = {
|
|
7058
7503
|
scheme: "viridis",
|
|
7059
7504
|
steps: 9
|
|
7060
7505
|
}, cellConfig: cellConfig = {
|
|
@@ -7249,7 +7694,8 @@ function useLineChart(datasets, options = {}) {
|
|
|
7249
7694
|
}), [hoveredPoint, setHoveredPoint] = useState(null), calculateMovingAverage = useCallback(((data, period) => {
|
|
7250
7695
|
const result = [];
|
|
7251
7696
|
for (let i = period - 1; i < data.length; i++) {
|
|
7252
|
-
|
|
7697
|
+
var _context;
|
|
7698
|
+
const average = _reduceInstanceProperty(_context = data.slice(i - period + 1, i + 1)).call(_context, ((acc, point) => acc + point.value), 0) / period, dataPoint = data[i];
|
|
7253
7699
|
dataPoint && result.push({
|
|
7254
7700
|
label: dataPoint.label,
|
|
7255
7701
|
value: average,
|
|
@@ -7260,7 +7706,7 @@ function useLineChart(datasets, options = {}) {
|
|
|
7260
7706
|
}), []), calculateTrendLine = useCallback((data => {
|
|
7261
7707
|
const n = data.length;
|
|
7262
7708
|
if (n < 2) return data.map((() => null));
|
|
7263
|
-
const xSum = data.
|
|
7709
|
+
const xSum = _reduceInstanceProperty(data).call(data, ((sum, _, i) => sum + i), 0), ySum = _reduceInstanceProperty(data).call(data, ((sum, point) => sum + point.value), 0), slope = (n * _reduceInstanceProperty(data).call(data, ((sum, point, i) => sum + i * point.value), 0) - xSum * ySum) / (n * _reduceInstanceProperty(data).call(data, ((sum, _, i) => sum + i * i), 0) - xSum * xSum), intercept = (ySum - slope * xSum) / n;
|
|
7264
7710
|
return data.map(((point, i) => ({
|
|
7265
7711
|
label: point.label,
|
|
7266
7712
|
value: slope * i + intercept,
|
|
@@ -7367,7 +7813,7 @@ function useLineChart(datasets, options = {}) {
|
|
|
7367
7813
|
|
|
7368
7814
|
HeatmapChart.displayName = "HeatmapChart";
|
|
7369
7815
|
|
|
7370
|
-
const LineChart =
|
|
7816
|
+
const LineChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, lineOptions: lineOptions = {}, onDataPointClick: onDataPointClick, onRealTimeUpdate: onRealTimeUpdate, onZoomChange: onZoomChange, onPanChange: onPanChange, onBrushSelection: onBrushSelection, ...props}, ref) => {
|
|
7371
7817
|
// Merge default options with provided options
|
|
7372
7818
|
const mergedLineOptions = {
|
|
7373
7819
|
showDataPoints: !0,
|
|
@@ -7467,7 +7913,7 @@ const LineChart = memo(forwardRef((({datasets: datasets = [], config: config = {
|
|
|
7467
7913
|
|
|
7468
7914
|
LineChart.displayName = "LineChart";
|
|
7469
7915
|
|
|
7470
|
-
const MultiAxisChart =
|
|
7916
|
+
const MultiAxisChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, yAxes: yAxes = [], xAxes: xAxes = [], multiAxisOptions: multiAxisOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
7471
7917
|
const {showLegend: showLegend = !0, legendPosition: legendPosition = "top", syncAxes: syncAxes = !1, axisPadding: axisPadding = 20, showTooltips: showTooltips = !0, tooltipPosition: tooltipPosition = "nearest", interpolation: interpolation = "linear", showArea: showArea = !1, areaOpacity: areaOpacity = .3, showDataPoints: showDataPoints = !0, pointRadius: pointRadius = 4, spanGaps: spanGaps = !1} = multiAxisOptions;
|
|
7472
7918
|
return jsx(BaseChart, {
|
|
7473
7919
|
ref: ref,
|
|
@@ -7615,7 +8061,7 @@ function usePieChart(data, options = {}) {
|
|
|
7615
8061
|
return validData.length ?
|
|
7616
8062
|
// Sort by value if enabled
|
|
7617
8063
|
options.sortByValue ? [ ...validData ].sort(((a, b) => b.value - a.value)) : validData : [];
|
|
7618
|
-
}), [ data, options.sortByValue ]), totalValue = useMemo((() => processedData.
|
|
8064
|
+
}), [ data, options.sortByValue ]), totalValue = useMemo((() => _reduceInstanceProperty(processedData).call(processedData, ((sum, point) => sum + point.value), 0)), [ processedData ]), slices = useMemo((() => {
|
|
7619
8065
|
if (!processedData.length || totalValue <= 0) return [];
|
|
7620
8066
|
const innerRadius = 150 * (options.innerRadius || 0), defaultColors = [ "#7AFFD7", "#1AFFD2", "#00E6C3", "#4DFF9F", "#1AFF85", "#00E66B", "#DD6061", "#FF1A1A", "#E60000", "#FFCC00", "#E6B800", "#B38F00" ];
|
|
7621
8067
|
// Default center
|
|
@@ -7702,7 +8148,7 @@ function usePieChart(data, options = {}) {
|
|
|
7702
8148
|
|
|
7703
8149
|
MultiAxisChart.displayName = "MultiAxisChart";
|
|
7704
8150
|
|
|
7705
|
-
const PieChart =
|
|
8151
|
+
const PieChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, pieOptions: pieOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
7706
8152
|
const data = datasets[0]?.data || [], {slices: slices, handleSliceHover: handleSliceHover, handleSliceLeave: handleSliceLeave, handleSliceClick: handleSliceClick, formatLabel: formatLabel, hoveredSlice: hoveredSlice, selectedSlices: selectedSlices} = usePieChart(data, pieOptions);
|
|
7707
8153
|
return jsx(BaseChart, {
|
|
7708
8154
|
ref: ref,
|
|
@@ -7767,7 +8213,7 @@ const PieChart = memo(forwardRef((({datasets: datasets = [], config: config = {}
|
|
|
7767
8213
|
|
|
7768
8214
|
PieChart.displayName = "PieChart";
|
|
7769
8215
|
|
|
7770
|
-
const RadarChart =
|
|
8216
|
+
const RadarChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, radarOptions: radarOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
7771
8217
|
const {gridLevels: gridLevels = 5, showGrid: showGrid = !0, showAxisLabels: showAxisLabels = !0, fillArea: fillArea = !0, fillOpacity: fillOpacity = .3, showDataPoints: showDataPoints = !0, pointRadius: pointRadius = 4, lineWidth: lineWidth = 2, smooth: smooth = !1, scaleType: scaleType = "linear", scaleMin: scaleMin = 0, scaleMax: scaleMax} = radarOptions;
|
|
7772
8218
|
return jsx(BaseChart, {
|
|
7773
8219
|
ref: ref,
|
|
@@ -7777,7 +8223,9 @@ const RadarChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
7777
8223
|
renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
|
|
7778
8224
|
if (!renderedDatasets.length) return null;
|
|
7779
8225
|
// Use toolbar state if available, fallback to config for backward compatibility
|
|
7780
|
-
const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, centerX = scales.width / 2, centerY = scales.height / 2, radius = .8 * Math.min(centerX, centerY),
|
|
8226
|
+
const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, centerX = scales.width / 2, centerY = scales.height / 2, radius = .8 * Math.min(centerX, centerY), firstDataset = renderedDatasets[0];
|
|
8227
|
+
if (!firstDataset) return null;
|
|
8228
|
+
const dataPoints = firstDataset.data || [], angleStep = 2 * Math.PI / dataPoints.length;
|
|
7781
8229
|
// Calculate value bounds
|
|
7782
8230
|
let minValue = scaleMin, maxValue = scaleMax;
|
|
7783
8231
|
if (void 0 === minValue || void 0 === maxValue) {
|
|
@@ -7840,18 +8288,18 @@ const RadarChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
7840
8288
|
point: dataset.data[i]
|
|
7841
8289
|
});
|
|
7842
8290
|
}
|
|
7843
|
-
if (0 === points.length) return null;
|
|
8291
|
+
if (0 === points.length || !points[0]) return null;
|
|
7844
8292
|
// Generate path
|
|
7845
8293
|
let path = "";
|
|
7846
8294
|
if (smooth && points.length > 2) {
|
|
7847
8295
|
// For smooth curves, we would implement a more complex algorithm
|
|
7848
8296
|
// For now, we'll just connect the points with straight lines
|
|
7849
8297
|
path = `M ${points[0].x},${points[0].y}`;
|
|
7850
|
-
for (let i = 1; i < points.length; i++) path += ` L ${points[i].x},${points[i].y}
|
|
8298
|
+
for (let i = 1; i < points.length; i++) points[i] && (path += ` L ${points[i].x},${points[i].y}`);
|
|
7851
8299
|
path += ` L ${points[0].x},${points[0].y} Z`;
|
|
7852
8300
|
} else {
|
|
7853
8301
|
path = `M ${points[0].x},${points[0].y}`;
|
|
7854
|
-
for (let i = 1; i < points.length; i++) path += ` L ${points[i].x},${points[i].y}
|
|
8302
|
+
for (let i = 1; i < points.length; i++) points[i] && (path += ` L ${points[i].x},${points[i].y}`);
|
|
7855
8303
|
path += ` L ${points[0].x},${points[0].y} Z`;
|
|
7856
8304
|
}
|
|
7857
8305
|
return jsxs("g", {
|
|
@@ -7875,7 +8323,9 @@ const RadarChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
7875
8323
|
r: isHovered ? 1.5 * pointRadius : pointRadius,
|
|
7876
8324
|
fill: color,
|
|
7877
8325
|
className: "c-chart__radar-point " + (isHovered ? "c-chart__radar-point--hovered" : ""),
|
|
7878
|
-
onClick: () =>
|
|
8326
|
+
onClick: () => {
|
|
8327
|
+
point.point && handlers.onDataPointClick?.(point.point, datasetIndex, pointIndex);
|
|
8328
|
+
},
|
|
7879
8329
|
onMouseEnter: e => {
|
|
7880
8330
|
const rect = e.currentTarget.getBoundingClientRect();
|
|
7881
8331
|
handlers.onPointHover(datasetIndex, pointIndex, point.x, point.y, rect.left + rect.width / 2, rect.top + rect.height / 2);
|
|
@@ -7889,8 +8339,8 @@ const RadarChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
7889
8339
|
return jsxs(Fragment, {
|
|
7890
8340
|
children: [ jsxs("g", {
|
|
7891
8341
|
children: [ gridLines, dataPaths, axisLabels ]
|
|
7892
|
-
}), showTooltips && hoveredPoint && jsx(ChartTooltip, {
|
|
7893
|
-
dataPoint: renderedDatasets[hoveredPoint.datasetIndex]
|
|
8342
|
+
}), showTooltips && hoveredPoint && renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && jsx(ChartTooltip, {
|
|
8343
|
+
dataPoint: renderedDatasets[hoveredPoint.datasetIndex].data[hoveredPoint.pointIndex],
|
|
7894
8344
|
datasetLabel: renderedDatasets[hoveredPoint.datasetIndex]?.label,
|
|
7895
8345
|
datasetColor: renderedDatasets[hoveredPoint.datasetIndex]?.color || colors[hoveredPoint.datasetIndex],
|
|
7896
8346
|
position: {
|
|
@@ -7908,7 +8358,7 @@ const RadarChart = memo(forwardRef((({datasets: datasets = [], config: config =
|
|
|
7908
8358
|
|
|
7909
8359
|
RadarChart.displayName = "RadarChart";
|
|
7910
8360
|
|
|
7911
|
-
const ScatterChart =
|
|
8361
|
+
const ScatterChart = memo( forwardRef((({datasets: datasets = [], config: config = {}, scatterOptions: scatterOptions = {
|
|
7912
8362
|
pointRadius: 4,
|
|
7913
8363
|
showLabels: !1,
|
|
7914
8364
|
enableHoverEffects: !0
|
|
@@ -7964,8 +8414,8 @@ const ScatterChart = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
7964
8414
|
}, `point-${datasetIndex}-${pointIndex}`));
|
|
7965
8415
|
}));
|
|
7966
8416
|
})), jsxs(Fragment, {
|
|
7967
|
-
children: [ points, showTooltips && hoveredPoint && jsx(ChartTooltip, {
|
|
7968
|
-
dataPoint: renderedDatasets[hoveredPoint.datasetIndex]
|
|
8417
|
+
children: [ points, showTooltips && hoveredPoint && renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && jsx(ChartTooltip, {
|
|
8418
|
+
dataPoint: renderedDatasets[hoveredPoint.datasetIndex].data[hoveredPoint.pointIndex],
|
|
7969
8419
|
datasetLabel: renderedDatasets[hoveredPoint.datasetIndex]?.label,
|
|
7970
8420
|
datasetColor: renderedDatasets[hoveredPoint.datasetIndex]?.color || colors[hoveredPoint.datasetIndex],
|
|
7971
8421
|
position: {
|
|
@@ -7982,7 +8432,7 @@ const ScatterChart = memo(forwardRef((({datasets: datasets = [], config: config
|
|
|
7982
8432
|
|
|
7983
8433
|
ScatterChart.displayName = "ScatterChart";
|
|
7984
8434
|
|
|
7985
|
-
const TreemapChart =
|
|
8435
|
+
const TreemapChart = memo( forwardRef((({data: data = [], algorithm: algorithm = "squarified", colorConfig: colorConfig = {
|
|
7986
8436
|
scheme: "category"
|
|
7987
8437
|
}, labelConfig: labelConfig = {
|
|
7988
8438
|
showLabels: !0,
|
|
@@ -8005,9 +8455,11 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8005
8455
|
processedNodes.add(node.id);
|
|
8006
8456
|
// Find children
|
|
8007
8457
|
const children = data.filter((item => item.parent === node.id));
|
|
8458
|
+
var _context;
|
|
8008
8459
|
return children.length > 0 && (node.children = children.map((child => buildTree(child))),
|
|
8009
8460
|
// For parent nodes, value is sum of children
|
|
8010
|
-
node.value = node.children.
|
|
8461
|
+
node.value = _reduceInstanceProperty(_context = node.children).call(_context, ((sum, child) => sum + child.value), 0)),
|
|
8462
|
+
node;
|
|
8011
8463
|
};
|
|
8012
8464
|
// Find root nodes
|
|
8013
8465
|
return data.forEach((item => {
|
|
@@ -8015,7 +8467,7 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8015
8467
|
})), 1 === rootNodes.length ? rootNodes[0] : {
|
|
8016
8468
|
id: "root",
|
|
8017
8469
|
label: "Root",
|
|
8018
|
-
value: rootNodes.
|
|
8470
|
+
value: _reduceInstanceProperty(rootNodes).call(rootNodes, ((sum, node) => sum + node.value), 0),
|
|
8019
8471
|
children: rootNodes
|
|
8020
8472
|
};
|
|
8021
8473
|
}), [ data ]);
|
|
@@ -8029,8 +8481,10 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8029
8481
|
return colors[index % colors.length];
|
|
8030
8482
|
|
|
8031
8483
|
case "depth":
|
|
8032
|
-
|
|
8033
|
-
|
|
8484
|
+
{
|
|
8485
|
+
const depthColors = [ "var(--atomix-blue-9)", "var(--atomix-blue-6)", "var(--atomix-blue-5)", "var(--atomix-blue-4)", "var(--atomix-blue-2)" ];
|
|
8486
|
+
return depthColors[Math.min(depth, depthColors.length - 1)];
|
|
8487
|
+
}
|
|
8034
8488
|
|
|
8035
8489
|
case "value":
|
|
8036
8490
|
if (data.length > 0) {
|
|
@@ -8041,7 +8495,7 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8041
8495
|
}
|
|
8042
8496
|
}), [ colorConfig, data ]), squarify = useCallback(((nodes, x, y, width, height) => {
|
|
8043
8497
|
if (0 === nodes.length) return;
|
|
8044
|
-
const totalValue = nodes.
|
|
8498
|
+
const totalValue = _reduceInstanceProperty(nodes).call(nodes, ((sum, node) => sum + node.value), 0);
|
|
8045
8499
|
if (1 === nodes.length) {
|
|
8046
8500
|
const node = nodes[0];
|
|
8047
8501
|
return void (node && (node.x = x, node.y = y, node.width = width, node.height = height));
|
|
@@ -8054,7 +8508,7 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8054
8508
|
if (!node) break;
|
|
8055
8509
|
currentRow.push(node);
|
|
8056
8510
|
// Calculate dimensions for current row
|
|
8057
|
-
const rowValue = currentRow.
|
|
8511
|
+
const rowValue = _reduceInstanceProperty(currentRow).call(currentRow, ((sum, n) => sum + n.value), 0), rowRatio = rowValue / totalValue;
|
|
8058
8512
|
let rowWidth, rowHeight;
|
|
8059
8513
|
remainingWidth >= remainingHeight ? (rowWidth = remainingWidth * rowRatio, rowHeight = remainingHeight) : (rowWidth = remainingWidth,
|
|
8060
8514
|
rowHeight = remainingHeight * rowRatio);
|
|
@@ -8063,7 +8517,7 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8063
8517
|
if (remainingNodes.length > 0) {
|
|
8064
8518
|
const nextNode = remainingNodes[0];
|
|
8065
8519
|
if (!nextNode) break;
|
|
8066
|
-
const testRow = [ ...currentRow, nextNode ], testRowValue = testRow.
|
|
8520
|
+
const testRow = [ ...currentRow, nextNode ], testRowValue = _reduceInstanceProperty(testRow).call(testRow, ((sum, n) => sum + n.value), 0), testRowRatio = testRowValue / totalValue;
|
|
8067
8521
|
let testRowWidth, testRowHeight;
|
|
8068
8522
|
remainingWidth >= remainingHeight ? (testRowWidth = remainingWidth * testRowRatio,
|
|
8069
8523
|
testRowHeight = remainingHeight) : (testRowWidth = remainingWidth, testRowHeight = remainingHeight * testRowRatio);
|
|
@@ -8112,7 +8566,7 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8112
8566
|
// Calculate available space with padding
|
|
8113
8567
|
const availableWidth = scales.width - 40, availableHeight = scales.height - 40, leafNodes = data.filter((item => !item.children || 0 === item.children.length));
|
|
8114
8568
|
if (!leafNodes.length) return null;
|
|
8115
|
-
const totalValue = leafNodes.
|
|
8569
|
+
const totalValue = _reduceInstanceProperty(leafNodes).call(leafNodes, ((sum, node) => sum + node.value), 0), treemapNodes = leafNodes.map(((item, index) => ({
|
|
8116
8570
|
id: item.id,
|
|
8117
8571
|
label: item.label,
|
|
8118
8572
|
value: item.value,
|
|
@@ -8186,7 +8640,7 @@ const TreemapChart = memo(forwardRef((({data: data = [], algorithm: algorithm =
|
|
|
8186
8640
|
|
|
8187
8641
|
TreemapChart.displayName = "TreemapChart";
|
|
8188
8642
|
|
|
8189
|
-
const WaterfallChart =
|
|
8643
|
+
const WaterfallChart = memo( forwardRef((({waterfallData: waterfallData = [], config: config = {}, waterfallOptions: waterfallOptions = {}, onDataPointClick: onDataPointClick, ...props}, ref) => {
|
|
8190
8644
|
const {showConnectors: showConnectors = !0, connectorColor: connectorColor = "var(--atomix-gray-1)", connectorStyle: connectorStyle = "dashed", showValues: showValues = !0, valuePosition: valuePosition = "top", colors: waterfallColors = {
|
|
8191
8645
|
positive: "var(--atomix-success)",
|
|
8192
8646
|
negative: "var(--atomix-error)",
|
|
@@ -8441,7 +8895,7 @@ const SIZE_MAP = {
|
|
|
8441
8895
|
|
|
8442
8896
|
ColorModeToggle.displayName = "ColorModeToggle";
|
|
8443
8897
|
|
|
8444
|
-
const Countdown =
|
|
8898
|
+
const Countdown = forwardRef((({target: target, show: show = [ "days", "hours", "minutes", "seconds" ], separator: separator = ":", focused: focused = !1, className: className = "", style: style, onComplete: onComplete}, ref) => {
|
|
8445
8899
|
const targetDate = "string" == typeof target ? new Date(target) : target, [now, setNow] = useState((() => new Date)), [completed, setCompleted] = useState(!1);
|
|
8446
8900
|
useEffect((() => {
|
|
8447
8901
|
if (completed) return;
|
|
@@ -8463,16 +8917,16 @@ const Countdown = forwardRef((({target: target, show: show = [ "days", "hours",
|
|
|
8463
8917
|
diff <= 0 && !completed && (setCompleted(!0), onComplete && onComplete());
|
|
8464
8918
|
}), [ diff, completed, onComplete ]);
|
|
8465
8919
|
const timeParts = [];
|
|
8466
|
-
return show.
|
|
8920
|
+
return _includesInstanceProperty(show).call(show, "days") && timeParts.push({
|
|
8467
8921
|
label: "Days",
|
|
8468
8922
|
value: days
|
|
8469
|
-
}), show.
|
|
8923
|
+
}), _includesInstanceProperty(show).call(show, "hours") && timeParts.push({
|
|
8470
8924
|
label: "Hours",
|
|
8471
8925
|
value: hours
|
|
8472
|
-
}), show.
|
|
8926
|
+
}), _includesInstanceProperty(show).call(show, "minutes") && timeParts.push({
|
|
8473
8927
|
label: "Minutes",
|
|
8474
8928
|
value: minutes
|
|
8475
|
-
}), show.
|
|
8929
|
+
}), _includesInstanceProperty(show).call(show, "seconds") && timeParts.push({
|
|
8476
8930
|
label: "Seconds",
|
|
8477
8931
|
value: seconds
|
|
8478
8932
|
}), jsx("div", {
|
|
@@ -8520,8 +8974,9 @@ function useDataTable({data: data = [], columns: columns = [], sortable: sortabl
|
|
|
8520
8974
|
if (!searchQuery) return data;
|
|
8521
8975
|
const lowercaseQuery = searchQuery.toLowerCase();
|
|
8522
8976
|
return data.filter((row => columns.some((column => {
|
|
8977
|
+
var _context;
|
|
8523
8978
|
const value = row[column.key];
|
|
8524
|
-
return null != value && String(value).toLowerCase().
|
|
8979
|
+
return null != value && _includesInstanceProperty(_context = String(value).toLowerCase()).call(_context, lowercaseQuery);
|
|
8525
8980
|
}))));
|
|
8526
8981
|
}), [ data, columns, searchQuery ]), sortedData = useMemo((() => sortConfig && sortable ? [ ...filteredData ].sort(((a, b) => {
|
|
8527
8982
|
const aValue = a[sortConfig.key], bValue = b[sortConfig.key];
|
|
@@ -8561,22 +9016,22 @@ const DOTS = "...", range = (start, end) => {
|
|
|
8561
9016
|
const paginationRange = useMemo((() => {
|
|
8562
9017
|
// siblingCount + firstPage + lastPage + currentPage + 2*DOTS
|
|
8563
9018
|
/*
|
|
8564
|
-
|
|
8565
|
-
|
|
8566
|
-
|
|
9019
|
+
Case 1: If the number of pages is less than the page numbers we want to show in our
|
|
9020
|
+
paginationComponent, we return the range [1..totalPages]
|
|
9021
|
+
*/
|
|
8567
9022
|
if (siblingCount + 5 >= totalPages) return range(1, totalPages);
|
|
8568
9023
|
const leftSiblingIndex = Math.max(currentPage - siblingCount, 1), rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages), shouldShowLeftDots = leftSiblingIndex > 2, shouldShowRightDots = rightSiblingIndex < totalPages - 2, lastPageIndex = totalPages;
|
|
8569
9024
|
/*
|
|
8570
|
-
|
|
8571
|
-
|
|
9025
|
+
Case 2: No left dots to show, but rights dots to be shown
|
|
9026
|
+
*/
|
|
8572
9027
|
return !shouldShowLeftDots && shouldShowRightDots ? [ ...range(1, 3 + 2 * siblingCount), "...", totalPages ] :
|
|
8573
9028
|
/*
|
|
8574
|
-
|
|
8575
|
-
|
|
9029
|
+
Case 3: No right dots to show, but left dots to be shown
|
|
9030
|
+
*/
|
|
8576
9031
|
shouldShowLeftDots && !shouldShowRightDots ? [ 1, "...", ...range(totalPages - (3 + 2 * siblingCount) + 1, totalPages) ] :
|
|
8577
9032
|
/*
|
|
8578
|
-
|
|
8579
|
-
|
|
9033
|
+
Case 4: Both left and right dots to be shown
|
|
9034
|
+
*/
|
|
8580
9035
|
shouldShowLeftDots && shouldShowRightDots ? [ 1, "...", ...range(leftSiblingIndex, rightSiblingIndex), "...", lastPageIndex ] : [];
|
|
8581
9036
|
}), [ totalPages, siblingCount, currentPage ]), goToPage = page => {
|
|
8582
9037
|
page >= 1 && page <= totalPages && page !== currentPage && onPageChange(page);
|
|
@@ -8600,7 +9055,7 @@ const DOTS = "...", range = (start, end) => {
|
|
|
8600
9055
|
},
|
|
8601
9056
|
DOTS: "..."
|
|
8602
9057
|
};
|
|
8603
|
-
}, PaginationNavButton =
|
|
9058
|
+
}, PaginationNavButton = memo((({type: type, onClick: onClick, disabled: disabled, label: label, iconName: iconName}) => jsx("li", {
|
|
8604
9059
|
className: `c-pagination__item c-pagination__item--${type} ${disabled ? "is-disabled" : ""}`,
|
|
8605
9060
|
"aria-disabled": disabled,
|
|
8606
9061
|
children: jsx("button", {
|
|
@@ -8615,10 +9070,7 @@ const DOTS = "...", range = (start, end) => {
|
|
|
8615
9070
|
"aria-hidden": "true"
|
|
8616
9071
|
})
|
|
8617
9072
|
})
|
|
8618
|
-
})
|
|
8619
|
-
/**
|
|
8620
|
-
* Pagination component
|
|
8621
|
-
*/ , Pagination = ({currentPage: currentPage = PAGINATION_DEFAULTS.currentPage, totalPages: totalPages = PAGINATION_DEFAULTS.totalPages, onPageChange: onPageChange, siblingCount: siblingCount = PAGINATION_DEFAULTS.siblingCount, showFirstLastButtons: showFirstLastButtons = PAGINATION_DEFAULTS.showFirstLastButtons, showPrevNextButtons: showPrevNextButtons = PAGINATION_DEFAULTS.showPrevNextButtons, size: size = PAGINATION_DEFAULTS.size, className: className = "", style: style, ariaLabel: ariaLabel = "Pagination", glass: glass}) => {
|
|
9073
|
+
}))), Pagination = memo((({currentPage: currentPage = PAGINATION_DEFAULTS.currentPage, totalPages: totalPages = PAGINATION_DEFAULTS.totalPages, onPageChange: onPageChange, siblingCount: siblingCount = PAGINATION_DEFAULTS.siblingCount, showFirstLastButtons: showFirstLastButtons = PAGINATION_DEFAULTS.showFirstLastButtons, showPrevNextButtons: showPrevNextButtons = PAGINATION_DEFAULTS.showPrevNextButtons, size: size = PAGINATION_DEFAULTS.size, className: className = "", style: style, ariaLabel: ariaLabel = "Pagination", glass: glass}) => {
|
|
8622
9074
|
const {paginationRange: paginationRange, goToPage: goToPage, nextPage: nextPage, prevPage: prevPage, firstPage: firstPage, lastPage: lastPage} = usePagination({
|
|
8623
9075
|
currentPage: currentPage,
|
|
8624
9076
|
totalPages: totalPages,
|
|
@@ -8698,9 +9150,9 @@ const DOTS = "...", range = (start, end) => {
|
|
|
8698
9150
|
});
|
|
8699
9151
|
}
|
|
8700
9152
|
return paginationContent;
|
|
8701
|
-
};
|
|
9153
|
+
}));
|
|
8702
9154
|
|
|
8703
|
-
Pagination.displayName = "Pagination";
|
|
9155
|
+
Pagination.displayName = "Pagination", PaginationNavButton.displayName = "PaginationNavButton";
|
|
8704
9156
|
|
|
8705
9157
|
/**
|
|
8706
9158
|
* DataTable - A flexible and accessible data table component
|
|
@@ -8715,7 +9167,7 @@ Pagination.displayName = "Pagination";
|
|
|
8715
9167
|
* />
|
|
8716
9168
|
* ```
|
|
8717
9169
|
*/
|
|
8718
|
-
const DataTable =
|
|
9170
|
+
const DataTable = memo((({data: data, columns: columns, className: className, style: style, sortable: sortable = !1, filterable: filterable = !1, paginated: paginated = !1, pageSize: pageSize = 10, striped: striped = !1, bordered: bordered = !1, dense: dense = !1, loading: loading = !1, emptyMessage: emptyMessage = "No data available", onRowClick: onRowClick, onSort: onSort, ...props}) => {
|
|
8719
9171
|
const tableRef = useRef(null), {displayData: displayData, sortConfig: sortConfig, currentPage: currentPage, totalPages: totalPages, handleSort: handleSort, handlePageChange: handlePageChange, handleSearch: handleSearch} = useDataTable({
|
|
8720
9172
|
data: data,
|
|
8721
9173
|
columns: columns,
|
|
@@ -8818,7 +9270,7 @@ const DataTable = ({data: data, columns: columns, className: className, style: s
|
|
|
8818
9270
|
})
|
|
8819
9271
|
}) ]
|
|
8820
9272
|
});
|
|
8821
|
-
};
|
|
9273
|
+
}));
|
|
8822
9274
|
|
|
8823
9275
|
/**
|
|
8824
9276
|
* Get the name of a month by its index (0-11)
|
|
@@ -9058,7 +9510,7 @@ function formatDate(date, format) {
|
|
|
9058
9510
|
* Supports various display modes, date ranges, and customization options.
|
|
9059
9511
|
*/ DataTable.displayName = "DataTable";
|
|
9060
9512
|
|
|
9061
|
-
const DatePicker =
|
|
9513
|
+
const DatePicker = forwardRef((({value: value, onChange: onChange, selectionMode: selectionMode = "single", startDate: startDate, endDate: endDate, onRangeChange: onRangeChange, format: format = "MM/dd/yyyy", minDate: minDate, maxDate: maxDate, placeholder: placeholder = "Select date...", disabled: disabled = !1, readOnly: readOnly = !1, clearable: clearable = !0, showTodayButton: showTodayButton = !0, showWeekNumbers: showWeekNumbers = !1, inline: inline = !1, id: id, name: name, className: className = "", placement: placement = "bottom-start", inputClassName: inputClassName = "", size: size = "md", style: style, glass: glass, ...props}, ref) => {
|
|
9062
9514
|
const {isOpen:
|
|
9063
9515
|
// State
|
|
9064
9516
|
isOpen, inputValue: inputValue, rangeInputValue: rangeInputValue, viewMode: viewMode, currentMonth: currentMonth, currentYear: currentYear, selectionMode: activeSelectionMode, rangeSelectionState: rangeSelectionState, datePickerRef:
|
|
@@ -9358,12 +9810,54 @@ const DatePicker = forwardRef((({value: value, onChange: onChange, selectionMode
|
|
|
9358
9810
|
DatePicker.displayName = "DatePicker";
|
|
9359
9811
|
|
|
9360
9812
|
// Create context for dropdown state management
|
|
9361
|
-
const DropdownContext =
|
|
9813
|
+
const DropdownContext = createContext({
|
|
9362
9814
|
isOpen: !1,
|
|
9363
9815
|
close: () => {},
|
|
9364
9816
|
id: "",
|
|
9365
9817
|
trigger: "click"
|
|
9366
|
-
}),
|
|
9818
|
+
}), DropdownItem = memo((({children: children, href: href, active: active = !1, disabled: disabled = !1, icon: icon, onClick: onClick, className: className = "", LinkComponent: LinkComponent, ...props}) => {
|
|
9819
|
+
const {close: close} = useContext(DropdownContext), handleClick = e => {
|
|
9820
|
+
disabled ? e.preventDefault() : (onClick && onClick(e),
|
|
9821
|
+
// Always close the dropdown when an item is clicked
|
|
9822
|
+
close());
|
|
9823
|
+
}, itemClasses = [ "c-dropdown__menu-item", active ? "is-active" : "", disabled ? "is-disabled" : "", className ].filter(Boolean).join(" "), linkProps = {
|
|
9824
|
+
href: href,
|
|
9825
|
+
className: itemClasses,
|
|
9826
|
+
onClick: handleClick,
|
|
9827
|
+
role: "menuitem",
|
|
9828
|
+
tabIndex: 0,
|
|
9829
|
+
...props
|
|
9830
|
+
};
|
|
9831
|
+
return jsx("li", href && !disabled ? {
|
|
9832
|
+
children: jsxs(LinkComponent || "a", {
|
|
9833
|
+
...linkProps,
|
|
9834
|
+
children: [ icon && jsx("span", {
|
|
9835
|
+
className: "c-dropdown__menu-item-icon",
|
|
9836
|
+
children: icon
|
|
9837
|
+
}), children ]
|
|
9838
|
+
})
|
|
9839
|
+
} : {
|
|
9840
|
+
children: jsxs("button", {
|
|
9841
|
+
type: "button",
|
|
9842
|
+
className: itemClasses,
|
|
9843
|
+
onClick: handleClick,
|
|
9844
|
+
disabled: disabled,
|
|
9845
|
+
role: "menuitem",
|
|
9846
|
+
tabIndex: 0,
|
|
9847
|
+
...props,
|
|
9848
|
+
children: [ icon && jsx("span", {
|
|
9849
|
+
className: "c-dropdown__menu-item-icon",
|
|
9850
|
+
children: icon
|
|
9851
|
+
}), children ]
|
|
9852
|
+
})
|
|
9853
|
+
});
|
|
9854
|
+
})), DropdownDivider = memo((({className: className = ""}) => jsx("li", {
|
|
9855
|
+
className: `c-dropdown__divider ${className}`,
|
|
9856
|
+
role: "separator"
|
|
9857
|
+
}))), DropdownHeader = memo((({children: children, className: className = ""}) => jsx("li", {
|
|
9858
|
+
className: `c-dropdown__header ${className}`,
|
|
9859
|
+
children: children
|
|
9860
|
+
}))), Dropdown = memo((({children: children, menu: menu, placement: placement = "bottom-start", trigger: trigger = "click", offset: offset = DROPDOWN.DEFAULTS.OFFSET, isOpen: controlledIsOpen, onOpenChange: onOpenChange, closeOnClickOutside: closeOnClickOutside = !0, closeOnEscape: closeOnEscape = !0, maxHeight: maxHeight, minWidth: minWidth = DROPDOWN.DEFAULTS.MIN_WIDTH, variant: variant, className: className = "", style: style, glass: glass, ...props}) => {
|
|
9367
9861
|
// Set up controlled vs uncontrolled state
|
|
9368
9862
|
const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState(!1), isControlled = void 0 !== controlledIsOpen, isOpen = isControlled ? controlledIsOpen : uncontrolledIsOpen, dropdownRef = useRef(null), toggleRef = useRef(null), menuRef = useRef(null), dropdownId = useRef(`dropdown-${Math.random().toString(36).substring(2, 9)}`).current, setIsOpen = useCallback((nextIsOpen => {
|
|
9369
9863
|
isControlled || setUncontrolledIsOpen(nextIsOpen), onOpenChange && onOpenChange(nextIsOpen);
|
|
@@ -9467,7 +9961,8 @@ const DropdownContext = createContext({
|
|
|
9467
9961
|
"aria-orientation": "vertical",
|
|
9468
9962
|
"aria-hidden": !isOpen,
|
|
9469
9963
|
onKeyDown: handleKeyDown,
|
|
9470
|
-
children: glass ?
|
|
9964
|
+
children: glass ?
|
|
9965
|
+
// Default glass settings for dropdowns
|
|
9471
9966
|
(() => {
|
|
9472
9967
|
const defaultGlassProps = {
|
|
9473
9968
|
displacementScale: 20,
|
|
@@ -9483,10 +9978,10 @@ const DropdownContext = createContext({
|
|
|
9483
9978
|
})() : menuContent
|
|
9484
9979
|
}) ]
|
|
9485
9980
|
});
|
|
9486
|
-
};
|
|
9981
|
+
}));
|
|
9487
9982
|
|
|
9488
9983
|
/**
|
|
9489
|
-
*
|
|
9984
|
+
* DropdownItem component for menu items
|
|
9490
9985
|
*/
|
|
9491
9986
|
/**
|
|
9492
9987
|
* EdgePanel state and functionality
|
|
@@ -9605,15 +10100,15 @@ function useEdgePanel(initialProps) {
|
|
|
9605
10100
|
defaultProps.closeOnBackdropClick && event.target === event.currentTarget && closePanel();
|
|
9606
10101
|
}), [ closePanel, defaultProps.closeOnBackdropClick ]);
|
|
9607
10102
|
/**
|
|
9608
|
-
|
|
9609
|
-
|
|
10103
|
+
* Set up event listeners for keyboard events
|
|
10104
|
+
*/
|
|
9610
10105
|
return useEffect((() => (isOpen && defaultProps.closeOnEscape && document.addEventListener("keydown", handleEscapeKey),
|
|
9611
10106
|
() => {
|
|
9612
10107
|
document.removeEventListener("keydown", handleEscapeKey);
|
|
9613
10108
|
})), [ isOpen, handleEscapeKey, defaultProps.closeOnEscape ]),
|
|
9614
10109
|
/**
|
|
9615
|
-
|
|
9616
|
-
|
|
10110
|
+
* Set initial transform values
|
|
10111
|
+
*/
|
|
9617
10112
|
useEffect((() => {
|
|
9618
10113
|
if (containerRef.current) {
|
|
9619
10114
|
const {position: position, mode: mode} = defaultProps;
|
|
@@ -9623,8 +10118,8 @@ function useEdgePanel(initialProps) {
|
|
|
9623
10118
|
}
|
|
9624
10119
|
}), [ defaultProps.mode, defaultProps.position, defaultProps.glass, isOpen ]),
|
|
9625
10120
|
/**
|
|
9626
|
-
|
|
9627
|
-
|
|
10121
|
+
* Sync with prop changes
|
|
10122
|
+
*/
|
|
9628
10123
|
useEffect((() => {
|
|
9629
10124
|
void 0 !== defaultProps.isOpen && defaultProps.isOpen !== isOpen && (defaultProps.isOpen ? openPanel(!!defaultProps.glass) : closePanel(!!defaultProps.glass));
|
|
9630
10125
|
}), [ defaultProps.isOpen, closePanel, isOpen, openPanel, defaultProps.glass ]),
|
|
@@ -9686,7 +10181,8 @@ function useEdgePanel(initialProps) {
|
|
|
9686
10181
|
* <p>Panel with custom glass effect</p>
|
|
9687
10182
|
* </EdgePanel>
|
|
9688
10183
|
* ```
|
|
9689
|
-
*/ Dropdown.displayName = "Dropdown"
|
|
10184
|
+
*/ Dropdown.displayName = "Dropdown", DropdownItem.displayName = "DropdownItem",
|
|
10185
|
+
DropdownDivider.displayName = "DropdownDivider", DropdownHeader.displayName = "DropdownHeader";
|
|
9690
10186
|
|
|
9691
10187
|
const EdgePanel = ({title: title, children: children, position: position = "start", mode: mode = "slide", isOpen: isOpen = !1, onOpenChange: onOpenChange, backdrop: backdrop = !0, closeOnBackdropClick: closeOnBackdropClick = !0, closeOnEscape: closeOnEscape = !0, className: className = "", style: style, glass: glass}) => {
|
|
9692
10188
|
const {isOpen: isOpenState, containerRef: containerRef, backdropRef: backdropRef, generateEdgePanelClass: generateEdgePanelClass, closePanel: closePanel, handleBackdropClick: handleBackdropClick} = useEdgePanel({
|
|
@@ -9800,7 +10296,7 @@ function useCheckbox(initialProps) {
|
|
|
9800
10296
|
|
|
9801
10297
|
/**
|
|
9802
10298
|
* Checkbox - A component for checkbox inputs
|
|
9803
|
-
*/ const Checkbox =
|
|
10299
|
+
*/ const Checkbox = memo((({label: label, checked: checked = !1, onChange: onChange, className: className = "", style: style, disabled: disabled = !1, required: required = !1, id: id, name: name, value: value, invalid: invalid = !1, valid: valid = !1, indeterminate: indeterminate = !1, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}) => {
|
|
9804
10300
|
const {generateCheckboxClass: generateCheckboxClass, checkboxRef: checkboxRef} = useCheckbox({
|
|
9805
10301
|
indeterminate: indeterminate,
|
|
9806
10302
|
disabled: disabled,
|
|
@@ -9854,7 +10350,7 @@ function useCheckbox(initialProps) {
|
|
|
9854
10350
|
});
|
|
9855
10351
|
}
|
|
9856
10352
|
return checkboxContent;
|
|
9857
|
-
};
|
|
10353
|
+
}));
|
|
9858
10354
|
|
|
9859
10355
|
/**
|
|
9860
10356
|
* Form state and functionality
|
|
@@ -9868,10 +10364,10 @@ function useForm(initialProps) {
|
|
|
9868
10364
|
...initialProps
|
|
9869
10365
|
};
|
|
9870
10366
|
/**
|
|
9871
|
-
|
|
9872
|
-
|
|
9873
|
-
|
|
9874
|
-
|
|
10367
|
+
* Generate form class based on properties
|
|
10368
|
+
* @param props - Form properties
|
|
10369
|
+
* @returns Class string
|
|
10370
|
+
*/ return {
|
|
9875
10371
|
defaultProps: defaultProps,
|
|
9876
10372
|
generateFormClass: props => {
|
|
9877
10373
|
const {disabled: disabled = defaultProps.disabled, className: className = ""} = props, disabledClass = disabled ? FORM.CLASSES.DISABLED : "";
|
|
@@ -9926,10 +10422,10 @@ function useFormGroup(initialProps) {
|
|
|
9926
10422
|
...initialProps
|
|
9927
10423
|
};
|
|
9928
10424
|
/**
|
|
9929
|
-
|
|
9930
|
-
|
|
9931
|
-
|
|
9932
|
-
|
|
10425
|
+
* Generate form group class based on properties
|
|
10426
|
+
* @param props - Form group properties
|
|
10427
|
+
* @returns Class string
|
|
10428
|
+
*/ return {
|
|
9933
10429
|
defaultProps: defaultProps,
|
|
9934
10430
|
generateFormGroupClass: props => {
|
|
9935
10431
|
const {size: size = defaultProps.size, disabled: disabled = defaultProps.disabled, invalid: invalid = defaultProps.invalid, valid: valid = defaultProps.valid, className: className = ""} = props, sizeClass = "md" === size ? "" : "sm" === size ? FORM_GROUP.CLASSES.SMALL : FORM_GROUP.CLASSES.LARGE, validationClass = invalid ? FORM_GROUP.CLASSES.INVALID : valid ? FORM_GROUP.CLASSES.VALID : "", disabledClass = disabled ? FORM_GROUP.CLASSES.DISABLED : "";
|
|
@@ -9990,10 +10486,10 @@ function useInput(initialProps) {
|
|
|
9990
10486
|
...initialProps
|
|
9991
10487
|
};
|
|
9992
10488
|
/**
|
|
9993
|
-
|
|
9994
|
-
|
|
9995
|
-
|
|
9996
|
-
|
|
10489
|
+
* Generate input class based on properties
|
|
10490
|
+
* @param props - Input properties
|
|
10491
|
+
* @returns Class string
|
|
10492
|
+
*/ return {
|
|
9997
10493
|
defaultProps: defaultProps,
|
|
9998
10494
|
generateInputClass: props => {
|
|
9999
10495
|
const {size: size = defaultProps.size, variant: variant = defaultProps.variant, disabled: disabled = defaultProps.disabled, invalid: invalid = defaultProps.invalid, valid: valid = defaultProps.valid, className: className = "", type: type} = props, sizeClass = "md" === size ? "" : "sm" === size ? INPUT.CLASSES.SMALL : INPUT.CLASSES.LARGE, variantClass = variant ? `c-input--${variant}` : "", textareaClass = "textarea" === type ? "c-input--textarea" : "";
|
|
@@ -10016,7 +10512,7 @@ function useInput(initialProps) {
|
|
|
10016
10512
|
* Input - A component for text input fields
|
|
10017
10513
|
*/ FormGroup.displayName = "FormGroup";
|
|
10018
10514
|
|
|
10019
|
-
const Input = forwardRef((({type: type = "text", value: value, onChange: onChange, onBlur: onBlur, onFocus: onFocus, placeholder: placeholder, className: className = "", style: style, disabled: disabled = !1, required: required = !1, readOnly: readOnly = !1, id: id, name: name, autoComplete: autoComplete, autoFocus: autoFocus = !1, size: size = "md", variant: variant, invalid: invalid = !1, valid: valid = !1, maxLength: maxLength, minLength: minLength, pattern: pattern, min: min, max: max, step: step, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}, ref) => {
|
|
10515
|
+
const Input = memo( forwardRef((({type: type = "text", value: value, onChange: onChange, onBlur: onBlur, onFocus: onFocus, placeholder: placeholder, className: className = "", style: style, disabled: disabled = !1, required: required = !1, readOnly: readOnly = !1, id: id, name: name, autoComplete: autoComplete, autoFocus: autoFocus = !1, size: size = "md", variant: variant, invalid: invalid = !1, valid: valid = !1, maxLength: maxLength, minLength: minLength, pattern: pattern, min: min, max: max, step: step, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}, ref) => {
|
|
10020
10516
|
const {generateInputClass: generateInputClass} = useInput({
|
|
10021
10517
|
size: size,
|
|
10022
10518
|
variant: variant,
|
|
@@ -10079,7 +10575,7 @@ const Input = forwardRef((({type: type = "text", value: value, onChange: onChang
|
|
|
10079
10575
|
});
|
|
10080
10576
|
}
|
|
10081
10577
|
return inputElement;
|
|
10082
|
-
}));
|
|
10578
|
+
})));
|
|
10083
10579
|
|
|
10084
10580
|
/**
|
|
10085
10581
|
* Hook for Hero component functionality
|
|
@@ -10098,25 +10594,25 @@ function useHero(initialProps) {
|
|
|
10098
10594
|
parallax: !1,
|
|
10099
10595
|
parallaxIntensity: .5,
|
|
10100
10596
|
...initialProps
|
|
10101
|
-
}, hasBackgroundSlider = !!defaultProps.backgroundSlider,
|
|
10597
|
+
}, hasBackgroundSlider = !!defaultProps.backgroundSlider, backgroundSliderResult =
|
|
10102
10598
|
/**
|
|
10103
10599
|
* Hook for Hero background slider functionality
|
|
10104
10600
|
* @param config - Background slider configuration
|
|
10105
10601
|
* @returns Slider state and methods
|
|
10106
10602
|
*/
|
|
10107
10603
|
function(config) {
|
|
10108
|
-
const {slides: slides, autoplay: autoplay, loop: loop = !0, transition: transition = "fade", transitionDuration: transitionDuration = 1e3} = config, [currentIndex, setCurrentIndex] = useState(0), [isTransitioning, setIsTransitioning] = useState(!1), autoplayRef = useRef(null), isPausedRef = useRef(!1), slideRefs = useMemo((() => slides.map((() =>
|
|
10604
|
+
const {slides: slides, autoplay: autoplay, loop: loop = !0, transition: transition = "fade", transitionDuration: transitionDuration = 1e3} = config, [currentIndex, setCurrentIndex] = useState(0), [isTransitioning, setIsTransitioning] = useState(!1), autoplayRef = useRef(null), isPausedRef = useRef(!1), slideRefs = useMemo((() => slides.map((() => React.createRef()))), [ slides.length ]), videoRefs = useMemo((() => slides.map((() => React.createRef()))), [ slides.length ]), handleSlideTransition = useCallback((nextIndex => {
|
|
10109
10605
|
if (nextIndex === currentIndex || isTransitioning) return;
|
|
10110
10606
|
if (nextIndex < 0 || nextIndex >= slides.length) return;
|
|
10111
10607
|
setIsTransitioning(!0),
|
|
10112
10608
|
// Update current index
|
|
10113
10609
|
setCurrentIndex(nextIndex);
|
|
10114
10610
|
// Play video if it's a video slide
|
|
10115
|
-
const currentVideo = videoRefs[nextIndex]?.current;
|
|
10116
|
-
currentVideo && "video" ===
|
|
10611
|
+
const currentVideo = videoRefs[nextIndex]?.current, nextSlide = slides[nextIndex];
|
|
10612
|
+
currentVideo && nextSlide && "video" === nextSlide.type && !1 !== (nextSlide.videoOptions || {}).autoplay && currentVideo.play().catch((() => {}));
|
|
10117
10613
|
// Pause previous video if it exists
|
|
10118
|
-
const prevVideo = videoRefs[currentIndex]?.current;
|
|
10119
|
-
prevVideo && "video" ===
|
|
10614
|
+
const prevVideo = videoRefs[currentIndex]?.current, currentSlide = slides[currentIndex];
|
|
10615
|
+
prevVideo && currentSlide && "video" === currentSlide.type && prevVideo.pause(),
|
|
10120
10616
|
// Reset transitioning state after transition duration
|
|
10121
10617
|
setTimeout((() => {
|
|
10122
10618
|
setIsTransitioning(!1);
|
|
@@ -10172,7 +10668,13 @@ function useHero(initialProps) {
|
|
|
10172
10668
|
pauseAutoplay: pauseAutoplay,
|
|
10173
10669
|
resumeAutoplay: resumeAutoplay
|
|
10174
10670
|
};
|
|
10175
|
-
}(defaultProps.backgroundSlider
|
|
10671
|
+
}(defaultProps.backgroundSlider || {
|
|
10672
|
+
slides: [],
|
|
10673
|
+
autoplay: {
|
|
10674
|
+
delay: 5e3,
|
|
10675
|
+
pauseOnHover: !0
|
|
10676
|
+
}
|
|
10677
|
+
}), backgroundSlider = hasBackgroundSlider && defaultProps.backgroundSlider ? backgroundSliderResult : void 0, hasBackgroundImage = !!hasBackgroundSlider || !!defaultProps.backgroundImageSrc || !!defaultProps.videoBackground, hasForegroundImage = !!defaultProps.imageSrc, useGridLayout = hasForegroundImage && "center" !== defaultProps.alignment, applyParallaxEffect = (element, intensity = .5) => {
|
|
10176
10678
|
if (!element) return;
|
|
10177
10679
|
// Ensure intensity is between 0 and 1
|
|
10178
10680
|
const safeIntensity = Math.max(0, Math.min(1, intensity));
|
|
@@ -10255,8 +10757,8 @@ function useHero(initialProps) {
|
|
|
10255
10757
|
...initialProps
|
|
10256
10758
|
};
|
|
10257
10759
|
/**
|
|
10258
|
-
|
|
10259
|
-
|
|
10760
|
+
* Check if the river has a background image
|
|
10761
|
+
*/ return {
|
|
10260
10762
|
generateRiverClassNames: (baseClassName = "") => {
|
|
10261
10763
|
const classes = [ RIVER.SELECTORS.RIVER.replace(".", "") ];
|
|
10262
10764
|
// Add layout classes
|
|
@@ -10320,10 +10822,10 @@ function useHero(initialProps) {
|
|
|
10320
10822
|
...initialProps
|
|
10321
10823
|
};
|
|
10322
10824
|
/**
|
|
10323
|
-
|
|
10324
|
-
|
|
10325
|
-
|
|
10326
|
-
|
|
10825
|
+
* Generate nav class based on properties
|
|
10826
|
+
* @param props - Nav properties
|
|
10827
|
+
* @returns Class string
|
|
10828
|
+
*/ return {
|
|
10327
10829
|
defaultProps: defaultProps,
|
|
10328
10830
|
generateNavClass: props => {
|
|
10329
10831
|
const {alignment: alignment = defaultProps.alignment, variant: variant = defaultProps.variant, className: className = ""} = props;
|
|
@@ -10345,10 +10847,10 @@ function useHero(initialProps) {
|
|
|
10345
10847
|
...initialProps
|
|
10346
10848
|
};
|
|
10347
10849
|
/**
|
|
10348
|
-
|
|
10349
|
-
|
|
10350
|
-
|
|
10351
|
-
|
|
10850
|
+
* Generate nav item class based on properties
|
|
10851
|
+
* @param props - Nav item properties
|
|
10852
|
+
* @returns Class string
|
|
10853
|
+
*/ return {
|
|
10352
10854
|
defaultProps: defaultProps,
|
|
10353
10855
|
generateNavItemClass: props => {
|
|
10354
10856
|
const {dropdown: dropdown = defaultProps.dropdown, megaMenu: megaMenu = defaultProps.megaMenu, active: active = defaultProps.active, disabled: disabled = defaultProps.disabled, className: className = ""} = props;
|
|
@@ -10374,10 +10876,10 @@ function useHero(initialProps) {
|
|
|
10374
10876
|
...initialProps
|
|
10375
10877
|
}, isInFixedBottomNavbar = () => null !== document.querySelector(".c-navbar--fixed-bottom");
|
|
10376
10878
|
/**
|
|
10377
|
-
|
|
10378
|
-
|
|
10379
|
-
|
|
10380
|
-
|
|
10879
|
+
* Generate dropdown menu class based on properties
|
|
10880
|
+
* @param props - Dropdown properties
|
|
10881
|
+
* @returns Class string
|
|
10882
|
+
*/ return {
|
|
10381
10883
|
defaultProps: defaultProps,
|
|
10382
10884
|
generateDropdownMenuClass: props => {
|
|
10383
10885
|
const {alignment: alignment = defaultProps.alignment, megaMenu: megaMenu = defaultProps.megaMenu, className: className = ""} = props, baseClass = megaMenu ? NAV.SELECTORS.MEGA_MENU.replace(".", "") : NAV.SELECTORS.DROPDOWN_MENU.replace(".", "");
|
|
@@ -10459,10 +10961,10 @@ function useHero(initialProps) {
|
|
|
10459
10961
|
wrapperRef.current.style.height = "auto");
|
|
10460
10962
|
}), [ defaultProps.isOpen, isOpenState, defaultProps.collapsible, defaultProps.collapsibleDesktop ]);
|
|
10461
10963
|
/**
|
|
10462
|
-
|
|
10463
|
-
|
|
10464
|
-
|
|
10465
|
-
|
|
10964
|
+
* Generate side menu class based on properties
|
|
10965
|
+
* @param props - Side menu properties
|
|
10966
|
+
* @returns Class string
|
|
10967
|
+
*/
|
|
10466
10968
|
const handleToggle = () => {
|
|
10467
10969
|
if (defaultProps.disabled) return;
|
|
10468
10970
|
const newState = void 0 !== defaultProps.isOpen ? !defaultProps.isOpen : !isOpenState;
|
|
@@ -10473,9 +10975,9 @@ function useHero(initialProps) {
|
|
|
10473
10975
|
setIsOpenState(newState);
|
|
10474
10976
|
}, getCurrentOpenState = () => void 0 !== defaultProps.isOpen ? defaultProps.isOpen : isOpenState;
|
|
10475
10977
|
/**
|
|
10476
|
-
|
|
10477
|
-
|
|
10478
|
-
|
|
10978
|
+
* Generate wrapper class
|
|
10979
|
+
* @returns Class string
|
|
10980
|
+
*/ return {
|
|
10479
10981
|
defaultProps: defaultProps,
|
|
10480
10982
|
isOpenState: getCurrentOpenState(),
|
|
10481
10983
|
wrapperRef: wrapperRef,
|
|
@@ -10506,9 +11008,9 @@ function useHero(initialProps) {
|
|
|
10506
11008
|
...initialProps
|
|
10507
11009
|
};
|
|
10508
11010
|
/**
|
|
10509
|
-
|
|
10510
|
-
|
|
10511
|
-
|
|
11011
|
+
* Generate side menu item class based on properties
|
|
11012
|
+
* @returns Class string
|
|
11013
|
+
*/ return {
|
|
10512
11014
|
defaultProps: defaultProps,
|
|
10513
11015
|
generateSideMenuItemClass: () => {
|
|
10514
11016
|
const {active: active = defaultProps.active, disabled: disabled = defaultProps.disabled, className: className = ""} = defaultProps, activeClass = active ? SIDE_MENU.CLASSES.ACTIVE : "", disabledClass = disabled ? SIDE_MENU.CLASSES.DISABLED : "";
|
|
@@ -10633,7 +11135,8 @@ function useHero(initialProps) {
|
|
|
10633
11135
|
* const style = cssVarsToStyle(vars)
|
|
10634
11136
|
* // Returns: { '--atomix-button-bg': '#000' } as React.CSSProperties
|
|
10635
11137
|
*/ function cssVarsToStyle(vars) {
|
|
10636
|
-
|
|
11138
|
+
var _context;
|
|
11139
|
+
return _reduceInstanceProperty(_context = Object.entries(vars)).call(_context, ((acc, [key, value]) => (acc[key] = "number" == typeof value ? `${value}px` : value,
|
|
10637
11140
|
acc)), {});
|
|
10638
11141
|
}
|
|
10639
11142
|
|
|
@@ -10641,7 +11144,8 @@ function useHero(initialProps) {
|
|
|
10641
11144
|
* Merge multiple CSS variable objects
|
|
10642
11145
|
* Later objects override earlier ones
|
|
10643
11146
|
*/ function mergeCSSVars(...varObjects) {
|
|
10644
|
-
return varObjects.
|
|
11147
|
+
return _reduceInstanceProperty(varObjects).call(varObjects, ((acc, vars) => (vars && Object.assign(acc, vars),
|
|
11148
|
+
acc)), {});
|
|
10645
11149
|
}
|
|
10646
11150
|
|
|
10647
11151
|
/**
|
|
@@ -10674,11 +11178,20 @@ function useHero(initialProps) {
|
|
|
10674
11178
|
|
|
10675
11179
|
/**
|
|
10676
11180
|
* Apply part styles to element props
|
|
10677
|
-
*/
|
|
11181
|
+
*/ function applyPartStyles(baseProps, partStyles) {
|
|
11182
|
+
return partStyles ? {
|
|
11183
|
+
...baseProps,
|
|
11184
|
+
className: mergeClassNames(baseProps.className, partStyles.className),
|
|
11185
|
+
style: {
|
|
11186
|
+
...baseProps.style,
|
|
11187
|
+
...partStyles.style
|
|
11188
|
+
}
|
|
11189
|
+
} : baseProps;
|
|
11190
|
+
}
|
|
11191
|
+
|
|
10678
11192
|
/**
|
|
10679
11193
|
* Create style object from CSS variables
|
|
10680
|
-
*/
|
|
10681
|
-
function createCSSVarStyle(cssVars, baseStyle) {
|
|
11194
|
+
*/ function createCSSVarStyle(cssVars, baseStyle) {
|
|
10682
11195
|
return cssVars ? {
|
|
10683
11196
|
...cssVarsToStyle(cssVars),
|
|
10684
11197
|
...baseStyle
|
|
@@ -10763,40 +11276,130 @@ function mergeComponentProps(baseProps, customization) {
|
|
|
10763
11276
|
}
|
|
10764
11277
|
|
|
10765
11278
|
/**
|
|
10766
|
-
*
|
|
11279
|
+
* Font Preloading Utilities
|
|
11280
|
+
*
|
|
11281
|
+
* Provides utilities for preloading fonts to improve performance
|
|
11282
|
+
* and prevent Flash of Invisible Text (FOIT).
|
|
11283
|
+
*/
|
|
11284
|
+
/**
|
|
11285
|
+
* Creates a preload link element for a font
|
|
11286
|
+
*
|
|
11287
|
+
* @param config - Font preload configuration
|
|
11288
|
+
* @returns HTML link element for preloading
|
|
11289
|
+
*
|
|
11290
|
+
* @example
|
|
11291
|
+
* ```tsx
|
|
11292
|
+
* const preloadLink = createFontPreloadLink({
|
|
11293
|
+
* family: 'Nunito Sans',
|
|
11294
|
+
* path: '/fonts/nunito-sans/nunito-sans-regular.woff2',
|
|
11295
|
+
* weight: 400
|
|
11296
|
+
* });
|
|
11297
|
+
* document.head.appendChild(preloadLink);
|
|
11298
|
+
* ```
|
|
11299
|
+
*/ function createFontPreloadLink(config) {
|
|
11300
|
+
const {path: path, format: format = "woff2", crossorigin: crossorigin = "anonymous"} = config, link = document.createElement("link");
|
|
11301
|
+
return link.rel = "preload", link.as = "font", link.href = path, link.type = `font/${format}`,
|
|
11302
|
+
link.crossOrigin = crossorigin, link;
|
|
11303
|
+
}
|
|
11304
|
+
|
|
11305
|
+
/**
|
|
11306
|
+
* Preloads multiple fonts
|
|
11307
|
+
*
|
|
11308
|
+
* @param fonts - Array of font configurations to preload
|
|
11309
|
+
* @returns Array of created link elements
|
|
11310
|
+
*
|
|
11311
|
+
* @example
|
|
11312
|
+
* ```tsx
|
|
11313
|
+
* const links = preloadFonts([
|
|
11314
|
+
* { family: 'Nunito Sans', path: '/fonts/nunito-sans/nunito-sans-regular.woff2', weight: 400 },
|
|
11315
|
+
* { family: 'Nunito Sans', path: '/fonts/nunito-sans/nunito-sans-bold.woff2', weight: 700 },
|
|
11316
|
+
* ]);
|
|
11317
|
+
* links.forEach(link => document.head.appendChild(link));
|
|
11318
|
+
* ```
|
|
11319
|
+
*/ function preloadFonts(fonts) {
|
|
11320
|
+
return fonts.map(createFontPreloadLink);
|
|
11321
|
+
}
|
|
11322
|
+
|
|
11323
|
+
/**
|
|
11324
|
+
* Generates preload link HTML tags as strings
|
|
11325
|
+
* Useful for server-side rendering or static HTML generation
|
|
11326
|
+
*
|
|
11327
|
+
* @param fonts - Array of font configurations
|
|
11328
|
+
* @returns Array of HTML string representations
|
|
11329
|
+
*
|
|
11330
|
+
* @example
|
|
11331
|
+
* ```tsx
|
|
11332
|
+
* const htmlTags = generateFontPreloadTags([
|
|
11333
|
+
* { family: 'Nunito Sans', path: '/fonts/nunito-sans/nunito-sans-regular.woff2' },
|
|
11334
|
+
* ]);
|
|
11335
|
+
* // Returns: ['<link rel="preload" as="font" href="/fonts/..." type="font/woff2" crossorigin="anonymous">']
|
|
11336
|
+
* ```
|
|
11337
|
+
*/ function generateFontPreloadTags(fonts) {
|
|
11338
|
+
return fonts.map((config => {
|
|
11339
|
+
const {path: path, format: format = "woff2", crossorigin: crossorigin = "anonymous"} = config;
|
|
11340
|
+
return `<link rel="preload" as="font" href="${path}" type="font/${format}" crossorigin="${crossorigin}">`;
|
|
11341
|
+
}));
|
|
11342
|
+
}
|
|
11343
|
+
|
|
11344
|
+
/**
|
|
11345
|
+
* Default font configurations for Atomix Design System
|
|
11346
|
+
* These can be used as a starting point for font preloading
|
|
10767
11347
|
*/ Input.displayName = "Input";
|
|
10768
11348
|
|
|
10769
|
-
const
|
|
11349
|
+
const DEFAULT_ATOMIX_FONTS = [ {
|
|
11350
|
+
family: "Nunito Sans",
|
|
11351
|
+
path: "/fonts/nunito-sans/nunito-sans-regular.woff2",
|
|
11352
|
+
weight: 400,
|
|
11353
|
+
style: "normal",
|
|
11354
|
+
format: "woff2"
|
|
11355
|
+
}, {
|
|
11356
|
+
family: "Nunito Sans",
|
|
11357
|
+
path: "/fonts/nunito-sans/nunito-sans-bold.woff2",
|
|
11358
|
+
weight: 700,
|
|
11359
|
+
style: "normal",
|
|
11360
|
+
format: "woff2"
|
|
11361
|
+
}, {
|
|
11362
|
+
family: "Nunito Sans",
|
|
11363
|
+
path: "/fonts/nunito-sans/nunito-sans-italic.woff2",
|
|
11364
|
+
weight: 400,
|
|
11365
|
+
style: "italic",
|
|
11366
|
+
format: "woff2"
|
|
11367
|
+
}, {
|
|
11368
|
+
family: "Nunito Sans",
|
|
11369
|
+
path: "/fonts/nunito-sans/nunito-sans-bold-italic.woff2",
|
|
11370
|
+
weight: 700,
|
|
11371
|
+
style: "italic",
|
|
11372
|
+
format: "woff2"
|
|
11373
|
+
} ], utilsImport = Object.freeze( Object.defineProperty({
|
|
10770
11374
|
__proto__: null,
|
|
10771
|
-
|
|
10772
|
-
|
|
10773
|
-
...baseProps,
|
|
10774
|
-
className: mergeClassNames(baseProps.className, partStyles.className),
|
|
10775
|
-
style: {
|
|
10776
|
-
...baseProps.style,
|
|
10777
|
-
...partStyles.style
|
|
10778
|
-
}
|
|
10779
|
-
} : baseProps;
|
|
10780
|
-
},
|
|
11375
|
+
DEFAULT_ATOMIX_FONTS: DEFAULT_ATOMIX_FONTS,
|
|
11376
|
+
applyPartStyles: applyPartStyles,
|
|
10781
11377
|
createCSSVarStyle: createCSSVarStyle,
|
|
10782
11378
|
createDebugAttrs: createDebugAttrs,
|
|
11379
|
+
createFontPreloadLink: createFontPreloadLink,
|
|
10783
11380
|
createPartProps: createPartProps,
|
|
10784
11381
|
extractYouTubeId: extractYouTubeId,
|
|
11382
|
+
generateFontPreloadTags: generateFontPreloadTags,
|
|
10785
11383
|
generateUUID: generateUUID,
|
|
10786
11384
|
getPartStyles: getPartStyles,
|
|
10787
11385
|
hasCustomization: hasCustomization,
|
|
10788
11386
|
isYouTubeUrl: isYouTubeUrl,
|
|
10789
11387
|
mergeClassNames: mergeClassNames,
|
|
10790
|
-
mergeComponentProps: mergeComponentProps
|
|
11388
|
+
mergeComponentProps: mergeComponentProps,
|
|
11389
|
+
preloadFonts: preloadFonts
|
|
10791
11390
|
}, Symbol.toStringTag, {
|
|
10792
11391
|
value: "Module"
|
|
10793
11392
|
}));
|
|
10794
11393
|
|
|
11394
|
+
/**
|
|
11395
|
+
* Utility Functions Exports
|
|
11396
|
+
*/
|
|
10795
11397
|
/**
|
|
10796
11398
|
* Todo composable hook - manages todo items state and operations
|
|
10797
11399
|
* @param initialProps - Initial todo properties
|
|
10798
11400
|
* @returns Todo state and methods
|
|
10799
|
-
*/
|
|
11401
|
+
*/
|
|
11402
|
+
function useTodo(initialProps) {
|
|
10800
11403
|
// Default todo properties
|
|
10801
11404
|
const defaultProps = {
|
|
10802
11405
|
items: [],
|
|
@@ -10951,10 +11554,10 @@ const utilsImport = Object.freeze( Object.defineProperty({
|
|
|
10951
11554
|
...initialProps
|
|
10952
11555
|
};
|
|
10953
11556
|
/**
|
|
10954
|
-
|
|
10955
|
-
|
|
10956
|
-
|
|
10957
|
-
|
|
11557
|
+
* Generate radio class based on properties
|
|
11558
|
+
* @param props - Radio properties
|
|
11559
|
+
* @returns Class string
|
|
11560
|
+
*/ return {
|
|
10958
11561
|
defaultProps: defaultProps,
|
|
10959
11562
|
generateRadioClass: props => {
|
|
10960
11563
|
const {disabled: disabled = defaultProps.disabled, invalid: invalid = defaultProps.invalid, valid: valid = defaultProps.valid, className: className = ""} = props;
|
|
@@ -10980,10 +11583,10 @@ const utilsImport = Object.freeze( Object.defineProperty({
|
|
|
10980
11583
|
...initialProps
|
|
10981
11584
|
};
|
|
10982
11585
|
/**
|
|
10983
|
-
|
|
10984
|
-
|
|
10985
|
-
|
|
10986
|
-
|
|
11586
|
+
* Generate select class based on properties
|
|
11587
|
+
* @param props - Select properties
|
|
11588
|
+
* @returns Class string
|
|
11589
|
+
*/ return {
|
|
10987
11590
|
defaultProps: defaultProps,
|
|
10988
11591
|
generateSelectClass: props => {
|
|
10989
11592
|
const {size: size = defaultProps.size, disabled: disabled = defaultProps.disabled, invalid: invalid = defaultProps.invalid, valid: valid = defaultProps.valid, className: className = ""} = props, sizeClass = "md" === size ? "" : "sm" === size ? SELECT.CLASSES.SMALL : SELECT.CLASSES.LARGE;
|
|
@@ -11009,10 +11612,10 @@ const utilsImport = Object.freeze( Object.defineProperty({
|
|
|
11009
11612
|
...initialProps
|
|
11010
11613
|
};
|
|
11011
11614
|
/**
|
|
11012
|
-
|
|
11013
|
-
|
|
11014
|
-
|
|
11015
|
-
|
|
11615
|
+
* Generate textarea class based on properties
|
|
11616
|
+
* @param props - Textarea properties
|
|
11617
|
+
* @returns Class string
|
|
11618
|
+
*/ return {
|
|
11016
11619
|
defaultProps: defaultProps,
|
|
11017
11620
|
generateTextareaClass: props => {
|
|
11018
11621
|
const {size: size = defaultProps.size, variant: variant = defaultProps.variant, disabled: disabled = defaultProps.disabled, invalid: invalid = defaultProps.invalid, valid: valid = defaultProps.valid, className: className = ""} = props, sizeClass = "md" === size ? "" : "sm" === size ? TEXTAREA.CLASSES.SMALL : TEXTAREA.CLASSES.LARGE, variantClass = variant ? `c-input--${variant}` : "";
|
|
@@ -11308,7 +11911,7 @@ function useSlider(options) {
|
|
|
11308
11911
|
total: 0,
|
|
11309
11912
|
average: 0
|
|
11310
11913
|
};
|
|
11311
|
-
const values = processedData.map((d => d.value)), min = Math.min(...values), max = Math.max(...values), total = values.
|
|
11914
|
+
const values = processedData.map((d => d.value)), min = Math.min(...values), max = Math.max(...values), total = _reduceInstanceProperty(values).call(values, ((sum, val) => sum + val), 0);
|
|
11312
11915
|
return {
|
|
11313
11916
|
min: min,
|
|
11314
11917
|
max: max,
|
|
@@ -11336,14 +11939,24 @@ function useSlider(options) {
|
|
|
11336
11939
|
if (!data.length) return {
|
|
11337
11940
|
xScale: () => padding.left,
|
|
11338
11941
|
yScale: () => padding.top + innerHeight,
|
|
11942
|
+
minValue: 0,
|
|
11943
|
+
maxValue: 0,
|
|
11944
|
+
valueRange: 0,
|
|
11945
|
+
innerWidth: innerWidth,
|
|
11946
|
+
innerHeight: innerHeight,
|
|
11339
11947
|
width: width,
|
|
11340
11948
|
height: height,
|
|
11341
11949
|
padding: padding
|
|
11342
11950
|
};
|
|
11343
|
-
const values = data.map((d => d.value)), minValue = Math.min(0, ...values),
|
|
11951
|
+
const values = data.map((d => d.value)), minValue = Math.min(0, ...values), maxValue = Math.max(...values), valueRange = maxValue - minValue || 1;
|
|
11344
11952
|
return {
|
|
11345
11953
|
xScale: index => padding.left + index / Math.max(data.length - 1, 1) * innerWidth,
|
|
11346
11954
|
yScale: value => padding.top + innerHeight - (value - minValue) / valueRange * innerHeight,
|
|
11955
|
+
minValue: minValue,
|
|
11956
|
+
maxValue: maxValue,
|
|
11957
|
+
valueRange: valueRange,
|
|
11958
|
+
innerWidth: innerWidth,
|
|
11959
|
+
innerHeight: innerHeight,
|
|
11347
11960
|
width: width,
|
|
11348
11961
|
height: height,
|
|
11349
11962
|
padding: padding
|
|
@@ -11423,7 +12036,7 @@ const composablesImport = Object.freeze( Object.defineProperty({
|
|
|
11423
12036
|
useTodo: useTodo
|
|
11424
12037
|
}, Symbol.toStringTag, {
|
|
11425
12038
|
value: "Module"
|
|
11426
|
-
})), Select =
|
|
12039
|
+
})), Select = memo((({options: options = [], value: value, onChange: onChange, onBlur: onBlur, onFocus: onFocus, placeholder: placeholder = "Select an option", className: className = "", style: style, disabled: disabled = !1, required: required = !1, id: id, name: name, size: size = "md", invalid: invalid = !1, valid: valid = !1, multiple: multiple = !1, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}) => {
|
|
11427
12040
|
const {generateSelectClass: generateSelectClass} = useSelect({
|
|
11428
12041
|
size: size,
|
|
11429
12042
|
disabled: disabled,
|
|
@@ -11562,7 +12175,7 @@ const composablesImport = Object.freeze( Object.defineProperty({
|
|
|
11562
12175
|
});
|
|
11563
12176
|
}
|
|
11564
12177
|
return selectContent;
|
|
11565
|
-
};
|
|
12178
|
+
}));
|
|
11566
12179
|
|
|
11567
12180
|
/**
|
|
11568
12181
|
* Select - A component for dropdown selection
|
|
@@ -11571,7 +12184,7 @@ const composablesImport = Object.freeze( Object.defineProperty({
|
|
|
11571
12184
|
/**
|
|
11572
12185
|
* Radio - A component for radio button inputs
|
|
11573
12186
|
*/
|
|
11574
|
-
const Radio =
|
|
12187
|
+
const Radio = memo((({label: label, checked: checked = !1, onChange: onChange, className: className = "", style: style, disabled: disabled = !1, required: required = !1, id: id, name: name, value: value, invalid: invalid = !1, valid: valid = !1, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}) => {
|
|
11575
12188
|
const {generateRadioClass: generateRadioClass} = useRadio({
|
|
11576
12189
|
disabled: disabled,
|
|
11577
12190
|
invalid: invalid,
|
|
@@ -11622,14 +12235,14 @@ const Radio = ({label: label, checked: checked = !1, onChange: onChange, classNa
|
|
|
11622
12235
|
});
|
|
11623
12236
|
}
|
|
11624
12237
|
return radioContent;
|
|
11625
|
-
};
|
|
12238
|
+
}));
|
|
11626
12239
|
|
|
11627
12240
|
Radio.displayName = "Radio";
|
|
11628
12241
|
|
|
11629
12242
|
/**
|
|
11630
12243
|
* Textarea - A component for multiline text input
|
|
11631
12244
|
*/
|
|
11632
|
-
const Textarea = forwardRef((({value: value, onChange: onChange, onBlur: onBlur, onFocus: onFocus, placeholder: placeholder, className: className = "", style: style, disabled: disabled = !1, required: required = !1, readOnly: readOnly = !1, id: id, name: name, rows: rows = 4, cols: cols, maxLength: maxLength, minLength: minLength, size: size = "md", variant: variant, invalid: invalid = !1, valid: valid = !1, autoFocus: autoFocus = !1, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}, ref) => {
|
|
12245
|
+
const Textarea = memo( forwardRef((({value: value, onChange: onChange, onBlur: onBlur, onFocus: onFocus, placeholder: placeholder, className: className = "", style: style, disabled: disabled = !1, required: required = !1, readOnly: readOnly = !1, id: id, name: name, rows: rows = 4, cols: cols, maxLength: maxLength, minLength: minLength, size: size = "md", variant: variant, invalid: invalid = !1, valid: valid = !1, autoFocus: autoFocus = !1, ariaLabel: ariaLabel, ariaDescribedBy: ariaDescribedBy, glass: glass}, ref) => {
|
|
11633
12246
|
const {generateTextareaClass: generateTextareaClass} = useTextarea({
|
|
11634
12247
|
size: size,
|
|
11635
12248
|
variant: variant,
|
|
@@ -11687,7 +12300,7 @@ const Textarea = forwardRef((({value: value, onChange: onChange, onBlur: onBlur,
|
|
|
11687
12300
|
});
|
|
11688
12301
|
}
|
|
11689
12302
|
return textareaElement;
|
|
11690
|
-
}));
|
|
12303
|
+
})));
|
|
11691
12304
|
|
|
11692
12305
|
Textarea.displayName = "Textarea";
|
|
11693
12306
|
|
|
@@ -11700,7 +12313,7 @@ Textarea.displayName = "Textarea";
|
|
|
11700
12313
|
* <FooterSocialLink platform="custom" url="https://example.com" icon={<CustomIcon />} label="Custom Platform" />
|
|
11701
12314
|
* ```
|
|
11702
12315
|
*/
|
|
11703
|
-
const FooterSocialLink =
|
|
12316
|
+
const FooterSocialLink = forwardRef((({platform: platform, url: url, icon: icon, label: label, size: size = "md", variant: variant = "default", disabled: disabled = !1, className: className = "", ...props}, ref) => {
|
|
11704
12317
|
const linkClass = [ "c-footer__social-link", `c-footer__social-link--${platform}`, `c-footer__social-link--${size}`, `c-footer__social-link--${variant}`, disabled && "c-footer__social-link--disabled", className ].filter(Boolean).join(" "), ariaLabel = label || `Follow us on ${(platform => ({
|
|
11705
12318
|
facebook: "Facebook",
|
|
11706
12319
|
twitter: "Twitter",
|
|
@@ -11785,7 +12398,7 @@ FooterSocialLink.displayName = "FooterSocialLink";
|
|
|
11785
12398
|
* </Grid>
|
|
11786
12399
|
* ```
|
|
11787
12400
|
*/
|
|
11788
|
-
const Grid =
|
|
12401
|
+
const Grid = forwardRef((({children: children, className: className = "", justifyContent: justifyContent, alignItems: alignItems, noGutters: noGutters, direction: direction, wrap: wrap, ...props}, ref) => {
|
|
11789
12402
|
const classes = [ "o-grid" ];
|
|
11790
12403
|
return justifyContent && classes.push(`u-justify-content-${justifyContent}`), alignItems && classes.push(`u-align-items-${alignItems}`),
|
|
11791
12404
|
noGutters && classes.push("o-grid--no-gutters"), direction && classes.push(`u-flex-direction-${direction}`),
|
|
@@ -11804,7 +12417,7 @@ Grid.displayName = "Grid";
|
|
|
11804
12417
|
* GridCol component for creating columns within a Grid.
|
|
11805
12418
|
* Uses the CSS grid column classes defined in _objects.grid.scss.
|
|
11806
12419
|
*/
|
|
11807
|
-
const GridCol =
|
|
12420
|
+
const GridCol = forwardRef((({children: children, className: className = "", xs: xs, sm: sm, md: md, lg: lg, xl: xl, xxl: xxl, offsetXs: offsetXs, offsetSm: offsetSm, offsetMd: offsetMd, offsetLg: offsetLg, offsetXl: offsetXl, offsetXxl: offsetXxl, grow: grow, shrink: shrink, basis: basis, align: align, ...props}, ref) => {
|
|
11808
12421
|
// If no specific size is provided, use auto class
|
|
11809
12422
|
const classes = xs || sm || md || lg || xl || xxl ? [ "o-grid__col" ] : [ "o-grid__col", "o-grid__col--auto" ], processResponsiveProp = (value, breakpoint) => {
|
|
11810
12423
|
void 0 !== value && (
|
|
@@ -11847,7 +12460,7 @@ GridCol.displayName = "GridCol";
|
|
|
11847
12460
|
* </Container>
|
|
11848
12461
|
* ```
|
|
11849
12462
|
*/
|
|
11850
|
-
const Row =
|
|
12463
|
+
const Row = forwardRef((({children: children, className: className = "", justifyContent: justifyContent, alignItems: alignItems, noGutters: noGutters, ...props}, ref) => {
|
|
11851
12464
|
const classes = [ "o-grid" ];
|
|
11852
12465
|
return justifyContent && classes.push(`u-justify-content-${justifyContent}`), alignItems && classes.push(`u-align-items-${alignItems}`),
|
|
11853
12466
|
noGutters && classes.push("o-grid--no-gutters"), className && classes.push(className),
|
|
@@ -11884,7 +12497,7 @@ Row.displayName = "Row";
|
|
|
11884
12497
|
* </Footer>
|
|
11885
12498
|
* ```
|
|
11886
12499
|
*/
|
|
11887
|
-
const Footer =
|
|
12500
|
+
const Footer = forwardRef((({brand: brand, brandLogo: brandLogo, brandDescription: brandDescription, copyright: copyright, layout: layout = "columns", variant: variant = "primary", size: size = "md", showNewsletter: showNewsletter = !1, newsletterTitle: newsletterTitle = "Stay Updated", newsletterDescription: newsletterDescription = "Subscribe to our newsletter for the latest updates.", newsletterPlaceholder: newsletterPlaceholder = "Enter your email", newsletterButtonText: newsletterButtonText = "Subscribe", onNewsletterSubmit: onNewsletterSubmit, socialLinks: socialLinks = [], showBackToTop: showBackToTop = !1, backToTopText: backToTopText = "Back to Top", onBackToTop: onBackToTop, showDivider: showDivider = !0, sticky: sticky = !1, children: children, className: className = "", disabled: disabled = !1, glass: glass, ...props}, ref) => {
|
|
11888
12501
|
const {footerClass: footerClass, containerClass: containerClass, brandClass: brandClass, sectionsClass: sectionsClass, bottomClass: bottomClass, handleNewsletterSubmit: handleNewsletterSubmit, handleBackToTop: handleBackToTop, socialLinks: footerSocialLinks} = function(options = {}) {
|
|
11889
12502
|
const {layout: layout = FOOTER.DEFAULTS.LAYOUT, variant: variant = FOOTER.DEFAULTS.VARIANT, size: size = FOOTER.DEFAULTS.SIZE, sticky: sticky = FOOTER.DEFAULTS.STICKY, showNewsletter: showNewsletter = FOOTER.DEFAULTS.SHOW_NEWSLETTER, showBackToTop: showBackToTop = FOOTER.DEFAULTS.SHOW_BACK_TO_TOP, socialLinks: socialLinks = [], onNewsletterSubmit: onNewsletterSubmit, onBackToTop: onBackToTop, className: className = ""} = options;
|
|
11890
12503
|
// Generate footer classes
|
|
@@ -12015,7 +12628,7 @@ const Footer = forwardRef((({brand: brand, brandLogo: brandLogo, brandDescriptio
|
|
|
12015
12628
|
alignItems: "centered" === layout || "stacked" === layout ? "center" : void 0,
|
|
12016
12629
|
children: React.Children.map(children, (child =>
|
|
12017
12630
|
// Check if the child is a valid React element
|
|
12018
|
-
|
|
12631
|
+
React.isValidElement(child) ? React.cloneElement(child, {
|
|
12019
12632
|
showNewsletter: showNewsletter
|
|
12020
12633
|
}) : child))
|
|
12021
12634
|
})
|
|
@@ -12104,7 +12717,7 @@ Footer.displayName = "Footer";
|
|
|
12104
12717
|
* </MasonryGrid>
|
|
12105
12718
|
* ```
|
|
12106
12719
|
*/
|
|
12107
|
-
const MasonryGrid =
|
|
12720
|
+
const MasonryGrid = forwardRef((({children: children, className: className = "", xs: xs = 1, sm: sm, md: md, lg: lg, xl: xl, xxl: xxl, gap: gap = 16, animate: animate = !0, imagesLoaded: imagesLoaded = !0, onLayoutComplete: onLayoutComplete, onImageLoad: onImageLoad, ...props}, ref) => {
|
|
12108
12721
|
// === REFS & STATE ===
|
|
12109
12722
|
const [columns, setColumns] = useState(xs), [positions, setPositions] = useState([]), [layoutComplete, setLayoutComplete] = useState(!1), [loadingImages, setLoadingImages] = useState(!1), containerRef = useRef(null), columnHeights = useRef([]), imagesLoadedCount = useRef(0), totalImagesCount = useRef(0), imageElements = useRef(new Map);
|
|
12110
12723
|
useEffect((() => {
|
|
@@ -12127,11 +12740,11 @@ const MasonryGrid = forwardRef((({children: children, className: className = "",
|
|
|
12127
12740
|
useEffect((() => {
|
|
12128
12741
|
const newItems = [];
|
|
12129
12742
|
Children.forEach(children, ((child, index) => {
|
|
12130
|
-
|
|
12743
|
+
isValidElement(child) && newItems.push({
|
|
12131
12744
|
id: child.key?.toString() || `masonry-item-${index}`,
|
|
12132
12745
|
element: child,
|
|
12133
12746
|
position: null,
|
|
12134
|
-
ref:
|
|
12747
|
+
ref: React.createRef()
|
|
12135
12748
|
});
|
|
12136
12749
|
})), setItems(newItems);
|
|
12137
12750
|
}), [ children ]);
|
|
@@ -12289,7 +12902,7 @@ MasonryGrid.displayName = "MasonryGrid";
|
|
|
12289
12902
|
* </MasonryGrid>
|
|
12290
12903
|
* ```
|
|
12291
12904
|
*/
|
|
12292
|
-
const MasonryGridItem =
|
|
12905
|
+
const MasonryGridItem = forwardRef((({children: children, className: className = "", ...props}, ref) => {
|
|
12293
12906
|
const classes = [ "o-masonry-grid__item-inner" ];
|
|
12294
12907
|
return className && classes.push(className), jsx("div", {
|
|
12295
12908
|
ref: ref,
|
|
@@ -12312,7 +12925,7 @@ const layouts = Object.freeze( Object.defineProperty({
|
|
|
12312
12925
|
Row: Row
|
|
12313
12926
|
}, Symbol.toStringTag, {
|
|
12314
12927
|
value: "Module"
|
|
12315
|
-
})), FooterSection =
|
|
12928
|
+
})), FooterSection = forwardRef((({title: title, icon: icon, collapsible: collapsible = !1, defaultCollapsed: defaultCollapsed = !1, showNewsletter: showNewsletter = !1, children: children, className: className = "", ...props}, ref) => {
|
|
12316
12929
|
const [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed), sectionClass = [ "c-footer__section", collapsible && "c-footer__section--collapsible", isCollapsed && "c-footer__section--collapsed", className ].filter(Boolean).join(" ");
|
|
12317
12930
|
return jsx(GridCol, {
|
|
12318
12931
|
xs: 12,
|
|
@@ -12386,7 +12999,7 @@ const layouts = Object.freeze( Object.defineProperty({
|
|
|
12386
12999
|
* </FooterLink>
|
|
12387
13000
|
* ```
|
|
12388
13001
|
*/
|
|
12389
|
-
const FooterLink =
|
|
13002
|
+
const FooterLink = forwardRef((({href: href, icon: icon, external: external = !1, active: active = !1, disabled: disabled = !1, onClick: onClick, children: children, className: className = "", LinkComponent: LinkComponent, ...props}, ref) => {
|
|
12390
13003
|
const linkProps = {
|
|
12391
13004
|
className: [ "c-footer__link", active && "c-footer__link--active", disabled && "c-footer__link--disabled", className ].filter(Boolean).join(" "),
|
|
12392
13005
|
onClick: disabled ? void 0 : onClick,
|
|
@@ -12648,32 +13261,34 @@ const Hero = ({title: title, subtitle: subtitle, text: text, imageSrc: imageSrc,
|
|
|
12648
13261
|
|
|
12649
13262
|
Hero.displayName = "Hero";
|
|
12650
13263
|
|
|
12651
|
-
const List =
|
|
13264
|
+
const List = memo((({children: children, variant: variant = "default", className: className = "", style: style, ...props}) => {
|
|
13265
|
+
var _context;
|
|
12652
13266
|
// Generate CSS classes
|
|
12653
|
-
|
|
13267
|
+
const listClasses = [ LIST.BASE_CLASS, "default" !== variant && `c-list--${variant}`, className ].filter(Boolean).join(" "), ListElement = _includesInstanceProperty(_context = [ "number", "text" ]).call(_context, variant) ? "ol" : "ul";
|
|
12654
13268
|
// Determine the HTML element based on variant
|
|
12655
13269
|
return jsx(ListElement, {
|
|
12656
13270
|
className: listClasses,
|
|
12657
13271
|
style: style,
|
|
12658
13272
|
...props,
|
|
12659
|
-
children: React.Children.map(children, (child =>
|
|
13273
|
+
children: React.Children.map(children, (child => jsx("li", {
|
|
12660
13274
|
className: "c-list__item",
|
|
12661
13275
|
children: child
|
|
12662
|
-
})))
|
|
13276
|
+
})))
|
|
12663
13277
|
});
|
|
12664
|
-
};
|
|
13278
|
+
}));
|
|
12665
13279
|
|
|
12666
13280
|
List.displayName = "List";
|
|
12667
13281
|
|
|
12668
13282
|
const ListGroup = ({children: children, className: className = "", style: style, variant: variant = "default"}) => {
|
|
12669
13283
|
// Generate CSS classes
|
|
12670
|
-
const listGroupClasses = [ LIST_GROUP.BASE_CLASS, className ].filter(Boolean).join(" "), validLists = React.Children.toArray(children).filter((child =>
|
|
13284
|
+
const listGroupClasses = [ LIST_GROUP.BASE_CLASS, className ].filter(Boolean).join(" "), validLists = React.Children.toArray(children).filter((child => React.isValidElement(child) && child.type === List));
|
|
12671
13285
|
// Get valid List children
|
|
12672
13286
|
return jsx("div", {
|
|
12673
13287
|
className: listGroupClasses,
|
|
12674
13288
|
style: style,
|
|
12675
13289
|
children: validLists.map(((child, index) => {
|
|
12676
13290
|
const childProps = child.props;
|
|
13291
|
+
|
|
12677
13292
|
return React.cloneElement(child, {
|
|
12678
13293
|
key: index,
|
|
12679
13294
|
variant: childProps?.variant ?? variant
|
|
@@ -12882,7 +13497,7 @@ const Messages = ({messages: messages = [], otherAvatar: otherAvatar, selfAvatar
|
|
|
12882
13497
|
/**
|
|
12883
13498
|
* Modal component for displaying overlay content
|
|
12884
13499
|
*/
|
|
12885
|
-
const Modal =
|
|
13500
|
+
const Modal = memo((({children: children, isOpen: isOpen = !1, onOpenChange: onOpenChange, onClose: onClose, onOpen: onOpen, title: title, subtitle: subtitle, size: size = "md", backdrop: backdrop = !0, keyboard: keyboard = !0, className: className = "", style: style, closeButton: closeButton = !0, footer: footer, glass: glass, ...props}) => {
|
|
12886
13501
|
const modalRef = useRef(null), dialogRef = useRef(null), backdropRef = useRef(null), {isOpen: isOpenState, open: open, close: close} =
|
|
12887
13502
|
/**
|
|
12888
13503
|
* Hook for managing modal state
|
|
@@ -12991,7 +13606,8 @@ const Modal = ({children: children, isOpen: isOpen = !1, onOpenChange: onOpenCha
|
|
|
12991
13606
|
}), jsx("div", {
|
|
12992
13607
|
ref: dialogRef,
|
|
12993
13608
|
className: "c-modal__dialog",
|
|
12994
|
-
children: glass ?
|
|
13609
|
+
children: glass ?
|
|
13610
|
+
// Default glass settings for modals
|
|
12995
13611
|
(() => {
|
|
12996
13612
|
const defaultGlassProps = {
|
|
12997
13613
|
displacementScale: document.querySelector(".c-modal---glass .c-modal__content")?.clientHeight,
|
|
@@ -13010,7 +13626,7 @@ const Modal = ({children: children, isOpen: isOpen = !1, onOpenChange: onOpenCha
|
|
|
13010
13626
|
})() : modalContent
|
|
13011
13627
|
}) ]
|
|
13012
13628
|
});
|
|
13013
|
-
};
|
|
13629
|
+
}));
|
|
13014
13630
|
|
|
13015
13631
|
Modal.displayName = "Modal";
|
|
13016
13632
|
|
|
@@ -13029,7 +13645,7 @@ Modal.displayName = "Modal";
|
|
|
13029
13645
|
* </Nav>
|
|
13030
13646
|
* ```
|
|
13031
13647
|
*/
|
|
13032
|
-
const Nav =
|
|
13648
|
+
const Nav = forwardRef((({children: children, alignment: alignment = "start", variant: variant = "default", className: className = "", disabled: disabled = !1, glass: glass}, ref) => {
|
|
13033
13649
|
const {generateNavClass: generateNavClass} = useNav({
|
|
13034
13650
|
alignment: alignment,
|
|
13035
13651
|
variant: variant
|
|
@@ -13043,8 +13659,9 @@ const Nav = forwardRef((({children: children, alignment: alignment = "start", va
|
|
|
13043
13659
|
role: "menubar",
|
|
13044
13660
|
"aria-orientation": "horizontal",
|
|
13045
13661
|
children: React.Children.map(children, (child => {
|
|
13046
|
-
if (React.isValidElement(child)) {
|
|
13662
|
+
if ( React.isValidElement(child)) {
|
|
13047
13663
|
const childProps = child.props;
|
|
13664
|
+
|
|
13048
13665
|
return React.cloneElement(child, {
|
|
13049
13666
|
...childProps,
|
|
13050
13667
|
disabled: !!disabled || childProps?.disabled
|
|
@@ -13101,7 +13718,7 @@ Nav.displayName = "Nav";
|
|
|
13101
13718
|
* </NavItem>
|
|
13102
13719
|
* ```
|
|
13103
13720
|
*/
|
|
13104
|
-
const NavItem =
|
|
13721
|
+
const NavItem = forwardRef((({children: children, dropdown: dropdown = !1, megaMenu: megaMenu = !1, active: active = !1, href: href, onClick: onClick, className: className = "", disabled: disabled = !1, "aria-expanded": ariaExpanded, LinkComponent: LinkComponent}, ref) => {
|
|
13105
13722
|
const {generateNavItemClass: generateNavItemClass, generateNavLinkClass: generateNavLinkClass, handleClick: handleClick} = useNavItem({
|
|
13106
13723
|
dropdown: dropdown,
|
|
13107
13724
|
megaMenu: megaMenu,
|
|
@@ -13176,7 +13793,7 @@ NavItem.displayName = "NavItem";
|
|
|
13176
13793
|
* </Navbar>
|
|
13177
13794
|
* ```
|
|
13178
13795
|
*/
|
|
13179
|
-
const Navbar =
|
|
13796
|
+
const Navbar = forwardRef((({brand: brand, children: children, variant: variant, position: position = "static", containerWidth: containerWidth, collapsible: collapsible = !0, expanded: expanded, onToggle: onToggle, className: className = "", style: style, disabled: disabled = !1, backdrop: backdrop = !1, closeOnOutsideClick: closeOnOutsideClick = !0, closeOnEscape: closeOnEscape = !0, ariaLabel: ariaLabel = "Main navigation", id: id, glass: glass}, ref) => {
|
|
13180
13797
|
const {generateNavbarClass: generateNavbarClass, generateContainerStyle: generateContainerStyle, generateCollapseClass: generateCollapseClass} = useNavbar({
|
|
13181
13798
|
position: position,
|
|
13182
13799
|
collapsible: collapsible,
|
|
@@ -13319,13 +13936,13 @@ function setRef(ref, value) {
|
|
|
13319
13936
|
* ```
|
|
13320
13937
|
*/ Navbar.displayName = "Navbar";
|
|
13321
13938
|
|
|
13322
|
-
const SideMenuList =
|
|
13939
|
+
const SideMenuList = forwardRef((({children: children, className: className = ""}, ref) => {
|
|
13323
13940
|
const listClass = `c-side-menu__list ${className}`.trim();
|
|
13324
13941
|
return jsx("ul", {
|
|
13325
13942
|
ref: ref,
|
|
13326
13943
|
className: listClass,
|
|
13327
13944
|
role: "list",
|
|
13328
|
-
children: React.Children.map(children, ((child, index) =>
|
|
13945
|
+
children: React.Children.map(children, ((child, index) => React.isValidElement(child) ? jsx("li", {
|
|
13329
13946
|
className: "c-side-menu__item",
|
|
13330
13947
|
role: "listitem",
|
|
13331
13948
|
children: child
|
|
@@ -13360,7 +13977,7 @@ SideMenuList.displayName = "SideMenuList";
|
|
|
13360
13977
|
* </SideMenuItem>
|
|
13361
13978
|
* ```
|
|
13362
13979
|
*/
|
|
13363
|
-
const SideMenuItem =
|
|
13980
|
+
const SideMenuItem = forwardRef((({children: children, href: href, onClick: onClick, active: active = !1, disabled: disabled = !1, icon: icon, className: className = "", target: target, rel: rel, LinkComponent: LinkComponentProp}, ref) => {
|
|
13364
13981
|
const {LinkComponent: LinkComponentFromContext} = useSideMenuContext(), LinkComponent = LinkComponentProp ?? LinkComponentFromContext, {generateSideMenuItemClass: generateSideMenuItemClass, handleClick: handleClick} = useSideMenuItem({
|
|
13365
13982
|
active: active,
|
|
13366
13983
|
disabled: disabled,
|
|
@@ -13447,7 +14064,7 @@ const SideMenuItem = forwardRef((({children: children, href: href, onClick: onCl
|
|
|
13447
14064
|
SideMenuItem.displayName = "SideMenuItem";
|
|
13448
14065
|
|
|
13449
14066
|
// Context for passing LinkComponent to SideMenuItem children
|
|
13450
|
-
const SideMenuContext =
|
|
14067
|
+
const SideMenuContext = createContext({}), useSideMenuContext = () => useContext(SideMenuContext)
|
|
13451
14068
|
/**
|
|
13452
14069
|
* SideMenu component provides a collapsible navigation menu with title and menu items.
|
|
13453
14070
|
* Automatically collapses on mobile devices and can be toggled via a header button.
|
|
@@ -13462,7 +14079,7 @@ const SideMenuContext = createContext({}), useSideMenuContext = () => useContext
|
|
|
13462
14079
|
* </SideMenuList>
|
|
13463
14080
|
* </SideMenu>
|
|
13464
14081
|
* ```
|
|
13465
|
-
*/ , SideMenu =
|
|
14082
|
+
*/ , SideMenu = forwardRef((({title: title, children: children, menuItems: menuItems = [], isOpen: isOpen, onToggle: onToggle, collapsible: collapsible = !0, collapsibleDesktop: collapsibleDesktop = !1, defaultCollapsedDesktop: defaultCollapsedDesktop = !1, className: className = "", style: style, disabled: disabled = !1, toggleIcon: toggleIcon, id: id, glass: glass, LinkComponent: LinkComponent}, ref) => {
|
|
13466
14083
|
const {isOpenState: isOpenState, wrapperRef: wrapperRef, innerRef: innerRef, sideMenuRef: sideMenuRef, generateSideMenuClass: generateSideMenuClass, generateWrapperClass: generateWrapperClass, handleToggle: handleToggle} = useSideMenu({
|
|
13467
14084
|
isOpen: isOpen,
|
|
13468
14085
|
onToggle: onToggle,
|
|
@@ -13665,7 +14282,7 @@ const SideMenuContext = createContext({}), useSideMenuContext = () => useContext
|
|
|
13665
14282
|
// Hook to use SideMenu context
|
|
13666
14283
|
SideMenu.displayName = "SideMenu";
|
|
13667
14284
|
|
|
13668
|
-
const Menu =
|
|
14285
|
+
const Menu = forwardRef((({children: children, className: className = "", style: style, disabled: disabled = !1}, ref) => jsx("div", {
|
|
13669
14286
|
ref: ref,
|
|
13670
14287
|
className: `c-menu ${className}`,
|
|
13671
14288
|
style: style,
|
|
@@ -13673,9 +14290,10 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13673
14290
|
className: "c-menu__list",
|
|
13674
14291
|
role: "menu",
|
|
13675
14292
|
children: React.Children.map(children, (child => {
|
|
13676
|
-
if (React.isValidElement(child)) {
|
|
14293
|
+
if ( React.isValidElement(child)) {
|
|
13677
14294
|
// Pass disabled prop down to all children if Menu is disabled
|
|
13678
14295
|
const childProps = child.props;
|
|
14296
|
+
|
|
13679
14297
|
return React.cloneElement(child, {
|
|
13680
14298
|
...childProps,
|
|
13681
14299
|
disabled: !!disabled || childProps?.disabled
|
|
@@ -13684,7 +14302,11 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13684
14302
|
return child;
|
|
13685
14303
|
}))
|
|
13686
14304
|
})
|
|
13687
|
-
})))
|
|
14305
|
+
})));
|
|
14306
|
+
|
|
14307
|
+
Menu.displayName = "Menu";
|
|
14308
|
+
|
|
14309
|
+
const MenuItem = forwardRef((({children: children, href: href = "#", icon: icon, active: active = !1, disabled: disabled = !1, onClick: onClick, className: className = ""}, ref) => jsx("li", {
|
|
13688
14310
|
ref: ref,
|
|
13689
14311
|
className: `c-menu__item ${active ? "is-active" : ""} ${disabled ? "is-disabled" : ""} ${className}`,
|
|
13690
14312
|
role: "menuitem",
|
|
@@ -13708,7 +14330,12 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13708
14330
|
children: icon
|
|
13709
14331
|
})), children ]
|
|
13710
14332
|
})
|
|
13711
|
-
})))
|
|
14333
|
+
})));
|
|
14334
|
+
|
|
14335
|
+
MenuItem.displayName = "MenuItem";
|
|
14336
|
+
|
|
14337
|
+
// Map icon-lux names to Phosphor icon names
|
|
14338
|
+
const mapIconName = luxIconName => ({
|
|
13712
14339
|
circle: "Circle",
|
|
13713
14340
|
"caret-down": "CaretDown",
|
|
13714
14341
|
"caret-up": "CaretUp",
|
|
@@ -13722,11 +14349,15 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13722
14349
|
bell: "Bell",
|
|
13723
14350
|
search: "MagnifyingGlass"
|
|
13724
14351
|
}[luxIconName] || "Circle") // Default to Circle if no mapping found
|
|
13725
|
-
, MenuDivider =
|
|
14352
|
+
, MenuDivider = forwardRef((({className: className = ""}, ref) => jsx("li", {
|
|
13726
14353
|
ref: ref,
|
|
13727
14354
|
className: `c-menu__divider ${className}`,
|
|
13728
14355
|
role: "separator"
|
|
13729
|
-
})))
|
|
14356
|
+
})));
|
|
14357
|
+
|
|
14358
|
+
MenuDivider.displayName = "MenuDivider";
|
|
14359
|
+
|
|
14360
|
+
const MegaMenu = forwardRef((({children: children, className: className = "", style: style, disabled: disabled = !1}, ref) => jsx("div", {
|
|
13730
14361
|
ref: ref,
|
|
13731
14362
|
className: `c-menu c-menu--mega ${className}`,
|
|
13732
14363
|
style: style,
|
|
@@ -13735,9 +14366,10 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13735
14366
|
children: jsx("div", {
|
|
13736
14367
|
className: "c-menu__grid o-grid",
|
|
13737
14368
|
children: React.Children.map(children, (child => {
|
|
13738
|
-
if (React.isValidElement(child)) {
|
|
14369
|
+
if ( React.isValidElement(child)) {
|
|
13739
14370
|
// Pass disabled prop down to all children if MegaMenu is disabled
|
|
13740
14371
|
const childProps = child.props;
|
|
14372
|
+
|
|
13741
14373
|
return React.cloneElement(child, {
|
|
13742
14374
|
...childProps,
|
|
13743
14375
|
disabled: !!disabled || childProps?.disabled
|
|
@@ -13747,7 +14379,11 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13747
14379
|
}))
|
|
13748
14380
|
})
|
|
13749
14381
|
})
|
|
13750
|
-
})))
|
|
14382
|
+
})));
|
|
14383
|
+
|
|
14384
|
+
MegaMenu.displayName = "MegaMenu";
|
|
14385
|
+
|
|
14386
|
+
const MegaMenuColumn = forwardRef((({title: title, icon: icon, children: children, width: width = "auto", className: className = "", disabled: disabled = !1}, ref) => jsxs("div", {
|
|
13751
14387
|
ref: ref,
|
|
13752
14388
|
className: `o-grid__col o-grid__col--${width} ${className}`,
|
|
13753
14389
|
children: [ (title || icon) && jsxs("div", {
|
|
@@ -13770,13 +14406,13 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13770
14406
|
className: "c-menu__subitems-list",
|
|
13771
14407
|
role: "menu",
|
|
13772
14408
|
children: React.Children.map(children, (child => {
|
|
13773
|
-
if (React.isValidElement(child)) {
|
|
14409
|
+
if ( React.isValidElement(child)) {
|
|
13774
14410
|
// Pass disabled prop down to all children if column is disabled
|
|
13775
14411
|
const childProps = child.props;
|
|
13776
14412
|
return jsx("li", {
|
|
13777
14413
|
className: "c-menu__subitem",
|
|
13778
14414
|
role: "menuitem",
|
|
13779
|
-
children:
|
|
14415
|
+
children: React.cloneElement(child, {
|
|
13780
14416
|
...childProps,
|
|
13781
14417
|
disabled: !!disabled || childProps?.disabled
|
|
13782
14418
|
})
|
|
@@ -13785,7 +14421,11 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13785
14421
|
return null;
|
|
13786
14422
|
}))
|
|
13787
14423
|
}) ]
|
|
13788
|
-
})))
|
|
14424
|
+
})));
|
|
14425
|
+
|
|
14426
|
+
MegaMenuColumn.displayName = "MegaMenuColumn";
|
|
14427
|
+
|
|
14428
|
+
const MegaMenuLink = forwardRef((({href: href, children: children, className: className = "", disabled: disabled = !1, onClick: onClick}, ref) => jsx("a", {
|
|
13789
14429
|
ref: ref,
|
|
13790
14430
|
href: href,
|
|
13791
14431
|
className: `c-menu__subitem-link ${disabled ? "is-disabled" : ""} ${className}`,
|
|
@@ -13794,7 +14434,11 @@ const Menu = forwardRef((({children: children, className: className = "", style:
|
|
|
13794
14434
|
},
|
|
13795
14435
|
"aria-disabled": disabled,
|
|
13796
14436
|
children: children
|
|
13797
|
-
})))
|
|
14437
|
+
})));
|
|
14438
|
+
|
|
14439
|
+
MegaMenuLink.displayName = "MegaMenuLink";
|
|
14440
|
+
|
|
14441
|
+
const NavDropdown = forwardRef((({title: title, children: children, alignment: alignment = "start", megaMenu: megaMenu = !1, className: className = "", style: style, disabled: disabled = !1}, ref) => {
|
|
13798
14442
|
const {generateDropdownMenuClass: generateDropdownMenuClass, getIconName: getIconName} = useNavDropdown({
|
|
13799
14443
|
alignment: alignment,
|
|
13800
14444
|
megaMenu: megaMenu
|
|
@@ -14434,12 +15078,13 @@ useEffect((() => {
|
|
|
14434
15078
|
};
|
|
14435
15079
|
}));
|
|
14436
15080
|
}), [ isMounted, currentIndex, calculateBounds, constrainPosition ]), handleWheel = useCallback((event => {
|
|
15081
|
+
var _context;
|
|
14437
15082
|
if (!isMounted || !event || !event.currentTarget) return;
|
|
14438
15083
|
// Additional safety check for the target element
|
|
14439
15084
|
const target = event.currentTarget;
|
|
14440
15085
|
if (target && "function" == typeof target.getBoundingClientRect) {
|
|
14441
15086
|
// Storybook-specific safety check - ensure DOM is ready
|
|
14442
|
-
if ("undefined" != typeof window && window.location?.href?.
|
|
15087
|
+
if ("undefined" != typeof window && (null == (_context = window.location?.href) ? void 0 : Function.call.bind(_includesInstanceProperty(_context), _context))?.("storybook")) try {
|
|
14443
15088
|
// Test if getBoundingClientRect works before proceeding
|
|
14444
15089
|
const testRect = target.getBoundingClientRect();
|
|
14445
15090
|
if (!testRect || 0 === testRect.width || 0 === testRect.height) return;
|
|
@@ -14983,7 +15628,7 @@ useEffect((() => {
|
|
|
14983
15628
|
/**
|
|
14984
15629
|
* Hook for managing popover state and positioning logic
|
|
14985
15630
|
*/
|
|
14986
|
-
const PopoverContext =
|
|
15631
|
+
const PopoverContext = createContext({
|
|
14987
15632
|
isOpen: !1,
|
|
14988
15633
|
setIsOpen: () => {},
|
|
14989
15634
|
triggerRef: {
|
|
@@ -15168,7 +15813,7 @@ const PopoverContext = createContext({
|
|
|
15168
15813
|
popoverId: popoverId,
|
|
15169
15814
|
triggerType: trigger
|
|
15170
15815
|
},
|
|
15171
|
-
children: [ children, "undefined" != typeof document &&
|
|
15816
|
+
children: [ children, "undefined" != typeof document && createPortal(jsxs("div", {
|
|
15172
15817
|
ref: popoverRef,
|
|
15173
15818
|
className: `c-popover c-popover--${currentPosition} ${isOpen ? POPOVER.CLASSES.IS_OPEN : ""} ${glass ? "c-popover--glass" : ""} ${className}`,
|
|
15174
15819
|
style: style,
|
|
@@ -15215,10 +15860,7 @@ const PopoverContext = createContext({
|
|
|
15215
15860
|
};
|
|
15216
15861
|
|
|
15217
15862
|
// Context to share popover state between components
|
|
15218
|
-
|
|
15219
|
-
* PopoverTrigger component to wrap the element that triggers the popover
|
|
15220
|
-
*/
|
|
15221
|
-
forwardRef((({children: children, trigger: triggerProp}, ref) => {
|
|
15863
|
+
forwardRef((({children: children, trigger: triggerProp}, ref) => {
|
|
15222
15864
|
const {isOpen: isOpen, setIsOpen: setIsOpen, triggerRef: triggerRef, popoverId: popoverId, triggerType: triggerType} = React.useContext(PopoverContext), effectiveTrigger = triggerProp || triggerType, child = React.Children.only(children), triggerProps = {
|
|
15223
15865
|
ref: ref || triggerRef,
|
|
15224
15866
|
"aria-describedby": popoverId,
|
|
@@ -15231,13 +15873,13 @@ forwardRef((({children: children, trigger: triggerProp}, ref) => {
|
|
|
15231
15873
|
setIsOpen(!0);
|
|
15232
15874
|
}, triggerProps.onMouseLeave = () => {
|
|
15233
15875
|
setIsOpen(!1);
|
|
15234
|
-
}),
|
|
15235
|
-
})), Popover.displayName = "Popover";
|
|
15876
|
+
}), React.cloneElement(child, triggerProps);
|
|
15877
|
+
})).displayName = "PopoverTrigger", Popover.displayName = "Popover";
|
|
15236
15878
|
|
|
15237
15879
|
/**
|
|
15238
15880
|
* Hook for managing rating component state and interactions
|
|
15239
15881
|
*/
|
|
15240
|
-
const Rating =
|
|
15882
|
+
const Rating = forwardRef((({value: valueProp = 0, defaultValue: defaultValue, maxValue: maxValue = 5, allowHalf: allowHalf = !1, readOnly: readOnly = !1, size: size = "md", color: color, onChange: onChange, className: className = "", style: style, label: label, id: id, useVanillaJS: useVanillaJS = !1, glass: glass, ...restProps}, ref) => {
|
|
15241
15883
|
const internalRef = useRef(null), ratingInstance = useRef(null), {currentValue: currentValue, hoverValue: hoverValue, focusedIndex: focusedIndex, setHoverValue: setHoverValue, setFocused: setFocused, handleKeyDown: handleKeyDown} = (({value: value = 0, maxValue: maxValue = 5, allowHalf: allowHalf = !1, readOnly: readOnly = !1, onChange: onChange}) => {
|
|
15242
15884
|
// Determine if component is in controlled mode
|
|
15243
15885
|
const isControlled = void 0 !== onChange, [internalValue, setInternalValue] = useState(value), [hoverValue, setHoverValue] = useState(null), [focusedIndex, setFocusedIndex] = useState(null), currentValue = isControlled ? value : internalValue, handleMouseEnter = useCallback((starValue => {
|
|
@@ -15298,7 +15940,7 @@ const Rating = forwardRef((({value: valueProp = 0, defaultValue: defaultValue, m
|
|
|
15298
15940
|
allowHalf: allowHalf,
|
|
15299
15941
|
readOnly: readOnly,
|
|
15300
15942
|
onChange: onChange
|
|
15301
|
-
}), handleMouseEnter = useCallback(((e, starValue) => {
|
|
15943
|
+
}), forkedRef = useForkRef(internalRef, ref), handleMouseEnter = useCallback(((e, starValue) => {
|
|
15302
15944
|
if (!readOnly) if (allowHalf) {
|
|
15303
15945
|
// Get the star element's bounding rectangle
|
|
15304
15946
|
const starRect = e.currentTarget.getBoundingClientRect(), starCenterX = starRect.left + starRect.width / 2, adjustedValue = e.clientX < starCenterX ? starValue - .5 : starValue;
|
|
@@ -15349,7 +15991,7 @@ const Rating = forwardRef((({value: valueProp = 0, defaultValue: defaultValue, m
|
|
|
15349
15991
|
// If using vanilla JS, just render the container
|
|
15350
15992
|
if (useVanillaJS) return jsx("div", {
|
|
15351
15993
|
className: ratingClasses,
|
|
15352
|
-
ref:
|
|
15994
|
+
ref: forkedRef,
|
|
15353
15995
|
id: id,
|
|
15354
15996
|
...restProps
|
|
15355
15997
|
});
|
|
@@ -15357,7 +15999,7 @@ const Rating = forwardRef((({value: valueProp = 0, defaultValue: defaultValue, m
|
|
|
15357
15999
|
// Determine the effective value (either hovered or actual)
|
|
15358
16000
|
const effectiveValue = null !== hoverValue ? hoverValue : currentValue, ratingContent = jsx("div", {
|
|
15359
16001
|
className: ratingClasses,
|
|
15360
|
-
ref:
|
|
16002
|
+
ref: forkedRef,
|
|
15361
16003
|
id: id,
|
|
15362
16004
|
style: style,
|
|
15363
16005
|
"data-readonly": readOnly ? "true" : "false",
|
|
@@ -15562,7 +16204,7 @@ ProductReview.displayName = "ProductReview";
|
|
|
15562
16204
|
/**
|
|
15563
16205
|
* Hook for managing Progress component state and behavior
|
|
15564
16206
|
*/
|
|
15565
|
-
const Progress = forwardRef((({value: value, variant: variant = "primary", size: size = "md", className: className = "", style: style, disabled: disabled = !1, ariaLabel: ariaLabel = PROGRESS.DEFAULTS.ARIA_LABEL, glass: glass}, ref) => {
|
|
16207
|
+
const Progress = memo( forwardRef((({value: value, variant: variant = "primary", size: size = "md", className: className = "", style: style, disabled: disabled = !1, ariaLabel: ariaLabel = PROGRESS.DEFAULTS.ARIA_LABEL, glass: glass}, ref) => {
|
|
15566
16208
|
const {progressValue: progressValue, progressStyle: progressStyle, progressClasses: progressClasses} = (({value: value, variant: variant = "primary", size: size = "md", className: className = ""}) => {
|
|
15567
16209
|
// Clamp value between 0 and 100
|
|
15568
16210
|
const progressValue = Math.min(Math.max(value, 0), 100), baseClass = "c-progress";
|
|
@@ -15612,7 +16254,14 @@ const Progress = forwardRef((({value: value, variant: variant = "primary", size:
|
|
|
15612
16254
|
});
|
|
15613
16255
|
}
|
|
15614
16256
|
return progressContent;
|
|
15615
|
-
}))
|
|
16257
|
+
})));
|
|
16258
|
+
|
|
16259
|
+
Progress.displayName = "Progress";
|
|
16260
|
+
|
|
16261
|
+
/**
|
|
16262
|
+
* River component for displaying content with image sections
|
|
16263
|
+
*/
|
|
16264
|
+
const River = ({title: title, text: text, actions: actions, imageSrc: imageSrc, imageAlt: imageAlt = "Image", center: center = !1, breakout: breakout = !1, reverse: reverse = !1, contentColumns: contentColumns, backgroundImageSrc: backgroundImageSrc, showOverlay: showOverlay = !0, contentWidth: contentWidth, className: className = "", style: style}) => {
|
|
15616
16265
|
const {generateRiverClassNames: generateRiverClassNames, generateContentClass: generateContentClass, generateVisualClass: generateVisualClass, hasBackgroundImage: hasBackgroundImage, hasForegroundImage: hasForegroundImage, textContent: textContent} = useRiver({
|
|
15617
16266
|
title: title,
|
|
15618
16267
|
text: text,
|
|
@@ -15790,9 +16439,22 @@ const SectionIntro = ({title: title, label: label, text: text, actions: actions,
|
|
|
15790
16439
|
|
|
15791
16440
|
SectionIntro.displayName = "SectionIntro";
|
|
15792
16441
|
|
|
15793
|
-
const Slider =
|
|
15794
|
-
const {slides: slides = [], height: height = 300, width: width = "100%", slidesToShow: slidesToShow = 1, spaceBetween: spaceBetween = 0, loop: loop = !1, initialSlide: initialSlide = 0, direction: direction = "horizontal", speed: speed = 300, allowTouchMove: allowTouchMove = !0, threshold: threshold = 50, grabCursor: grabCursor = !0, autoplay: autoplay, navigation: navigation, pagination: pagination, className: className, style: style, onSlideChange: onSlideChange, ...rest} = props
|
|
15795
|
-
|
|
16442
|
+
const Slider = forwardRef(((props, ref) => {
|
|
16443
|
+
const {slides: slides = [], height: height = 300, width: width = "100%", slidesToShow: slidesToShow = 1, spaceBetween: spaceBetween = 0, loop: loop = !1, initialSlide: initialSlide = 0, direction: direction = "horizontal", speed: speed = 300, allowTouchMove: allowTouchMove = !0, threshold: threshold = 50, grabCursor: grabCursor = !0, autoplay: autoplay, navigation: navigation, pagination: pagination, className: className, style: style, onSlideChange: onSlideChange, ...rest} = props, slider = useSlider({
|
|
16444
|
+
slides: slides || [],
|
|
16445
|
+
slidesToShow: slidesToShow,
|
|
16446
|
+
spaceBetween: spaceBetween,
|
|
16447
|
+
loop: loop,
|
|
16448
|
+
initialSlide: initialSlide,
|
|
16449
|
+
direction: direction,
|
|
16450
|
+
speed: speed,
|
|
16451
|
+
allowTouchMove: allowTouchMove,
|
|
16452
|
+
threshold: threshold,
|
|
16453
|
+
autoplay: autoplay,
|
|
16454
|
+
onSlideChange: onSlideChange
|
|
16455
|
+
}), {containerRef: containerRef, wrapperRef: wrapperRef, allSlides: allSlides, realIndex: realIndex, translateValue: translateValue, slideWidth: slideWidth, transitioning: transitioning, touching: touching, slideNext: slideNext, slidePrev: slidePrev, goToSlide: goToSlide, canSlideNext: canSlideNext, canSlidePrev: canSlidePrev, handleTouchStart: handleTouchStart, handleTouchMove: handleTouchMove, handleTouchEnd: handleTouchEnd, loopedSlides: loopedSlides} = slider, totalWrapperWidth = useMemo((() => 0 === slideWidth ? 0 : allSlides.length * (slideWidth + spaceBetween) - spaceBetween), [ allSlides.length, slideWidth, spaceBetween ]);
|
|
16456
|
+
// Hooks must be called unconditionally - before early return
|
|
16457
|
+
if (!slides || 0 === slides.length) return jsx("div", {
|
|
15796
16458
|
className: "c-slider c-slider--empty",
|
|
15797
16459
|
style: {
|
|
15798
16460
|
height: height,
|
|
@@ -15804,19 +16466,7 @@ const Slider = forwardRef(((props, ref) => {
|
|
|
15804
16466
|
children: "No slides available"
|
|
15805
16467
|
})
|
|
15806
16468
|
});
|
|
15807
|
-
const
|
|
15808
|
-
slides: slides,
|
|
15809
|
-
slidesToShow: slidesToShow,
|
|
15810
|
-
spaceBetween: spaceBetween,
|
|
15811
|
-
loop: loop,
|
|
15812
|
-
initialSlide: initialSlide,
|
|
15813
|
-
direction: direction,
|
|
15814
|
-
speed: speed,
|
|
15815
|
-
allowTouchMove: allowTouchMove,
|
|
15816
|
-
threshold: threshold,
|
|
15817
|
-
autoplay: autoplay,
|
|
15818
|
-
onSlideChange: onSlideChange
|
|
15819
|
-
}), {containerRef: containerRef, wrapperRef: wrapperRef, allSlides: allSlides, realIndex: realIndex, translateValue: translateValue, slideWidth: slideWidth, transitioning: transitioning, touching: touching, slideNext: slideNext, slidePrev: slidePrev, goToSlide: goToSlide, canSlideNext: canSlideNext, canSlidePrev: canSlidePrev, handleTouchStart: handleTouchStart, handleTouchMove: handleTouchMove, handleTouchEnd: handleTouchEnd, loopedSlides: loopedSlides} = slider, totalWrapperWidth = useMemo((() => 0 === slideWidth ? 0 : allSlides.length * (slideWidth + spaceBetween) - spaceBetween), [ allSlides.length, slideWidth, spaceBetween ]), containerClasses = [ "c-slider", "vertical" === direction && "c-slider--vertical", grabCursor && "c-slider--grab-cursor", touching && "c-slider--grabbing", loop && "c-slider--loop", className ].filter(Boolean).join(" ");
|
|
16469
|
+
const containerClasses = [ "c-slider", "vertical" === direction && "c-slider--vertical", grabCursor && "c-slider--grab-cursor", touching && "c-slider--grabbing", loop && "c-slider--loop", className ].filter(Boolean).join(" ");
|
|
15820
16470
|
return jsxs("div", {
|
|
15821
16471
|
ref: ref || containerRef,
|
|
15822
16472
|
className: containerClasses,
|
|
@@ -15982,7 +16632,7 @@ Steps.displayName = "Steps";
|
|
|
15982
16632
|
/**
|
|
15983
16633
|
* Tabs component for switching between different content panels
|
|
15984
16634
|
*/
|
|
15985
|
-
const Tabs =
|
|
16635
|
+
const Tabs = memo((({items: items, activeIndex: activeIndex = TAB.DEFAULTS.ACTIVE_INDEX, onTabChange: onTabChange, className: className = "", style: style, glass: glass}) => {
|
|
15986
16636
|
const [currentTab, setCurrentTab] = useState(activeIndex), tabContent = jsxs("div", {
|
|
15987
16637
|
className: `c-tabs js-atomix-tab ${className}`,
|
|
15988
16638
|
style: style,
|
|
@@ -16043,7 +16693,7 @@ const Tabs = ({items: items, activeIndex: activeIndex = TAB.DEFAULTS.ACTIVE_INDE
|
|
|
16043
16693
|
});
|
|
16044
16694
|
}
|
|
16045
16695
|
return tabContent;
|
|
16046
|
-
};
|
|
16696
|
+
}));
|
|
16047
16697
|
|
|
16048
16698
|
Tabs.displayName = "Tabs";
|
|
16049
16699
|
|
|
@@ -16207,13 +16857,12 @@ const Todo = ({items: items = [], title: title = "Todo List", onAddTodo: onAddTo
|
|
|
16207
16857
|
type: "checkbox",
|
|
16208
16858
|
className: "c-todo__checkbox c-checkbox",
|
|
16209
16859
|
checked: item.completed,
|
|
16210
|
-
onChange: () => {
|
|
16211
|
-
|
|
16860
|
+
onChange: () => (id => {
|
|
16861
|
+
disabled || (setLocalItems((prevItems => prevItems.map((item => item.id === id ? {
|
|
16212
16862
|
...item,
|
|
16213
16863
|
completed: !item.completed
|
|
16214
|
-
} : item)))), onToggleTodo && onToggleTodo(id))
|
|
16215
|
-
|
|
16216
|
-
},
|
|
16864
|
+
} : item)))), onToggleTodo && onToggleTodo(id));
|
|
16865
|
+
})(item.id),
|
|
16217
16866
|
disabled: disabled,
|
|
16218
16867
|
"aria-label": `Mark "${item.text}" as ${item.completed ? "incomplete" : "complete"}`
|
|
16219
16868
|
}), jsx("span", {
|
|
@@ -16223,11 +16872,10 @@ const Todo = ({items: items = [], title: title = "Todo List", onAddTodo: onAddTo
|
|
|
16223
16872
|
}), jsx("button", {
|
|
16224
16873
|
type: "button",
|
|
16225
16874
|
className: "c-todo__delete-btn c-btn c-btn--error c-btn--sm",
|
|
16226
|
-
onClick: () => {
|
|
16227
|
-
|
|
16228
|
-
onDeleteTodo && onDeleteTodo(id))
|
|
16229
|
-
|
|
16230
|
-
},
|
|
16875
|
+
onClick: () => (id => {
|
|
16876
|
+
disabled || (setLocalItems((prevItems => prevItems.filter((item => item.id !== id)))),
|
|
16877
|
+
onDeleteTodo && onDeleteTodo(id));
|
|
16878
|
+
})(item.id),
|
|
16231
16879
|
disabled: disabled,
|
|
16232
16880
|
"aria-label": `Delete "${item.text}"`,
|
|
16233
16881
|
children: jsx(Icon, {
|
|
@@ -16293,7 +16941,7 @@ Toggle.displayName = "Toggle";
|
|
|
16293
16941
|
/**
|
|
16294
16942
|
* Calculate tooltip and arrow positions based on trigger and tooltip dimensions
|
|
16295
16943
|
*/
|
|
16296
|
-
const Tooltip =
|
|
16944
|
+
const Tooltip = memo((({content: content, children: children, position: position = TOOLTIP.DEFAULTS.POSITION, trigger: trigger = TOOLTIP.DEFAULTS.TRIGGER, className: className = "", style: style, delay: delay = TOOLTIP.DEFAULTS.DELAY, offset: offset = TOOLTIP.DEFAULTS.OFFSET, glass: glass}) => {
|
|
16297
16945
|
const {isVisible: isVisible, isPositioned: isPositioned, tooltipId: tooltipId, triggerRef: triggerRef, tooltipRef: tooltipRef, tooltipStyle: tooltipStyle, arrowStyle: arrowStyle, triggerProps: triggerProps, wrapperProps: wrapperProps} = (({position: position = "top", trigger: trigger = "hover", offset: offset = 10, delay: delay = 200}) => {
|
|
16298
16946
|
const [isVisible, setIsVisible] = useState(!1), [isPositioned, setIsPositioned] = useState(!1), [tooltipStyle, setTooltipStyle] = useState({}), [arrowStyle, setArrowStyle] = useState({}), timeoutRef = useRef(null), triggerRef = useRef(null), tooltipRef = useRef(null), tooltipId = `tooltip-${Math.random().toString(36).slice(2, 11)}`, showTooltip = useCallback((() => {
|
|
16299
16947
|
timeoutRef.current && clearTimeout(timeoutRef.current), delay > 0 ? timeoutRef.current = setTimeout((() => {
|
|
@@ -16470,7 +17118,7 @@ const Tooltip = ({content: content, children: children, position: position = TOO
|
|
|
16470
17118
|
})()
|
|
16471
17119
|
}) ]
|
|
16472
17120
|
});
|
|
16473
|
-
};
|
|
17121
|
+
}));
|
|
16474
17122
|
|
|
16475
17123
|
/**
|
|
16476
17124
|
* Get arrow size from CSS custom property
|
|
@@ -16633,13 +17281,14 @@ Upload.displayName = "Upload";
|
|
|
16633
17281
|
/**
|
|
16634
17282
|
* Advanced Video Player Component
|
|
16635
17283
|
*/
|
|
16636
|
-
const VideoPlayer =
|
|
17284
|
+
const VideoPlayer = forwardRef((({src: src, type: type = "video", youtubeId: youtubeId, poster: poster, autoplay: autoplay = !1, loop: loop = !1, muted: muted = !1, controls: controls = !0, preload: preload = "metadata", width: width, height: height, aspectRatio: aspectRatio = "16:9", className: className = "", onPlay: onPlay, onPause: onPause, onEnded: onEnded, onTimeUpdate: onTimeUpdate, onVolumeChange: onVolumeChange, onFullscreenChange: onFullscreenChange, onError: onError, showDownload: showDownload = !1, showShare: showShare = !1, showSettings: showSettings = !0, playbackRates: playbackRates = [ .5, .75, 1, 1.25, 1.5, 2 ], subtitles: subtitles, quality: quality, ambientMode: ambientMode = !1, glass: glass = !1, glassOpacity: glassOpacity = 1, glassContent: glassContent, style: style, ...props}, ref) => {
|
|
16637
17285
|
const videoRef = useRef(null), containerRef = useRef(null), canvasRef = useRef(null), iframeRef = useRef(null), [containerBorderRadius, setContainerBorderRadius] = useState(8), isYouTube = "youtube" === type || youtubeId || src && isYouTubeUrl(src), videoId = youtubeId || (isYouTube && src ? extractYouTubeId(src) : null), {isPlaying: isPlaying, currentTime: currentTime, duration: duration, volume: volume, isMuted: isMuted, isFullscreen: isFullscreen, isLoading: isLoading, playbackRate: playbackRate, currentQuality: currentQuality, showControls: showControls, play: play, pause: pause, togglePlay: togglePlay, seek: seek, setVolume: setVolume, toggleMute: toggleMute, toggleFullscreen: toggleFullscreen, togglePictureInPicture: togglePictureInPicture, setPlaybackRate: setPlaybackRate, setQuality: setQuality, formatTime: formatTime, getProgressPercentage: getProgressPercentage, getBufferedPercentage: getBufferedPercentage} = function({videoRef: videoRef, containerRef: containerRef, onPlay: onPlay, onPause: onPause, onEnded: onEnded, onTimeUpdate: onTimeUpdate, onVolumeChange: onVolumeChange, onFullscreenChange: onFullscreenChange, onError: onError, playbackRates: playbackRates = [ .5, .75, 1, 1.25, 1.5, 2 ], quality: quality}) {
|
|
16638
17286
|
const [isPlaying, setIsPlaying] = useState(!1), [currentTime, setCurrentTime] = useState(0), [duration, setDuration] = useState(0), [volume, setVolumeState] = useState(1), [isMuted, setIsMuted] = useState(!1), [isFullscreen, setIsFullscreen] = useState(!1), [isPictureInPicture, setIsPictureInPicture] = useState(!1), [isLoading, setIsLoading] = useState(!1), [buffered, setBuffered] = useState(0), [playbackRate, setPlaybackRateState] = useState(1), [currentQuality, setCurrentQuality] = useState(quality?.[0] || null), [showControls, setShowControls] = useState(!0), controlsTimeoutRef = useRef(null), resetControlsTimeout = useCallback((() => {
|
|
16639
|
-
controlsTimeoutRef.current && clearTimeout(controlsTimeoutRef.current), setShowControls(!0)
|
|
16640
|
-
|
|
17287
|
+
controlsTimeoutRef.current && clearTimeout(controlsTimeoutRef.current), setShowControls(!0);
|
|
17288
|
+
const timeout = setTimeout((() => {
|
|
16641
17289
|
isPlaying && setShowControls(!1);
|
|
16642
17290
|
}), 3e3);
|
|
17291
|
+
controlsTimeoutRef.current = timeout;
|
|
16643
17292
|
}), [ isPlaying ]), play = useCallback((async () => {
|
|
16644
17293
|
if (videoRef.current) try {
|
|
16645
17294
|
await videoRef.current.play(), setIsPlaying(!0), onPlay?.();
|
|
@@ -16674,7 +17323,7 @@ const VideoPlayer = forwardRef((({src: src, type: type = "video", youtubeId: you
|
|
|
16674
17323
|
console.error("Picture-in-picture error:", error);
|
|
16675
17324
|
}
|
|
16676
17325
|
}), [ videoRef, isPictureInPicture ]), setPlaybackRate = useCallback((rate => {
|
|
16677
|
-
videoRef.current && playbackRates.
|
|
17326
|
+
videoRef.current && _includesInstanceProperty(playbackRates).call(playbackRates, rate) && (videoRef.current.playbackRate = rate,
|
|
16678
17327
|
setPlaybackRateState(rate));
|
|
16679
17328
|
}), [ videoRef, playbackRates ]), setQuality = useCallback((newQuality => {
|
|
16680
17329
|
if (videoRef.current && quality) {
|
|
@@ -17506,41 +18155,37 @@ function validateConfig(config) {
|
|
|
17506
18155
|
function(themes) {
|
|
17507
18156
|
const errors = [], warnings = [];
|
|
17508
18157
|
0 === Object.keys(themes).length && warnings.push("No themes defined in configuration");
|
|
17509
|
-
for (const [themeId, theme] of Object.entries(themes))
|
|
17510
|
-
|
|
17511
|
-
|
|
17512
|
-
|
|
17513
|
-
|
|
17514
|
-
|
|
17515
|
-
|
|
17516
|
-
|
|
17517
|
-
|
|
17518
|
-
|
|
17519
|
-
|
|
17520
|
-
|
|
17521
|
-
|
|
17522
|
-
|
|
17523
|
-
|
|
17524
|
-
|
|
17525
|
-
|
|
17526
|
-
|
|
17527
|
-
|
|
17528
|
-
|
|
17529
|
-
|
|
17530
|
-
|
|
17531
|
-
|
|
17532
|
-
|
|
17533
|
-
|
|
17534
|
-
|
|
17535
|
-
|
|
17536
|
-
|
|
17537
|
-
|
|
17538
|
-
|
|
17539
|
-
|
|
17540
|
-
var version;
|
|
17541
|
-
/**
|
|
17542
|
-
* Check if string is valid color
|
|
17543
|
-
*/ return {
|
|
18158
|
+
for (const [themeId, theme] of Object.entries(themes)) {
|
|
18159
|
+
var _context;
|
|
18160
|
+
// Validate theme ID
|
|
18161
|
+
if (themeId && "string" == typeof themeId)
|
|
18162
|
+
// Validate theme object
|
|
18163
|
+
if (theme && "object" == typeof theme)
|
|
18164
|
+
// Validate theme type
|
|
18165
|
+
if (!theme.type || "css" !== theme.type && "js" !== theme.type) errors.push(`Theme "${themeId}" must have type "css" or "js"`); else {
|
|
18166
|
+
// Validate CSS theme
|
|
18167
|
+
if (
|
|
18168
|
+
// Validate required fields
|
|
18169
|
+
theme.name && "string" == typeof theme.name || errors.push(`Theme "${themeId}" must have a "name" string`),
|
|
18170
|
+
"css" === theme.type) {
|
|
18171
|
+
const cssErrors = validateCSSTheme();
|
|
18172
|
+
errors.push(...cssErrors.errors), warnings.push(...cssErrors.warnings);
|
|
18173
|
+
}
|
|
18174
|
+
// Validate JS theme
|
|
18175
|
+
if ("js" === theme.type) {
|
|
18176
|
+
const jsErrors = validateJSTheme(themeId, theme);
|
|
18177
|
+
errors.push(...jsErrors.errors), warnings.push(...jsErrors.warnings);
|
|
18178
|
+
}
|
|
18179
|
+
// Validate metadata
|
|
18180
|
+
theme.version && !isValidSemver(theme.version) && warnings.push(`Theme "${themeId}" has invalid version format: ${theme.version}`),
|
|
18181
|
+
theme.status && !_includesInstanceProperty(_context = [ "stable", "beta", "experimental", "deprecated" ]).call(_context, theme.status) && warnings.push(`Theme "${themeId}" has invalid status: ${theme.status}`),
|
|
18182
|
+
// Validate color format
|
|
18183
|
+
theme.color && !isValidColor(theme.color) && warnings.push(`Theme "${themeId}" has invalid color format: ${theme.color}`),
|
|
18184
|
+
// Validate accessibility
|
|
18185
|
+
theme.a11y && theme.a11y.contrastTarget && (theme.a11y.contrastTarget < 1 || theme.a11y.contrastTarget > 21) && warnings.push(`Theme "${themeId}" has invalid contrast target: ${theme.a11y.contrastTarget}`);
|
|
18186
|
+
} else errors.push(`Theme "${themeId}" must be an object`); else errors.push(`Invalid theme ID: ${themeId}`);
|
|
18187
|
+
}
|
|
18188
|
+
return {
|
|
17544
18189
|
valid: 0 === errors.length,
|
|
17545
18190
|
errors: errors,
|
|
17546
18191
|
warnings: warnings
|
|
@@ -17560,9 +18205,10 @@ function validateConfig(config) {
|
|
|
17560
18205
|
*/
|
|
17561
18206
|
function(build) {
|
|
17562
18207
|
const errors = [], warnings = [];
|
|
18208
|
+
var _context2;
|
|
17563
18209
|
return build.output && "object" == typeof build.output ? (build.output.directory && "string" == typeof build.output.directory || errors.push('Build output must have a "directory" string'),
|
|
17564
18210
|
build.output.formats && "object" == typeof build.output.formats || errors.push('Build output must have a "formats" object')) : errors.push('Build config must have an "output" object'),
|
|
17565
|
-
build.sass && "object" == typeof build.sass ? build.sass.style && ![ "expanded", "compressed", "compact", "nested" ].
|
|
18211
|
+
build.sass && "object" == typeof build.sass ? build.sass.style && !_includesInstanceProperty(_context2 = [ "expanded", "compressed", "compact", "nested" ]).call(_context2, build.sass.style) && warnings.push(`Invalid Sass style: ${build.sass.style}`) : errors.push('Build config must have a "sass" object'),
|
|
17566
18212
|
{
|
|
17567
18213
|
valid: 0 === errors.length,
|
|
17568
18214
|
errors: errors,
|
|
@@ -17626,7 +18272,10 @@ function validateConfig(config) {
|
|
|
17626
18272
|
errors: errors,
|
|
17627
18273
|
warnings: warnings
|
|
17628
18274
|
};
|
|
17629
|
-
}
|
|
18275
|
+
}
|
|
18276
|
+
/**
|
|
18277
|
+
* Check if string is valid semver
|
|
18278
|
+
*/ (config.dependencies, config.themes || {});
|
|
17630
18279
|
errors.push(...depErrors.errors), warnings.push(...depErrors.warnings);
|
|
17631
18280
|
}
|
|
17632
18281
|
return {
|
|
@@ -17660,13 +18309,22 @@ function validateCSSTheme(themeId, theme) {
|
|
|
17660
18309
|
};
|
|
17661
18310
|
}
|
|
17662
18311
|
|
|
17663
|
-
function
|
|
18312
|
+
function isValidSemver(version) {
|
|
18313
|
+
return /^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(version);
|
|
18314
|
+
}
|
|
18315
|
+
|
|
18316
|
+
/**
|
|
18317
|
+
* Check if string is valid color
|
|
18318
|
+
*/ function isValidColor(color) {
|
|
17664
18319
|
// Hex color
|
|
17665
|
-
|
|
18320
|
+
if (/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(color)) return !0;
|
|
17666
18321
|
// RGB/RGBA
|
|
17667
|
-
|
|
18322
|
+
if (/^rgba?\(/.test(color)) return !0;
|
|
17668
18323
|
// HSL/HSLA
|
|
17669
|
-
|
|
18324
|
+
if (/^hsla?\(/.test(color)) return !0;
|
|
18325
|
+
// Named colors (basic check)
|
|
18326
|
+
const namedColors = [ "black", "white", "red", "green", "blue", "yellow", "cyan", "magenta", "transparent", "currentColor" ];
|
|
18327
|
+
return !!_includesInstanceProperty(namedColors).call(namedColors, color.toLowerCase());
|
|
17670
18328
|
}
|
|
17671
18329
|
|
|
17672
18330
|
/**
|
|
@@ -17715,8 +18373,8 @@ class ThemeError extends Error {
|
|
|
17715
18373
|
Error.captureStackTrace && Error.captureStackTrace(this, ThemeError);
|
|
17716
18374
|
}
|
|
17717
18375
|
/**
|
|
17718
|
-
|
|
17719
|
-
|
|
18376
|
+
* Convert error to JSON for logging
|
|
18377
|
+
*/ toJSON() {
|
|
17720
18378
|
return {
|
|
17721
18379
|
name: this.name,
|
|
17722
18380
|
message: this.message,
|
|
@@ -17753,8 +18411,8 @@ class ThemeLogger {
|
|
|
17753
18411
|
};
|
|
17754
18412
|
}
|
|
17755
18413
|
/**
|
|
17756
|
-
|
|
17757
|
-
|
|
18414
|
+
* Log an error
|
|
18415
|
+
*/ error(message, error, context) {
|
|
17758
18416
|
if (this.config.level < LogLevel.ERROR) return;
|
|
17759
18417
|
const errorObj = error instanceof Error ? error : new Error(message), themeError = error instanceof ThemeError ? error : new ThemeError(message, ThemeErrorCode.UNKNOWN_ERROR, context);
|
|
17760
18418
|
this.config.enableConsole && console.error(`[ThemeError] ${message}`, {
|
|
@@ -17767,20 +18425,20 @@ class ThemeLogger {
|
|
|
17767
18425
|
}), this.config.onError?.(themeError, context);
|
|
17768
18426
|
}
|
|
17769
18427
|
/**
|
|
17770
|
-
|
|
17771
|
-
|
|
18428
|
+
* Log a warning
|
|
18429
|
+
*/ warn(message, context) {
|
|
17772
18430
|
this.config.level < LogLevel.WARN || (this.config.enableConsole && console.warn(`[ThemeWarning] ${message}`, context || {}),
|
|
17773
18431
|
this.config.onWarn?.(message, context));
|
|
17774
18432
|
}
|
|
17775
18433
|
/**
|
|
17776
|
-
|
|
17777
|
-
|
|
18434
|
+
* Log an info message
|
|
18435
|
+
*/ info(message, context) {
|
|
17778
18436
|
this.config.level < LogLevel.INFO || (this.config.enableConsole && console.info(`[ThemeInfo] ${message}`, context || {}),
|
|
17779
18437
|
this.config.onInfo?.(message, context));
|
|
17780
18438
|
}
|
|
17781
18439
|
/**
|
|
17782
|
-
|
|
17783
|
-
|
|
18440
|
+
* Log a debug message
|
|
18441
|
+
*/ debug(message, context) {
|
|
17784
18442
|
this.config.level < LogLevel.DEBUG || (this.config.enableConsole, this.config.onDebug?.(message, context));
|
|
17785
18443
|
}
|
|
17786
18444
|
}
|
|
@@ -17923,11 +18581,6 @@ class ThemeLogger {
|
|
|
17923
18581
|
/**
|
|
17924
18582
|
* Theme Registry
|
|
17925
18583
|
*
|
|
17926
|
-
* Central registry for all themes with discovery and dependency management
|
|
17927
|
-
*/
|
|
17928
|
-
/**
|
|
17929
|
-
* Theme Registry
|
|
17930
|
-
*
|
|
17931
18584
|
* Manages theme registration, discovery, and dependency resolution
|
|
17932
18585
|
*/ (processedConfig, env);
|
|
17933
18586
|
// Validate if requested
|
|
@@ -17990,8 +18643,8 @@ class ThemeRegistry {
|
|
|
17990
18643
|
this.entries = new Map, this.config = null, this.initialized = !1;
|
|
17991
18644
|
}
|
|
17992
18645
|
/**
|
|
17993
|
-
|
|
17994
|
-
|
|
18646
|
+
* Initialize registry from config
|
|
18647
|
+
*/ async initialize(config) {
|
|
17995
18648
|
if (!this.initialized) {
|
|
17996
18649
|
// Load config if not provided
|
|
17997
18650
|
if (config) this.config = config; else try {
|
|
@@ -18041,8 +18694,8 @@ class ThemeRegistry {
|
|
|
18041
18694
|
}
|
|
18042
18695
|
}
|
|
18043
18696
|
/**
|
|
18044
|
-
|
|
18045
|
-
|
|
18697
|
+
* Register a theme
|
|
18698
|
+
*/ register(themeId, definition) {
|
|
18046
18699
|
// Get dependencies from config or definition
|
|
18047
18700
|
const entry = {
|
|
18048
18701
|
id: themeId,
|
|
@@ -18054,23 +18707,23 @@ class ThemeRegistry {
|
|
|
18054
18707
|
this.entries.set(themeId, entry);
|
|
18055
18708
|
}
|
|
18056
18709
|
/**
|
|
18057
|
-
|
|
18058
|
-
|
|
18710
|
+
* Get theme entry
|
|
18711
|
+
*/ get(themeId) {
|
|
18059
18712
|
return this.entries.get(themeId);
|
|
18060
18713
|
}
|
|
18061
18714
|
/**
|
|
18062
|
-
|
|
18063
|
-
|
|
18715
|
+
* Check if theme exists
|
|
18716
|
+
*/ has(themeId) {
|
|
18064
18717
|
return this.entries.has(themeId);
|
|
18065
18718
|
}
|
|
18066
18719
|
/**
|
|
18067
|
-
|
|
18068
|
-
|
|
18720
|
+
* Get all theme IDs
|
|
18721
|
+
*/ getAllIds() {
|
|
18069
18722
|
return Array.from(this.entries.keys());
|
|
18070
18723
|
}
|
|
18071
18724
|
/**
|
|
18072
|
-
|
|
18073
|
-
|
|
18725
|
+
* Get all theme metadata
|
|
18726
|
+
*/ getAllMetadata() {
|
|
18074
18727
|
return Array.from(this.entries.values()).map((entry => ({
|
|
18075
18728
|
id: entry.id,
|
|
18076
18729
|
name: entry.definition.name,
|
|
@@ -18089,34 +18742,34 @@ class ThemeRegistry {
|
|
|
18089
18742
|
})));
|
|
18090
18743
|
}
|
|
18091
18744
|
/**
|
|
18092
|
-
|
|
18093
|
-
|
|
18745
|
+
* Get theme definition
|
|
18746
|
+
*/ getDefinition(themeId) {
|
|
18094
18747
|
return this.entries.get(themeId)?.definition;
|
|
18095
18748
|
}
|
|
18096
18749
|
/**
|
|
18097
|
-
|
|
18098
|
-
|
|
18750
|
+
* Get theme object (for JS themes)
|
|
18751
|
+
*/ getTheme(themeId) {
|
|
18099
18752
|
return this.entries.get(themeId)?.theme;
|
|
18100
18753
|
}
|
|
18101
18754
|
/**
|
|
18102
|
-
|
|
18103
|
-
|
|
18755
|
+
* Set theme object (for JS themes)
|
|
18756
|
+
*/ setTheme(themeId, theme) {
|
|
18104
18757
|
const entry = this.entries.get(themeId);
|
|
18105
18758
|
entry && (entry.theme = theme, entry.loaded = !0);
|
|
18106
18759
|
}
|
|
18107
18760
|
/**
|
|
18108
|
-
|
|
18109
|
-
|
|
18761
|
+
* Get dependencies for a theme
|
|
18762
|
+
*/ getDependencies(themeId) {
|
|
18110
18763
|
return this.entries.get(themeId)?.dependencies || [];
|
|
18111
18764
|
}
|
|
18112
18765
|
/**
|
|
18113
|
-
|
|
18114
|
-
|
|
18766
|
+
* Get dependents for a theme (themes that depend on this one)
|
|
18767
|
+
*/ getDependents(themeId) {
|
|
18115
18768
|
return this.entries.get(themeId)?.dependents || [];
|
|
18116
18769
|
}
|
|
18117
18770
|
/**
|
|
18118
|
-
|
|
18119
|
-
|
|
18771
|
+
* Resolve all dependencies in correct order
|
|
18772
|
+
*/ resolveDependencyOrder(themeId) {
|
|
18120
18773
|
const resolved = [], visited = new Set, visiting = new Set, visit = id => {
|
|
18121
18774
|
if (visiting.has(id)) throw new Error(`Circular dependency detected involving theme: ${id}`);
|
|
18122
18775
|
if (visited.has(id)) return;
|
|
@@ -18131,17 +18784,18 @@ class ThemeRegistry {
|
|
|
18131
18784
|
return visit(themeId), resolved;
|
|
18132
18785
|
}
|
|
18133
18786
|
/**
|
|
18134
|
-
|
|
18135
|
-
|
|
18787
|
+
* Resolve dependencies and build dependency graph
|
|
18788
|
+
*/ resolveDependencies() {
|
|
18136
18789
|
// Build dependents map
|
|
18137
18790
|
for (const entry of this.entries.values()) for (const dep of entry.dependencies) {
|
|
18138
18791
|
const depEntry = this.entries.get(dep);
|
|
18139
|
-
|
|
18792
|
+
var _context;
|
|
18793
|
+
depEntry && (_includesInstanceProperty(_context = depEntry.dependents).call(_context, entry.id) || depEntry.dependents.push(entry.id));
|
|
18140
18794
|
}
|
|
18141
18795
|
}
|
|
18142
18796
|
/**
|
|
18143
|
-
|
|
18144
|
-
|
|
18797
|
+
* Validate all themes
|
|
18798
|
+
*/ validate() {
|
|
18145
18799
|
const errors = [];
|
|
18146
18800
|
// Check for circular dependencies
|
|
18147
18801
|
for (const themeId of this.entries.keys()) try {
|
|
@@ -18157,8 +18811,8 @@ class ThemeRegistry {
|
|
|
18157
18811
|
};
|
|
18158
18812
|
}
|
|
18159
18813
|
/**
|
|
18160
|
-
|
|
18161
|
-
|
|
18814
|
+
* Clear registry
|
|
18815
|
+
*/ clear() {
|
|
18162
18816
|
this.entries.clear(), this.config = null, this.initialized = !1;
|
|
18163
18817
|
}
|
|
18164
18818
|
}
|
|
@@ -18189,8 +18843,8 @@ class ThemeRegistry {
|
|
|
18189
18843
|
};
|
|
18190
18844
|
}
|
|
18191
18845
|
/**
|
|
18192
|
-
|
|
18193
|
-
|
|
18846
|
+
* Get cached CSS theme
|
|
18847
|
+
*/ getCSS(themeId) {
|
|
18194
18848
|
if (!this.config.enabled) return null;
|
|
18195
18849
|
const entry = this.cache.get(themeId);
|
|
18196
18850
|
return entry && "css" === entry.type ?
|
|
@@ -18201,8 +18855,8 @@ class ThemeRegistry {
|
|
|
18201
18855
|
this.updateAccessOrder(themeId), entry) : null;
|
|
18202
18856
|
}
|
|
18203
18857
|
/**
|
|
18204
|
-
|
|
18205
|
-
|
|
18858
|
+
* Get cached JS theme
|
|
18859
|
+
*/ getJS(themeId) {
|
|
18206
18860
|
if (!this.config.enabled) return null;
|
|
18207
18861
|
const entry = this.cache.get(themeId);
|
|
18208
18862
|
return entry && "js" === entry.type ?
|
|
@@ -18213,8 +18867,8 @@ class ThemeRegistry {
|
|
|
18213
18867
|
this.updateAccessOrder(themeId), entry) : null;
|
|
18214
18868
|
}
|
|
18215
18869
|
/**
|
|
18216
|
-
|
|
18217
|
-
|
|
18870
|
+
* Set CSS theme cache entry
|
|
18871
|
+
*/ setCSS(themeId, entry) {
|
|
18218
18872
|
if (!this.config.enabled) return;
|
|
18219
18873
|
// Evict if needed
|
|
18220
18874
|
this.evictIfNeeded();
|
|
@@ -18230,8 +18884,8 @@ class ThemeRegistry {
|
|
|
18230
18884
|
this.cache.set(themeId, cacheEntry), this.updateAccessOrder(themeId);
|
|
18231
18885
|
}
|
|
18232
18886
|
/**
|
|
18233
|
-
|
|
18234
|
-
|
|
18887
|
+
* Set JS theme cache entry
|
|
18888
|
+
*/ setJS(themeId, theme) {
|
|
18235
18889
|
if (!this.config.enabled) return;
|
|
18236
18890
|
// Evict if needed
|
|
18237
18891
|
this.evictIfNeeded();
|
|
@@ -18245,8 +18899,8 @@ class ThemeRegistry {
|
|
|
18245
18899
|
this.cache.set(themeId, cacheEntry), this.updateAccessOrder(themeId);
|
|
18246
18900
|
}
|
|
18247
18901
|
/**
|
|
18248
|
-
|
|
18249
|
-
|
|
18902
|
+
* Check if theme is cached
|
|
18903
|
+
*/ has(themeId) {
|
|
18250
18904
|
if (!this.config.enabled) return !1;
|
|
18251
18905
|
const entry = this.cache.get(themeId);
|
|
18252
18906
|
return !!entry && (
|
|
@@ -18255,19 +18909,19 @@ class ThemeRegistry {
|
|
|
18255
18909
|
this.removeFromAccessOrder(themeId), !1));
|
|
18256
18910
|
}
|
|
18257
18911
|
/**
|
|
18258
|
-
|
|
18259
|
-
|
|
18912
|
+
* Remove theme from cache
|
|
18913
|
+
*/ delete(themeId) {
|
|
18260
18914
|
const deleted = this.cache.delete(themeId);
|
|
18261
18915
|
return deleted && this.removeFromAccessOrder(themeId), deleted;
|
|
18262
18916
|
}
|
|
18263
18917
|
/**
|
|
18264
|
-
|
|
18265
|
-
|
|
18918
|
+
* Clear all cache
|
|
18919
|
+
*/ clear() {
|
|
18266
18920
|
this.cache.clear(), this.accessOrder = [];
|
|
18267
18921
|
}
|
|
18268
18922
|
/**
|
|
18269
|
-
|
|
18270
|
-
|
|
18923
|
+
* Get cache statistics
|
|
18924
|
+
*/ getStats() {
|
|
18271
18925
|
let cssThemes = 0, jsThemes = 0;
|
|
18272
18926
|
for (const entry of this.cache.values()) "css" === entry.type ? cssThemes++ : jsThemes++;
|
|
18273
18927
|
return {
|
|
@@ -18278,19 +18932,19 @@ class ThemeRegistry {
|
|
|
18278
18932
|
};
|
|
18279
18933
|
}
|
|
18280
18934
|
/**
|
|
18281
|
-
|
|
18282
|
-
|
|
18935
|
+
* Update access order for LRU
|
|
18936
|
+
*/ updateAccessOrder(themeId) {
|
|
18283
18937
|
this.removeFromAccessOrder(themeId), this.accessOrder.push(themeId);
|
|
18284
18938
|
}
|
|
18285
18939
|
/**
|
|
18286
|
-
|
|
18287
|
-
|
|
18940
|
+
* Remove from access order
|
|
18941
|
+
*/ removeFromAccessOrder(themeId) {
|
|
18288
18942
|
const index = this.accessOrder.indexOf(themeId);
|
|
18289
18943
|
index > -1 && this.accessOrder.splice(index, 1);
|
|
18290
18944
|
}
|
|
18291
18945
|
/**
|
|
18292
|
-
|
|
18293
|
-
|
|
18946
|
+
* Evict least recently used entries if cache is full
|
|
18947
|
+
*/ evictIfNeeded() {
|
|
18294
18948
|
if (!(this.cache.size < this.config.maxSize))
|
|
18295
18949
|
// Evict least recently used (first in access order)
|
|
18296
18950
|
for (;this.cache.size >= this.config.maxSize && this.accessOrder.length > 0; ) {
|
|
@@ -18418,8 +19072,8 @@ function isJSTheme(theme) {
|
|
|
18418
19072
|
* Validates themes for correctness and accessibility
|
|
18419
19073
|
*/ class ThemeValidator {
|
|
18420
19074
|
/**
|
|
18421
|
-
|
|
18422
|
-
|
|
19075
|
+
* Validate theme
|
|
19076
|
+
*/
|
|
18423
19077
|
validate(theme, metadata) {
|
|
18424
19078
|
const errors = [], warnings = [], a11yIssues = [], paletteResult = this.validatePalette(theme.palette, metadata);
|
|
18425
19079
|
errors.push(...paletteResult.errors), warnings.push(...paletteResult.warnings),
|
|
@@ -18453,8 +19107,8 @@ function isJSTheme(theme) {
|
|
|
18453
19107
|
};
|
|
18454
19108
|
}
|
|
18455
19109
|
/**
|
|
18456
|
-
|
|
18457
|
-
|
|
19110
|
+
* Validate palette
|
|
19111
|
+
*/ validatePalette(palette, metadata) {
|
|
18458
19112
|
const errors = [], warnings = [], a11yIssues = [], contrastTarget = metadata?.a11y?.contrastTarget || 4.5;
|
|
18459
19113
|
// Validate primary color contrast
|
|
18460
19114
|
if (palette.primary) {
|
|
@@ -18498,8 +19152,8 @@ function isJSTheme(theme) {
|
|
|
18498
19152
|
};
|
|
18499
19153
|
}
|
|
18500
19154
|
/**
|
|
18501
|
-
|
|
18502
|
-
|
|
19155
|
+
* Validate typography
|
|
19156
|
+
*/ validateTypography(typography) {
|
|
18503
19157
|
const errors = [], warnings = [];
|
|
18504
19158
|
return typography.fontFamily && "string" == typeof typography.fontFamily || errors.push("Typography must have a fontFamily"),
|
|
18505
19159
|
(!typography.fontSize || "number" != typeof typography.fontSize || typography.fontSize <= 0) && errors.push("Typography must have a valid fontSize"),
|
|
@@ -18513,8 +19167,8 @@ function isJSTheme(theme) {
|
|
|
18513
19167
|
};
|
|
18514
19168
|
}
|
|
18515
19169
|
/**
|
|
18516
|
-
|
|
18517
|
-
|
|
19170
|
+
* Validate spacing
|
|
19171
|
+
*/ validateSpacing(spacing) {
|
|
18518
19172
|
const errors = [];
|
|
18519
19173
|
if ("function" != typeof spacing) errors.push("Spacing must be a function"); else
|
|
18520
19174
|
// Test spacing function
|
|
@@ -18531,8 +19185,8 @@ function isJSTheme(theme) {
|
|
|
18531
19185
|
};
|
|
18532
19186
|
}
|
|
18533
19187
|
/**
|
|
18534
|
-
|
|
18535
|
-
|
|
19188
|
+
* Validate breakpoints
|
|
19189
|
+
*/ validateBreakpoints(breakpoints) {
|
|
18536
19190
|
const errors = [], warnings = [];
|
|
18537
19191
|
if (breakpoints.values) {
|
|
18538
19192
|
const required = [ "xs", "sm", "md", "lg", "xl" ];
|
|
@@ -18555,8 +19209,8 @@ function isJSTheme(theme) {
|
|
|
18555
19209
|
};
|
|
18556
19210
|
}
|
|
18557
19211
|
/**
|
|
18558
|
-
|
|
18559
|
-
|
|
19212
|
+
* Check color contrast ratio
|
|
19213
|
+
*/ checkContrast(foreground, background) {
|
|
18560
19214
|
try {
|
|
18561
19215
|
return getContrastRatio(foreground, background);
|
|
18562
19216
|
} catch {
|
|
@@ -18564,15 +19218,15 @@ function isJSTheme(theme) {
|
|
|
18564
19218
|
}
|
|
18565
19219
|
}
|
|
18566
19220
|
/**
|
|
18567
|
-
|
|
18568
|
-
|
|
19221
|
+
* Check if color is valid
|
|
19222
|
+
*/ isValidColor(color) {
|
|
18569
19223
|
// Hex
|
|
18570
19224
|
return !!/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(color) || !!/^rgba?\(/.test(color) || !!/^hsla?\(/.test(color);
|
|
18571
19225
|
// RGB/RGBA
|
|
18572
19226
|
}
|
|
18573
19227
|
/**
|
|
18574
|
-
|
|
18575
|
-
|
|
19228
|
+
* Validate transitions
|
|
19229
|
+
*/ validateTransitions(transitions) {
|
|
18576
19230
|
const errors = [], warnings = [], a11yIssues = [];
|
|
18577
19231
|
if (!transitions) return errors.push("Transitions configuration is required"), {
|
|
18578
19232
|
valid: !1,
|
|
@@ -18604,8 +19258,8 @@ function isJSTheme(theme) {
|
|
|
18604
19258
|
};
|
|
18605
19259
|
}
|
|
18606
19260
|
/**
|
|
18607
|
-
|
|
18608
|
-
|
|
19261
|
+
* Validate z-index
|
|
19262
|
+
*/ validateZIndex(zIndex) {
|
|
18609
19263
|
const errors = [], warnings = [], a11yIssues = [];
|
|
18610
19264
|
if (!zIndex) return errors.push("Z-index configuration is required"), {
|
|
18611
19265
|
valid: !1,
|
|
@@ -18616,7 +19270,9 @@ function isJSTheme(theme) {
|
|
|
18616
19270
|
const numericEntries = Object.entries(zIndex).filter((([, value]) => "number" == typeof value));
|
|
18617
19271
|
for (const [key, value] of Object.entries(zIndex)) void 0 !== value && ("number" != typeof value ? errors.push(`Z-index ${key} must be a number, got ${typeof value}`) : value < 0 ? errors.push(`Z-index ${key} must be non-negative, got ${value}`) : value > 1e4 && warnings.push(`Z-index ${key} (${value}) exceeds recommended maximum (10000)`));
|
|
18618
19272
|
for (let i = 0; i < numericEntries.length; i++) for (let j = i + 1; j < numericEntries.length; j++) {
|
|
18619
|
-
const
|
|
19273
|
+
const entryA = numericEntries[i], entryB = numericEntries[j];
|
|
19274
|
+
if (!entryA || !entryB) continue;
|
|
19275
|
+
const [keyA, valueA] = entryA, [keyB, valueB] = entryB, diff = Math.abs(valueA - valueB);
|
|
18620
19276
|
diff < 10 && diff > 0 && warnings.push(`Z-index values ${keyA} (${valueA}) and ${keyB} (${valueB}) are very close, potential layering conflicts`);
|
|
18621
19277
|
}
|
|
18622
19278
|
return {
|
|
@@ -18627,8 +19283,8 @@ function isJSTheme(theme) {
|
|
|
18627
19283
|
};
|
|
18628
19284
|
}
|
|
18629
19285
|
/**
|
|
18630
|
-
|
|
18631
|
-
|
|
19286
|
+
* Validate border radius
|
|
19287
|
+
*/ validateBorderRadius(borderRadius) {
|
|
18632
19288
|
const errors = [], warnings = [], a11yIssues = [];
|
|
18633
19289
|
if (!borderRadius) return errors.push("Border radius configuration is required"),
|
|
18634
19290
|
{
|
|
@@ -18674,8 +19330,8 @@ function isJSTheme(theme) {
|
|
|
18674
19330
|
};
|
|
18675
19331
|
}
|
|
18676
19332
|
/**
|
|
18677
|
-
|
|
18678
|
-
|
|
19333
|
+
* Validate custom properties
|
|
19334
|
+
*/ validateCustom(custom) {
|
|
18679
19335
|
const errors = [], warnings = [], a11yIssues = [];
|
|
18680
19336
|
if (!custom || "object" != typeof custom) return {
|
|
18681
19337
|
valid: !0,
|
|
@@ -18732,7 +19388,7 @@ function isJSTheme(theme) {
|
|
|
18732
19388
|
* Convert a nested object to flat CSS variable declarations
|
|
18733
19389
|
*/ function flattenObject(obj, prefix = "", result = {}) {
|
|
18734
19390
|
for (const key in obj) {
|
|
18735
|
-
if (!
|
|
19391
|
+
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
18736
19392
|
const value = obj[key], newKey = prefix ? `${prefix}-${key}` : key;
|
|
18737
19393
|
if (value && "object" == typeof value && !Array.isArray(value)) {
|
|
18738
19394
|
// Skip special objects like functions
|
|
@@ -19232,28 +19888,28 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19232
19888
|
};
|
|
19233
19889
|
}
|
|
19234
19890
|
/**
|
|
19235
|
-
|
|
19236
|
-
|
|
19891
|
+
* Initialize engine with theme registry
|
|
19892
|
+
*/ async initialize() {
|
|
19237
19893
|
await this.registry.initialize();
|
|
19238
19894
|
}
|
|
19239
19895
|
/**
|
|
19240
|
-
|
|
19241
|
-
|
|
19896
|
+
* Get current theme ID
|
|
19897
|
+
*/ getCurrentTheme() {
|
|
19242
19898
|
return this.currentTheme;
|
|
19243
19899
|
}
|
|
19244
19900
|
/**
|
|
19245
|
-
|
|
19246
|
-
|
|
19901
|
+
* Get active theme object
|
|
19902
|
+
*/ getActiveTheme() {
|
|
19247
19903
|
return this.activeTheme;
|
|
19248
19904
|
}
|
|
19249
19905
|
/**
|
|
19250
|
-
|
|
19251
|
-
|
|
19906
|
+
* Check if theme is loaded
|
|
19907
|
+
*/ isThemeLoaded(themeId) {
|
|
19252
19908
|
return this.loadedThemes.has(themeId);
|
|
19253
19909
|
}
|
|
19254
19910
|
/**
|
|
19255
|
-
|
|
19256
|
-
|
|
19911
|
+
* Load and apply theme
|
|
19912
|
+
*/ async setTheme(themeId, options = {}) {
|
|
19257
19913
|
const {force: force = !1, preload: preload = !1, removePrevious: removePrevious = !0, fallbackOnError: fallbackOnError = !0} = options;
|
|
19258
19914
|
// Handle Theme object directly
|
|
19259
19915
|
if ("string" != typeof themeId) {
|
|
@@ -19318,16 +19974,16 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19318
19974
|
}
|
|
19319
19975
|
}
|
|
19320
19976
|
/**
|
|
19321
|
-
|
|
19322
|
-
|
|
19977
|
+
* Load theme (CSS or JS)
|
|
19978
|
+
*/ async loadTheme(themeId, options) {
|
|
19323
19979
|
const definition = this.registry.getDefinition(themeId);
|
|
19324
19980
|
if (!definition) throw new Error(`Theme definition not found: ${themeId}`);
|
|
19325
19981
|
"css" === definition.type ? await this.loadCSSTheme(themeId, definition, options) : await this.loadJSTheme(themeId, definition),
|
|
19326
19982
|
this.loadedThemes.add(themeId), this.emitLoad(themeId);
|
|
19327
19983
|
}
|
|
19328
19984
|
/**
|
|
19329
|
-
|
|
19330
|
-
|
|
19985
|
+
* Load CSS theme
|
|
19986
|
+
*/ async loadCSSTheme(themeId, definition, options) {
|
|
19331
19987
|
// Check cache
|
|
19332
19988
|
if (this.config.enableCache) {
|
|
19333
19989
|
const cached = this.cache.getCSS(themeId);
|
|
@@ -19369,8 +20025,8 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19369
20025
|
}
|
|
19370
20026
|
}
|
|
19371
20027
|
/**
|
|
19372
|
-
|
|
19373
|
-
|
|
20028
|
+
* Load JS theme
|
|
20029
|
+
*/ async loadJSTheme(themeId, definition) {
|
|
19374
20030
|
if ("js" !== definition.type) return;
|
|
19375
20031
|
// Check cache
|
|
19376
20032
|
if (this.config.enableCache) {
|
|
@@ -19394,8 +20050,8 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19394
20050
|
this.config.enableCache && this.cache.setJS(themeId, theme), this.registry.setTheme(themeId, theme);
|
|
19395
20051
|
}
|
|
19396
20052
|
/**
|
|
19397
|
-
|
|
19398
|
-
|
|
20053
|
+
* Apply theme (set as active)
|
|
20054
|
+
*/ async applyTheme(themeId, removePrevious) {
|
|
19399
20055
|
const previousTheme = this.currentTheme;
|
|
19400
20056
|
// Remove previous theme if requested
|
|
19401
20057
|
removePrevious && previousTheme && previousTheme !== themeId && await this.removeTheme(previousTheme);
|
|
@@ -19414,15 +20070,15 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19414
20070
|
});
|
|
19415
20071
|
}
|
|
19416
20072
|
/**
|
|
19417
|
-
|
|
19418
|
-
|
|
20073
|
+
* Apply CSS theme
|
|
20074
|
+
*/ async applyCSSTheme(themeId) {
|
|
19419
20075
|
if (isServer()) return;
|
|
19420
20076
|
const definition = this.registry.getDefinition(themeId), className = definition?.class || themeId;
|
|
19421
20077
|
applyThemeAttributes(this.config.dataAttribute, className), this.activeTheme = null;
|
|
19422
20078
|
}
|
|
19423
20079
|
/**
|
|
19424
|
-
|
|
19425
|
-
|
|
20080
|
+
* Apply JS theme
|
|
20081
|
+
*/ async applyJSTheme(theme, removePrevious) {
|
|
19426
20082
|
if (isServer()) return;
|
|
19427
20083
|
// Remove previous JS theme CSS
|
|
19428
20084
|
removePrevious && removeInjectedCSS(this.config.styleId), injectCSS(generateCSSVariables(theme, {
|
|
@@ -19436,8 +20092,8 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19436
20092
|
this.currentTheme = themeId;
|
|
19437
20093
|
}
|
|
19438
20094
|
/**
|
|
19439
|
-
|
|
19440
|
-
|
|
20095
|
+
* Remove theme
|
|
20096
|
+
*/ async removeTheme(themeId) {
|
|
19441
20097
|
const definition = this.registry.getDefinition(themeId);
|
|
19442
20098
|
definition && ("css" === definition.type ? isBrowser() && (themeNameOrLinkId => {
|
|
19443
20099
|
if (isServer()) return;
|
|
@@ -19451,35 +20107,35 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19451
20107
|
})(getThemeLinkId(themeId)) : isBrowser() && removeInjectedCSS(this.config.styleId));
|
|
19452
20108
|
}
|
|
19453
20109
|
/**
|
|
19454
|
-
|
|
19455
|
-
|
|
20110
|
+
* Preload theme
|
|
20111
|
+
*/ async preloadTheme(themeId) {
|
|
19456
20112
|
await this.setTheme(themeId, {
|
|
19457
20113
|
preload: !0
|
|
19458
20114
|
});
|
|
19459
20115
|
}
|
|
19460
20116
|
/**
|
|
19461
|
-
|
|
19462
|
-
|
|
20117
|
+
* Get registry
|
|
20118
|
+
*/ getRegistry() {
|
|
19463
20119
|
return this.registry;
|
|
19464
20120
|
}
|
|
19465
20121
|
/**
|
|
19466
|
-
|
|
19467
|
-
|
|
20122
|
+
* Get cache
|
|
20123
|
+
*/ getCache() {
|
|
19468
20124
|
return this.cache;
|
|
19469
20125
|
}
|
|
19470
20126
|
/**
|
|
19471
|
-
|
|
19472
|
-
|
|
20127
|
+
* Clear failed theme tracking (allows retry of previously failed themes)
|
|
20128
|
+
*/ clearFailedThemes() {
|
|
19473
20129
|
this.failedThemes.clear();
|
|
19474
20130
|
}
|
|
19475
20131
|
/**
|
|
19476
|
-
|
|
19477
|
-
|
|
20132
|
+
* Clear specific failed theme (allows retry of a specific theme)
|
|
20133
|
+
*/ clearFailedTheme(themeId) {
|
|
19478
20134
|
this.failedThemes.delete(themeId);
|
|
19479
20135
|
}
|
|
19480
20136
|
/**
|
|
19481
|
-
|
|
19482
|
-
|
|
20137
|
+
* Check if theme has failed to load
|
|
20138
|
+
*/ hasFailedTheme(themeId) {
|
|
19483
20139
|
return this.failedThemes.has(themeId);
|
|
19484
20140
|
}
|
|
19485
20141
|
on(event, listener) {
|
|
@@ -19489,8 +20145,8 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19489
20145
|
"change" === event ? this.changeListeners = this.changeListeners.filter((l => l !== listener)) : "load" === event ? this.loadListeners = this.loadListeners.filter((l => l !== listener)) : "error" === event ? this.errorListeners = this.errorListeners.filter((l => l !== listener)) : "revert" === event && (this.revertListeners = this.revertListeners.filter((l => l !== listener)));
|
|
19490
20146
|
}
|
|
19491
20147
|
/**
|
|
19492
|
-
|
|
19493
|
-
|
|
20148
|
+
* Emit change event
|
|
20149
|
+
*/ emitChange(event) {
|
|
19494
20150
|
for (const listener of this.changeListeners) try {
|
|
19495
20151
|
listener(event);
|
|
19496
20152
|
} catch (error) {
|
|
@@ -19500,8 +20156,8 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19500
20156
|
}
|
|
19501
20157
|
}
|
|
19502
20158
|
/**
|
|
19503
|
-
|
|
19504
|
-
|
|
20159
|
+
* Emit load event
|
|
20160
|
+
*/ emitLoad(themeId) {
|
|
19505
20161
|
for (const listener of this.loadListeners) try {
|
|
19506
20162
|
listener(themeId);
|
|
19507
20163
|
} catch (error) {
|
|
@@ -19511,9 +20167,9 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19511
20167
|
}
|
|
19512
20168
|
}
|
|
19513
20169
|
/**
|
|
19514
|
-
|
|
19515
|
-
|
|
19516
|
-
|
|
20170
|
+
* Emit error event
|
|
20171
|
+
* Emits error to listeners (error emission is controlled at call site)
|
|
20172
|
+
*/ emitError(error, themeId) {
|
|
19517
20173
|
for (const listener of this.errorListeners) try {
|
|
19518
20174
|
listener(error, themeId);
|
|
19519
20175
|
} catch (err) {
|
|
@@ -19524,8 +20180,8 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19524
20180
|
}
|
|
19525
20181
|
}
|
|
19526
20182
|
/**
|
|
19527
|
-
|
|
19528
|
-
|
|
20183
|
+
* Emit revert event
|
|
20184
|
+
*/ emitRevert(event) {
|
|
19529
20185
|
for (const listener of this.revertListeners) try {
|
|
19530
20186
|
listener(event);
|
|
19531
20187
|
} catch (error) {
|
|
@@ -19549,15 +20205,24 @@ function generateCSSVariables(theme, options = {}) {
|
|
|
19549
20205
|
*/
|
|
19550
20206
|
/**
|
|
19551
20207
|
* RTL-aware locales (languages that use RTL)
|
|
19552
|
-
*/ const RTL_LOCALES = new Set([ "ar",
|
|
19553
|
-
|
|
19554
|
-
"
|
|
19555
|
-
|
|
19556
|
-
"
|
|
19557
|
-
|
|
19558
|
-
"
|
|
19559
|
-
|
|
19560
|
-
"
|
|
20208
|
+
*/ const RTL_LOCALES = new Set([ "ar",
|
|
20209
|
+
// Arabic
|
|
20210
|
+
"he",
|
|
20211
|
+
// Hebrew
|
|
20212
|
+
"fa",
|
|
20213
|
+
// Persian/Farsi
|
|
20214
|
+
"ur",
|
|
20215
|
+
// Urdu
|
|
20216
|
+
"yi",
|
|
20217
|
+
// Yiddish
|
|
20218
|
+
"ji",
|
|
20219
|
+
// Yiddish (alternative)
|
|
20220
|
+
"iw",
|
|
20221
|
+
// Hebrew (old code)
|
|
20222
|
+
"ku",
|
|
20223
|
+
// Kurdish
|
|
20224
|
+
"ps",
|
|
20225
|
+
// Pashto
|
|
19561
20226
|
"sd" ]), DEFAULT_RTL_CONFIG = {
|
|
19562
20227
|
enabled: !1,
|
|
19563
20228
|
direction: "ltr",
|
|
@@ -19589,66 +20254,66 @@ class RTLManager {
|
|
|
19589
20254
|
this.config.enabled && "undefined" != typeof document && this.applyDirection(this.config.direction);
|
|
19590
20255
|
}
|
|
19591
20256
|
/**
|
|
19592
|
-
|
|
19593
|
-
|
|
20257
|
+
* Detect locale from browser
|
|
20258
|
+
*/ detectLocale() {
|
|
19594
20259
|
if ("undefined" == typeof navigator) return "en";
|
|
19595
20260
|
// Try navigator.language first
|
|
19596
|
-
const lang = navigator.language || navigator.languages && navigator.languages[0] || "en";
|
|
19597
|
-
return
|
|
20261
|
+
const lang = navigator.language || navigator.languages && navigator.languages[0] || "en", langParts = String(lang).split("-");
|
|
20262
|
+
return langParts[0] ? langParts[0].toLowerCase() : "en";
|
|
19598
20263
|
}
|
|
19599
20264
|
/**
|
|
19600
|
-
|
|
19601
|
-
|
|
20265
|
+
* Check if locale is RTL
|
|
20266
|
+
*/ isRTLLocale(locale) {
|
|
19602
20267
|
return RTL_LOCALES.has(locale.toLowerCase());
|
|
19603
20268
|
}
|
|
19604
20269
|
/**
|
|
19605
|
-
|
|
19606
|
-
|
|
20270
|
+
* Get current direction
|
|
20271
|
+
*/ getDirection() {
|
|
19607
20272
|
return this.config.direction;
|
|
19608
20273
|
}
|
|
19609
20274
|
/**
|
|
19610
|
-
|
|
19611
|
-
|
|
20275
|
+
* Check if RTL is enabled
|
|
20276
|
+
*/ isEnabled() {
|
|
19612
20277
|
return this.config.enabled;
|
|
19613
20278
|
}
|
|
19614
20279
|
/**
|
|
19615
|
-
|
|
19616
|
-
|
|
20280
|
+
* Set direction
|
|
20281
|
+
*/ setDirection(direction) {
|
|
19617
20282
|
this.config.direction !== direction && (this.config.direction = direction, this.applyDirection(direction),
|
|
19618
20283
|
this.notifyListeners(direction));
|
|
19619
20284
|
}
|
|
19620
20285
|
/**
|
|
19621
|
-
|
|
19622
|
-
|
|
20286
|
+
* Toggle direction
|
|
20287
|
+
*/ toggleDirection() {
|
|
19623
20288
|
const newDirection = "ltr" === this.config.direction ? "rtl" : "ltr";
|
|
19624
20289
|
return this.setDirection(newDirection), newDirection;
|
|
19625
20290
|
}
|
|
19626
20291
|
/**
|
|
19627
|
-
|
|
19628
|
-
|
|
20292
|
+
* Enable RTL
|
|
20293
|
+
*/ enable() {
|
|
19629
20294
|
this.config.enabled || (this.config.enabled = !0, this.applyDirection(this.config.direction));
|
|
19630
20295
|
}
|
|
19631
20296
|
/**
|
|
19632
|
-
|
|
19633
|
-
|
|
20297
|
+
* Disable RTL
|
|
20298
|
+
*/ disable() {
|
|
19634
20299
|
this.config.enabled && (this.config.enabled = !1, this.applyDirection("ltr"));
|
|
19635
20300
|
}
|
|
19636
20301
|
/**
|
|
19637
|
-
|
|
19638
|
-
|
|
20302
|
+
* Set locale and auto-adjust direction
|
|
20303
|
+
*/ setLocale(locale) {
|
|
19639
20304
|
if (this.config.locale = locale.toLowerCase(), this.config.autoDetect) {
|
|
19640
20305
|
const isRTL = this.isRTLLocale(locale);
|
|
19641
20306
|
this.setDirection(isRTL ? "rtl" : "ltr");
|
|
19642
20307
|
}
|
|
19643
20308
|
}
|
|
19644
20309
|
/**
|
|
19645
|
-
|
|
19646
|
-
|
|
20310
|
+
* Get current locale
|
|
20311
|
+
*/ getLocale() {
|
|
19647
20312
|
return this.config.locale;
|
|
19648
20313
|
}
|
|
19649
20314
|
/**
|
|
19650
|
-
|
|
19651
|
-
|
|
20315
|
+
* Apply direction to DOM
|
|
20316
|
+
*/ applyDirection(direction) {
|
|
19652
20317
|
if ("undefined" == typeof document) return;
|
|
19653
20318
|
const html = document.documentElement, body = document.body;
|
|
19654
20319
|
// Set dir attribute
|
|
@@ -19660,16 +20325,16 @@ class RTLManager {
|
|
|
19660
20325
|
html.style.setProperty("--atomix-direction", direction), html.style.setProperty("--atomix-text-direction", direction);
|
|
19661
20326
|
}
|
|
19662
20327
|
/**
|
|
19663
|
-
|
|
19664
|
-
|
|
20328
|
+
* Add direction change listener
|
|
20329
|
+
*/ onDirectionChange(callback) {
|
|
19665
20330
|
// Return unsubscribe function
|
|
19666
20331
|
return this.listeners.add(callback), () => {
|
|
19667
20332
|
this.listeners.delete(callback);
|
|
19668
20333
|
};
|
|
19669
20334
|
}
|
|
19670
20335
|
/**
|
|
19671
|
-
|
|
19672
|
-
|
|
20336
|
+
* Notify listeners of direction change
|
|
20337
|
+
*/ notifyListeners(direction) {
|
|
19673
20338
|
this.listeners.forEach((callback => {
|
|
19674
20339
|
try {
|
|
19675
20340
|
callback(direction);
|
|
@@ -19681,17 +20346,17 @@ class RTLManager {
|
|
|
19681
20346
|
}));
|
|
19682
20347
|
}
|
|
19683
20348
|
/**
|
|
19684
|
-
|
|
19685
|
-
|
|
19686
|
-
|
|
19687
|
-
|
|
20349
|
+
* Get RTL-aware value
|
|
20350
|
+
*
|
|
20351
|
+
* Returns different values based on direction
|
|
20352
|
+
*/ getValue(ltrValue, rtlValue) {
|
|
19688
20353
|
return "rtl" === this.config.direction ? rtlValue : ltrValue;
|
|
19689
20354
|
}
|
|
19690
20355
|
/**
|
|
19691
|
-
|
|
19692
|
-
|
|
19693
|
-
|
|
19694
|
-
|
|
20356
|
+
* Get RTL-aware CSS property
|
|
20357
|
+
*
|
|
20358
|
+
* Returns appropriate CSS property based on direction
|
|
20359
|
+
*/ getCSSProperty(property) {
|
|
19695
20360
|
return "rtl" === this.config.direction && {
|
|
19696
20361
|
left: "right",
|
|
19697
20362
|
right: "left",
|
|
@@ -19708,8 +20373,8 @@ class RTLManager {
|
|
|
19708
20373
|
}[property] || property;
|
|
19709
20374
|
}
|
|
19710
20375
|
/**
|
|
19711
|
-
|
|
19712
|
-
|
|
20376
|
+
* Destroy RTL manager
|
|
20377
|
+
*/ destroy() {
|
|
19713
20378
|
if (this.listeners.clear(), "undefined" != typeof document) {
|
|
19714
20379
|
const html = document.documentElement, body = document.body;
|
|
19715
20380
|
html.removeAttribute("dir"), html.removeAttribute(this.config.dataAttribute), body?.removeAttribute("dir"),
|
|
@@ -19718,14 +20383,6 @@ class RTLManager {
|
|
|
19718
20383
|
}
|
|
19719
20384
|
}
|
|
19720
20385
|
|
|
19721
|
-
/**
|
|
19722
|
-
* Theme Manager
|
|
19723
|
-
*
|
|
19724
|
-
* Core theme management class for the Atomix Design System.
|
|
19725
|
-
* Rewritten to use the new ThemeEngine architecture.
|
|
19726
|
-
* Handles theme loading, switching, persistence, and events.
|
|
19727
|
-
* Supports both CSS-based themes and JavaScript-based themes.
|
|
19728
|
-
*/
|
|
19729
20386
|
/**
|
|
19730
20387
|
* Default configuration values
|
|
19731
20388
|
*/ const DEFAULT_CONFIG = {
|
|
@@ -19755,10 +20412,10 @@ class RTLManager {
|
|
|
19755
20412
|
* ```
|
|
19756
20413
|
*/ class ThemeManager {
|
|
19757
20414
|
/**
|
|
19758
|
-
|
|
19759
|
-
|
|
19760
|
-
|
|
19761
|
-
|
|
20415
|
+
* Create a new ThemeManager instance
|
|
20416
|
+
*
|
|
20417
|
+
* @param config - Theme manager configuration
|
|
20418
|
+
*/
|
|
19762
20419
|
constructor(config) {
|
|
19763
20420
|
this.currentTheme = null, this.activeTheme = null, this.eventListeners = {
|
|
19764
20421
|
themeChange: [],
|
|
@@ -19830,8 +20487,8 @@ class RTLManager {
|
|
|
19830
20487
|
this.initialize();
|
|
19831
20488
|
}
|
|
19832
20489
|
/**
|
|
19833
|
-
|
|
19834
|
-
|
|
20490
|
+
* Initialize the theme manager
|
|
20491
|
+
*/ initialize() {
|
|
19835
20492
|
this.initialized || isServer() || (
|
|
19836
20493
|
// Initialize engine
|
|
19837
20494
|
this.engine.initialize().then((() => {
|
|
@@ -19869,8 +20526,9 @@ class RTLManager {
|
|
|
19869
20526
|
removePrevious: !1,
|
|
19870
20527
|
fallbackOnError: !0
|
|
19871
20528
|
}).catch((error => {
|
|
20529
|
+
var _context;
|
|
19872
20530
|
// Only log error once, don't spam console
|
|
19873
|
-
|
|
20531
|
+
error instanceof Error && !_includesInstanceProperty(_context = error.message).call(_context, "previously failed") && this.logger.warn(`Failed to load default theme "${themeId}"`, {
|
|
19874
20532
|
themeId: themeId,
|
|
19875
20533
|
error: error.message
|
|
19876
20534
|
});
|
|
@@ -19884,8 +20542,8 @@ class RTLManager {
|
|
|
19884
20542
|
})), this.initialized = !0);
|
|
19885
20543
|
}
|
|
19886
20544
|
/**
|
|
19887
|
-
|
|
19888
|
-
|
|
20545
|
+
* Get default theme
|
|
20546
|
+
*/ getDefaultTheme() {
|
|
19889
20547
|
// Check storage first
|
|
19890
20548
|
if (this.config.enablePersistence && this.storageAdapter.isAvailable()) {
|
|
19891
20549
|
const stored = this.storageAdapter.getItem(this.config.storageKey);
|
|
@@ -19900,8 +20558,8 @@ class RTLManager {
|
|
|
19900
20558
|
return this.config.defaultTheme || null;
|
|
19901
20559
|
}
|
|
19902
20560
|
/**
|
|
19903
|
-
|
|
19904
|
-
|
|
20561
|
+
* Set theme
|
|
20562
|
+
*/ async setTheme(theme, options) {
|
|
19905
20563
|
// Persist to storage
|
|
19906
20564
|
if (await this.engine.setTheme(theme, options), this.config.enablePersistence && this.storageAdapter.isAvailable()) {
|
|
19907
20565
|
const themeId = "string" == typeof theme ? theme : theme.name || "js-theme";
|
|
@@ -19911,39 +20569,39 @@ class RTLManager {
|
|
|
19911
20569
|
this.config.onThemeChange && this.config.onThemeChange(theme);
|
|
19912
20570
|
}
|
|
19913
20571
|
/**
|
|
19914
|
-
|
|
19915
|
-
|
|
20572
|
+
* Get current theme
|
|
20573
|
+
*/ getTheme() {
|
|
19916
20574
|
return this.currentTheme || ("string" == typeof this.config.defaultTheme ? this.config.defaultTheme : "");
|
|
19917
20575
|
}
|
|
19918
20576
|
/**
|
|
19919
|
-
|
|
19920
|
-
|
|
20577
|
+
* Get active theme object (for JS themes)
|
|
20578
|
+
*/ getActiveTheme() {
|
|
19921
20579
|
return this.activeTheme || this.engine.getActiveTheme();
|
|
19922
20580
|
}
|
|
19923
20581
|
/**
|
|
19924
|
-
|
|
19925
|
-
|
|
20582
|
+
* Get available themes
|
|
20583
|
+
*/ getAvailableThemes() {
|
|
19926
20584
|
return this.engine.getRegistry().getAllMetadata();
|
|
19927
20585
|
}
|
|
19928
20586
|
/**
|
|
19929
|
-
|
|
19930
|
-
|
|
20587
|
+
* Check if theme is loaded
|
|
20588
|
+
*/ isThemeLoaded(themeName) {
|
|
19931
20589
|
return this.engine.isThemeLoaded(themeName);
|
|
19932
20590
|
}
|
|
19933
20591
|
/**
|
|
19934
|
-
|
|
19935
|
-
|
|
20592
|
+
* Preload theme
|
|
20593
|
+
*/ async preloadTheme(themeName) {
|
|
19936
20594
|
await this.engine.preloadTheme(themeName);
|
|
19937
20595
|
}
|
|
19938
|
-
on(event, callback) {
|
|
20596
|
+
/* eslint-enable no-dupe-class-members */ on(event, callback) {
|
|
19939
20597
|
"themeChange" === event ? this.eventListeners.themeChange.push(callback) : "themeLoad" === event ? this.eventListeners.themeLoad.push(callback) : "themeError" === event && this.eventListeners.themeError.push(callback);
|
|
19940
20598
|
}
|
|
19941
|
-
off(event, callback) {
|
|
20599
|
+
/* eslint-enable no-dupe-class-members */ off(event, callback) {
|
|
19942
20600
|
"themeChange" === event ? this.eventListeners.themeChange = this.eventListeners.themeChange.filter((cb => cb !== callback)) : "themeLoad" === event ? this.eventListeners.themeLoad = this.eventListeners.themeLoad.filter((cb => cb !== callback)) : "themeError" === event && (this.eventListeners.themeError = this.eventListeners.themeError.filter((cb => cb !== callback)));
|
|
19943
20601
|
}
|
|
19944
20602
|
/**
|
|
19945
|
-
|
|
19946
|
-
|
|
20603
|
+
* Emit theme change event
|
|
20604
|
+
*/ emitThemeChange(event) {
|
|
19947
20605
|
for (const callback of this.eventListeners.themeChange) try {
|
|
19948
20606
|
callback(event);
|
|
19949
20607
|
} catch (error) {
|
|
@@ -19953,8 +20611,8 @@ class RTLManager {
|
|
|
19953
20611
|
}
|
|
19954
20612
|
}
|
|
19955
20613
|
/**
|
|
19956
|
-
|
|
19957
|
-
|
|
20614
|
+
* Emit theme load event
|
|
20615
|
+
*/ emitThemeLoad(themeName) {
|
|
19958
20616
|
for (const callback of this.eventListeners.themeLoad) try {
|
|
19959
20617
|
callback(themeName);
|
|
19960
20618
|
} catch (error) {
|
|
@@ -19964,8 +20622,8 @@ class RTLManager {
|
|
|
19964
20622
|
}
|
|
19965
20623
|
}
|
|
19966
20624
|
/**
|
|
19967
|
-
|
|
19968
|
-
|
|
20625
|
+
* Emit theme error event
|
|
20626
|
+
*/ emitThemeError(error, themeName) {
|
|
19969
20627
|
if (error instanceof ThemeError || new ThemeError(error.message, ThemeErrorCode.THEME_LOAD_FAILED, {
|
|
19970
20628
|
themeName: themeName,
|
|
19971
20629
|
originalError: error.message
|
|
@@ -19985,28 +20643,28 @@ class RTLManager {
|
|
|
19985
20643
|
}
|
|
19986
20644
|
}
|
|
19987
20645
|
/**
|
|
19988
|
-
|
|
19989
|
-
|
|
20646
|
+
* Get engine instance (for advanced usage)
|
|
20647
|
+
*/ getEngine() {
|
|
19990
20648
|
return this.engine;
|
|
19991
20649
|
}
|
|
19992
20650
|
/**
|
|
19993
|
-
|
|
19994
|
-
|
|
20651
|
+
* Get RTL manager
|
|
20652
|
+
*/ getRTLManager() {
|
|
19995
20653
|
return this.rtlManager;
|
|
19996
20654
|
}
|
|
19997
20655
|
/**
|
|
19998
|
-
|
|
19999
|
-
|
|
20656
|
+
* Set RTL direction
|
|
20657
|
+
*/ setDirection(direction) {
|
|
20000
20658
|
this.rtlManager?.setDirection(direction);
|
|
20001
20659
|
}
|
|
20002
20660
|
/**
|
|
20003
|
-
|
|
20004
|
-
|
|
20661
|
+
* Get current direction
|
|
20662
|
+
*/ getDirection() {
|
|
20005
20663
|
return this.rtlManager?.getDirection() || "ltr";
|
|
20006
20664
|
}
|
|
20007
20665
|
/**
|
|
20008
|
-
|
|
20009
|
-
|
|
20666
|
+
* Destroy theme manager
|
|
20667
|
+
*/ destroy() {
|
|
20010
20668
|
// Remove all listeners
|
|
20011
20669
|
this.eventListeners = {
|
|
20012
20670
|
themeChange: [],
|
|
@@ -20027,7 +20685,7 @@ class RTLManager {
|
|
|
20027
20685
|
*/
|
|
20028
20686
|
/**
|
|
20029
20687
|
* Theme context with default values
|
|
20030
|
-
*/ const ThemeContext =
|
|
20688
|
+
*/ const ThemeContext = createContext(null);
|
|
20031
20689
|
|
|
20032
20690
|
ThemeContext.displayName = "ThemeContext";
|
|
20033
20691
|
|
|
@@ -20403,7 +21061,7 @@ const ThemeProvider = ({children: children, defaultTheme: defaultTheme, themes:
|
|
|
20403
21061
|
...target
|
|
20404
21062
|
};
|
|
20405
21063
|
for (const source of sources) if (source) for (const key in source) {
|
|
20406
|
-
if (!
|
|
21064
|
+
if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
|
|
20407
21065
|
const targetValue = result[key], sourceValue = source[key];
|
|
20408
21066
|
isObject(targetValue) && isObject(sourceValue) ?
|
|
20409
21067
|
// Recursively merge objects
|
|
@@ -20500,25 +21158,6 @@ const ThemeProvider = ({children: children, defaultTheme: defaultTheme, themes:
|
|
|
20500
21158
|
custom: theme.custom
|
|
20501
21159
|
};
|
|
20502
21160
|
}
|
|
20503
|
-
/**
|
|
20504
|
-
* createTheme - Create a theme object with computed values
|
|
20505
|
-
*
|
|
20506
|
-
* Similar to Material-UI's createTheme, this function accepts theme configuration
|
|
20507
|
-
* options and returns a complete theme object with computed values.
|
|
20508
|
-
*
|
|
20509
|
-
* @example
|
|
20510
|
-
* ```typescript
|
|
20511
|
-
* const theme = createTheme({
|
|
20512
|
-
* palette: {
|
|
20513
|
-
* primary: { main: '#7AFFD7' },
|
|
20514
|
-
* secondary: { main: '#FF5733' },
|
|
20515
|
-
* },
|
|
20516
|
-
* typography: {
|
|
20517
|
-
* fontFamily: 'Inter, sans-serif',
|
|
20518
|
-
* },
|
|
20519
|
-
* });
|
|
20520
|
-
* ```
|
|
20521
|
-
*/
|
|
20522
21161
|
// ============================================================================
|
|
20523
21162
|
// Default Theme Values
|
|
20524
21163
|
// ============================================================================
|
|
@@ -20745,7 +21384,7 @@ function createPaletteColor(color) {
|
|
|
20745
21384
|
*/
|
|
20746
21385
|
function createTheme(...options) {
|
|
20747
21386
|
// Merge all options
|
|
20748
|
-
const mergedOptions = options.
|
|
21387
|
+
const mergedOptions = _reduceInstanceProperty(options).call(options, ((acc, option) => deepMerge(acc, option)), {}), palette = {
|
|
20749
21388
|
primary: createPaletteColor(mergedOptions.palette?.primary || DEFAULT_PALETTE.primary),
|
|
20750
21389
|
secondary: createPaletteColor(mergedOptions.palette?.secondary || DEFAULT_PALETTE.secondary),
|
|
20751
21390
|
error: createPaletteColor(mergedOptions.palette?.error || DEFAULT_PALETTE.error),
|
|
@@ -20921,11 +21560,6 @@ function createThemeFromConfig(config) {
|
|
|
20921
21560
|
return config.prefix && config.prefix, theme;
|
|
20922
21561
|
}
|
|
20923
21562
|
|
|
20924
|
-
/**
|
|
20925
|
-
* Theme Tools for Library Users
|
|
20926
|
-
*
|
|
20927
|
-
* Developer-friendly utilities for working with Atomix themes
|
|
20928
|
-
*/
|
|
20929
21563
|
/**
|
|
20930
21564
|
* Quick theme creator with sensible defaults
|
|
20931
21565
|
*/ function quickTheme(name, primaryColor, secondaryColor) {
|
|
@@ -20951,7 +21585,7 @@ function createThemeFromConfig(config) {
|
|
|
20951
21585
|
mode: "dark",
|
|
20952
21586
|
background: {
|
|
20953
21587
|
default: "#121212",
|
|
20954
|
-
|
|
21588
|
+
subtle: "#1e1e1e"
|
|
20955
21589
|
},
|
|
20956
21590
|
text: {
|
|
20957
21591
|
primary: "#ffffff",
|
|
@@ -21000,7 +21634,8 @@ function createThemeFromConfig(config) {
|
|
|
21000
21634
|
/**
|
|
21001
21635
|
* Check if theme supports dark mode
|
|
21002
21636
|
*/ function supportsDarkMode(theme) {
|
|
21003
|
-
|
|
21637
|
+
var _context;
|
|
21638
|
+
return "dark" === theme.palette?.mode || !0 === theme.supportsDarkMode || Boolean((null == (_context = theme.a11y?.modes) ? void 0 : Function.call.bind(_includesInstanceProperty(_context), _context))?.("dark"));
|
|
21004
21639
|
}
|
|
21005
21640
|
|
|
21006
21641
|
/**
|
|
@@ -21033,8 +21668,8 @@ function createThemeFromConfig(config) {
|
|
|
21033
21668
|
this.commands = new Map, this.registerDefaultCommands();
|
|
21034
21669
|
}
|
|
21035
21670
|
/**
|
|
21036
|
-
|
|
21037
|
-
|
|
21671
|
+
* Register default commands
|
|
21672
|
+
*/ registerDefaultCommands() {
|
|
21038
21673
|
this.register({
|
|
21039
21674
|
name: "validate",
|
|
21040
21675
|
description: "Validate theme configuration",
|
|
@@ -21078,13 +21713,13 @@ function createThemeFromConfig(config) {
|
|
|
21078
21713
|
});
|
|
21079
21714
|
}
|
|
21080
21715
|
/**
|
|
21081
|
-
|
|
21082
|
-
|
|
21716
|
+
* Register a command
|
|
21717
|
+
*/ register(command) {
|
|
21083
21718
|
this.commands.set(command.name, command);
|
|
21084
21719
|
}
|
|
21085
21720
|
/**
|
|
21086
|
-
|
|
21087
|
-
|
|
21721
|
+
* Run CLI with arguments
|
|
21722
|
+
*/ async run(args) {
|
|
21088
21723
|
const [commandName, ...commandArgs] = args;
|
|
21089
21724
|
if (!commandName) return void this.handleHelp([], {});
|
|
21090
21725
|
const command = this.commands.get(commandName);
|
|
@@ -21098,8 +21733,8 @@ function createThemeFromConfig(config) {
|
|
|
21098
21733
|
}
|
|
21099
21734
|
}
|
|
21100
21735
|
/**
|
|
21101
|
-
|
|
21102
|
-
|
|
21736
|
+
* Parse command arguments
|
|
21737
|
+
*/ parseArgs(args) {
|
|
21103
21738
|
const parsedArgs = [], options = {};
|
|
21104
21739
|
for (let i = 0; i < args.length; i++) {
|
|
21105
21740
|
const arg = args[i];
|
|
@@ -21114,8 +21749,8 @@ function createThemeFromConfig(config) {
|
|
|
21114
21749
|
};
|
|
21115
21750
|
}
|
|
21116
21751
|
/**
|
|
21117
|
-
|
|
21118
|
-
|
|
21752
|
+
* Handle validate command
|
|
21753
|
+
*/ handleValidate(args, options) {
|
|
21119
21754
|
try {
|
|
21120
21755
|
const result = validateConfig(loadThemeConfig());
|
|
21121
21756
|
result.valid ? result.warnings.length > 0 && result.warnings.forEach((warning => {})) : (result.errors.forEach((error => {})),
|
|
@@ -21125,8 +21760,8 @@ function createThemeFromConfig(config) {
|
|
|
21125
21760
|
}
|
|
21126
21761
|
}
|
|
21127
21762
|
/**
|
|
21128
|
-
|
|
21129
|
-
|
|
21763
|
+
* Handle list command
|
|
21764
|
+
*/ handleList(args, options) {
|
|
21130
21765
|
try {
|
|
21131
21766
|
const themes = loadThemeConfig().themes || {};
|
|
21132
21767
|
if (0 === Object.keys(themes).length) return;
|
|
@@ -21137,8 +21772,8 @@ function createThemeFromConfig(config) {
|
|
|
21137
21772
|
}
|
|
21138
21773
|
}
|
|
21139
21774
|
/**
|
|
21140
|
-
|
|
21141
|
-
|
|
21775
|
+
* Handle inspect command
|
|
21776
|
+
*/ handleInspect(args, options) {
|
|
21142
21777
|
const themeName = options.theme || args[0];
|
|
21143
21778
|
themeName || (console.error("Error: Theme name is required"), console.error("Usage: atomix-theme inspect --theme <theme-name>"),
|
|
21144
21779
|
process.exit(1));
|
|
@@ -21151,8 +21786,8 @@ function createThemeFromConfig(config) {
|
|
|
21151
21786
|
}
|
|
21152
21787
|
}
|
|
21153
21788
|
/**
|
|
21154
|
-
|
|
21155
|
-
|
|
21789
|
+
* Handle compare command
|
|
21790
|
+
*/ handleCompare(args, options) {
|
|
21156
21791
|
const theme1 = options.theme1 || args[0], theme2 = options.theme2 || args[1];
|
|
21157
21792
|
theme1 && theme2 || (console.error("Error: Two theme names are required"), console.error("Usage: atomix-theme compare --theme1 <name1> --theme2 <name2>"),
|
|
21158
21793
|
process.exit(1));
|
|
@@ -21171,8 +21806,8 @@ function createThemeFromConfig(config) {
|
|
|
21171
21806
|
}
|
|
21172
21807
|
}
|
|
21173
21808
|
/**
|
|
21174
|
-
|
|
21175
|
-
|
|
21809
|
+
* Handle export command
|
|
21810
|
+
*/ handleExport(args, options) {
|
|
21176
21811
|
const themeName = options.theme || args[0], outputPath = options.output || `${themeName}.json`;
|
|
21177
21812
|
themeName || (console.error("Error: Theme name is required"), console.error("Usage: atomix-theme export --theme <theme-name> [--output <path>]"),
|
|
21178
21813
|
process.exit(1));
|
|
@@ -21185,8 +21820,8 @@ function createThemeFromConfig(config) {
|
|
|
21185
21820
|
}
|
|
21186
21821
|
}
|
|
21187
21822
|
/**
|
|
21188
|
-
|
|
21189
|
-
|
|
21823
|
+
* Handle help command
|
|
21824
|
+
*/ handleHelp(args, options) {
|
|
21190
21825
|
for (const [name, command] of this.commands.entries()) if (command.options) for (const [option, description] of Object.entries(command.options)) ;
|
|
21191
21826
|
}
|
|
21192
21827
|
}
|
|
@@ -21956,9 +22591,12 @@ function createThemeFromConfig(config) {
|
|
|
21956
22591
|
...theme
|
|
21957
22592
|
}, keys = path.split(".");
|
|
21958
22593
|
let current = newTheme;
|
|
21959
|
-
for (let i = 0; i < keys.length - 1; i++)
|
|
21960
|
-
|
|
21961
|
-
|
|
22594
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
22595
|
+
const key = keys[i];
|
|
22596
|
+
key && !current[key] && (current[key] = {}), key && (current = current[key]);
|
|
22597
|
+
}
|
|
22598
|
+
const lastKey = keys[keys.length - 1];
|
|
22599
|
+
lastKey && (current[lastKey] = value), updateTheme(createTheme(newTheme));
|
|
21962
22600
|
}), [ theme, updateTheme ]), exportTheme = useCallback((() => {
|
|
21963
22601
|
const dataStr = JSON.stringify(theme, null, 2), dataUri = "data:application/json;charset=utf-8," + encodeURIComponent(dataStr), exportFileDefaultName = `${theme.name.toLowerCase().replace(/\s+/g, "-")}-theme.json`, linkElement = document.createElement("a");
|
|
21964
22602
|
linkElement.setAttribute("href", dataUri), linkElement.setAttribute("download", exportFileDefaultName),
|
|
@@ -22124,8 +22762,8 @@ class ThemeApplicator {
|
|
|
22124
22762
|
this.appliedVars = new Set, this.root = root;
|
|
22125
22763
|
}
|
|
22126
22764
|
/**
|
|
22127
|
-
|
|
22128
|
-
|
|
22765
|
+
* Apply a complete theme configuration
|
|
22766
|
+
*/ applyTheme(theme) {
|
|
22129
22767
|
// Clear previously applied variables
|
|
22130
22768
|
this.clearAppliedVars(),
|
|
22131
22769
|
// Apply global CSS variables
|
|
@@ -22140,55 +22778,56 @@ class ThemeApplicator {
|
|
|
22140
22778
|
theme.components && this.applyComponentOverrides(theme.components);
|
|
22141
22779
|
}
|
|
22142
22780
|
/**
|
|
22143
|
-
|
|
22144
|
-
|
|
22781
|
+
* Apply global CSS variables
|
|
22782
|
+
*/ applyGlobalCSSVars(vars) {
|
|
22145
22783
|
Object.entries(vars).forEach((([key, value]) => {
|
|
22146
22784
|
this.root.style.setProperty(key, String(value)), this.appliedVars.add(key);
|
|
22147
22785
|
}));
|
|
22148
22786
|
}
|
|
22149
22787
|
/**
|
|
22150
|
-
|
|
22151
|
-
|
|
22788
|
+
* Apply typography system
|
|
22789
|
+
*/ applyTypography(typography) {
|
|
22152
22790
|
if (!typography) return;
|
|
22153
22791
|
const vars = {};
|
|
22154
22792
|
typography.fontFamily && (vars["--atomix-font-family"] = typography.fontFamily),
|
|
22155
22793
|
typography.fontSize && Object.entries(typography.fontSize).forEach((([key, value]) => {
|
|
22156
|
-
vars[`--atomix-font-size-${key}`] = value;
|
|
22794
|
+
"string" != typeof value && "number" != typeof value || (vars[`--atomix-font-size-${key}`] = value);
|
|
22157
22795
|
})), typography.fontWeight && Object.entries(typography.fontWeight).forEach((([key, value]) => {
|
|
22158
|
-
vars[`--atomix-font-weight-${key}`] = value;
|
|
22796
|
+
"string" != typeof value && "number" != typeof value || (vars[`--atomix-font-weight-${key}`] = value);
|
|
22159
22797
|
})), typography.lineHeight && Object.entries(typography.lineHeight).forEach((([key, value]) => {
|
|
22160
|
-
vars[`--atomix-line-height-${key}`] = value;
|
|
22798
|
+
"string" != typeof value && "number" != typeof value || (vars[`--atomix-line-height-${key}`] = value);
|
|
22161
22799
|
})), this.applyGlobalCSSVars(vars);
|
|
22162
22800
|
}
|
|
22163
22801
|
/**
|
|
22164
|
-
|
|
22165
|
-
|
|
22802
|
+
* Apply spacing system
|
|
22803
|
+
*/ applySpacing(spacing) {
|
|
22166
22804
|
const vars = {};
|
|
22167
|
-
|
|
22168
|
-
|
|
22169
|
-
|
|
22805
|
+
// Handle spacing function or object
|
|
22806
|
+
"function" != typeof spacing && ("object" == typeof spacing && null !== spacing && Object.entries(spacing).forEach((([key, value]) => {
|
|
22807
|
+
"string" != typeof value && "number" != typeof value || (vars[`--atomix-space-${key}`] = value);
|
|
22808
|
+
})), this.applyGlobalCSSVars(vars));
|
|
22170
22809
|
}
|
|
22171
22810
|
/**
|
|
22172
|
-
|
|
22173
|
-
|
|
22811
|
+
* Apply color palette
|
|
22812
|
+
*/ applyPalette(palette) {
|
|
22174
22813
|
if (!palette) return;
|
|
22175
22814
|
const vars = {};
|
|
22176
22815
|
Object.entries(palette).forEach((([colorName, colorScale]) => {
|
|
22177
|
-
colorScale && Object.entries(colorScale).forEach((([shade, value]) => {
|
|
22178
|
-
value && (vars[`--atomix-color-${colorName}-${shade}`] = value);
|
|
22816
|
+
colorScale && "object" == typeof colorScale && Object.entries(colorScale).forEach((([shade, value]) => {
|
|
22817
|
+
!value || "string" != typeof value && "number" != typeof value || (vars[`--atomix-color-${colorName}-${shade}`] = value);
|
|
22179
22818
|
}));
|
|
22180
22819
|
})), this.applyGlobalCSSVars(vars);
|
|
22181
22820
|
}
|
|
22182
22821
|
/**
|
|
22183
|
-
|
|
22184
|
-
|
|
22822
|
+
* Apply component-level overrides
|
|
22823
|
+
*/ applyComponentOverrides(overrides) {
|
|
22185
22824
|
Object.entries(overrides).forEach((([componentName, override]) => {
|
|
22186
22825
|
override && this.applyComponentOverride(componentName, override);
|
|
22187
22826
|
}));
|
|
22188
22827
|
}
|
|
22189
22828
|
/**
|
|
22190
|
-
|
|
22191
|
-
|
|
22829
|
+
* Apply override for a specific component
|
|
22830
|
+
*/ applyComponentOverride(componentName, override) {
|
|
22192
22831
|
const vars = {}, componentKey = componentName.toLowerCase();
|
|
22193
22832
|
// Apply component-level CSS variables
|
|
22194
22833
|
override.cssVars && Object.entries(override.cssVars).forEach((([key, value]) => {
|
|
@@ -22212,23 +22851,23 @@ class ThemeApplicator {
|
|
|
22212
22851
|
})), this.applyGlobalCSSVars(vars);
|
|
22213
22852
|
}
|
|
22214
22853
|
/**
|
|
22215
|
-
|
|
22216
|
-
|
|
22854
|
+
* Clear all applied CSS variables
|
|
22855
|
+
*/ clearAppliedVars() {
|
|
22217
22856
|
removeCSSVariables(Array.from(this.appliedVars), this.root), this.appliedVars.clear();
|
|
22218
22857
|
}
|
|
22219
22858
|
/**
|
|
22220
|
-
|
|
22221
|
-
|
|
22859
|
+
* Get all currently applied variables
|
|
22860
|
+
*/ getAppliedVars() {
|
|
22222
22861
|
return Array.from(this.appliedVars);
|
|
22223
22862
|
}
|
|
22224
22863
|
/**
|
|
22225
|
-
|
|
22226
|
-
|
|
22864
|
+
* Remove theme application
|
|
22865
|
+
*/ removeTheme() {
|
|
22227
22866
|
this.clearAppliedVars();
|
|
22228
22867
|
}
|
|
22229
22868
|
/**
|
|
22230
|
-
|
|
22231
|
-
|
|
22869
|
+
* Update specific CSS variables without clearing all
|
|
22870
|
+
*/ updateCSSVars(vars) {
|
|
22232
22871
|
this.applyGlobalCSSVars(vars);
|
|
22233
22872
|
}
|
|
22234
22873
|
}
|
|
@@ -22610,7 +23249,7 @@ function getComponentCSSVars(component) {
|
|
|
22610
23249
|
// No slot provided, use fallback
|
|
22611
23250
|
if (!slot) return fallback;
|
|
22612
23251
|
// Slot is a plain React node
|
|
22613
|
-
if (React.isValidElement(slot) || "string" == typeof slot || "number" == typeof slot) return slot;
|
|
23252
|
+
if ( React.isValidElement(slot) || "string" == typeof slot || "number" == typeof slot) return slot;
|
|
22614
23253
|
// Slot is an object with rendering options
|
|
22615
23254
|
if ("object" == typeof slot && null !== slot) {
|
|
22616
23255
|
const slotObj = slot;
|
|
@@ -22641,7 +23280,7 @@ function getComponentCSSVars(component) {
|
|
|
22641
23280
|
* Later slots override earlier ones
|
|
22642
23281
|
*/ function mergeSlots(...slots) {
|
|
22643
23282
|
const filtered = slots.filter((s => void 0 !== s));
|
|
22644
|
-
if (0 !== filtered.length) return 1 === filtered.length ? filtered[0] : filtered.
|
|
23283
|
+
if (0 !== filtered.length) return 1 === filtered.length ? filtered[0] : _reduceInstanceProperty(filtered).call(filtered, ((acc, slot) => ({
|
|
22645
23284
|
...acc,
|
|
22646
23285
|
...slot
|
|
22647
23286
|
})));
|
|
@@ -22683,12 +23322,6 @@ function getComponentCSSVars(component) {
|
|
|
22683
23322
|
return React.useMemo((() => renderSlot(slot, props, fallback)), [ slot, props, fallback ]);
|
|
22684
23323
|
}
|
|
22685
23324
|
|
|
22686
|
-
/**
|
|
22687
|
-
* Component Customization Hook
|
|
22688
|
-
*
|
|
22689
|
-
* Merges theme-level component overrides with component-level props
|
|
22690
|
-
* for comprehensive customization support.
|
|
22691
|
-
*/
|
|
22692
23325
|
/**
|
|
22693
23326
|
* Hook to merge theme overrides with component props
|
|
22694
23327
|
*
|
|
@@ -22713,8 +23346,11 @@ function getComponentCSSVars(component) {
|
|
|
22713
23346
|
})), merged;
|
|
22714
23347
|
}), [ theme, component, props.parts ]), className = useMemo((() => [ theme?.components?.[component]?.className || "", props.className || "" ].filter(Boolean).join(" ")), [ theme, component, props.className ]), style = useMemo((() => ({
|
|
22715
23348
|
...props.style
|
|
22716
|
-
})), [ props.style ]), cssVarStyle = useMemo((() =>
|
|
22717
|
-
|
|
23349
|
+
})), [ props.style ]), cssVarStyle = useMemo((() => {
|
|
23350
|
+
var _context;
|
|
23351
|
+
return _reduceInstanceProperty(_context = Object.entries(cssVars)).call(_context, ((acc, [key, value]) => (acc[key] = "number" == typeof value ? `${value}px` : value,
|
|
23352
|
+
acc)), {});
|
|
23353
|
+
}), [ cssVars ]);
|
|
22718
23354
|
// Merge CSS variables
|
|
22719
23355
|
return {
|
|
22720
23356
|
cssVars: cssVars,
|
|
@@ -22744,8 +23380,9 @@ function getComponentCSSVars(component) {
|
|
|
22744
23380
|
/**
|
|
22745
23381
|
* Utility to apply CSS variables to style object
|
|
22746
23382
|
*/ function applyCSSVarsToStyle(cssVars, baseStyle) {
|
|
23383
|
+
var _context2;
|
|
22747
23384
|
return {
|
|
22748
|
-
...Object.entries(cssVars).
|
|
23385
|
+
..._reduceInstanceProperty(_context2 = Object.entries(cssVars)).call(_context2, ((acc, [key, value]) => (acc[key] = "number" == typeof value ? `${value}px` : value,
|
|
22749
23386
|
acc)), {}),
|
|
22750
23387
|
...baseStyle
|
|
22751
23388
|
};
|
|
@@ -22804,10 +23441,46 @@ function getComponentCSSVars(component) {
|
|
|
22804
23441
|
* Resolve config path
|
|
22805
23442
|
*
|
|
22806
23443
|
* Finds atomix.config.ts in the project, checking common locations.
|
|
23444
|
+
* Returns null in browser environments where file system access is not available.
|
|
23445
|
+
*
|
|
23446
|
+
* This function is designed to work in Node.js environments only.
|
|
23447
|
+
* In browser builds, it will always return null without attempting to access Node.js modules.
|
|
23448
|
+
*
|
|
23449
|
+
* @internal This function uses Node.js modules and should not be called in browser environments.
|
|
22807
23450
|
*/ function resolveConfigPath() {
|
|
22808
|
-
|
|
22809
|
-
|
|
22810
|
-
|
|
23451
|
+
// Early return for browser environments - prevents any Node.js module access
|
|
23452
|
+
// This check happens before any require() calls, preventing bundlers from analyzing them
|
|
23453
|
+
if ("undefined" != typeof window || "undefined" == typeof process || !process.cwd) return null;
|
|
23454
|
+
// Only attempt to load Node.js modules in Node.js runtime
|
|
23455
|
+
// Use a lazy-loading pattern that prevents static analysis by bundlers
|
|
23456
|
+
try {
|
|
23457
|
+
// Create a function that only executes in Node.js runtime
|
|
23458
|
+
// Use string-based module names to prevent static analysis by bundlers
|
|
23459
|
+
const modules = (() => {
|
|
23460
|
+
// These requires are only executed at runtime in Node.js environments
|
|
23461
|
+
// They are marked as external in Rollup config and should not be bundled
|
|
23462
|
+
// Using string concatenation and computed property access to prevent static analysis
|
|
23463
|
+
if ("undefined" == typeof require) return null;
|
|
23464
|
+
// Use a try-catch wrapper to safely access require
|
|
23465
|
+
try {
|
|
23466
|
+
// Build module names dynamically to prevent static analysis
|
|
23467
|
+
const moduleNames = [ "fs", "path" ];
|
|
23468
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
23469
|
+
return {
|
|
23470
|
+
fs: require(moduleNames[0]),
|
|
23471
|
+
path: require(moduleNames[1])
|
|
23472
|
+
};
|
|
23473
|
+
} catch {
|
|
23474
|
+
return null;
|
|
23475
|
+
}
|
|
23476
|
+
})();
|
|
23477
|
+
if (!modules) return null;
|
|
23478
|
+
const {fs: fs, path: path} = modules, cwd = process.cwd(), possiblePaths = [ path.join(cwd, "atomix.config.ts"), path.join(cwd, "atomix.config.js"), path.join(cwd, "atomix.config.mjs") ];
|
|
23479
|
+
for (const configPath of possiblePaths) if (fs.existsSync(configPath)) return configPath;
|
|
23480
|
+
} catch (error) {
|
|
23481
|
+
// Silently fail in browser environments or when modules are unavailable
|
|
23482
|
+
return null;
|
|
23483
|
+
}
|
|
22811
23484
|
return null;
|
|
22812
23485
|
}
|
|
22813
23486
|
|
|
@@ -22879,5 +23552,5 @@ const composables = composablesImport, utils = utilsImport, types = typesImport,
|
|
|
22879
23552
|
types: types
|
|
22880
23553
|
};
|
|
22881
23554
|
|
|
22882
|
-
export { ACCORDION, ATOMIX_GLASS, AVATAR, AVATAR_GROUP, Accordion, AnimatedChart, AreaChart, AtomixGlass, AtomixLogo, Avatar, AvatarGroup, BADGE, BADGE_CSS_VARS, BLOCK, BREADCRUMB, BUTTON, BUTTON_CSS_VARS, Badge, BarChart, Block, Breadcrumb, BubbleChart, Button, CALLOUT, CARD, CARD_CSS_VARS, CHART, CHECKBOX_CSS_VARS, CLASS_PREFIX, CODE_SNIPPET, COMPONENT_CSS_VARS, COUNTDOWN, Callout, CandlestickChart, Card, Chart, ChartRenderer, Checkbox, ColorModeToggle, Container, Countdown, DATA_TABLE_CLASSES, DATA_TABLE_SELECTORS, DATEPICKER, DOTS, DROPDOWN, DROPDOWN_CSS_VARS, DataTable, DatePicker, DonutChart, Dropdown, EDGE_PANEL, EdgePanel, ElevationCard, FOOTER, FORM, FORM_GROUP, Footer, FooterLink, FooterSection, FooterSocialLink, Form, FormGroup, FunnelChart, GLASS_CONTAINER, GaugeChart, Grid, GridCol, HERO, HeatmapChart, Hero, INPUT, INPUT_CSS_VARS, Icon, Input, LIST, LIST_GROUP, LineChart, List, ListGroup, MESSAGES, MODAL, MODAL_CSS_VARS, MasonryGrid, MasonryGridItem, MegaMenu, MegaMenuColumn, MegaMenuLink, Menu, MenuDivider, MenuItem, Messages, Modal, MultiAxisChart, NAV, NAVBAR, Nav, NavDropdown, NavItem, Navbar, PAGINATION_DEFAULTS, PHOTOVIEWER, POPOVER, PROGRESS, PROGRESS_CSS_VARS, Pagination, PhotoViewer, PieChart, Popover, ProductReview, Progress, RADIO, RADIO_CSS_VARS, RATING, RIVER, RTLManager, RadarChart, Radio, Rating, River, Row, SECTION_INTRO, SELECT, SIDE_MENU, SIZES, SLIDER, SPINNER, STEPS, ScatterChart, SectionIntro, Select, SideMenu, SideMenuItem, SideMenuList, Slider, Spinner, Steps, TAB, TABS_CSS_VARS, TESTIMONIAL, TEXTAREA, THEME_COLORS, TODO, TOGGLE, TOOLTIP, TOOLTIP_CSS_VARS, Tabs, Testimonial, Textarea, ThemeApplicator, ThemeCLI, ThemeComparator, ThemeContext, ThemeErrorBoundary, ThemeInspector, ThemeLiveEditor, ThemeManager, ThemePreview, ThemeProvider, Todo, Toggle, Tooltip, TreemapChart, UPLOAD, Upload, VIDEO_PLAYER, VideoPlayer, WaterfallChart, applyCSSVariables, applyCSSVarsToStyle, applyTheme, composables, constants, createCLI, createCSSVarStyle, createDarkVariant, createDebugAttrs, createPartProps, createSlotComponent, createSlotProps, createTheme, createThemeFromConfig, cssVarsToStyle, atomix as default, defineConfig, exportTheme, extendTheme, extractComponentName, extractYouTubeId, generateCSSVariableName, generateCSSVariables, generateComponentCSSVars, generateUUID, getCSSVariable, getComponentCSSVars, getPartStyles, getThemeApplicator, getThemeMetadata, hasCustomization, importTheme, isSlot, isValidCSSVariableName, isYouTubeUrl, loadAtomixConfig, mapSCSSTokensToCSSVars, mergeCSSVars, mergeComponentProps, mergePartStyles, mergeSlots, mergeTheme, quickTheme, removeCSSVariables, removeTheme, renderSlot, resolveConfigPath, runCLI, sliderConstants, supportsDarkMode, theme, themeToCSS, types, useAccordion, useAtomixGlass, useBadge, useBarChart, useBlock, useBreadcrumb, useButton, useCard, useChartData, useChartInteraction, useChartScale, useCheckbox, useComponentCustomization, useComponentDefaultProps, useDataTable, useEdgePanel, useForm, useFormGroup, useGlassContainer, useHero, useInput, useLineChart, useMergedProps, useModal$1 as useModal, useNav, useNavDropdown, useNavItem, useNavbar, usePagination, usePieChart, useRadio, useRiver, useSelect, useSideMenu, useSideMenuItem, useSlider, useSlot, useSpinner, useTextarea, useTheme, useTodo, utils, validateTheme };
|
|
23555
|
+
export { ACCORDION, ATOMIX_GLASS, AVATAR, AVATAR_GROUP, Accordion, AnimatedChart, AreaChart, AtomixGlass, AtomixLogo, Avatar, AvatarGroup, BADGE, BADGE_CSS_VARS, BLOCK, BREADCRUMB, BUTTON, BUTTON_CSS_VARS, Badge, BarChart, Block, Breadcrumb, BubbleChart, Button, CALLOUT, CARD, CARD_CSS_VARS, CHART, CHECKBOX_CSS_VARS, CLASS_PREFIX, CODE_SNIPPET, COMPONENT_CSS_VARS, COUNTDOWN, Callout, CandlestickChart, Card, Chart, ChartRenderer, Checkbox, ColorModeToggle, Container, Countdown, DATA_TABLE_CLASSES, DATA_TABLE_SELECTORS, DATEPICKER, DEFAULT_ATOMIX_FONTS, DOTS, DROPDOWN, DROPDOWN_CSS_VARS, DataTable, DatePicker, DonutChart, Dropdown, EDGE_PANEL, EdgePanel, ElevationCard, FOOTER, FORM, FORM_GROUP, Footer, FooterLink, FooterSection, FooterSocialLink, Form, FormGroup, FunnelChart, GLASS_CONTAINER, GaugeChart, Grid, GridCol, HERO, HeatmapChart, Hero, INPUT, INPUT_CSS_VARS, Icon, Input, LIST, LIST_GROUP, LineChart, List, ListGroup, MESSAGES, MODAL, MODAL_CSS_VARS, MasonryGrid, MasonryGridItem, MegaMenu, MegaMenuColumn, MegaMenuLink, Menu, MenuDivider, MenuItem, Messages, Modal, MultiAxisChart, NAV, NAVBAR, Nav, NavDropdown, NavItem, Navbar, PAGINATION_DEFAULTS, PHOTOVIEWER, POPOVER, PROGRESS, PROGRESS_CSS_VARS, Pagination, PhotoViewer, PieChart, Popover, ProductReview, Progress, RADIO, RADIO_CSS_VARS, RATING, RIVER, RTLManager, RadarChart, Radio, Rating, River, Row, SECTION_INTRO, SELECT, SIDE_MENU, SIZES, SLIDER, SPINNER, STEPS, ScatterChart, SectionIntro, Select, SideMenu, SideMenuItem, SideMenuList, Slider, Spinner, Steps, TAB, TABS_CSS_VARS, TESTIMONIAL, TEXTAREA, THEME_COLORS, TODO, TOGGLE, TOOLTIP, TOOLTIP_CSS_VARS, Tabs, Testimonial, Textarea, ThemeApplicator, ThemeCLI, ThemeComparator, ThemeContext, ThemeErrorBoundary, ThemeInspector, ThemeLiveEditor, ThemeManager, ThemePreview, ThemeProvider, Todo, Toggle, Tooltip, TreemapChart, UPLOAD, Upload, VIDEO_PLAYER, VideoPlayer, WaterfallChart, applyCSSVariables, applyCSSVarsToStyle, applyPartStyles, applyTheme, composables, constants, createCLI, createCSSVarStyle, createDarkVariant, createDebugAttrs, createFontPreloadLink, createPartProps, createSlotComponent, createSlotProps, createTheme, createThemeFromConfig, cssVarsToStyle, atomix as default, defineConfig, exportTheme, extendTheme, extractComponentName, extractYouTubeId, generateCSSVariableName, generateCSSVariables, generateComponentCSSVars, generateFontPreloadTags, generateUUID, getCSSVariable, getComponentCSSVars, getPartStyles, getThemeApplicator, getThemeMetadata, hasCustomization, importTheme, isSlot, isValidCSSVariableName, isYouTubeUrl, loadAtomixConfig, mapSCSSTokensToCSSVars, mergeCSSVars, mergeClassNames, mergeComponentProps, mergePartStyles, mergeSlots, mergeTheme, preloadFonts, quickTheme, removeCSSVariables, removeTheme, renderSlot, resolveConfigPath, runCLI, sliderConstants, supportsDarkMode, theme, themeToCSS, types, useAccordion, useAtomixGlass, useBadge, useBarChart, useBlock, useBreadcrumb, useButton, useCard, useChartData, useChartInteraction, useChartScale, useCheckbox, useComponentCustomization, useComponentDefaultProps, useDataTable, useEdgePanel, useForm, useFormGroup, useGlassContainer, useHero, useInput, useLineChart, useMergedProps, useModal$1 as useModal, useNav, useNavDropdown, useNavItem, useNavbar, usePagination, usePieChart, useRadio, useRiver, useSelect, useSideMenu, useSideMenuItem, useSlider, useSlot, useSpinner, useTextarea, useTheme, useTodo, utils, validateTheme };
|
|
22883
23556
|
//# sourceMappingURL=index.esm.js.map
|