@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.d.ts +259 -0
- package/dist/components/ui/accessibility-demo.esm.js +265 -0
- package/dist/components/ui/accessibility-demo.js +265 -0
- package/dist/components/ui/advanced-component-architecture-demo.d.ts +718 -0
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +860 -0
- package/dist/components/ui/advanced-component-architecture-demo.js +860 -0
- package/dist/components/ui/advanced-transition-system-demo.d.ts +660 -0
- package/dist/components/ui/advanced-transition-system-demo.esm.js +624 -0
- package/dist/components/ui/advanced-transition-system-demo.js +624 -0
- package/dist/components/ui/advanced-transition-system.d.ts +391 -0
- package/dist/components/ui/advanced-transition-system.esm.js +351 -0
- package/dist/components/ui/advanced-transition-system.js +351 -0
- package/dist/components/ui/animation/animated-container.d.ts +162 -0
- package/dist/components/ui/animation/animated-container.esm.js +143 -0
- package/dist/components/ui/animation/animated-container.js +143 -0
- package/dist/components/ui/animation/index.d.ts +9 -0
- package/dist/components/ui/animation/index.esm.js +19 -0
- package/dist/components/ui/animation/index.js +19 -0
- package/dist/components/ui/animation/staggered-container.d.ts +64 -0
- package/dist/components/ui/animation/staggered-container.esm.js +59 -0
- package/dist/components/ui/animation/staggered-container.js +59 -0
- package/dist/components/ui/animation-demo.d.ts +238 -0
- package/dist/components/ui/animation-demo.esm.js +218 -0
- package/dist/components/ui/animation-demo.js +218 -0
- package/dist/components/ui/badge.d.ts +28 -0
- package/dist/components/ui/badge.esm.js +30 -0
- package/dist/components/ui/badge.js +30 -0
- package/dist/components/ui/battery-conscious-animation-demo.d.ts +561 -0
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +533 -0
- package/dist/components/ui/battery-conscious-animation-demo.js +533 -0
- package/dist/components/ui/border-radius-shadow-demo.d.ts +183 -0
- package/dist/components/ui/border-radius-shadow-demo.esm.js +176 -0
- package/dist/components/ui/border-radius-shadow-demo.js +176 -0
- package/dist/components/ui/button.d.ts +33 -0
- package/dist/components/ui/button.esm.js +30 -0
- package/dist/components/ui/button.js +30 -0
- package/dist/components/ui/card.d.ts +205 -0
- package/dist/components/ui/card.esm.js +182 -0
- package/dist/components/ui/card.js +182 -0
- package/dist/components/ui/checkbox.d.ts +26 -0
- package/dist/components/ui/checkbox.esm.js +30 -0
- package/dist/components/ui/checkbox.js +30 -0
- package/dist/components/ui/color-preview.d.ts +402 -0
- package/dist/components/ui/color-preview.esm.js +388 -0
- package/dist/components/ui/color-preview.js +388 -0
- package/dist/components/ui/data-display/chart.d.ts +646 -0
- package/dist/components/ui/data-display/chart.esm.js +625 -0
- package/dist/components/ui/data-display/chart.js +625 -0
- package/dist/components/ui/data-display/data-grid-simple.d.ts +73 -0
- package/dist/components/ui/data-display/data-grid-simple.esm.js +76 -0
- package/dist/components/ui/data-display/data-grid-simple.js +76 -0
- package/dist/components/ui/data-display/data-grid.d.ts +670 -0
- package/dist/components/ui/data-display/data-grid.esm.js +667 -0
- package/dist/components/ui/data-display/data-grid.js +667 -0
- package/dist/components/ui/data-display/list.d.ts +448 -0
- package/dist/components/ui/data-display/list.esm.js +448 -0
- package/dist/components/ui/data-display/list.js +448 -0
- package/dist/components/ui/data-display/table.d.ts +472 -0
- package/dist/components/ui/data-display/table.esm.js +474 -0
- package/dist/components/ui/data-display/table.js +474 -0
- package/dist/components/ui/data-display/timeline.d.ts +433 -0
- package/dist/components/ui/data-display/timeline.esm.js +436 -0
- package/dist/components/ui/data-display/timeline.js +436 -0
- package/dist/components/ui/data-display/tree.d.ts +594 -0
- package/dist/components/ui/data-display/tree.esm.js +570 -0
- package/dist/components/ui/data-display/tree.js +570 -0
- package/dist/components/ui/data-display/types.d.ts +534 -0
- package/dist/components/ui/data-display/types.esm.js +511 -0
- package/dist/components/ui/data-display/types.js +511 -0
- package/dist/components/ui/enterprise-mobile-experience-demo.d.ts +735 -0
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +699 -0
- package/dist/components/ui/enterprise-mobile-experience-demo.js +699 -0
- package/dist/components/ui/enterprise-mobile-experience.d.ts +461 -0
- package/dist/components/ui/enterprise-mobile-experience.esm.js +413 -0
- package/dist/components/ui/enterprise-mobile-experience.js +413 -0
- package/dist/components/ui/feedback/alert.d.ts +154 -0
- package/dist/components/ui/feedback/alert.esm.js +150 -0
- package/dist/components/ui/feedback/alert.js +150 -0
- package/dist/components/ui/feedback/progress.d.ts +288 -0
- package/dist/components/ui/feedback/progress.esm.js +269 -0
- package/dist/components/ui/feedback/progress.js +269 -0
- package/dist/components/ui/feedback/skeleton.d.ts +182 -0
- package/dist/components/ui/feedback/skeleton.esm.js +175 -0
- package/dist/components/ui/feedback/skeleton.js +175 -0
- package/dist/components/ui/feedback/toast.d.ts +277 -0
- package/dist/components/ui/feedback/toast.esm.js +256 -0
- package/dist/components/ui/feedback/toast.js +256 -0
- package/dist/components/ui/feedback/types.d.ts +123 -0
- package/dist/components/ui/feedback/types.esm.js +125 -0
- package/dist/components/ui/feedback/types.js +125 -0
- package/dist/components/ui/font-preview.d.ts +282 -0
- package/dist/components/ui/font-preview.esm.js +286 -0
- package/dist/components/ui/font-preview.js +286 -0
- package/dist/components/ui/form-demo.d.ts +544 -0
- package/dist/components/ui/form-demo.esm.js +516 -0
- package/dist/components/ui/form-demo.js +516 -0
- package/dist/components/ui/hardware-acceleration-demo.d.ts +540 -0
- package/dist/components/ui/hardware-acceleration-demo.esm.js +497 -0
- package/dist/components/ui/hardware-acceleration-demo.js +497 -0
- package/dist/components/ui/input.d.ts +33 -0
- package/dist/components/ui/input.esm.js +32 -0
- package/dist/components/ui/input.js +32 -0
- package/dist/components/ui/label.d.ts +13 -0
- package/dist/components/ui/label.esm.js +16 -0
- package/dist/components/ui/label.js +16 -0
- package/dist/components/ui/layout-demo.d.ts +352 -0
- package/dist/components/ui/layout-demo.esm.js +342 -0
- package/dist/components/ui/layout-demo.js +342 -0
- package/dist/components/ui/layouts/adaptive-layout.d.ts +132 -0
- package/dist/components/ui/layouts/adaptive-layout.esm.js +120 -0
- package/dist/components/ui/layouts/adaptive-layout.js +120 -0
- package/dist/components/ui/layouts/desktop-layout.d.ts +219 -0
- package/dist/components/ui/layouts/desktop-layout.esm.js +204 -0
- package/dist/components/ui/layouts/desktop-layout.js +204 -0
- package/dist/components/ui/layouts/index.d.ts +5 -0
- package/dist/components/ui/layouts/index.esm.js +10 -0
- package/dist/components/ui/layouts/index.js +10 -0
- package/dist/components/ui/layouts/mobile-layout.d.ts +158 -0
- package/dist/components/ui/layouts/mobile-layout.esm.js +152 -0
- package/dist/components/ui/layouts/mobile-layout.js +152 -0
- package/dist/components/ui/layouts/tablet-layout.d.ts +192 -0
- package/dist/components/ui/layouts/tablet-layout.esm.js +183 -0
- package/dist/components/ui/layouts/tablet-layout.js +183 -0
- package/dist/components/ui/mobile-form-validation.d.ts +439 -0
- package/dist/components/ui/mobile-form-validation.esm.js +418 -0
- package/dist/components/ui/mobile-form-validation.js +418 -0
- package/dist/components/ui/mobile-input-demo.d.ts +197 -0
- package/dist/components/ui/mobile-input-demo.esm.js +195 -0
- package/dist/components/ui/mobile-input-demo.js +195 -0
- package/dist/components/ui/mobile-input.d.ts +273 -0
- package/dist/components/ui/mobile-input.esm.js +216 -0
- package/dist/components/ui/mobile-input.js +216 -0
- package/dist/components/ui/mobile-skeleton-loading-demo.d.ts +628 -0
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +621 -0
- package/dist/components/ui/mobile-skeleton-loading-demo.js +621 -0
- package/dist/components/ui/navigation/breadcrumb.d.ts +149 -0
- package/dist/components/ui/navigation/breadcrumb.esm.js +155 -0
- package/dist/components/ui/navigation/breadcrumb.js +155 -0
- package/dist/components/ui/navigation/index.d.ts +25 -0
- package/dist/components/ui/navigation/index.esm.js +14 -0
- package/dist/components/ui/navigation/index.js +14 -0
- package/dist/components/ui/navigation/menu.d.ts +366 -0
- package/dist/components/ui/navigation/menu.esm.js +360 -0
- package/dist/components/ui/navigation/menu.js +360 -0
- package/dist/components/ui/navigation/navigation-demo.d.ts +169 -0
- package/dist/components/ui/navigation/navigation-demo.esm.js +317 -0
- package/dist/components/ui/navigation/navigation-demo.js +317 -0
- package/dist/components/ui/navigation/pagination.d.ts +261 -0
- package/dist/components/ui/navigation/pagination.esm.js +260 -0
- package/dist/components/ui/navigation/pagination.js +260 -0
- package/dist/components/ui/navigation/sidebar.d.ts +375 -0
- package/dist/components/ui/navigation/sidebar.esm.js +369 -0
- package/dist/components/ui/navigation/sidebar.js +369 -0
- package/dist/components/ui/navigation/stepper.d.ts +294 -0
- package/dist/components/ui/navigation/stepper.esm.js +292 -0
- package/dist/components/ui/navigation/stepper.js +292 -0
- package/dist/components/ui/navigation/tabs.d.ts +196 -0
- package/dist/components/ui/navigation/tabs.esm.js +194 -0
- package/dist/components/ui/navigation/tabs.js +194 -0
- package/dist/components/ui/navigation/types.d.ts +293 -0
- package/dist/components/ui/navigation/types.esm.js +298 -0
- package/dist/components/ui/navigation/types.js +298 -0
- package/dist/components/ui/overlay/backdrop.d.ts +79 -0
- package/dist/components/ui/overlay/backdrop.esm.js +80 -0
- package/dist/components/ui/overlay/backdrop.js +80 -0
- package/dist/components/ui/overlay/focus-manager.d.ts +141 -0
- package/dist/components/ui/overlay/focus-manager.esm.js +141 -0
- package/dist/components/ui/overlay/focus-manager.js +141 -0
- package/dist/components/ui/overlay/index.d.ts +27 -0
- package/dist/components/ui/overlay/index.esm.js +16 -0
- package/dist/components/ui/overlay/index.js +16 -0
- package/dist/components/ui/overlay/modal.d.ts +262 -0
- package/dist/components/ui/overlay/modal.esm.js +266 -0
- package/dist/components/ui/overlay/modal.js +266 -0
- package/dist/components/ui/overlay/overlay-manager.d.ts +107 -0
- package/dist/components/ui/overlay/overlay-manager.esm.js +105 -0
- package/dist/components/ui/overlay/overlay-manager.js +105 -0
- package/dist/components/ui/overlay/popover.d.ts +450 -0
- package/dist/components/ui/overlay/popover.esm.js +446 -0
- package/dist/components/ui/overlay/popover.js +446 -0
- package/dist/components/ui/overlay/portal.d.ts +75 -0
- package/dist/components/ui/overlay/portal.esm.js +79 -0
- package/dist/components/ui/overlay/portal.js +79 -0
- package/dist/components/ui/overlay/tooltip.d.ts +298 -0
- package/dist/components/ui/overlay/tooltip.esm.js +288 -0
- package/dist/components/ui/overlay/tooltip.js +288 -0
- package/dist/components/ui/overlay/types.d.ts +194 -0
- package/dist/components/ui/overlay/types.esm.js +195 -0
- package/dist/components/ui/overlay/types.js +195 -0
- package/dist/components/ui/performance-demo.d.ts +583 -0
- package/dist/components/ui/performance-demo.esm.js +549 -0
- package/dist/components/ui/performance-demo.js +549 -0
- package/dist/components/ui/semantic-input-system-demo.d.ts +490 -0
- package/dist/components/ui/semantic-input-system-demo.esm.js +465 -0
- package/dist/components/ui/semantic-input-system-demo.js +465 -0
- package/dist/components/ui/theme-customizer.d.ts +378 -0
- package/dist/components/ui/theme-customizer.esm.js +354 -0
- package/dist/components/ui/theme-customizer.js +354 -0
- package/dist/components/ui/theme-preview.d.ts +305 -0
- package/dist/components/ui/theme-preview.esm.js +258 -0
- package/dist/components/ui/theme-preview.js +258 -0
- package/dist/components/ui/theme-switcher.d.ts +259 -0
- package/dist/components/ui/theme-switcher.esm.js +238 -0
- package/dist/components/ui/theme-switcher.js +238 -0
- package/dist/components/ui/theme-toggle.d.ts +34 -0
- package/dist/components/ui/theme-toggle.esm.js +38 -0
- package/dist/components/ui/theme-toggle.js +38 -0
- package/dist/components/ui/token-demo.d.ts +188 -0
- package/dist/components/ui/token-demo.esm.js +183 -0
- package/dist/components/ui/token-demo.js +183 -0
- package/dist/components/ui/touch-demo.d.ts +455 -0
- package/dist/components/ui/touch-demo.esm.js +433 -0
- package/dist/components/ui/touch-demo.js +433 -0
- package/dist/components/ui/touch-friendly-interface-demo.d.ts +512 -0
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +481 -0
- package/dist/components/ui/touch-friendly-interface-demo.js +481 -0
- package/dist/components/ui/touch-friendly-interface.d.ts +292 -0
- package/dist/components/ui/touch-friendly-interface.esm.js +272 -0
- package/dist/components/ui/touch-friendly-interface.js +272 -0
- package/dist/hooks/index.d.ts +161 -0
- package/dist/hooks/index.esm.js +190 -0
- package/dist/hooks/index.js +190 -0
- package/dist/hooks/use-accessibility-support.d.ts +516 -0
- package/dist/hooks/use-accessibility-support.esm.js +488 -0
- package/dist/hooks/use-accessibility-support.js +488 -0
- package/dist/hooks/use-adaptive-layout.d.ts +287 -0
- package/dist/hooks/use-adaptive-layout.esm.js +266 -0
- package/dist/hooks/use-adaptive-layout.js +266 -0
- package/dist/hooks/use-advanced-patterns.d.ts +292 -0
- package/dist/hooks/use-advanced-patterns.esm.js +279 -0
- package/dist/hooks/use-advanced-patterns.js +279 -0
- package/dist/hooks/use-advanced-transition-system.d.ts +390 -0
- package/dist/hooks/use-advanced-transition-system.esm.js +352 -0
- package/dist/hooks/use-advanced-transition-system.js +352 -0
- package/dist/hooks/use-animation-profile.d.ts +285 -0
- package/dist/hooks/use-animation-profile.esm.js +259 -0
- package/dist/hooks/use-animation-profile.js +259 -0
- package/dist/hooks/use-battery-animations.d.ts +382 -0
- package/dist/hooks/use-battery-animations.esm.js +359 -0
- package/dist/hooks/use-battery-animations.js +359 -0
- package/dist/hooks/use-battery-conscious-loading.d.ts +473 -0
- package/dist/hooks/use-battery-conscious-loading.esm.js +432 -0
- package/dist/hooks/use-battery-conscious-loading.js +432 -0
- package/dist/hooks/use-battery-optimization.d.ts +328 -0
- package/dist/hooks/use-battery-optimization.esm.js +307 -0
- package/dist/hooks/use-battery-optimization.js +307 -0
- package/dist/hooks/use-battery-status.d.ts +297 -0
- package/dist/hooks/use-battery-status.esm.js +277 -0
- package/dist/hooks/use-battery-status.js +277 -0
- package/dist/hooks/use-component-performance.d.ts +342 -0
- package/dist/hooks/use-component-performance.esm.js +329 -0
- package/dist/hooks/use-component-performance.js +329 -0
- package/dist/hooks/use-device-loading-states.d.ts +456 -0
- package/dist/hooks/use-device-loading-states.esm.js +416 -0
- package/dist/hooks/use-device-loading-states.js +416 -0
- package/dist/hooks/use-device.d.ts +104 -0
- package/dist/hooks/use-device.esm.js +99 -0
- package/dist/hooks/use-device.js +99 -0
- package/dist/hooks/use-enterprise-mobile-experience.d.ts +486 -0
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +439 -0
- package/dist/hooks/use-enterprise-mobile-experience.js +439 -0
- package/dist/hooks/use-form-feedback.d.ts +401 -0
- package/dist/hooks/use-form-feedback.esm.js +360 -0
- package/dist/hooks/use-form-feedback.js +360 -0
- package/dist/hooks/use-form-performance.d.ts +511 -0
- package/dist/hooks/use-form-performance.esm.js +478 -0
- package/dist/hooks/use-form-performance.js +478 -0
- package/dist/hooks/use-frame-rate.d.ts +249 -0
- package/dist/hooks/use-frame-rate.esm.js +232 -0
- package/dist/hooks/use-frame-rate.js +232 -0
- package/dist/hooks/use-gestures.d.ts +336 -0
- package/dist/hooks/use-gestures.esm.js +314 -0
- package/dist/hooks/use-gestures.js +314 -0
- package/dist/hooks/use-hardware-acceleration.d.ts +339 -0
- package/dist/hooks/use-hardware-acceleration.esm.js +313 -0
- package/dist/hooks/use-hardware-acceleration.js +313 -0
- package/dist/hooks/use-input-accessibility.d.ts +451 -0
- package/dist/hooks/use-input-accessibility.esm.js +417 -0
- package/dist/hooks/use-input-accessibility.js +417 -0
- package/dist/hooks/use-input-performance.d.ts +503 -0
- package/dist/hooks/use-input-performance.esm.js +471 -0
- package/dist/hooks/use-input-performance.js +471 -0
- package/dist/hooks/use-layout-performance.d.ts +317 -0
- package/dist/hooks/use-layout-performance.esm.js +298 -0
- package/dist/hooks/use-layout-performance.js +298 -0
- package/dist/hooks/use-loading-accessibility.d.ts +532 -0
- package/dist/hooks/use-loading-accessibility.esm.js +495 -0
- package/dist/hooks/use-loading-accessibility.js +495 -0
- package/dist/hooks/use-loading-performance.d.ts +471 -0
- package/dist/hooks/use-loading-performance.esm.js +449 -0
- package/dist/hooks/use-loading-performance.js +449 -0
- package/dist/hooks/use-memory-usage.d.ts +285 -0
- package/dist/hooks/use-memory-usage.esm.js +268 -0
- package/dist/hooks/use-memory-usage.js +268 -0
- package/dist/hooks/use-mobile-form-layout.d.ts +462 -0
- package/dist/hooks/use-mobile-form-layout.esm.js +427 -0
- package/dist/hooks/use-mobile-form-layout.js +427 -0
- package/dist/hooks/use-mobile-form-validation.d.ts +516 -0
- package/dist/hooks/use-mobile-form-validation.esm.js +451 -0
- package/dist/hooks/use-mobile-form-validation.js +451 -0
- package/dist/hooks/use-mobile-keyboard-optimization.d.ts +469 -0
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +431 -0
- package/dist/hooks/use-mobile-keyboard-optimization.js +431 -0
- package/dist/hooks/use-mobile-layout.d.ts +300 -0
- package/dist/hooks/use-mobile-layout.esm.js +280 -0
- package/dist/hooks/use-mobile-layout.js +280 -0
- package/dist/hooks/use-mobile-optimization.d.ts +404 -0
- package/dist/hooks/use-mobile-optimization.esm.js +378 -0
- package/dist/hooks/use-mobile-optimization.js +378 -0
- package/dist/hooks/use-mobile-skeleton.d.ts +399 -0
- package/dist/hooks/use-mobile-skeleton.esm.js +369 -0
- package/dist/hooks/use-mobile-skeleton.js +369 -0
- package/dist/hooks/use-mobile-touch.d.ts +412 -0
- package/dist/hooks/use-mobile-touch.esm.js +379 -0
- package/dist/hooks/use-mobile-touch.js +379 -0
- package/dist/hooks/use-performance-throttling.d.ts +346 -0
- package/dist/hooks/use-performance-throttling.esm.js +324 -0
- package/dist/hooks/use-performance-throttling.js +324 -0
- package/dist/hooks/use-performance.d.ts +314 -0
- package/dist/hooks/use-performance.esm.js +278 -0
- package/dist/hooks/use-performance.js +278 -0
- package/dist/hooks/use-reusable-architecture.d.ts +412 -0
- package/dist/hooks/use-reusable-architecture.esm.js +385 -0
- package/dist/hooks/use-reusable-architecture.js +385 -0
- package/dist/hooks/use-semantic-input-types.d.ts +354 -0
- package/dist/hooks/use-semantic-input-types.esm.js +315 -0
- package/dist/hooks/use-semantic-input-types.js +315 -0
- package/dist/hooks/use-semantic-input.d.ts +563 -0
- package/dist/hooks/use-semantic-input.esm.js +513 -0
- package/dist/hooks/use-semantic-input.js +513 -0
- package/dist/hooks/use-tablet-layout.d.ts +382 -0
- package/dist/hooks/use-tablet-layout.esm.js +355 -0
- package/dist/hooks/use-tablet-layout.js +355 -0
- package/dist/hooks/use-touch-friendly-input.d.ts +520 -0
- package/dist/hooks/use-touch-friendly-input.esm.js +480 -0
- package/dist/hooks/use-touch-friendly-input.js +480 -0
- package/dist/hooks/use-touch-friendly-interface.d.ts +329 -0
- package/dist/hooks/use-touch-friendly-interface.esm.js +299 -0
- package/dist/hooks/use-touch-friendly-interface.js +299 -0
- package/dist/hooks/use-touch-optimization.d.ts +373 -0
- package/dist/hooks/use-touch-optimization.esm.js +348 -0
- package/dist/hooks/use-touch-optimization.js +348 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.esm.js +6 -0
- package/dist/lib/utils.js +6 -0
- package/dist/plugins/theme-css-generator.d.ts +345 -0
- package/dist/plugins/theme-css-generator.esm.js +305 -0
- package/dist/plugins/theme-css-generator.js +305 -0
- package/dist/styles.css +1 -1
- package/dist/themes/ThemeContext.d.ts +27 -0
- package/dist/themes/ThemeContext.esm.js +31 -0
- package/dist/themes/ThemeContext.js +31 -0
- package/dist/themes/ThemeProvider.d.ts +222 -0
- package/dist/themes/ThemeProvider.esm.js +229 -0
- package/dist/themes/ThemeProvider.js +229 -0
- package/dist/themes/accessibility/index.d.ts +7 -0
- package/dist/themes/accessibility/index.esm.js +27 -0
- package/dist/themes/accessibility/index.js +27 -0
- package/dist/themes/accessibility.d.ts +259 -0
- package/dist/themes/accessibility.esm.js +220 -0
- package/dist/themes/accessibility.js +220 -0
- package/dist/themes/aria-patterns.d.ts +418 -0
- package/dist/themes/aria-patterns.esm.js +384 -0
- package/dist/themes/aria-patterns.js +384 -0
- package/dist/themes/base-themes.d.ts +34 -0
- package/dist/themes/base-themes.esm.js +52 -0
- package/dist/themes/base-themes.js +52 -0
- package/dist/themes/colorManager.d.ts +327 -0
- package/dist/themes/colorManager.esm.js +362 -0
- package/dist/themes/colorManager.js +362 -0
- package/dist/themes/examples/dark-theme.d.ts +139 -0
- package/dist/themes/examples/dark-theme.esm.js +124 -0
- package/dist/themes/examples/dark-theme.js +124 -0
- package/dist/themes/examples/minimal-theme.d.ts +93 -0
- package/dist/themes/examples/minimal-theme.esm.js +86 -0
- package/dist/themes/examples/minimal-theme.js +86 -0
- package/dist/themes/focus-management.d.ts +699 -0
- package/dist/themes/focus-management.esm.js +642 -0
- package/dist/themes/focus-management.js +642 -0
- package/dist/themes/fontLoader.d.ts +163 -0
- package/dist/themes/fontLoader.esm.js +192 -0
- package/dist/themes/fontLoader.js +192 -0
- package/dist/themes/high-contrast.d.ts +619 -0
- package/dist/themes/high-contrast.esm.js +573 -0
- package/dist/themes/high-contrast.js +573 -0
- package/dist/themes/index.d.ts +11 -0
- package/dist/themes/index.esm.js +19 -0
- package/dist/themes/index.js +19 -0
- package/dist/themes/inheritance.d.ts +160 -0
- package/dist/themes/inheritance.esm.js +219 -0
- package/dist/themes/inheritance.js +219 -0
- package/dist/themes/keyboard-navigation.d.ts +550 -0
- package/dist/themes/keyboard-navigation.esm.js +521 -0
- package/dist/themes/keyboard-navigation.js +521 -0
- package/dist/themes/motion-reduction.d.ts +660 -0
- package/dist/themes/motion-reduction.esm.js +602 -0
- package/dist/themes/motion-reduction.js +602 -0
- package/dist/themes/navigation.d.ts +232 -0
- package/dist/themes/navigation.esm.js +238 -0
- package/dist/themes/navigation.js +238 -0
- package/dist/themes/screen-reader.d.ts +645 -0
- package/dist/themes/screen-reader.esm.js +580 -0
- package/dist/themes/screen-reader.js +580 -0
- package/dist/themes/systemThemeDetector.d.ts +148 -0
- package/dist/themes/systemThemeDetector.esm.js +174 -0
- package/dist/themes/systemThemeDetector.js +174 -0
- package/dist/themes/themeCSSUpdater.d.ts +229 -0
- package/dist/themes/themeCSSUpdater.esm.js +250 -0
- package/dist/themes/themeCSSUpdater.js +250 -0
- package/dist/themes/themePersistence.d.ts +192 -0
- package/dist/themes/themePersistence.esm.js +217 -0
- package/dist/themes/themePersistence.js +217 -0
- package/dist/themes/themes/stan-design.d.ts +678 -0
- package/dist/themes/themes/stan-design.esm.js +518 -0
- package/dist/themes/themes/stan-design.js +518 -0
- package/dist/themes/types.d.ts +454 -0
- package/dist/themes/types.esm.js +446 -0
- package/dist/themes/types.js +446 -0
- package/dist/themes/useSystemTheme.d.ts +43 -0
- package/dist/themes/useSystemTheme.esm.js +48 -0
- package/dist/themes/useSystemTheme.js +48 -0
- package/dist/themes/useTheme.d.ts +20 -0
- package/dist/themes/useTheme.esm.js +87 -0
- package/dist/themes/useTheme.js +87 -0
- package/dist/themes/validation.d.ts +406 -0
- package/dist/themes/validation.esm.js +411 -0
- package/dist/themes/validation.js +411 -0
- package/dist/tokens/index.d.ts +25 -0
- package/dist/tokens/index.esm.js +23 -0
- package/dist/tokens/index.js +23 -0
- package/dist/tokens/tokenExporter.d.ts +336 -0
- package/dist/tokens/tokenExporter.esm.js +371 -0
- package/dist/tokens/tokenExporter.js +371 -0
- package/dist/tokens/tokenGenerator.d.ts +250 -0
- package/dist/tokens/tokenGenerator.esm.js +267 -0
- package/dist/tokens/tokenGenerator.js +267 -0
- package/dist/tokens/tokenManager.d.ts +194 -0
- package/dist/tokens/tokenManager.esm.js +235 -0
- package/dist/tokens/tokenManager.js +235 -0
- package/dist/tokens/tokenValidator.d.ts +488 -0
- package/dist/tokens/tokenValidator.esm.js +497 -0
- package/dist/tokens/tokenValidator.js +497 -0
- package/dist/tokens/types.d.ts +78 -0
- package/dist/tokens/types.esm.js +64 -0
- package/dist/tokens/types.js +64 -0
- package/dist/utils/bundle-analyzer.d.ts +260 -0
- package/dist/utils/bundle-analyzer.esm.js +242 -0
- package/dist/utils/bundle-analyzer.js +242 -0
- package/dist/utils/bundle-splitting.d.ts +483 -0
- package/dist/utils/bundle-splitting.esm.js +458 -0
- package/dist/utils/bundle-splitting.js +458 -0
- package/dist/utils/lazy-loading.d.ts +437 -0
- package/dist/utils/lazy-loading.esm.js +415 -0
- package/dist/utils/lazy-loading.js +415 -0
- package/dist/utils/performance-monitor.d.ts +513 -0
- package/dist/utils/performance-monitor.esm.js +472 -0
- package/dist/utils/performance-monitor.js +472 -0
- package/dist/utils/tree-shaking.d.ts +274 -0
- package/dist/utils/tree-shaking.esm.js +266 -0
- package/dist/utils/tree-shaking.js +266 -0
- package/package.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { ThemeContext, ThemeContextType } from './ThemeContext';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook to access theme context
|
|
6
|
+
* Must be used within a ThemeProvider
|
|
7
|
+
*
|
|
8
|
+
* @returns ThemeContextType - The current theme context
|
|
9
|
+
* @throws Error if used outside of ThemeProvider
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* function MyComponent() {
|
|
14
|
+
* const { currentTheme, setTheme, currentThemeConfig } = useTheme();
|
|
15
|
+
*
|
|
16
|
+
* return (
|
|
17
|
+
* <button onClick={() => setTheme('harvey')}>
|
|
18
|
+
* Switch to Harvey Theme
|
|
19
|
+
* </button>
|
|
20
|
+
* );
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export const useTheme = ()=> {
|
|
25
|
+
const context = useContext(ThemeContext);
|
|
26
|
+
|
|
27
|
+
if (!context) {
|
|
28
|
+
throw new Error('useTheme must be used within ThemeProvider');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return context;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Hook to get a specific theme by name
|
|
36
|
+
* Useful for accessing theme data without switching
|
|
37
|
+
*
|
|
38
|
+
* @param themeName - Name of the theme to retrieve
|
|
39
|
+
* @returns CompleteThemeConfig | null - The requested theme or null if not found
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```tsx
|
|
43
|
+
* function ThemePreview() {
|
|
44
|
+
* const harveyTheme = useThemeByName('harvey');
|
|
45
|
+
*
|
|
46
|
+
* if (!harveyTheme) return <div>Theme not found</div>;
|
|
47
|
+
*
|
|
48
|
+
* return (
|
|
49
|
+
* <div style={{ color] }}>
|
|
50
|
+
* Harvey Theme Preview
|
|
51
|
+
* </div>
|
|
52
|
+
* );
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export const useThemeByName = (themeName) => {
|
|
57
|
+
const { getTheme } = useTheme();
|
|
58
|
+
return getTheme(themeName);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Hook to check if a specific theme is available
|
|
63
|
+
*
|
|
64
|
+
* @param themeName - Name of the theme to check
|
|
65
|
+
* @returns boolean - True if theme is available
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```tsx
|
|
69
|
+
* function ThemeSwitcher() {
|
|
70
|
+
* const hasHarveyTheme = useThemeAvailable('harvey');
|
|
71
|
+
*
|
|
72
|
+
* return (
|
|
73
|
+
* <div>
|
|
74
|
+
* {hasHarveyTheme && (
|
|
75
|
+
* <button onClick={() => setTheme('harvey')}>
|
|
76
|
+
* Harvey Theme
|
|
77
|
+
* </button>
|
|
78
|
+
* )}
|
|
79
|
+
* </div>
|
|
80
|
+
* );
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export const useThemeAvailable = (themeName)=> {
|
|
85
|
+
const { availableThemes } = useTheme();
|
|
86
|
+
return availableThemes.includes(themeName);
|
|
87
|
+
};
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
// Theme Validation System
|
|
2
|
+
// This file provides comprehensive validation for theme configurations
|
|
3
|
+
|
|
4
|
+
export class ThemeValidator {
|
|
5
|
+
private static readonly REQUIRED_FIELDS = [
|
|
6
|
+
'fonts.primary.family',
|
|
7
|
+
'fonts.primary.sizes.md',
|
|
8
|
+
'colors.primary.500',
|
|
9
|
+
'colors.semantic.success',
|
|
10
|
+
'colors.semantic.error',
|
|
11
|
+
'colors.semantic.warning',
|
|
12
|
+
'colors.semantic.info',
|
|
13
|
+
'colors.surface.background',
|
|
14
|
+
'colors.text.primary',
|
|
15
|
+
'spacing.scale.md',
|
|
16
|
+
'shadows.md',
|
|
17
|
+
'transitions.duration.normal',
|
|
18
|
+
'transitions.easing.ease',
|
|
19
|
+
'meta.name',
|
|
20
|
+
'meta.description',
|
|
21
|
+
'meta.version'
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
private static readonly COLOR_FORMATS = {
|
|
25
|
+
hex: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
|
|
26
|
+
rgb: /^rgb\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*\)$/,
|
|
27
|
+
rgba: /^rgba\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*,\s*[\d.]+\s*\)$/,
|
|
28
|
+
hsl: /^hsl\(\s*\d+\s*,\s*\d+%\s*,\s*\d+%\s*\)$/,
|
|
29
|
+
hsla: /^hsla\(\s*\d+\s*,\s*\d+%\s*,\s*\d+%\s*,\s*[\d.]+\s*\)$/
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
private static readonly FONT_WEIGHTS = [100, 200, 300, 400, 500, 600, 700, 800, 900];
|
|
33
|
+
|
|
34
|
+
static validateTheme(theme: MultiThemeConfig): ThemeValidationResult {
|
|
35
|
+
const errors: ThemeValidationError[] = [];
|
|
36
|
+
const warnings: ThemeValidationWarning[] = [];
|
|
37
|
+
|
|
38
|
+
// Validate required fields
|
|
39
|
+
this.validateRequiredFields(theme, errors);
|
|
40
|
+
|
|
41
|
+
// Validate color formats
|
|
42
|
+
this.validateColorFormats(theme, errors, warnings);
|
|
43
|
+
|
|
44
|
+
// Validate color contrast
|
|
45
|
+
this.validateColorContrast(theme, warnings);
|
|
46
|
+
|
|
47
|
+
// Validate font configurations
|
|
48
|
+
this.validateFontConfigurations(theme, warnings);
|
|
49
|
+
|
|
50
|
+
// Validate spacing scales
|
|
51
|
+
this.validateSpacingScales(theme, warnings);
|
|
52
|
+
|
|
53
|
+
// Validate navigation configurations
|
|
54
|
+
this.validateNavigationConfigurations(theme, errors, warnings);
|
|
55
|
+
|
|
56
|
+
// Validate metadata
|
|
57
|
+
this.validateMetadata(theme, errors, warnings);
|
|
58
|
+
|
|
59
|
+
// Validate semantic consistency
|
|
60
|
+
this.validateSemanticConsistency(theme, warnings);
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
isValid: errors.length === 0,
|
|
64
|
+
errors,
|
|
65
|
+
warnings
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private static validateRequiredFields(theme: MultiThemeConfig, errors: ThemeValidationError[]): void {
|
|
70
|
+
for (const fieldPath of this.REQUIRED_FIELDS) {
|
|
71
|
+
const value = this.getNestedValue(theme, fieldPath);
|
|
72
|
+
if (value === undefined || value === null || value === '') {
|
|
73
|
+
errors.push({
|
|
74
|
+
path: fieldPath,
|
|
75
|
+
message: `Required field '${fieldPath}' is missing or empty`,
|
|
76
|
+
severity: 'error'
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private static validateColorFormats(theme: MultiThemeConfig, errors: ThemeValidationError[], warnings: ThemeValidationWarning[]): void {
|
|
83
|
+
const colorFields = this.getAllColorFields(theme);
|
|
84
|
+
const formats = new Set<string>();
|
|
85
|
+
|
|
86
|
+
for (const { path, value } of colorFields) {
|
|
87
|
+
if (typeof value === 'string') {
|
|
88
|
+
// Use colorManager for validation
|
|
89
|
+
if (!ColorManager.isValidColor(value)) {
|
|
90
|
+
errors.push({
|
|
91
|
+
path,
|
|
92
|
+
message: `Invalid color format: '${value}'. Expected hex, rgb, hsl, or named color format`,
|
|
93
|
+
severity: 'error'
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
const format = this.detectColorFormat(value);
|
|
97
|
+
if (format) {
|
|
98
|
+
formats.add(format);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Warn if multiple color formats are used
|
|
105
|
+
if (formats.size > 1) {
|
|
106
|
+
warnings.push({
|
|
107
|
+
path: 'colors',
|
|
108
|
+
message: `Multiple color formats detected: ${Array.from(formats).join(', ')}. Consider using a consistent format for better maintainability`,
|
|
109
|
+
severity: 'warning'
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private static validateColorContrast(theme: MultiThemeConfig, warnings: ThemeValidationWarning[]): void {
|
|
115
|
+
const textColors = [
|
|
116
|
+
theme.colors?.text?.primary,
|
|
117
|
+
theme.colors?.text?.secondary,
|
|
118
|
+
theme.colors?.text?.muted
|
|
119
|
+
].filter(Boolean);
|
|
120
|
+
|
|
121
|
+
const backgroundColors = [
|
|
122
|
+
theme.colors?.surface?.background,
|
|
123
|
+
theme.colors?.surface?.surface
|
|
124
|
+
].filter(Boolean);
|
|
125
|
+
|
|
126
|
+
for (const textColor of textColors) {
|
|
127
|
+
for (const bgColor of backgroundColors) {
|
|
128
|
+
if (textColor && bgColor) {
|
|
129
|
+
// Use colorManager for contrast checking
|
|
130
|
+
const accessibility = ColorManager.checkColorContrast(textColor, bgColor);
|
|
131
|
+
|
|
132
|
+
if (!accessibility.aa) {
|
|
133
|
+
warnings.push({
|
|
134
|
+
path: 'colors',
|
|
135
|
+
message: `Color contrast ratio ${accessibility.contrastRatio.toFixed(2)}:1 between '${textColor}' and '${bgColor}' is below WCAG AA standard (4.5:1)`,
|
|
136
|
+
severity: 'warning'
|
|
137
|
+
});
|
|
138
|
+
} else if (!accessibility.aaa) {
|
|
139
|
+
warnings.push({
|
|
140
|
+
path: 'colors',
|
|
141
|
+
message: `Color contrast ratio ${accessibility.contrastRatio.toFixed(2)}:1 between '${textColor}' and '${bgColor}' is below WCAG AAA standard (7:1)`,
|
|
142
|
+
severity: 'info'
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Add accessibility recommendations
|
|
147
|
+
if (accessibility.recommended.length > 0) {
|
|
148
|
+
warnings.push({
|
|
149
|
+
path: 'colors',
|
|
150
|
+
message: `Accessibility recommendations: ${accessibility.recommended.join('; ')}`,
|
|
151
|
+
severity: 'info'
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private static validateFontConfigurations(theme: MultiThemeConfig, warnings: ThemeValidationWarning[]): void {
|
|
160
|
+
// Validate font weights
|
|
161
|
+
if (theme.fonts?.primary?.weights) {
|
|
162
|
+
for (const weight of theme.fonts.primary.weights) {
|
|
163
|
+
if (!this.FONT_WEIGHTS.includes(weight)) {
|
|
164
|
+
warnings.push({
|
|
165
|
+
path: 'fonts.primary.weights',
|
|
166
|
+
message: `Font weight ${weight} is not a standard CSS font weight. Consider using: ${this.FONT_WEIGHTS.join(', ')}`,
|
|
167
|
+
severity: 'warning'
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Validate font size scale
|
|
174
|
+
if (theme.fonts?.primary?.sizes) {
|
|
175
|
+
const sizes = Object.values(theme.fonts.primary.sizes);
|
|
176
|
+
const numericSizes = sizes.map(size => parseFloat(size)).filter(size => !isNaN(size));
|
|
177
|
+
|
|
178
|
+
if (numericSizes.length > 1) {
|
|
179
|
+
for (let i = 1; i < numericSizes.length; i++) {
|
|
180
|
+
if (numericSizes[i] <= numericSizes[i - 1]) {
|
|
181
|
+
warnings.push({
|
|
182
|
+
path: 'fonts.primary.sizes',
|
|
183
|
+
message: `Font sizes should be in ascending order. Found: ${numericSizes[i - 1]} followed by ${numericSizes[i]}`,
|
|
184
|
+
severity: 'warning'
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Validate font family fallbacks
|
|
192
|
+
if (theme.fonts?.primary?.family) {
|
|
193
|
+
const family = theme.fonts.primary.family;
|
|
194
|
+
if (!family.includes(',') && !family.includes('"') && !family.includes("'")) {
|
|
195
|
+
warnings.push({
|
|
196
|
+
path: 'fonts.primary.family',
|
|
197
|
+
message: `Font family '${family}' should include fallback fonts for better cross-platform compatibility`,
|
|
198
|
+
severity: 'warning'
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private static validateSpacingScales(theme: MultiThemeConfig, warnings: ThemeValidationWarning[]): void {
|
|
205
|
+
if (theme.spacing?.scale) {
|
|
206
|
+
const scales = Object.values(theme.spacing.scale);
|
|
207
|
+
const numericScales = scales.map(scale => parseFloat(scale)).filter(scale => !isNaN(scale));
|
|
208
|
+
|
|
209
|
+
if (numericScales.length > 1) {
|
|
210
|
+
// Check if spacing follows a consistent pattern
|
|
211
|
+
const ratios = [];
|
|
212
|
+
for (let i = 1; i < numericScales.length; i++) {
|
|
213
|
+
ratios.push(numericScales[i] / numericScales[i - 1]);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const avgRatio = ratios.reduce((sum, ratio) => sum + ratio, 0) / ratios.length;
|
|
217
|
+
const variance = ratios.reduce((sum, ratio) => sum + Math.pow(ratio - avgRatio, 2), 0) / ratios.length;
|
|
218
|
+
|
|
219
|
+
if (variance > 0.1) { // High variance indicates inconsistent spacing
|
|
220
|
+
warnings.push({
|
|
221
|
+
path: 'spacing.scale',
|
|
222
|
+
message: `Spacing scale appears inconsistent. Consider using a mathematical scale (e.g., 1.5x or 2x multiplier) for better visual harmony`,
|
|
223
|
+
severity: 'warning'
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private static validateNavigationConfigurations(theme: MultiThemeConfig, _errors: ThemeValidationError[], warnings: ThemeValidationWarning[]): void {
|
|
231
|
+
if (theme.navigation) {
|
|
232
|
+
// Validate layout and behavior combinations
|
|
233
|
+
const { layout, behavior } = theme.navigation;
|
|
234
|
+
|
|
235
|
+
if (layout === 'sidebar' && behavior === 'floating') {
|
|
236
|
+
warnings.push({
|
|
237
|
+
path: 'navigation',
|
|
238
|
+
message: 'Sidebar layout with floating behavior may cause usability issues. Consider using static or sticky behavior',
|
|
239
|
+
severity: 'warning'
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (layout === 'tabs' && behavior === 'overlay') {
|
|
244
|
+
warnings.push({
|
|
245
|
+
path: 'navigation',
|
|
246
|
+
message: 'Tab layout with overlay behavior is unusual. Consider using static or sticky behavior',
|
|
247
|
+
severity: 'warning'
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Validate responsive behavior
|
|
252
|
+
if (theme.navigation.responsive === 'desktop-first' && layout === 'horizontal') {
|
|
253
|
+
warnings.push({
|
|
254
|
+
path: 'navigation',
|
|
255
|
+
message: 'Desktop-first responsive approach with horizontal layout may cause mobile usability issues',
|
|
256
|
+
severity: 'warning'
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private static validateMetadata(theme: MultiThemeConfig, errors: ThemeValidationError[], warnings: ThemeValidationWarning[]): void {
|
|
263
|
+
if (theme.meta) {
|
|
264
|
+
// Validate version format
|
|
265
|
+
if (theme.meta.version && !/^\d+\.\d+\.\d+/.test(theme.meta.version)) {
|
|
266
|
+
warnings.push({
|
|
267
|
+
path: 'meta.version',
|
|
268
|
+
message: `Version '${theme.meta.version}' should follow semantic versioning (e.g., 1.0.0)`,
|
|
269
|
+
severity: 'warning'
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Validate category
|
|
274
|
+
if (theme.meta.category && !['brand', 'enterprise', 'custom', 'accessibility'].includes(theme.meta.category)) {
|
|
275
|
+
errors.push({
|
|
276
|
+
path: 'meta.category',
|
|
277
|
+
message: `Invalid category '${theme.meta.category}'. Must be one of: brand, enterprise, custom, accessibility`,
|
|
278
|
+
severity: 'error'
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Validate tags
|
|
283
|
+
if (theme.meta.tags && theme.meta.tags.length > 10) {
|
|
284
|
+
warnings.push({
|
|
285
|
+
path: 'meta.tags',
|
|
286
|
+
message: `Theme has ${theme.meta.tags.length} tags. Consider limiting to 10 tags for better organization`,
|
|
287
|
+
severity: 'warning'
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private static validateSemanticConsistency(theme: MultiThemeConfig, warnings: ThemeValidationWarning[]): void {
|
|
294
|
+
// Check if semantic colors are distinct from primary colors
|
|
295
|
+
if (theme.colors?.semantic && theme.colors?.primary) {
|
|
296
|
+
const semanticColors = Object.values(theme.colors.semantic);
|
|
297
|
+
const primaryColors = Object.values(theme.colors.primary);
|
|
298
|
+
|
|
299
|
+
for (const semanticColor of semanticColors) {
|
|
300
|
+
for (const primaryColor of primaryColors) {
|
|
301
|
+
if (this.colorsAreSimilar(semanticColor, primaryColor)) {
|
|
302
|
+
warnings.push({
|
|
303
|
+
path: 'colors.semantic',
|
|
304
|
+
message: `Semantic color '${semanticColor}' is too similar to primary color '${primaryColor}'. Consider using more distinct colors for better semantic clarity`,
|
|
305
|
+
severity: 'warning'
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
private static getNestedValue(obj: any, path: string): any {
|
|
314
|
+
return path.split('.').reduce((current, key) => current?.[key], obj);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
private static getAllColorFields(theme: MultiThemeConfig): Array<{ path: string; value: any }> {
|
|
318
|
+
const fields: Array<{ path: string; value: any }> = [];
|
|
319
|
+
|
|
320
|
+
const traverseColors = (obj: any, path: string) => {
|
|
321
|
+
if (obj && typeof obj === 'object') {
|
|
322
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
323
|
+
const currentPath = path ? `${path}.${key}` : key;
|
|
324
|
+
if (typeof value === 'string' && this.isColorValue(value)) {
|
|
325
|
+
fields.push({ path: currentPath, value });
|
|
326
|
+
} else if (typeof value === 'object') {
|
|
327
|
+
traverseColors(value, currentPath);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
traverseColors(theme.colors, 'colors');
|
|
334
|
+
return fields;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
private static detectColorFormat(color: string): string | null {
|
|
338
|
+
for (const [format, regex] of Object.entries(this.COLOR_FORMATS)) {
|
|
339
|
+
if (regex.test(color)) {
|
|
340
|
+
return format;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
private static isColorValue(value: string): boolean {
|
|
347
|
+
// Accept any string that might be a color, let detectColorFormat validate it
|
|
348
|
+
return value.startsWith('#') ||
|
|
349
|
+
value.startsWith('rgb') ||
|
|
350
|
+
value.startsWith('hsl') ||
|
|
351
|
+
value.startsWith('var(--') ||
|
|
352
|
+
value === 'transparent' ||
|
|
353
|
+
value === 'currentColor' ||
|
|
354
|
+
value === 'inherit' ||
|
|
355
|
+
// Also accept any string that might be a color (for validation)
|
|
356
|
+
value.includes('color') ||
|
|
357
|
+
value.includes('invalid');
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
private static calculateColorContrast(color1: string, color2: string): number {
|
|
361
|
+
try {
|
|
362
|
+
const luminance1 = this.getLuminance(color1);
|
|
363
|
+
const luminance2 = this.getLuminance(color2);
|
|
364
|
+
|
|
365
|
+
const lighter = Math.max(luminance1, luminance2);
|
|
366
|
+
const darker = Math.min(luminance1, luminance2);
|
|
367
|
+
|
|
368
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
369
|
+
} catch {
|
|
370
|
+
return 1; // Default fallback
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
private static getLuminance(color: string): number {
|
|
375
|
+
// Handle CSS variables and other formats
|
|
376
|
+
if (color.startsWith('var(--') || color === 'transparent' || color === 'currentColor' || color === 'inherit') {
|
|
377
|
+
return 0.5; // Default fallback
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Convert hex to RGB and calculate luminance
|
|
381
|
+
try {
|
|
382
|
+
const hex = color.replace('#', '');
|
|
383
|
+
const r = parseInt(hex.substr(0, 2), 16) / 255;
|
|
384
|
+
const g = parseInt(hex.substr(2, 2), 16) / 255;
|
|
385
|
+
const b = parseInt(hex.substr(4, 2), 16) / 255;
|
|
386
|
+
|
|
387
|
+
const [rs, gs, bs] = [r, g, b].map(c => {
|
|
388
|
+
if (c <= 0.03928) return c / 12.92;
|
|
389
|
+
return Math.pow((c + 0.055) / 1.055, 2.4);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
|
|
393
|
+
} catch {
|
|
394
|
+
return 0.5; // Default fallback
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
private static colorsAreSimilar(color1: string, color2: string): boolean {
|
|
399
|
+
try {
|
|
400
|
+
const contrast = this.calculateColorContrast(color1, color2);
|
|
401
|
+
return contrast < 2.0; // Very low contrast indicates similar colors
|
|
402
|
+
} catch {
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|