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