@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.d.ts +259 -0
- package/dist/components/ui/accessibility-demo.esm.js +265 -0
- package/dist/components/ui/accessibility-demo.js +265 -0
- package/dist/components/ui/advanced-component-architecture-demo.d.ts +718 -0
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +860 -0
- package/dist/components/ui/advanced-component-architecture-demo.js +860 -0
- package/dist/components/ui/advanced-transition-system-demo.d.ts +660 -0
- package/dist/components/ui/advanced-transition-system-demo.esm.js +624 -0
- package/dist/components/ui/advanced-transition-system-demo.js +624 -0
- package/dist/components/ui/advanced-transition-system.d.ts +391 -0
- package/dist/components/ui/advanced-transition-system.esm.js +351 -0
- package/dist/components/ui/advanced-transition-system.js +351 -0
- package/dist/components/ui/animation/animated-container.d.ts +162 -0
- package/dist/components/ui/animation/animated-container.esm.js +143 -0
- package/dist/components/ui/animation/animated-container.js +143 -0
- package/dist/components/ui/animation/index.d.ts +9 -0
- package/dist/components/ui/animation/index.esm.js +19 -0
- package/dist/components/ui/animation/index.js +19 -0
- package/dist/components/ui/animation/staggered-container.d.ts +64 -0
- package/dist/components/ui/animation/staggered-container.esm.js +59 -0
- package/dist/components/ui/animation/staggered-container.js +59 -0
- package/dist/components/ui/animation-demo.d.ts +238 -0
- package/dist/components/ui/animation-demo.esm.js +218 -0
- package/dist/components/ui/animation-demo.js +218 -0
- package/dist/components/ui/badge.d.ts +28 -0
- package/dist/components/ui/badge.esm.js +30 -0
- package/dist/components/ui/badge.js +30 -0
- package/dist/components/ui/battery-conscious-animation-demo.d.ts +561 -0
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +533 -0
- package/dist/components/ui/battery-conscious-animation-demo.js +533 -0
- package/dist/components/ui/border-radius-shadow-demo.d.ts +183 -0
- package/dist/components/ui/border-radius-shadow-demo.esm.js +176 -0
- package/dist/components/ui/border-radius-shadow-demo.js +176 -0
- package/dist/components/ui/button.d.ts +33 -0
- package/dist/components/ui/button.esm.js +30 -0
- package/dist/components/ui/button.js +30 -0
- package/dist/components/ui/card.d.ts +205 -0
- package/dist/components/ui/card.esm.js +182 -0
- package/dist/components/ui/card.js +182 -0
- package/dist/components/ui/checkbox.d.ts +26 -0
- package/dist/components/ui/checkbox.esm.js +30 -0
- package/dist/components/ui/checkbox.js +30 -0
- package/dist/components/ui/color-preview.d.ts +402 -0
- package/dist/components/ui/color-preview.esm.js +388 -0
- package/dist/components/ui/color-preview.js +388 -0
- package/dist/components/ui/data-display/chart.d.ts +646 -0
- package/dist/components/ui/data-display/chart.esm.js +625 -0
- package/dist/components/ui/data-display/chart.js +625 -0
- package/dist/components/ui/data-display/data-grid-simple.d.ts +73 -0
- package/dist/components/ui/data-display/data-grid-simple.esm.js +76 -0
- package/dist/components/ui/data-display/data-grid-simple.js +76 -0
- package/dist/components/ui/data-display/data-grid.d.ts +670 -0
- package/dist/components/ui/data-display/data-grid.esm.js +667 -0
- package/dist/components/ui/data-display/data-grid.js +667 -0
- package/dist/components/ui/data-display/list.d.ts +448 -0
- package/dist/components/ui/data-display/list.esm.js +448 -0
- package/dist/components/ui/data-display/list.js +448 -0
- package/dist/components/ui/data-display/table.d.ts +472 -0
- package/dist/components/ui/data-display/table.esm.js +474 -0
- package/dist/components/ui/data-display/table.js +474 -0
- package/dist/components/ui/data-display/timeline.d.ts +433 -0
- package/dist/components/ui/data-display/timeline.esm.js +436 -0
- package/dist/components/ui/data-display/timeline.js +436 -0
- package/dist/components/ui/data-display/tree.d.ts +594 -0
- package/dist/components/ui/data-display/tree.esm.js +570 -0
- package/dist/components/ui/data-display/tree.js +570 -0
- package/dist/components/ui/data-display/types.d.ts +534 -0
- package/dist/components/ui/data-display/types.esm.js +511 -0
- package/dist/components/ui/data-display/types.js +511 -0
- package/dist/components/ui/enterprise-mobile-experience-demo.d.ts +735 -0
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +699 -0
- package/dist/components/ui/enterprise-mobile-experience-demo.js +699 -0
- package/dist/components/ui/enterprise-mobile-experience.d.ts +461 -0
- package/dist/components/ui/enterprise-mobile-experience.esm.js +413 -0
- package/dist/components/ui/enterprise-mobile-experience.js +413 -0
- package/dist/components/ui/feedback/alert.d.ts +154 -0
- package/dist/components/ui/feedback/alert.esm.js +150 -0
- package/dist/components/ui/feedback/alert.js +150 -0
- package/dist/components/ui/feedback/progress.d.ts +288 -0
- package/dist/components/ui/feedback/progress.esm.js +269 -0
- package/dist/components/ui/feedback/progress.js +269 -0
- package/dist/components/ui/feedback/skeleton.d.ts +182 -0
- package/dist/components/ui/feedback/skeleton.esm.js +175 -0
- package/dist/components/ui/feedback/skeleton.js +175 -0
- package/dist/components/ui/feedback/toast.d.ts +277 -0
- package/dist/components/ui/feedback/toast.esm.js +256 -0
- package/dist/components/ui/feedback/toast.js +256 -0
- package/dist/components/ui/feedback/types.d.ts +123 -0
- package/dist/components/ui/feedback/types.esm.js +125 -0
- package/dist/components/ui/feedback/types.js +125 -0
- package/dist/components/ui/font-preview.d.ts +282 -0
- package/dist/components/ui/font-preview.esm.js +286 -0
- package/dist/components/ui/font-preview.js +286 -0
- package/dist/components/ui/form-demo.d.ts +544 -0
- package/dist/components/ui/form-demo.esm.js +516 -0
- package/dist/components/ui/form-demo.js +516 -0
- package/dist/components/ui/hardware-acceleration-demo.d.ts +540 -0
- package/dist/components/ui/hardware-acceleration-demo.esm.js +497 -0
- package/dist/components/ui/hardware-acceleration-demo.js +497 -0
- package/dist/components/ui/input.d.ts +33 -0
- package/dist/components/ui/input.esm.js +32 -0
- package/dist/components/ui/input.js +32 -0
- package/dist/components/ui/label.d.ts +13 -0
- package/dist/components/ui/label.esm.js +16 -0
- package/dist/components/ui/label.js +16 -0
- package/dist/components/ui/layout-demo.d.ts +352 -0
- package/dist/components/ui/layout-demo.esm.js +342 -0
- package/dist/components/ui/layout-demo.js +342 -0
- package/dist/components/ui/layouts/adaptive-layout.d.ts +132 -0
- package/dist/components/ui/layouts/adaptive-layout.esm.js +120 -0
- package/dist/components/ui/layouts/adaptive-layout.js +120 -0
- package/dist/components/ui/layouts/desktop-layout.d.ts +219 -0
- package/dist/components/ui/layouts/desktop-layout.esm.js +204 -0
- package/dist/components/ui/layouts/desktop-layout.js +204 -0
- package/dist/components/ui/layouts/index.d.ts +5 -0
- package/dist/components/ui/layouts/index.esm.js +10 -0
- package/dist/components/ui/layouts/index.js +10 -0
- package/dist/components/ui/layouts/mobile-layout.d.ts +158 -0
- package/dist/components/ui/layouts/mobile-layout.esm.js +152 -0
- package/dist/components/ui/layouts/mobile-layout.js +152 -0
- package/dist/components/ui/layouts/tablet-layout.d.ts +192 -0
- package/dist/components/ui/layouts/tablet-layout.esm.js +183 -0
- package/dist/components/ui/layouts/tablet-layout.js +183 -0
- package/dist/components/ui/mobile-form-validation.d.ts +439 -0
- package/dist/components/ui/mobile-form-validation.esm.js +418 -0
- package/dist/components/ui/mobile-form-validation.js +418 -0
- package/dist/components/ui/mobile-input-demo.d.ts +197 -0
- package/dist/components/ui/mobile-input-demo.esm.js +195 -0
- package/dist/components/ui/mobile-input-demo.js +195 -0
- package/dist/components/ui/mobile-input.d.ts +273 -0
- package/dist/components/ui/mobile-input.esm.js +216 -0
- package/dist/components/ui/mobile-input.js +216 -0
- package/dist/components/ui/mobile-skeleton-loading-demo.d.ts +628 -0
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +621 -0
- package/dist/components/ui/mobile-skeleton-loading-demo.js +621 -0
- package/dist/components/ui/navigation/breadcrumb.d.ts +149 -0
- package/dist/components/ui/navigation/breadcrumb.esm.js +155 -0
- package/dist/components/ui/navigation/breadcrumb.js +155 -0
- package/dist/components/ui/navigation/index.d.ts +25 -0
- package/dist/components/ui/navigation/index.esm.js +14 -0
- package/dist/components/ui/navigation/index.js +14 -0
- package/dist/components/ui/navigation/menu.d.ts +366 -0
- package/dist/components/ui/navigation/menu.esm.js +360 -0
- package/dist/components/ui/navigation/menu.js +360 -0
- package/dist/components/ui/navigation/navigation-demo.d.ts +169 -0
- package/dist/components/ui/navigation/navigation-demo.esm.js +317 -0
- package/dist/components/ui/navigation/navigation-demo.js +317 -0
- package/dist/components/ui/navigation/pagination.d.ts +261 -0
- package/dist/components/ui/navigation/pagination.esm.js +260 -0
- package/dist/components/ui/navigation/pagination.js +260 -0
- package/dist/components/ui/navigation/sidebar.d.ts +375 -0
- package/dist/components/ui/navigation/sidebar.esm.js +369 -0
- package/dist/components/ui/navigation/sidebar.js +369 -0
- package/dist/components/ui/navigation/stepper.d.ts +294 -0
- package/dist/components/ui/navigation/stepper.esm.js +292 -0
- package/dist/components/ui/navigation/stepper.js +292 -0
- package/dist/components/ui/navigation/tabs.d.ts +196 -0
- package/dist/components/ui/navigation/tabs.esm.js +194 -0
- package/dist/components/ui/navigation/tabs.js +194 -0
- package/dist/components/ui/navigation/types.d.ts +293 -0
- package/dist/components/ui/navigation/types.esm.js +298 -0
- package/dist/components/ui/navigation/types.js +298 -0
- package/dist/components/ui/overlay/backdrop.d.ts +79 -0
- package/dist/components/ui/overlay/backdrop.esm.js +80 -0
- package/dist/components/ui/overlay/backdrop.js +80 -0
- package/dist/components/ui/overlay/focus-manager.d.ts +141 -0
- package/dist/components/ui/overlay/focus-manager.esm.js +141 -0
- package/dist/components/ui/overlay/focus-manager.js +141 -0
- package/dist/components/ui/overlay/index.d.ts +27 -0
- package/dist/components/ui/overlay/index.esm.js +16 -0
- package/dist/components/ui/overlay/index.js +16 -0
- package/dist/components/ui/overlay/modal.d.ts +262 -0
- package/dist/components/ui/overlay/modal.esm.js +266 -0
- package/dist/components/ui/overlay/modal.js +266 -0
- package/dist/components/ui/overlay/overlay-manager.d.ts +107 -0
- package/dist/components/ui/overlay/overlay-manager.esm.js +105 -0
- package/dist/components/ui/overlay/overlay-manager.js +105 -0
- package/dist/components/ui/overlay/popover.d.ts +450 -0
- package/dist/components/ui/overlay/popover.esm.js +446 -0
- package/dist/components/ui/overlay/popover.js +446 -0
- package/dist/components/ui/overlay/portal.d.ts +75 -0
- package/dist/components/ui/overlay/portal.esm.js +79 -0
- package/dist/components/ui/overlay/portal.js +79 -0
- package/dist/components/ui/overlay/tooltip.d.ts +298 -0
- package/dist/components/ui/overlay/tooltip.esm.js +288 -0
- package/dist/components/ui/overlay/tooltip.js +288 -0
- package/dist/components/ui/overlay/types.d.ts +194 -0
- package/dist/components/ui/overlay/types.esm.js +195 -0
- package/dist/components/ui/overlay/types.js +195 -0
- package/dist/components/ui/performance-demo.d.ts +583 -0
- package/dist/components/ui/performance-demo.esm.js +549 -0
- package/dist/components/ui/performance-demo.js +549 -0
- package/dist/components/ui/semantic-input-system-demo.d.ts +490 -0
- package/dist/components/ui/semantic-input-system-demo.esm.js +465 -0
- package/dist/components/ui/semantic-input-system-demo.js +465 -0
- package/dist/components/ui/theme-customizer.d.ts +378 -0
- package/dist/components/ui/theme-customizer.esm.js +354 -0
- package/dist/components/ui/theme-customizer.js +354 -0
- package/dist/components/ui/theme-preview.d.ts +305 -0
- package/dist/components/ui/theme-preview.esm.js +258 -0
- package/dist/components/ui/theme-preview.js +258 -0
- package/dist/components/ui/theme-switcher.d.ts +259 -0
- package/dist/components/ui/theme-switcher.esm.js +238 -0
- package/dist/components/ui/theme-switcher.js +238 -0
- package/dist/components/ui/theme-toggle.d.ts +34 -0
- package/dist/components/ui/theme-toggle.esm.js +38 -0
- package/dist/components/ui/theme-toggle.js +38 -0
- package/dist/components/ui/token-demo.d.ts +188 -0
- package/dist/components/ui/token-demo.esm.js +183 -0
- package/dist/components/ui/token-demo.js +183 -0
- package/dist/components/ui/touch-demo.d.ts +455 -0
- package/dist/components/ui/touch-demo.esm.js +433 -0
- package/dist/components/ui/touch-demo.js +433 -0
- package/dist/components/ui/touch-friendly-interface-demo.d.ts +512 -0
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +481 -0
- package/dist/components/ui/touch-friendly-interface-demo.js +481 -0
- package/dist/components/ui/touch-friendly-interface.d.ts +292 -0
- package/dist/components/ui/touch-friendly-interface.esm.js +272 -0
- package/dist/components/ui/touch-friendly-interface.js +272 -0
- package/dist/hooks/index.d.ts +161 -0
- package/dist/hooks/index.esm.js +190 -0
- package/dist/hooks/index.js +190 -0
- package/dist/hooks/use-accessibility-support.d.ts +516 -0
- package/dist/hooks/use-accessibility-support.esm.js +488 -0
- package/dist/hooks/use-accessibility-support.js +488 -0
- package/dist/hooks/use-adaptive-layout.d.ts +287 -0
- package/dist/hooks/use-adaptive-layout.esm.js +266 -0
- package/dist/hooks/use-adaptive-layout.js +266 -0
- package/dist/hooks/use-advanced-patterns.d.ts +292 -0
- package/dist/hooks/use-advanced-patterns.esm.js +279 -0
- package/dist/hooks/use-advanced-patterns.js +279 -0
- package/dist/hooks/use-advanced-transition-system.d.ts +390 -0
- package/dist/hooks/use-advanced-transition-system.esm.js +352 -0
- package/dist/hooks/use-advanced-transition-system.js +352 -0
- package/dist/hooks/use-animation-profile.d.ts +285 -0
- package/dist/hooks/use-animation-profile.esm.js +259 -0
- package/dist/hooks/use-animation-profile.js +259 -0
- package/dist/hooks/use-battery-animations.d.ts +382 -0
- package/dist/hooks/use-battery-animations.esm.js +359 -0
- package/dist/hooks/use-battery-animations.js +359 -0
- package/dist/hooks/use-battery-conscious-loading.d.ts +473 -0
- package/dist/hooks/use-battery-conscious-loading.esm.js +432 -0
- package/dist/hooks/use-battery-conscious-loading.js +432 -0
- package/dist/hooks/use-battery-optimization.d.ts +328 -0
- package/dist/hooks/use-battery-optimization.esm.js +307 -0
- package/dist/hooks/use-battery-optimization.js +307 -0
- package/dist/hooks/use-battery-status.d.ts +297 -0
- package/dist/hooks/use-battery-status.esm.js +277 -0
- package/dist/hooks/use-battery-status.js +277 -0
- package/dist/hooks/use-component-performance.d.ts +342 -0
- package/dist/hooks/use-component-performance.esm.js +329 -0
- package/dist/hooks/use-component-performance.js +329 -0
- package/dist/hooks/use-device-loading-states.d.ts +456 -0
- package/dist/hooks/use-device-loading-states.esm.js +416 -0
- package/dist/hooks/use-device-loading-states.js +416 -0
- package/dist/hooks/use-device.d.ts +104 -0
- package/dist/hooks/use-device.esm.js +99 -0
- package/dist/hooks/use-device.js +99 -0
- package/dist/hooks/use-enterprise-mobile-experience.d.ts +486 -0
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +439 -0
- package/dist/hooks/use-enterprise-mobile-experience.js +439 -0
- package/dist/hooks/use-form-feedback.d.ts +401 -0
- package/dist/hooks/use-form-feedback.esm.js +360 -0
- package/dist/hooks/use-form-feedback.js +360 -0
- package/dist/hooks/use-form-performance.d.ts +511 -0
- package/dist/hooks/use-form-performance.esm.js +478 -0
- package/dist/hooks/use-form-performance.js +478 -0
- package/dist/hooks/use-frame-rate.d.ts +249 -0
- package/dist/hooks/use-frame-rate.esm.js +232 -0
- package/dist/hooks/use-frame-rate.js +232 -0
- package/dist/hooks/use-gestures.d.ts +336 -0
- package/dist/hooks/use-gestures.esm.js +314 -0
- package/dist/hooks/use-gestures.js +314 -0
- package/dist/hooks/use-hardware-acceleration.d.ts +339 -0
- package/dist/hooks/use-hardware-acceleration.esm.js +313 -0
- package/dist/hooks/use-hardware-acceleration.js +313 -0
- package/dist/hooks/use-input-accessibility.d.ts +451 -0
- package/dist/hooks/use-input-accessibility.esm.js +417 -0
- package/dist/hooks/use-input-accessibility.js +417 -0
- package/dist/hooks/use-input-performance.d.ts +503 -0
- package/dist/hooks/use-input-performance.esm.js +471 -0
- package/dist/hooks/use-input-performance.js +471 -0
- package/dist/hooks/use-layout-performance.d.ts +317 -0
- package/dist/hooks/use-layout-performance.esm.js +298 -0
- package/dist/hooks/use-layout-performance.js +298 -0
- package/dist/hooks/use-loading-accessibility.d.ts +532 -0
- package/dist/hooks/use-loading-accessibility.esm.js +495 -0
- package/dist/hooks/use-loading-accessibility.js +495 -0
- package/dist/hooks/use-loading-performance.d.ts +471 -0
- package/dist/hooks/use-loading-performance.esm.js +449 -0
- package/dist/hooks/use-loading-performance.js +449 -0
- package/dist/hooks/use-memory-usage.d.ts +285 -0
- package/dist/hooks/use-memory-usage.esm.js +268 -0
- package/dist/hooks/use-memory-usage.js +268 -0
- package/dist/hooks/use-mobile-form-layout.d.ts +462 -0
- package/dist/hooks/use-mobile-form-layout.esm.js +427 -0
- package/dist/hooks/use-mobile-form-layout.js +427 -0
- package/dist/hooks/use-mobile-form-validation.d.ts +516 -0
- package/dist/hooks/use-mobile-form-validation.esm.js +451 -0
- package/dist/hooks/use-mobile-form-validation.js +451 -0
- package/dist/hooks/use-mobile-keyboard-optimization.d.ts +469 -0
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +431 -0
- package/dist/hooks/use-mobile-keyboard-optimization.js +431 -0
- package/dist/hooks/use-mobile-layout.d.ts +300 -0
- package/dist/hooks/use-mobile-layout.esm.js +280 -0
- package/dist/hooks/use-mobile-layout.js +280 -0
- package/dist/hooks/use-mobile-optimization.d.ts +404 -0
- package/dist/hooks/use-mobile-optimization.esm.js +378 -0
- package/dist/hooks/use-mobile-optimization.js +378 -0
- package/dist/hooks/use-mobile-skeleton.d.ts +399 -0
- package/dist/hooks/use-mobile-skeleton.esm.js +369 -0
- package/dist/hooks/use-mobile-skeleton.js +369 -0
- package/dist/hooks/use-mobile-touch.d.ts +412 -0
- package/dist/hooks/use-mobile-touch.esm.js +379 -0
- package/dist/hooks/use-mobile-touch.js +379 -0
- package/dist/hooks/use-performance-throttling.d.ts +346 -0
- package/dist/hooks/use-performance-throttling.esm.js +324 -0
- package/dist/hooks/use-performance-throttling.js +324 -0
- package/dist/hooks/use-performance.d.ts +314 -0
- package/dist/hooks/use-performance.esm.js +278 -0
- package/dist/hooks/use-performance.js +278 -0
- package/dist/hooks/use-reusable-architecture.d.ts +412 -0
- package/dist/hooks/use-reusable-architecture.esm.js +385 -0
- package/dist/hooks/use-reusable-architecture.js +385 -0
- package/dist/hooks/use-semantic-input-types.d.ts +354 -0
- package/dist/hooks/use-semantic-input-types.esm.js +315 -0
- package/dist/hooks/use-semantic-input-types.js +315 -0
- package/dist/hooks/use-semantic-input.d.ts +563 -0
- package/dist/hooks/use-semantic-input.esm.js +513 -0
- package/dist/hooks/use-semantic-input.js +513 -0
- package/dist/hooks/use-tablet-layout.d.ts +382 -0
- package/dist/hooks/use-tablet-layout.esm.js +355 -0
- package/dist/hooks/use-tablet-layout.js +355 -0
- package/dist/hooks/use-touch-friendly-input.d.ts +520 -0
- package/dist/hooks/use-touch-friendly-input.esm.js +480 -0
- package/dist/hooks/use-touch-friendly-input.js +480 -0
- package/dist/hooks/use-touch-friendly-interface.d.ts +329 -0
- package/dist/hooks/use-touch-friendly-interface.esm.js +299 -0
- package/dist/hooks/use-touch-friendly-interface.js +299 -0
- package/dist/hooks/use-touch-optimization.d.ts +373 -0
- package/dist/hooks/use-touch-optimization.esm.js +348 -0
- package/dist/hooks/use-touch-optimization.js +348 -0
- package/dist/index.esm.js +2 -2
- package/dist/index.js +2 -2
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.esm.js +6 -0
- package/dist/lib/utils.js +6 -0
- package/dist/plugins/theme-css-generator.d.ts +345 -0
- package/dist/plugins/theme-css-generator.esm.js +305 -0
- package/dist/plugins/theme-css-generator.js +305 -0
- package/dist/styles.css +1 -1
- package/dist/themes/ThemeContext.d.ts +27 -0
- package/dist/themes/ThemeContext.esm.js +31 -0
- package/dist/themes/ThemeContext.js +31 -0
- package/dist/themes/ThemeProvider.d.ts +222 -0
- package/dist/themes/ThemeProvider.esm.js +229 -0
- package/dist/themes/ThemeProvider.js +229 -0
- package/dist/themes/accessibility/index.d.ts +7 -0
- package/dist/themes/accessibility/index.esm.js +27 -0
- package/dist/themes/accessibility/index.js +27 -0
- package/dist/themes/accessibility.d.ts +259 -0
- package/dist/themes/accessibility.esm.js +220 -0
- package/dist/themes/accessibility.js +220 -0
- package/dist/themes/aria-patterns.d.ts +418 -0
- package/dist/themes/aria-patterns.esm.js +384 -0
- package/dist/themes/aria-patterns.js +384 -0
- package/dist/themes/base-themes.d.ts +34 -0
- package/dist/themes/base-themes.esm.js +52 -0
- package/dist/themes/base-themes.js +52 -0
- package/dist/themes/colorManager.d.ts +327 -0
- package/dist/themes/colorManager.esm.js +362 -0
- package/dist/themes/colorManager.js +362 -0
- package/dist/themes/examples/dark-theme.d.ts +139 -0
- package/dist/themes/examples/dark-theme.esm.js +124 -0
- package/dist/themes/examples/dark-theme.js +124 -0
- package/dist/themes/examples/minimal-theme.d.ts +93 -0
- package/dist/themes/examples/minimal-theme.esm.js +86 -0
- package/dist/themes/examples/minimal-theme.js +86 -0
- package/dist/themes/focus-management.d.ts +699 -0
- package/dist/themes/focus-management.esm.js +642 -0
- package/dist/themes/focus-management.js +642 -0
- package/dist/themes/fontLoader.d.ts +163 -0
- package/dist/themes/fontLoader.esm.js +192 -0
- package/dist/themes/fontLoader.js +192 -0
- package/dist/themes/high-contrast.d.ts +619 -0
- package/dist/themes/high-contrast.esm.js +573 -0
- package/dist/themes/high-contrast.js +573 -0
- package/dist/themes/index.d.ts +11 -0
- package/dist/themes/index.esm.js +19 -0
- package/dist/themes/index.js +19 -0
- package/dist/themes/inheritance.d.ts +160 -0
- package/dist/themes/inheritance.esm.js +219 -0
- package/dist/themes/inheritance.js +219 -0
- package/dist/themes/keyboard-navigation.d.ts +550 -0
- package/dist/themes/keyboard-navigation.esm.js +521 -0
- package/dist/themes/keyboard-navigation.js +521 -0
- package/dist/themes/motion-reduction.d.ts +660 -0
- package/dist/themes/motion-reduction.esm.js +602 -0
- package/dist/themes/motion-reduction.js +602 -0
- package/dist/themes/navigation.d.ts +232 -0
- package/dist/themes/navigation.esm.js +238 -0
- package/dist/themes/navigation.js +238 -0
- package/dist/themes/screen-reader.d.ts +645 -0
- package/dist/themes/screen-reader.esm.js +580 -0
- package/dist/themes/screen-reader.js +580 -0
- package/dist/themes/systemThemeDetector.d.ts +148 -0
- package/dist/themes/systemThemeDetector.esm.js +174 -0
- package/dist/themes/systemThemeDetector.js +174 -0
- package/dist/themes/themeCSSUpdater.d.ts +229 -0
- package/dist/themes/themeCSSUpdater.esm.js +250 -0
- package/dist/themes/themeCSSUpdater.js +250 -0
- package/dist/themes/themePersistence.d.ts +192 -0
- package/dist/themes/themePersistence.esm.js +217 -0
- package/dist/themes/themePersistence.js +217 -0
- package/dist/themes/themes/stan-design.d.ts +678 -0
- package/dist/themes/themes/stan-design.esm.js +518 -0
- package/dist/themes/themes/stan-design.js +518 -0
- package/dist/themes/types.d.ts +454 -0
- package/dist/themes/types.esm.js +446 -0
- package/dist/themes/types.js +446 -0
- package/dist/themes/useSystemTheme.d.ts +43 -0
- package/dist/themes/useSystemTheme.esm.js +48 -0
- package/dist/themes/useSystemTheme.js +48 -0
- package/dist/themes/useTheme.d.ts +20 -0
- package/dist/themes/useTheme.esm.js +87 -0
- package/dist/themes/useTheme.js +87 -0
- package/dist/themes/validation.d.ts +406 -0
- package/dist/themes/validation.esm.js +411 -0
- package/dist/themes/validation.js +411 -0
- package/dist/tokens/index.d.ts +25 -0
- package/dist/tokens/index.esm.js +23 -0
- package/dist/tokens/index.js +23 -0
- package/dist/tokens/tokenExporter.d.ts +336 -0
- package/dist/tokens/tokenExporter.esm.js +371 -0
- package/dist/tokens/tokenExporter.js +371 -0
- package/dist/tokens/tokenGenerator.d.ts +250 -0
- package/dist/tokens/tokenGenerator.esm.js +267 -0
- package/dist/tokens/tokenGenerator.js +267 -0
- package/dist/tokens/tokenManager.d.ts +194 -0
- package/dist/tokens/tokenManager.esm.js +235 -0
- package/dist/tokens/tokenManager.js +235 -0
- package/dist/tokens/tokenValidator.d.ts +488 -0
- package/dist/tokens/tokenValidator.esm.js +497 -0
- package/dist/tokens/tokenValidator.js +497 -0
- package/dist/tokens/types.d.ts +78 -0
- package/dist/tokens/types.esm.js +64 -0
- package/dist/tokens/types.js +64 -0
- package/dist/utils/bundle-analyzer.d.ts +260 -0
- package/dist/utils/bundle-analyzer.esm.js +242 -0
- package/dist/utils/bundle-analyzer.js +242 -0
- package/dist/utils/bundle-splitting.d.ts +483 -0
- package/dist/utils/bundle-splitting.esm.js +458 -0
- package/dist/utils/bundle-splitting.js +458 -0
- package/dist/utils/lazy-loading.d.ts +437 -0
- package/dist/utils/lazy-loading.esm.js +415 -0
- package/dist/utils/lazy-loading.js +415 -0
- package/dist/utils/performance-monitor.d.ts +513 -0
- package/dist/utils/performance-monitor.esm.js +472 -0
- package/dist/utils/performance-monitor.js +472 -0
- package/dist/utils/tree-shaking.d.ts +274 -0
- package/dist/utils/tree-shaking.esm.js +266 -0
- package/dist/utils/tree-shaking.js +266 -0
- package/package.json +1 -1
- package/src/index.ts +2 -2
- package/src/themes/accessibility/index.ts +1 -1
- package/src/themes/focus-management.ts +3 -3
- package/src/themes/keyboard-navigation.ts +3 -3
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
import { screenReaderOptimizer } from './screen-reader';
|
|
2
|
+
|
|
3
|
+
// Focus management utilities
|
|
4
|
+
export class AccessibilityFocusManager {
|
|
5
|
+
private focusableSelectors];
|
|
6
|
+
private focusableElements];
|
|
7
|
+
private lastFocusedElement;
|
|
8
|
+
private focusTraps, FocusTrap>;
|
|
9
|
+
private focusHistory];
|
|
10
|
+
private maxHistorySize;
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
this.focusableSelectors = [
|
|
14
|
+
'a[href]',
|
|
15
|
+
'button])',
|
|
16
|
+
'input])',
|
|
17
|
+
'select])',
|
|
18
|
+
'textarea])',
|
|
19
|
+
'[tabindex]="-1"])',
|
|
20
|
+
'[contenteditable="true"]',
|
|
21
|
+
'audio[controls]',
|
|
22
|
+
'video[controls]',
|
|
23
|
+
'iframe'
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
this.focusableElements = [];
|
|
27
|
+
this.lastFocusedElement = null;
|
|
28
|
+
this.focusTraps = new Map();
|
|
29
|
+
this.focusHistory = [];
|
|
30
|
+
this.maxHistorySize = 10;
|
|
31
|
+
|
|
32
|
+
this.initialize();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Initialize focus management
|
|
36
|
+
private initialize());
|
|
37
|
+
this.setupEventListeners();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Update list of focusable elements
|
|
41
|
+
private updateFocusableElements()= Array.from(
|
|
42
|
+
document.querySelectorAll(this.focusableSelectors.join(','))
|
|
43
|
+
) as HTMLElement[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Setup event listeners
|
|
47
|
+
private setupEventListeners(), this.handleFocusIn.bind(this));
|
|
48
|
+
document.addEventListener('focusout', this.handleFocusOut.bind(this));
|
|
49
|
+
|
|
50
|
+
// Handle tab key navigation
|
|
51
|
+
document.addEventListener('keydown', this.handleKeyDown.bind(this));
|
|
52
|
+
|
|
53
|
+
// Update focusable elements when DOM changes
|
|
54
|
+
const observer = new MutationObserver(() => {
|
|
55
|
+
this.updateFocusableElements();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
observer.observe(document.body, {
|
|
59
|
+
childList,
|
|
60
|
+
subtree});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Handle focus in events
|
|
64
|
+
private handleFocusIn(event)= event.target as HTMLElement;
|
|
65
|
+
|
|
66
|
+
if (target && target !== this.lastFocusedElement) {
|
|
67
|
+
// Add to focus history
|
|
68
|
+
this.addToFocusHistory(target);
|
|
69
|
+
|
|
70
|
+
// Update last focused element
|
|
71
|
+
this.lastFocusedElement = target;
|
|
72
|
+
|
|
73
|
+
// Announce focus change for screen readers
|
|
74
|
+
if (screenReaderOptimizer) {
|
|
75
|
+
screenReaderOptimizer.announceFocusChange(
|
|
76
|
+
this.getElementDescription(target),
|
|
77
|
+
this.getElementContext(target)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Handle focus out events
|
|
84
|
+
private handleFocusOut(_event)}
|
|
85
|
+
|
|
86
|
+
// Handle key down events
|
|
87
|
+
private handleKeyDown(event)=== 'Tab') {
|
|
88
|
+
this.handleTabNavigation(event);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Handle tab navigation
|
|
93
|
+
private handleTabNavigation(event)= event.shiftKey;
|
|
94
|
+
const currentElement = event.target as HTMLElement;
|
|
95
|
+
|
|
96
|
+
// Check if we're in a focus trap
|
|
97
|
+
const activeTrap = this.getActiveFocusTrap(currentElement);
|
|
98
|
+
if (activeTrap) {
|
|
99
|
+
event.preventDefault();
|
|
100
|
+
this.navigateInFocusTrap(activeTrap, isShiftTab);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Normal tab navigation
|
|
105
|
+
this.navigateFocusableElements(isShiftTab);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Get active focus trap for element
|
|
109
|
+
private getActiveFocusTrap(element))) {
|
|
110
|
+
if (trap.isActive && trap.container.contains(element)) {
|
|
111
|
+
return trap;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Navigate within a focus trap
|
|
118
|
+
private navigateInFocusTrap(trap, isShiftTab)= trap.getFocusableElements();
|
|
119
|
+
if (focusableElements.length === 0) return;
|
|
120
|
+
|
|
121
|
+
const currentIndex = focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
122
|
+
let nextIndex;
|
|
123
|
+
|
|
124
|
+
if (isShiftTab) {
|
|
125
|
+
nextIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
126
|
+
} else {
|
|
127
|
+
nextIndex = currentIndex < focusableElements.length - 1 ? currentIndex + 1 ;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
focusableElements[nextIndex]?.focus();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Navigate focusable elements
|
|
134
|
+
private navigateFocusableElements(isShiftTab)= this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
135
|
+
let nextIndex;
|
|
136
|
+
|
|
137
|
+
if (isShiftTab) {
|
|
138
|
+
nextIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
139
|
+
} else {
|
|
140
|
+
nextIndex = currentIndex < this.focusableElements.length - 1 ? currentIndex + 1 ;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
this.focusableElements[nextIndex]?.focus();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Add element to focus history
|
|
147
|
+
private addToFocusHistory(element)= this.focusHistory.filter(el => el !== element);
|
|
148
|
+
|
|
149
|
+
// Add to beginning
|
|
150
|
+
this.focusHistory.unshift(element);
|
|
151
|
+
|
|
152
|
+
// Maintain history size
|
|
153
|
+
if (this.focusHistory.length > this.maxHistorySize) {
|
|
154
|
+
this.focusHistory.pop();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Get element description for screen readers
|
|
159
|
+
private getElementDescription(element)= element.getAttribute('aria-label');
|
|
160
|
+
if (ariaLabel) return ariaLabel;
|
|
161
|
+
|
|
162
|
+
const ariaLabelledBy = element.getAttribute('aria-labelledby');
|
|
163
|
+
if (ariaLabelledBy) {
|
|
164
|
+
const labelElement = document.getElementById(ariaLabelledBy);
|
|
165
|
+
if (labelElement) return labelElement.textContent || '';
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const placeholder = element.getAttribute('placeholder');
|
|
169
|
+
if (placeholder) return placeholder;
|
|
170
|
+
|
|
171
|
+
const title = element.getAttribute('title');
|
|
172
|
+
if (title) return title;
|
|
173
|
+
|
|
174
|
+
return element.textContent || element.tagName.toLowerCase();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Get element context for screen readers
|
|
178
|
+
private getElementContext(element)= element.closest('[role], section, article, aside, nav, header, footer, main');
|
|
179
|
+
if (landmark) {
|
|
180
|
+
const role = landmark.getAttribute('role');
|
|
181
|
+
const ariaLabel = landmark.getAttribute('aria-label');
|
|
182
|
+
return ariaLabel || role || landmark.tagName.toLowerCase();
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Create focus trap
|
|
188
|
+
createFocusTrap(container, options= {})= new FocusTrap(container, options);
|
|
189
|
+
this.focusTraps.set(trap.id, trap);
|
|
190
|
+
return trap;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Remove focus trap
|
|
194
|
+
removeFocusTrap(trapId)= this.focusTraps.get(trapId);
|
|
195
|
+
if (trap) {
|
|
196
|
+
trap.deactivate();
|
|
197
|
+
this.focusTraps.delete(trapId);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Focus first focusable element
|
|
202
|
+
focusFirst()= this.focusableElements[0];
|
|
203
|
+
if (firstElement) {
|
|
204
|
+
firstElement.focus();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Focus last focusable element
|
|
209
|
+
focusLast()= this.focusableElements[this.focusableElements.length - 1];
|
|
210
|
+
if (lastElement) {
|
|
211
|
+
lastElement.focus();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Focus next element
|
|
216
|
+
focusNext()= this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
217
|
+
const nextIndex = currentIndex < this.focusableElements.length - 1 ? currentIndex + 1 ;
|
|
218
|
+
this.focusableElements[nextIndex]?.focus();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Focus previous element
|
|
222
|
+
focusPrevious()= this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
223
|
+
const prevIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
224
|
+
this.focusableElements[prevIndex]?.focus();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Focus element by index
|
|
228
|
+
focusByIndex(index)= 0 && index < this.focusableElements.length) {
|
|
229
|
+
this.focusableElements[index].focus();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Focus element by ID
|
|
234
|
+
focusById(id)= document.getElementById(id);
|
|
235
|
+
if (element && this.focusableElements.includes(element)) {
|
|
236
|
+
element.focus();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Focus element by data attribute
|
|
241
|
+
focusByDataAttribute(attribute, value)= document.querySelector(`[data-${attribute}="${value}"]`) as HTMLElement;
|
|
242
|
+
if (element && this.focusableElements.includes(element)) {
|
|
243
|
+
element.focus();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Restore previous focus
|
|
248
|
+
restoreFocus()== null) {
|
|
249
|
+
this.lastFocusedElement.focus();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Get focus history
|
|
254
|
+
getFocusHistory()] {
|
|
255
|
+
return [...this.focusHistory];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Clear focus history
|
|
259
|
+
clearFocusHistory()= [];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Get current focus information
|
|
263
|
+
getCurrentFocusInfo();
|
|
264
|
+
index;
|
|
265
|
+
total;
|
|
266
|
+
context;
|
|
267
|
+
} {
|
|
268
|
+
const currentElement = document.activeElement as HTMLElement;
|
|
269
|
+
const index = this.focusableElements.indexOf(currentElement);
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
element,
|
|
273
|
+
index= 0 ? index ,
|
|
274
|
+
total,
|
|
275
|
+
context) };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Check if element is focusable
|
|
279
|
+
isFocusable(element));
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Get all focusable elements
|
|
283
|
+
getAllFocusableElements()] {
|
|
284
|
+
return [...this.focusableElements];
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Get focusable elements within container
|
|
288
|
+
getFocusableElementsInContainer(container)] {
|
|
289
|
+
return this.focusableElements.filter(element =>
|
|
290
|
+
container.contains(element)
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Update focusable elements manually
|
|
295
|
+
refreshFocusableElements());
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Destroy focus manager
|
|
299
|
+
destroy()=> trap.deactivate());
|
|
300
|
+
this.focusTraps.clear();
|
|
301
|
+
|
|
302
|
+
// Clear focus history
|
|
303
|
+
this.focusHistory = [];
|
|
304
|
+
|
|
305
|
+
// Remove event listeners
|
|
306
|
+
document.removeEventListener('focusin', this.handleFocusIn.bind(this));
|
|
307
|
+
document.removeEventListener('focusout', this.handleFocusOut.bind(this));
|
|
308
|
+
document.removeEventListener('keydown', this.handleKeyDown.bind(this));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Focus trap options
|
|
313
|
+
export interface FocusTrapOptions {
|
|
314
|
+
autoFocus?;
|
|
315
|
+
returnFocus?;
|
|
316
|
+
escapeDeactivates?;
|
|
317
|
+
clickOutsideDeactivates?;
|
|
318
|
+
allowOutsideClick?;
|
|
319
|
+
fallbackFocus?;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Focus trap class
|
|
323
|
+
export class FocusTrap {
|
|
324
|
+
public readonly id;
|
|
325
|
+
public readonly container;
|
|
326
|
+
public readonly options;
|
|
327
|
+
public isActive= false;
|
|
328
|
+
|
|
329
|
+
private returnFocusElement= null;
|
|
330
|
+
private focusableElements] = [];
|
|
331
|
+
private eventListeners; handler) => void }> = [];
|
|
332
|
+
|
|
333
|
+
constructor(container, options= {}) {
|
|
334
|
+
this.id = `focus-trap-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
335
|
+
this.container = container;
|
|
336
|
+
this.options = {
|
|
337
|
+
autoFocus,
|
|
338
|
+
returnFocus,
|
|
339
|
+
escapeDeactivates,
|
|
340
|
+
clickOutsideDeactivates,
|
|
341
|
+
allowOutsideClick,
|
|
342
|
+
fallbackFocus,
|
|
343
|
+
...options
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Activate focus trap
|
|
348
|
+
activate()) return;
|
|
349
|
+
|
|
350
|
+
// Store current focus for return
|
|
351
|
+
if (this.options.returnFocus) {
|
|
352
|
+
this.returnFocusElement = document.activeElement as HTMLElement;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Get focusable elements within container
|
|
356
|
+
this.focusableElements = this.getFocusableElements();
|
|
357
|
+
|
|
358
|
+
// Auto-focus first element or fallback
|
|
359
|
+
if (this.options.autoFocus && this.focusableElements.length > 0) {
|
|
360
|
+
this.focusableElements[0].focus();
|
|
361
|
+
} else if (this.options.fallbackFocus) {
|
|
362
|
+
this.options.fallbackFocus.focus();
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Setup event listeners
|
|
366
|
+
this.setupEventListeners();
|
|
367
|
+
|
|
368
|
+
this.isActive = true;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Deactivate focus trap
|
|
372
|
+
deactivate()) return;
|
|
373
|
+
|
|
374
|
+
// Remove event listeners
|
|
375
|
+
this.removeEventListeners();
|
|
376
|
+
|
|
377
|
+
// Return focus if requested
|
|
378
|
+
if (this.options.returnFocus && this.returnFocusElement) {
|
|
379
|
+
this.returnFocusElement.focus();
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
this.isActive = false;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Get focusable elements within container
|
|
386
|
+
getFocusableElements()] {
|
|
387
|
+
const focusableSelectors = [
|
|
388
|
+
'a[href]',
|
|
389
|
+
'button])',
|
|
390
|
+
'input])',
|
|
391
|
+
'select])',
|
|
392
|
+
'textarea])',
|
|
393
|
+
'[tabindex]="-1"])',
|
|
394
|
+
'[contenteditable="true"]'
|
|
395
|
+
];
|
|
396
|
+
|
|
397
|
+
return Array.from(
|
|
398
|
+
this.container.querySelectorAll(focusableSelectors.join(','))
|
|
399
|
+
) as HTMLElement[];
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Setup event listeners
|
|
403
|
+
private setupEventListeners()) {
|
|
404
|
+
const escapeHandler = (event) => {
|
|
405
|
+
if (event.key === 'Escape') {
|
|
406
|
+
this.deactivate();
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
document.addEventListener('keydown', escapeHandler);
|
|
411
|
+
this.eventListeners.push({ event, handler});
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Handle click outside
|
|
415
|
+
if (this.options.clickOutsideDeactivates) {
|
|
416
|
+
const clickHandler = (event) => {
|
|
417
|
+
if (!this.container.contains(event.target as Node)) {
|
|
418
|
+
this.deactivate();
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
document.addEventListener('click', clickHandler);
|
|
423
|
+
this.eventListeners.push({ event, handler});
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Handle tab key within trap
|
|
427
|
+
const tabHandler = (event) => {
|
|
428
|
+
if (event.key === 'Tab') {
|
|
429
|
+
event.preventDefault();
|
|
430
|
+
this.handleTabNavigation(event.shiftKey);
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
this.container.addEventListener('keydown', tabHandler);
|
|
435
|
+
this.eventListeners.push({ event, handler});
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Remove event listeners
|
|
439
|
+
private removeEventListeners(), handler }) => {
|
|
440
|
+
if (event === 'keydown' && handler.toString().includes('tabHandler')) {
|
|
441
|
+
this.container.removeEventListener(event, handler);
|
|
442
|
+
} else {
|
|
443
|
+
document.removeEventListener(event, handler);
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
this.eventListeners = [];
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Handle tab navigation within trap
|
|
451
|
+
private handleTabNavigation(isShiftTab)=== 0) return;
|
|
452
|
+
|
|
453
|
+
const currentIndex = this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
454
|
+
let nextIndex;
|
|
455
|
+
|
|
456
|
+
if (isShiftTab) {
|
|
457
|
+
nextIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
458
|
+
} else {
|
|
459
|
+
nextIndex = currentIndex < this.focusableElements.length - 1 ? currentIndex + 1 ;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
this.focusableElements[nextIndex]?.focus();
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Focus first element in trap
|
|
466
|
+
focusFirst()) {
|
|
467
|
+
this.focusableElements[0].focus();
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Focus last element in trap
|
|
472
|
+
focusLast()) {
|
|
473
|
+
this.focusableElements[this.focusableElements.length - 1].focus();
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// Focus next element in trap
|
|
478
|
+
focusNext()=== 0) return;
|
|
479
|
+
|
|
480
|
+
const currentIndex = this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
481
|
+
const nextIndex = currentIndex < this.focusableElements.length - 1 ? currentIndex + 1 ;
|
|
482
|
+
this.focusableElements[nextIndex]?.focus();
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Focus previous element in trap
|
|
486
|
+
focusPrevious()=== 0) return;
|
|
487
|
+
|
|
488
|
+
const currentIndex = this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
489
|
+
const prevIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
490
|
+
this.focusableElements[prevIndex]?.focus();
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Get trap information
|
|
494
|
+
getInfo();
|
|
495
|
+
isActive;
|
|
496
|
+
focusableElementsCount;
|
|
497
|
+
currentFocusIndex;
|
|
498
|
+
container;
|
|
499
|
+
} {
|
|
500
|
+
const currentIndex = this.focusableElements.indexOf(document.activeElement as HTMLElement);
|
|
501
|
+
|
|
502
|
+
return {
|
|
503
|
+
id,
|
|
504
|
+
isActive,
|
|
505
|
+
focusableElementsCount,
|
|
506
|
+
currentFocusIndex= 0 ? currentIndex ,
|
|
507
|
+
container};
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Focus restoration utilities
|
|
512
|
+
export class FocusRestoration {
|
|
513
|
+
private focusStack] = [];
|
|
514
|
+
private maxStackSize= 20;
|
|
515
|
+
|
|
516
|
+
// Push current focus to stack
|
|
517
|
+
pushFocus()= document.activeElement as HTMLElement;
|
|
518
|
+
if (currentElement && currentElement !== document.body) {
|
|
519
|
+
this.focusStack.push(currentElement);
|
|
520
|
+
|
|
521
|
+
// Maintain stack size
|
|
522
|
+
if (this.focusStack.length > this.maxStackSize) {
|
|
523
|
+
this.focusStack.shift();
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Pop and restore focus from stack
|
|
529
|
+
popFocus()= this.focusStack.pop();
|
|
530
|
+
if (element && element.offsetParent !== null) {
|
|
531
|
+
element.focus();
|
|
532
|
+
return true;
|
|
533
|
+
}
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Peek at top of focus stack
|
|
538
|
+
peekFocus()];
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Clear focus stack
|
|
542
|
+
clear()= [];
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// Get stack size
|
|
546
|
+
getSize();
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// Check if stack is empty
|
|
550
|
+
isEmpty()=== 0;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// Focus navigation utilities
|
|
555
|
+
export class FocusNavigation {
|
|
556
|
+
// Navigate to next heading
|
|
557
|
+
static focusNextHeading()= Array.from(document.querySelectorAll('h1, h2, h3, h4, h5, h6'));
|
|
558
|
+
const currentIndex = headings.indexOf(document.activeElement as HTMLElement);
|
|
559
|
+
const nextIndex = currentIndex < headings.length - 1 ? currentIndex + 1 ;
|
|
560
|
+
|
|
561
|
+
if (headings[nextIndex]) {
|
|
562
|
+
(headings[nextIndex] as HTMLElement).focus();
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Navigate to previous heading
|
|
567
|
+
static focusPreviousHeading()= Array.from(document.querySelectorAll('h1, h2, h3, h4, h5, h6'));
|
|
568
|
+
const currentIndex = headings.indexOf(document.activeElement as HTMLElement);
|
|
569
|
+
const prevIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
570
|
+
|
|
571
|
+
if (headings[prevIndex]) {
|
|
572
|
+
(headings[prevIndex] as HTMLElement).focus();
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Navigate to next landmark
|
|
577
|
+
static focusNextLandmark()= Array.from(document.querySelectorAll('[role="banner"], [role="main"], [role="navigation"], [role="complementary"], [role="contentinfo"]'));
|
|
578
|
+
const currentIndex = landmarks.indexOf(document.activeElement as HTMLElement);
|
|
579
|
+
const nextIndex = currentIndex < landmarks.length - 1 ? currentIndex + 1 ;
|
|
580
|
+
|
|
581
|
+
if (landmarks[nextIndex]) {
|
|
582
|
+
(landmarks[nextIndex] as HTMLElement).focus();
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// Navigate to previous landmark
|
|
587
|
+
static focusPreviousLandmark()= Array.from(document.querySelectorAll('[role="banner"], [role="main"], [role="navigation"], [role="complementary"], [role="contentinfo"]'));
|
|
588
|
+
const currentIndex = landmarks.indexOf(document.activeElement as HTMLElement);
|
|
589
|
+
const prevIndex = currentIndex > 0 ? currentIndex - 1 ;
|
|
590
|
+
|
|
591
|
+
if (landmarks[prevIndex]) {
|
|
592
|
+
(landmarks[prevIndex] as HTMLElement).focus();
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// Focus first focusable element in container
|
|
597
|
+
static focusFirstInContainer(container)= [
|
|
598
|
+
'a[href]',
|
|
599
|
+
'button])',
|
|
600
|
+
'input])',
|
|
601
|
+
'select])',
|
|
602
|
+
'textarea])',
|
|
603
|
+
'[tabindex]="-1"])'
|
|
604
|
+
];
|
|
605
|
+
|
|
606
|
+
const firstElement = container.querySelector(focusableSelectors.join(','));
|
|
607
|
+
if (firstElement) {
|
|
608
|
+
(firstElement as HTMLElement).focus();
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
// Focus last focusable element in container
|
|
613
|
+
static focusLastInContainer(container)= [
|
|
614
|
+
'a[href]',
|
|
615
|
+
'button])',
|
|
616
|
+
'input])',
|
|
617
|
+
'select])',
|
|
618
|
+
'textarea])',
|
|
619
|
+
'[tabindex]="-1"])'
|
|
620
|
+
];
|
|
621
|
+
|
|
622
|
+
const elements = Array.from(container.querySelectorAll(focusableSelectors.join(',')));
|
|
623
|
+
const lastElement = elements[elements.length - 1];
|
|
624
|
+
if (lastElement) {
|
|
625
|
+
(lastElement as HTMLElement).focus();
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// Export default instances
|
|
631
|
+
export const focusManager = new AccessibilityFocusManager();
|
|
632
|
+
export const focusRestoration = new FocusRestoration();
|
|
633
|
+
|
|
634
|
+
// Export default
|
|
635
|
+
export default {
|
|
636
|
+
AccessibilityFocusManager,
|
|
637
|
+
FocusTrap,
|
|
638
|
+
FocusRestoration,
|
|
639
|
+
FocusNavigation,
|
|
640
|
+
focusManager,
|
|
641
|
+
focusRestoration
|
|
642
|
+
};
|