@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.11 → 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 -3
- package/dist/components/ui/navigation/index.js +0 -3
- 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 -5
- package/dist/components/ui/overlay/index.js +0 -5
- 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 -161
- package/dist/index.js +150 -161
- 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 -13
- package/dist/tokens/index.js +2 -13
- 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,160 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {
|
|
3
|
-
const result = { ...target };
|
|
4
|
-
|
|
5
|
-
for (const key in source) {
|
|
6
|
-
if (source[key] !== undefined) {
|
|
7
|
-
if (
|
|
8
|
-
typeof source[key] === 'object' &&
|
|
9
|
-
source[key] !== null &&
|
|
10
|
-
!Array.isArray(source[key]) &&
|
|
11
|
-
typeof target[key] === 'object' &&
|
|
12
|
-
target[key] !== null &&
|
|
13
|
-
!Array.isArray(target[key])
|
|
14
|
-
) {
|
|
15
|
-
// Recursively merge objects
|
|
16
|
-
result[key] = deepMerge(target[key], source[key]);
|
|
17
|
-
} else {
|
|
18
|
-
// Direct assignment for primitives, arrays, or null values
|
|
19
|
-
result[key] = source[key] as T[Extract<keyof T, string>];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return result;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function applyThemeInheritance(theme: Partial<MultiThemeConfig>): MultiThemeConfig {
|
|
28
|
-
return deepMerge(defaultTheme, theme);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function createTheme(themeConfig: Partial<MultiThemeConfig>): MultiThemeConfig {
|
|
32
|
-
return applyThemeInheritance(themeConfig);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function validateThemeCompleteness(theme: MultiThemeConfig): string[] {
|
|
36
|
-
const missingPaths: string[] = [];
|
|
37
|
-
|
|
38
|
-
function checkObject(obj: any, defaultObj: any, path: string = '') {
|
|
39
|
-
for (const key in defaultObj) {
|
|
40
|
-
const currentPath = path ? `${path}.${key}` : key;
|
|
41
|
-
|
|
42
|
-
if (obj[key] === undefined) {
|
|
43
|
-
missingPaths.push(currentPath);
|
|
44
|
-
} else if (
|
|
45
|
-
typeof defaultObj[key] === 'object' &&
|
|
46
|
-
defaultObj[key] !== null &&
|
|
47
|
-
!Array.isArray(defaultObj[key])
|
|
48
|
-
) {
|
|
49
|
-
checkObject(obj[key], defaultObj[key], currentPath);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
checkObject(theme, defaultTheme);
|
|
55
|
-
return missingPaths;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export declare const themeInheritanceManager: {
|
|
59
|
-
// Internal theme registry
|
|
60
|
-
_themes: new Map<string, MultiThemeConfig>(),
|
|
61
|
-
|
|
62
|
-
applyInheritance: applyThemeInheritance,
|
|
63
|
-
|
|
64
|
-
createTheme,
|
|
65
|
-
|
|
66
|
-
getDefaultTheme: () => defaultTheme,
|
|
67
|
-
|
|
68
|
-
validateCompleteness: validateThemeCompleteness,
|
|
69
|
-
|
|
70
|
-
hasInheritance: (theme: MultiThemeConfig): boolean => {
|
|
71
|
-
const missing = validateThemeCompleteness(theme);
|
|
72
|
-
return missing.length === 0;
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
getProperty: <T>(theme: MultiThemeConfig, path: string, fallback?: T): T => {
|
|
76
|
-
const keys = path.split('.');
|
|
77
|
-
let current: any = theme;
|
|
78
|
-
|
|
79
|
-
for (const key of keys) {
|
|
80
|
-
if (current && typeof current === 'object' && key in current) {
|
|
81
|
-
current = current[key];
|
|
82
|
-
} else {
|
|
83
|
-
// Fall back to default theme
|
|
84
|
-
current = defaultTheme;
|
|
85
|
-
for (const key of keys) {
|
|
86
|
-
if (current && typeof current === 'object' && key in current) {
|
|
87
|
-
current = current[key];
|
|
88
|
-
} else {
|
|
89
|
-
return fallback as T;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return current as T;
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
registerTheme: (name: string, theme: Partial<MultiThemeConfig>): MultiThemeConfig => {
|
|
100
|
-
const themeWithInheritance = applyThemeInheritance(theme);
|
|
101
|
-
themeInheritanceManager._themes.set(name, themeWithInheritance);
|
|
102
|
-
return themeWithInheritance;
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
getCompleteTheme: (name: string): CompleteThemeConfig | null => {
|
|
106
|
-
// First try to get the registered theme
|
|
107
|
-
const registeredTheme = themeInheritanceManager._themes.get(name);
|
|
108
|
-
if (registeredTheme) {
|
|
109
|
-
// Check if this theme extends another theme that exists
|
|
110
|
-
if (registeredTheme.extends && !themeInheritanceManager._themes.has(registeredTheme.extends)) {
|
|
111
|
-
// Theme extends a missing parent, return null
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
return toCompleteThemeConfig(registeredTheme);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Fall back to default theme if the requested theme is not found
|
|
118
|
-
if (name === 'default' || name === 'stan-design') {
|
|
119
|
-
return toCompleteThemeConfig(defaultTheme);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return null;
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
getRegisteredThemeNames: (): string[] => {
|
|
126
|
-
return Array.from(themeInheritanceManager._themes.keys());
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
isThemeRegistered: (name: string): boolean => {
|
|
130
|
-
return themeInheritanceManager._themes.has(name);
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
export function withInheritance(themeConfig: Partial<MultiThemeConfig>) {
|
|
135
|
-
return function <T extends { new (...args: any[]): any }>(constructor: T) {
|
|
136
|
-
return class extends constructor {
|
|
137
|
-
static theme = applyThemeInheritance(themeConfig);
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export type PartialThemeConfig = Partial<MultiThemeConfig>;
|
|
143
|
-
|
|
144
|
-
export function overrideTheme(
|
|
145
|
-
baseTheme: MultiThemeConfig,
|
|
146
|
-
overrides: Partial<MultiThemeConfig>
|
|
147
|
-
): MultiThemeConfig {
|
|
148
|
-
return deepMerge(baseTheme, overrides);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export function toCompleteThemeConfig(theme: MultiThemeConfig): CompleteThemeConfig {
|
|
152
|
-
return {
|
|
153
|
-
...theme,
|
|
154
|
-
validation: {
|
|
155
|
-
isValid: true,
|
|
156
|
-
errors: [],
|
|
157
|
-
warnings: []
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
}
|
|
@@ -1,550 +0,0 @@
|
|
|
1
|
-
// Keyboard key constants
|
|
2
|
-
export declare const KEY_CODES: {
|
|
3
|
-
// Navigation keys
|
|
4
|
-
TAB: 'Tab',
|
|
5
|
-
SHIFT_TAB: 'Shift+Tab',
|
|
6
|
-
ARROW_UP: 'ArrowUp',
|
|
7
|
-
ARROW_DOWN: 'ArrowDown',
|
|
8
|
-
ARROW_LEFT: 'ArrowLeft',
|
|
9
|
-
ARROW_RIGHT: 'ArrowRight',
|
|
10
|
-
HOME: 'Home',
|
|
11
|
-
END: 'End',
|
|
12
|
-
PAGE_UP: 'PageUp',
|
|
13
|
-
PAGE_DOWN: 'PageDown',
|
|
14
|
-
|
|
15
|
-
// Action keys
|
|
16
|
-
ENTER: 'Enter',
|
|
17
|
-
SPACE: ' ',
|
|
18
|
-
ESCAPE: 'Escape',
|
|
19
|
-
BACKSPACE: 'Backspace',
|
|
20
|
-
DELETE: 'Delete',
|
|
21
|
-
|
|
22
|
-
// Modifier keys
|
|
23
|
-
SHIFT: 'Shift',
|
|
24
|
-
CTRL: 'Control',
|
|
25
|
-
ALT: 'Alt',
|
|
26
|
-
META: 'Meta',
|
|
27
|
-
|
|
28
|
-
// Function keys
|
|
29
|
-
F1: 'F1',
|
|
30
|
-
F2: 'F2',
|
|
31
|
-
F3: 'F3',
|
|
32
|
-
F4: 'F4',
|
|
33
|
-
F5: 'F5',
|
|
34
|
-
F6: 'F6',
|
|
35
|
-
F7: 'F7',
|
|
36
|
-
F8: 'F8',
|
|
37
|
-
F9: 'F9',
|
|
38
|
-
F10: 'F10',
|
|
39
|
-
F11: 'F11',
|
|
40
|
-
F12: 'F12'
|
|
41
|
-
} as const;
|
|
42
|
-
|
|
43
|
-
// Keyboard navigation patterns
|
|
44
|
-
export declare const NAVIGATION_PATTERNS: {
|
|
45
|
-
// List navigation
|
|
46
|
-
LIST: {
|
|
47
|
-
NEXT: [KEY_CODES.ARROW_DOWN, KEY_CODES.ARROW_RIGHT],
|
|
48
|
-
PREVIOUS: [KEY_CODES.ARROW_UP, KEY_CODES.ARROW_LEFT],
|
|
49
|
-
FIRST: [KEY_CODES.HOME],
|
|
50
|
-
LAST: [KEY_CODES.END],
|
|
51
|
-
SELECT: [KEY_CODES.ENTER, KEY_CODES.SPACE]
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
// Grid navigation
|
|
55
|
-
GRID: {
|
|
56
|
-
NEXT_ROW: [KEY_CODES.ARROW_DOWN],
|
|
57
|
-
PREVIOUS_ROW: [KEY_CODES.ARROW_UP],
|
|
58
|
-
NEXT_COLUMN: [KEY_CODES.ARROW_RIGHT],
|
|
59
|
-
PREVIOUS_COLUMN: [KEY_CODES.ARROW_LEFT],
|
|
60
|
-
FIRST_ROW: [KEY_CODES.HOME],
|
|
61
|
-
LAST_ROW: [KEY_CODES.END],
|
|
62
|
-
FIRST_COLUMN: [KEY_CODES.CTRL + '+' + KEY_CODES.HOME],
|
|
63
|
-
LAST_COLUMN: [KEY_CODES.CTRL + '+' + KEY_CODES.END]
|
|
64
|
-
},
|
|
65
|
-
|
|
66
|
-
// Tree navigation
|
|
67
|
-
TREE: {
|
|
68
|
-
EXPAND: [KEY_CODES.ARROW_RIGHT],
|
|
69
|
-
COLLAPSE: [KEY_CODES.ARROW_LEFT],
|
|
70
|
-
NEXT_ITEM: [KEY_CODES.ARROW_DOWN],
|
|
71
|
-
PREVIOUS_ITEM: [KEY_CODES.ARROW_UP],
|
|
72
|
-
FIRST_ITEM: [KEY_CODES.HOME],
|
|
73
|
-
LAST_ITEM: [KEY_CODES.END],
|
|
74
|
-
SELECT: [KEY_CODES.ENTER, KEY_CODES.SPACE]
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
// Tab navigation
|
|
78
|
-
TABS: {
|
|
79
|
-
NEXT_TAB: [KEY_CODES.ARROW_RIGHT],
|
|
80
|
-
PREVIOUS_TAB: [KEY_CODES.ARROW_LEFT],
|
|
81
|
-
FIRST_TAB: [KEY_CODES.HOME],
|
|
82
|
-
LAST_TAB: [KEY_CODES.END],
|
|
83
|
-
SELECT_TAB: [KEY_CODES.ENTER, KEY_CODES.SPACE]
|
|
84
|
-
},
|
|
85
|
-
|
|
86
|
-
// Menu navigation
|
|
87
|
-
MENU: {
|
|
88
|
-
OPEN: [KEY_CODES.ENTER, KEY_CODES.SPACE, KEY_CODES.ARROW_DOWN],
|
|
89
|
-
CLOSE: [KEY_CODES.ESCAPE],
|
|
90
|
-
NEXT_ITEM: [KEY_CODES.ARROW_DOWN],
|
|
91
|
-
PREVIOUS_ITEM: [KEY_CODES.ARROW_UP],
|
|
92
|
-
FIRST_ITEM: [KEY_CODES.HOME],
|
|
93
|
-
LAST_ITEM: [KEY_CODES.END],
|
|
94
|
-
SELECT: [KEY_CODES.ENTER, KEY_CODES.SPACE]
|
|
95
|
-
},
|
|
96
|
-
|
|
97
|
-
// Modal navigation
|
|
98
|
-
MODAL: {
|
|
99
|
-
CLOSE: [KEY_CODES.ESCAPE],
|
|
100
|
-
NEXT_FOCUS: [KEY_CODES.TAB],
|
|
101
|
-
PREVIOUS_FOCUS: [KEY_CODES.SHIFT + '+' + KEY_CODES.TAB]
|
|
102
|
-
}
|
|
103
|
-
} as const;
|
|
104
|
-
|
|
105
|
-
// Keyboard navigation manager
|
|
106
|
-
export class KeyboardNavigationManager {
|
|
107
|
-
private focusableSelectors: string[];
|
|
108
|
-
private currentFocusIndex: number;
|
|
109
|
-
private focusableElements: HTMLElement[];
|
|
110
|
-
private container: HTMLElement | null;
|
|
111
|
-
private onFocusChange: ((element: HTMLElement, index: number) => void) | null;
|
|
112
|
-
|
|
113
|
-
constructor(
|
|
114
|
-
container?: HTMLElement,
|
|
115
|
-
focusableSelectors: string[] = [
|
|
116
|
-
'button:not([disabled])',
|
|
117
|
-
'input:not([disabled])',
|
|
118
|
-
'select:not([disabled])',
|
|
119
|
-
'textarea:not([disabled])',
|
|
120
|
-
'a[href]',
|
|
121
|
-
'[tabindex]:not([tabindex="-1"])',
|
|
122
|
-
'[contenteditable="true"]'
|
|
123
|
-
]
|
|
124
|
-
) {
|
|
125
|
-
this.container = container || null;
|
|
126
|
-
this.focusableSelectors = focusableSelectors;
|
|
127
|
-
this.currentFocusIndex = -1;
|
|
128
|
-
this.focusableElements = [];
|
|
129
|
-
this.onFocusChange = null;
|
|
130
|
-
|
|
131
|
-
this.updateFocusableElements();
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Set container element
|
|
135
|
-
setContainer(container: HTMLElement) {
|
|
136
|
-
this.container = container;
|
|
137
|
-
this.updateFocusableElements();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Update list of focusable elements
|
|
141
|
-
updateFocusableElements() {
|
|
142
|
-
if (!this.container) return;
|
|
143
|
-
|
|
144
|
-
this.focusableElements = Array.from(
|
|
145
|
-
this.container.querySelectorAll<HTMLElement>(this.focusableSelectors.join(','))
|
|
146
|
-
).filter(element => {
|
|
147
|
-
// Filter out hidden elements
|
|
148
|
-
const style = window.getComputedStyle(element);
|
|
149
|
-
return style.display !== 'none' && style.visibility !== 'hidden';
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
// Reset focus index
|
|
153
|
-
this.currentFocusIndex = -1;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Set focus change callback
|
|
157
|
-
onFocusChangeCallback(callback: (element: HTMLElement, index: number) => void) {
|
|
158
|
-
this.onFocusChange = callback;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Get current focusable elements
|
|
162
|
-
getFocusableElements(): HTMLElement[] {
|
|
163
|
-
return [...this.focusableElements];
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Get current focus index
|
|
167
|
-
getCurrentFocusIndex(): number {
|
|
168
|
-
return this.currentFocusIndex;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Focus first element
|
|
172
|
-
focusFirst(): boolean {
|
|
173
|
-
if (this.focusableElements.length === 0) return false;
|
|
174
|
-
|
|
175
|
-
this.currentFocusIndex = 0;
|
|
176
|
-
const element = this.focusableElements[0];
|
|
177
|
-
element.focus();
|
|
178
|
-
|
|
179
|
-
if (this.onFocusChange) {
|
|
180
|
-
this.onFocusChange(element, 0);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Focus last element
|
|
187
|
-
focusLast(): boolean {
|
|
188
|
-
if (this.focusableElements.length === 0) return false;
|
|
189
|
-
|
|
190
|
-
this.currentFocusIndex = this.focusableElements.length - 1;
|
|
191
|
-
const element = this.focusableElements[this.currentFocusIndex];
|
|
192
|
-
element.focus();
|
|
193
|
-
|
|
194
|
-
if (this.onFocusChange) {
|
|
195
|
-
this.onFocusChange(element, this.currentFocusIndex);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Focus next element
|
|
202
|
-
focusNext(): boolean {
|
|
203
|
-
if (this.focusableElements.length === 0) return false;
|
|
204
|
-
|
|
205
|
-
const nextIndex = (this.currentFocusIndex + 1) % this.focusableElements.length;
|
|
206
|
-
this.currentFocusIndex = nextIndex;
|
|
207
|
-
const element = this.focusableElements[nextIndex];
|
|
208
|
-
element.focus();
|
|
209
|
-
|
|
210
|
-
if (this.onFocusChange) {
|
|
211
|
-
this.onFocusChange(element, nextIndex);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
return true;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Focus previous element
|
|
218
|
-
focusPrevious(): boolean {
|
|
219
|
-
if (this.focusableElements.length === 0) return false;
|
|
220
|
-
|
|
221
|
-
const prevIndex = this.currentFocusIndex <= 0
|
|
222
|
-
? this.focusableElements.length - 1
|
|
223
|
-
: this.currentFocusIndex - 1;
|
|
224
|
-
this.currentFocusIndex = prevIndex;
|
|
225
|
-
const element = this.focusableElements[prevIndex];
|
|
226
|
-
element.focus();
|
|
227
|
-
|
|
228
|
-
if (this.onFocusChange) {
|
|
229
|
-
this.onFocusChange(element, prevIndex);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Focus element by index
|
|
236
|
-
focusByIndex(index: number): boolean {
|
|
237
|
-
if (index < 0 || index >= this.focusableElements.length) return false;
|
|
238
|
-
|
|
239
|
-
this.currentFocusIndex = index;
|
|
240
|
-
const element = this.focusableElements[index];
|
|
241
|
-
element.focus();
|
|
242
|
-
|
|
243
|
-
if (this.onFocusChange) {
|
|
244
|
-
this.onFocusChange(element, index);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Focus element by ID
|
|
251
|
-
focusById(id: string): boolean {
|
|
252
|
-
const index = this.focusableElements.findIndex(element => element.id === id);
|
|
253
|
-
if (index === -1) return false;
|
|
254
|
-
|
|
255
|
-
return this.focusByIndex(index);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Focus element by data attribute
|
|
259
|
-
focusByDataAttribute(attribute: string, value: string): boolean {
|
|
260
|
-
const index = this.focusableElements.findIndex(
|
|
261
|
-
element => element.getAttribute(`data-${attribute}`) === value
|
|
262
|
-
);
|
|
263
|
-
if (index === -1) return false;
|
|
264
|
-
|
|
265
|
-
return this.focusByIndex(index);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Handle keyboard navigation
|
|
269
|
-
handleKeyDown(event: KeyboardEvent): boolean {
|
|
270
|
-
const key = event.key;
|
|
271
|
-
const isShift = event.shiftKey;
|
|
272
|
-
const isCtrl = event.ctrlKey;
|
|
273
|
-
|
|
274
|
-
// Handle Tab navigation
|
|
275
|
-
if (key === KEY_CODES.TAB) {
|
|
276
|
-
if (isShift) {
|
|
277
|
-
return this.focusPrevious();
|
|
278
|
-
} else {
|
|
279
|
-
return this.focusNext();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Handle arrow key navigation
|
|
284
|
-
if (key === KEY_CODES.ARROW_DOWN || key === KEY_CODES.ARROW_RIGHT) {
|
|
285
|
-
event.preventDefault();
|
|
286
|
-
return this.focusNext();
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
if (key === KEY_CODES.ARROW_UP || key === KEY_CODES.ARROW_LEFT) {
|
|
290
|
-
event.preventDefault();
|
|
291
|
-
return this.focusPrevious();
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Handle Home/End navigation
|
|
295
|
-
if (key === KEY_CODES.HOME) {
|
|
296
|
-
event.preventDefault();
|
|
297
|
-
if (isCtrl) {
|
|
298
|
-
return this.focusFirst();
|
|
299
|
-
}
|
|
300
|
-
return this.focusFirst();
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
if (key === KEY_CODES.END) {
|
|
304
|
-
event.preventDefault();
|
|
305
|
-
if (isCtrl) {
|
|
306
|
-
return this.focusLast();
|
|
307
|
-
}
|
|
308
|
-
return this.focusLast();
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Handle Page Up/Down navigation
|
|
312
|
-
if (key === KEY_CODES.PAGE_UP) {
|
|
313
|
-
event.preventDefault();
|
|
314
|
-
// Jump to previous page of elements
|
|
315
|
-
const pageSize = Math.max(1, Math.floor(this.focusableElements.length / 10));
|
|
316
|
-
const targetIndex = Math.max(0, this.currentFocusIndex - pageSize);
|
|
317
|
-
return this.focusByIndex(targetIndex);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
if (key === KEY_CODES.PAGE_DOWN) {
|
|
321
|
-
event.preventDefault();
|
|
322
|
-
// Jump to next page of elements
|
|
323
|
-
const pageSize = Math.max(1, Math.floor(this.focusableElements.length / 10));
|
|
324
|
-
const targetIndex = Math.min(
|
|
325
|
-
this.focusableElements.length - 1,
|
|
326
|
-
this.currentFocusIndex + pageSize
|
|
327
|
-
);
|
|
328
|
-
return this.focusByIndex(targetIndex);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Handle Enter/Space for selection
|
|
332
|
-
if (key === KEY_CODES.ENTER || key === KEY_CODES.SPACE) {
|
|
333
|
-
if (this.currentFocusIndex >= 0) {
|
|
334
|
-
const element = this.focusableElements[this.currentFocusIndex];
|
|
335
|
-
// Trigger click or submit event
|
|
336
|
-
if (element.tagName === 'BUTTON' || element.tagName === 'A') {
|
|
337
|
-
element.click();
|
|
338
|
-
return true;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// Handle Escape for closing/canceling
|
|
344
|
-
if (key === KEY_CODES.ESCAPE) {
|
|
345
|
-
// This could trigger a close action depending on context
|
|
346
|
-
return false;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// Trap focus within container (for modals, etc.)
|
|
353
|
-
trapFocus(): void {
|
|
354
|
-
if (!this.container) return;
|
|
355
|
-
|
|
356
|
-
// Focus first element initially
|
|
357
|
-
this.focusFirst();
|
|
358
|
-
|
|
359
|
-
// Add event listener for focus trapping
|
|
360
|
-
const handleFocus = (event: FocusEvent) => {
|
|
361
|
-
const target = event.target as HTMLElement;
|
|
362
|
-
|
|
363
|
-
// If focus is outside the container, move it back
|
|
364
|
-
if (!this.container?.contains(target)) {
|
|
365
|
-
if (this.focusableElements.length > 0) {
|
|
366
|
-
this.focusFirst();
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
this.container.addEventListener('focusin', handleFocus);
|
|
372
|
-
|
|
373
|
-
// Store cleanup function
|
|
374
|
-
(this.container as any)._focusTrapCleanup = () => {
|
|
375
|
-
this.container?.removeEventListener('focusin', handleFocus);
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
// Release focus trap
|
|
380
|
-
releaseFocusTrap(): void {
|
|
381
|
-
if (this.container && (this.container as any)._focusTrapCleanup) {
|
|
382
|
-
(this.container as any)._focusTrapCleanup();
|
|
383
|
-
delete (this.container as any)._focusTrapCleanup;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Restore focus to previously focused element
|
|
388
|
-
restoreFocus(): void {
|
|
389
|
-
if (this.currentFocusIndex >= 0 && this.currentFocusIndex < this.focusableElements.length) {
|
|
390
|
-
this.focusableElements[this.currentFocusIndex].focus();
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Get keyboard shortcuts for accessibility
|
|
395
|
-
getKeyboardShortcuts(): Record<string, string> {
|
|
396
|
-
return {
|
|
397
|
-
'Navigate Next': 'Tab or Arrow Down/Right',
|
|
398
|
-
'Navigate Previous': 'Shift+Tab or Arrow Up/Left',
|
|
399
|
-
'Navigate First': 'Home',
|
|
400
|
-
'Navigate Last': 'End',
|
|
401
|
-
'Navigate Page Up': 'Page Up',
|
|
402
|
-
'Navigate Page Down': 'Page Down',
|
|
403
|
-
'Select/Activate': 'Enter or Space',
|
|
404
|
-
'Close/Cancel': 'Escape'
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// Validate keyboard navigation
|
|
409
|
-
validateNavigation(): boolean {
|
|
410
|
-
if (this.focusableElements.length === 0) {
|
|
411
|
-
console.warn('No focusable elements found in container');
|
|
412
|
-
return false;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
// Check if all focusable elements have proper tabindex
|
|
416
|
-
const invalidElements = this.focusableElements.filter(element => {
|
|
417
|
-
const tabindex = element.getAttribute('tabindex');
|
|
418
|
-
return tabindex === null || tabindex === '';
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
if (invalidElements.length > 0) {
|
|
422
|
-
console.warn('Some focusable elements lack proper tabindex:', invalidElements);
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
return true;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
// Focus management utilities
|
|
431
|
-
export class KeyboardFocusManager {
|
|
432
|
-
private previousActiveElement: Element | null;
|
|
433
|
-
private focusableSelectors: string[];
|
|
434
|
-
|
|
435
|
-
constructor(focusableSelectors: string[] = [
|
|
436
|
-
'button:not([disabled])',
|
|
437
|
-
'input:not([disabled])',
|
|
438
|
-
'select:not([disabled])',
|
|
439
|
-
'textarea:not([disabled])',
|
|
440
|
-
'a[href]',
|
|
441
|
-
'[tabindex]:not([tabindex="-1"])',
|
|
442
|
-
'[contenteditable="true"]'
|
|
443
|
-
]) {
|
|
444
|
-
this.previousActiveElement = null;
|
|
445
|
-
this.focusableSelectors = focusableSelectors;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
// Store current active element
|
|
449
|
-
storeActiveElement(): void {
|
|
450
|
-
this.previousActiveElement = document.activeElement;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// Restore previously active element
|
|
454
|
-
restoreActiveElement(): boolean {
|
|
455
|
-
if (this.previousActiveElement && this.previousActiveElement instanceof HTMLElement) {
|
|
456
|
-
this.previousActiveElement.focus();
|
|
457
|
-
return true;
|
|
458
|
-
}
|
|
459
|
-
return false;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// Get all focusable elements in a container
|
|
463
|
-
getFocusableElements(container: HTMLElement): HTMLElement[] {
|
|
464
|
-
return Array.from(
|
|
465
|
-
container.querySelectorAll<HTMLElement>(this.focusableSelectors.join(','))
|
|
466
|
-
).filter(element => {
|
|
467
|
-
const style = window.getComputedStyle(element);
|
|
468
|
-
return style.display !== 'none' && style.visibility !== 'hidden';
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// Focus first focusable element in container
|
|
473
|
-
focusFirst(container: HTMLElement): boolean {
|
|
474
|
-
const focusableElements = this.getFocusableElements(container);
|
|
475
|
-
if (focusableElements.length === 0) return false;
|
|
476
|
-
|
|
477
|
-
focusableElements[0].focus();
|
|
478
|
-
return true;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// Focus last focusable element in container
|
|
482
|
-
focusLast(container: HTMLElement): boolean {
|
|
483
|
-
const focusableElements = this.getFocusableElements(container);
|
|
484
|
-
if (focusableElements.length === 0) return false;
|
|
485
|
-
|
|
486
|
-
focusableElements[focusableElements.length - 1].focus();
|
|
487
|
-
return true;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
// Check if element is focusable
|
|
491
|
-
isFocusable(element: HTMLElement): boolean {
|
|
492
|
-
// Check if element matches focusable selectors
|
|
493
|
-
const isSelectorMatch = this.focusableSelectors.some(selector => {
|
|
494
|
-
try {
|
|
495
|
-
return element.matches(selector);
|
|
496
|
-
} catch {
|
|
497
|
-
return false;
|
|
498
|
-
}
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
if (!isSelectorMatch) return false;
|
|
502
|
-
|
|
503
|
-
// Check if element is visible
|
|
504
|
-
const style = window.getComputedStyle(element);
|
|
505
|
-
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
506
|
-
|
|
507
|
-
// Check if element is not disabled
|
|
508
|
-
if (element.hasAttribute('disabled')) return false;
|
|
509
|
-
|
|
510
|
-
return true;
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
// Get next focusable element
|
|
514
|
-
getNextFocusableElement(currentElement: HTMLElement, container: HTMLElement): HTMLElement | null {
|
|
515
|
-
const focusableElements = this.getFocusableElements(container);
|
|
516
|
-
const currentIndex = focusableElements.indexOf(currentElement);
|
|
517
|
-
|
|
518
|
-
if (currentIndex === -1 || currentIndex === focusableElements.length - 1) {
|
|
519
|
-
return focusableElements[0] || null;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
return focusableElements[currentIndex + 1];
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
// Get previous focusable element
|
|
526
|
-
getPreviousFocusableElement(currentElement: HTMLElement, container: HTMLElement): HTMLElement | null {
|
|
527
|
-
const focusableElements = this.getFocusableElements(container);
|
|
528
|
-
const currentIndex = focusableElements.indexOf(currentElement);
|
|
529
|
-
|
|
530
|
-
if (currentIndex === -1 || currentIndex === 0) {
|
|
531
|
-
return focusableElements[focusableElements.length - 1] || null;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
return focusableElements[currentIndex - 1];
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
// Export default instances
|
|
539
|
-
export declare const keyboardNavigationManager: new KeyboardNavigationManager();
|
|
540
|
-
export declare const focusManager: new KeyboardFocusManager();
|
|
541
|
-
|
|
542
|
-
// Export default
|
|
543
|
-
export default {
|
|
544
|
-
KeyboardNavigationManager,
|
|
545
|
-
KeyboardFocusManager,
|
|
546
|
-
KEY_CODES,
|
|
547
|
-
NAVIGATION_PATTERNS,
|
|
548
|
-
keyboardNavigationManager,
|
|
549
|
-
focusManager
|
|
550
|
-
};
|