@rivetjs/cdk 0.0.0-stage → 0.1.0-alpha.0
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/LICENSE +21 -0
- package/NOTICE +483 -0
- package/README.md +10 -2
- package/_adapters/collection.d.ts +160 -0
- package/_adapters/collection.js +235 -0
- package/_adapters/collections.d.ts +325 -0
- package/_adapters/collections.js +934 -0
- package/_adapters/dom-collection.d.ts +42 -0
- package/_adapters/dom-collection.js +228 -0
- package/_adapters/grid-selection.d.ts +115 -0
- package/_adapters/grid-selection.js +436 -0
- package/_adapters/interactions.d.ts +19 -0
- package/_adapters/interactions.js +45 -0
- package/_adapters/intl.d.ts +8 -0
- package/_adapters/intl.js +106 -0
- package/_adapters/press.d.ts +22 -0
- package/_adapters/press.js +34 -0
- package/_adapters/selectable.d.ts +132 -0
- package/_adapters/selectable.js +599 -0
- package/_adapters/selection.d.ts +109 -0
- package/_adapters/selection.js +685 -0
- package/_adapters/type-select.d.ts +8 -0
- package/_adapters/type-select.js +59 -0
- package/a11y/aria-describer.d.ts +46 -0
- package/a11y/aria-describer.js +169 -0
- package/a11y/focus-monitor.d.ts +98 -0
- package/a11y/focus-monitor.js +321 -0
- package/a11y/focus-trap.d.ts +137 -0
- package/a11y/focus-trap.js +378 -0
- package/a11y/high-contrast.d.ts +26 -0
- package/a11y/high-contrast.js +84 -0
- package/a11y/index.d.ts +37 -0
- package/a11y/index.js +97 -0
- package/a11y/interactivity-checker.d.ts +18 -0
- package/a11y/interactivity-checker.js +126 -0
- package/a11y/key-manager.d.ts +152 -0
- package/a11y/key-manager.js +397 -0
- package/a11y/live-announcer.d.ts +53 -0
- package/a11y/live-announcer.js +143 -0
- package/accordion/index.d.ts +2 -0
- package/accordion/index.jsx +10 -0
- package/announcer/index.d.ts +8 -0
- package/announcer/index.jsx +22 -0
- package/announcer/live-announcer.d.ts +15 -0
- package/announcer/live-announcer.js +123 -0
- package/autocomplete/behaviour.d.ts +94 -0
- package/autocomplete/behaviour.jsx +423 -0
- package/autocomplete/contexts.d.ts +54 -0
- package/autocomplete/contexts.js +28 -0
- package/autocomplete/index.d.ts +12 -0
- package/autocomplete/index.jsx +31 -0
- package/autocomplete/intl.d.ts +2 -0
- package/autocomplete/intl.js +36 -0
- package/bidi/bidi-dir.d.ts +23 -0
- package/bidi/bidi-dir.jsx +36 -0
- package/bidi/index.d.ts +58 -0
- package/bidi/index.js +84 -0
- package/breadcrumbs/behaviour.d.ts +6 -0
- package/breadcrumbs/behaviour.js +17 -0
- package/breadcrumbs/index.d.ts +68 -0
- package/breadcrumbs/index.jsx +224 -0
- package/breadcrumbs/intl.d.ts +3 -0
- package/breadcrumbs/intl.js +104 -0
- package/button/behaviour.d.ts +61 -0
- package/button/behaviour.js +90 -0
- package/button/index.d.ts +38 -0
- package/button/index.jsx +374 -0
- package/button/press.d.ts +25 -0
- package/button/press.js +54 -0
- package/calendar/behaviour.d.ts +250 -0
- package/calendar/behaviour.jsx +939 -0
- package/calendar/index.d.ts +157 -0
- package/calendar/index.jsx +484 -0
- package/calendar/intl.d.ts +3 -0
- package/calendar/intl.js +36 -0
- package/carousel/behaviour.d.ts +50 -0
- package/carousel/behaviour.jsx +365 -0
- package/carousel/engine/Alignment.d.ts +5 -0
- package/carousel/engine/Alignment.js +24 -0
- package/carousel/engine/Animations.d.ts +13 -0
- package/carousel/engine/Animations.js +28 -0
- package/carousel/engine/Axis.d.ts +14 -0
- package/carousel/engine/Axis.js +35 -0
- package/carousel/engine/Counter.d.ts +7 -0
- package/carousel/engine/Counter.js +32 -0
- package/carousel/engine/DragHandler.d.ts +22 -0
- package/carousel/engine/DragHandler.js +141 -0
- package/carousel/engine/DragTracker.d.ts +10 -0
- package/carousel/engine/DragTracker.js +29 -0
- package/carousel/engine/EmblaCarousel.d.ts +32 -0
- package/carousel/engine/EmblaCarousel.js +177 -0
- package/carousel/engine/Engine.d.ts +64 -0
- package/carousel/engine/Engine.js +137 -0
- package/carousel/engine/EventHandler.d.ts +27 -0
- package/carousel/engine/EventHandler.js +33 -0
- package/carousel/engine/EventStore.d.ts +9 -0
- package/carousel/engine/EventStore.js +25 -0
- package/carousel/engine/NodeRects.d.ts +12 -0
- package/carousel/engine/NodeRects.js +18 -0
- package/carousel/engine/Options.d.ts +40 -0
- package/carousel/engine/Options.js +22 -0
- package/carousel/engine/OptionsHandler.d.ts +10 -0
- package/carousel/engine/OptionsHandler.js +26 -0
- package/carousel/engine/PercentOfView.d.ts +4 -0
- package/carousel/engine/PercentOfView.js +9 -0
- package/carousel/engine/Plugins.d.ts +16 -0
- package/carousel/engine/Plugins.js +1 -0
- package/carousel/engine/PluginsHandler.d.ts +8 -0
- package/carousel/engine/PluginsHandler.js +16 -0
- package/carousel/engine/ResizeHandler.d.ts +13 -0
- package/carousel/engine/ResizeHandler.js +51 -0
- package/carousel/engine/ScrollBounds.d.ts +10 -0
- package/carousel/engine/ScrollBounds.js +41 -0
- package/carousel/engine/ScrollContain.d.ts +7 -0
- package/carousel/engine/ScrollContain.js +52 -0
- package/carousel/engine/ScrollLimit.d.ts +5 -0
- package/carousel/engine/ScrollLimit.js +13 -0
- package/carousel/engine/ScrollLooper.d.ts +6 -0
- package/carousel/engine/ScrollLooper.js +26 -0
- package/carousel/engine/ScrollProgress.d.ts +5 -0
- package/carousel/engine/ScrollProgress.js +11 -0
- package/carousel/engine/ScrollSnaps.d.ts +9 -0
- package/carousel/engine/ScrollSnaps.js +26 -0
- package/carousel/engine/ScrollTarget.d.ts +12 -0
- package/carousel/engine/ScrollTarget.js +47 -0
- package/carousel/engine/ScrollTo.d.ts +11 -0
- package/carousel/engine/ScrollTo.js +36 -0
- package/carousel/engine/SlideFocus.d.ts +13 -0
- package/carousel/engine/SlideFocus.js +39 -0
- package/carousel/engine/SlideLooper.d.ts +18 -0
- package/carousel/engine/SlideLooper.js +78 -0
- package/carousel/engine/SlideRegistry.d.ts +7 -0
- package/carousel/engine/SlideRegistry.js +31 -0
- package/carousel/engine/SlideSizes.d.ts +10 -0
- package/carousel/engine/SlideSizes.js +41 -0
- package/carousel/engine/SlidesHandler.d.ts +10 -0
- package/carousel/engine/SlidesHandler.js +36 -0
- package/carousel/engine/SlidesInView.d.ts +8 -0
- package/carousel/engine/SlidesInView.js +59 -0
- package/carousel/engine/SlidesToScroll.d.ts +7 -0
- package/carousel/engine/SlidesToScroll.js +41 -0
- package/carousel/engine/Translate.d.ts +7 -0
- package/carousel/engine/Translate.js +38 -0
- package/carousel/engine/index.d.ts +11 -0
- package/carousel/engine/index.js +1 -0
- package/carousel/engine/utils.d.ts +15 -0
- package/carousel/engine/utils.js +45 -0
- package/carousel/index.d.ts +202 -0
- package/carousel/index.jsx +469 -0
- package/carousel/plugins/auto-height/AutoHeight.d.ts +14 -0
- package/carousel/plugins/auto-height/AutoHeight.js +43 -0
- package/carousel/plugins/auto-height/Options.d.ts +2 -0
- package/carousel/plugins/auto-height/Options.js +1 -0
- package/carousel/plugins/auto-height/index.d.ts +2 -0
- package/carousel/plugins/auto-height/index.js +1 -0
- package/carousel/plugins/auto-scroll/AutoScroll.d.ts +25 -0
- package/carousel/plugins/auto-scroll/AutoScroll.js +185 -0
- package/carousel/plugins/auto-scroll/Options.d.ts +13 -0
- package/carousel/plugins/auto-scroll/Options.js +12 -0
- package/carousel/plugins/auto-scroll/index.d.ts +2 -0
- package/carousel/plugins/auto-scroll/index.js +1 -0
- package/carousel/plugins/auto-scroll/utils.d.ts +3 -0
- package/carousel/plugins/auto-scroll/utils.js +4 -0
- package/carousel/plugins/autoplay/Autoplay.d.ts +29 -0
- package/carousel/plugins/autoplay/Autoplay.js +173 -0
- package/carousel/plugins/autoplay/Options.d.ts +14 -0
- package/carousel/plugins/autoplay/Options.js +12 -0
- package/carousel/plugins/autoplay/index.d.ts +2 -0
- package/carousel/plugins/autoplay/index.js +1 -0
- package/carousel/plugins/autoplay/utils.d.ts +4 -0
- package/carousel/plugins/autoplay/utils.js +11 -0
- package/carousel/plugins/class-names/ClassNames.d.ts +14 -0
- package/carousel/plugins/class-names/ClassNames.js +98 -0
- package/carousel/plugins/class-names/Options.d.ts +13 -0
- package/carousel/plugins/class-names/Options.js +9 -0
- package/carousel/plugins/class-names/index.d.ts +2 -0
- package/carousel/plugins/class-names/index.js +1 -0
- package/carousel/plugins/class-names/utils.d.ts +4 -0
- package/carousel/plugins/class-names/utils.js +14 -0
- package/carousel/plugins/fade/Fade.d.ts +14 -0
- package/carousel/plugins/fade/Fade.js +199 -0
- package/carousel/plugins/fade/Options.d.ts +2 -0
- package/carousel/plugins/fade/Options.js +1 -0
- package/carousel/plugins/fade/index.d.ts +2 -0
- package/carousel/plugins/fade/index.js +1 -0
- package/carousel/plugins/fade/utils.d.ts +2 -0
- package/carousel/plugins/fade/utils.js +8 -0
- package/carousel/state.d.ts +81 -0
- package/carousel/state.js +71 -0
- package/chat/index.d.ts +83 -0
- package/chat/index.jsx +287 -0
- package/checkbox/behaviour.d.ts +172 -0
- package/checkbox/behaviour.jsx +412 -0
- package/checkbox/index.d.ts +168 -0
- package/checkbox/index.jsx +310 -0
- package/clipboard/index.d.ts +49 -0
- package/clipboard/index.js +136 -0
- package/coercion/index.d.ts +36 -0
- package/coercion/index.js +58 -0
- package/collections/base.d.ts +115 -0
- package/collections/base.js +346 -0
- package/collections/builder.d.ts +44 -0
- package/collections/builder.js +283 -0
- package/collections/components.d.ts +217 -0
- package/collections/components.jsx +537 -0
- package/collections/data-source.d.ts +26 -0
- package/collections/data-source.js +27 -0
- package/collections/dom.d.ts +34 -0
- package/collections/dom.js +127 -0
- package/collections/grid.d.ts +45 -0
- package/collections/grid.js +125 -0
- package/collections/hidden.d.ts +4 -0
- package/collections/hidden.js +12 -0
- package/collections/index.d.ts +45 -0
- package/collections/index.js +105 -0
- package/collections/list-state.d.ts +99 -0
- package/collections/list-state.js +156 -0
- package/collections/list.d.ts +20 -0
- package/collections/list.js +77 -0
- package/collections/nodes.d.ts +9 -0
- package/collections/nodes.js +81 -0
- package/collections/selection-model.d.ts +93 -0
- package/collections/selection-model.js +192 -0
- package/collections/server-dev.d.ts +5 -0
- package/collections/server-dev.js +16 -0
- package/collections/server-off.d.ts +5 -0
- package/collections/server-off.js +7 -0
- package/collections/server-on.d.ts +28 -0
- package/collections/server-on.jsx +76 -0
- package/collections/table.d.ts +114 -0
- package/collections/table.js +439 -0
- package/collections/tree-state.d.ts +47 -0
- package/collections/tree-state.js +73 -0
- package/collections/tree.d.ts +20 -0
- package/collections/tree.js +66 -0
- package/collections/types.d.ts +229 -0
- package/collections/types.js +4 -0
- package/collections/unique-selection-dispatcher.d.ts +10 -0
- package/collections/unique-selection-dispatcher.js +25 -0
- package/color/area-state.d.ts +99 -0
- package/color/area-state.js +160 -0
- package/color/aria-intl.d.ts +3 -0
- package/color/aria-intl.js +274 -0
- package/color/channel-field-state.d.ts +50 -0
- package/color/channel-field-state.jsx +87 -0
- package/color/color.d.ts +78 -0
- package/color/color.js +738 -0
- package/color/field-state.d.ts +66 -0
- package/color/field-state.jsx +159 -0
- package/color/index.d.ts +58 -0
- package/color/index.js +88 -0
- package/color/intl.d.ts +3 -0
- package/color/intl.js +1328 -0
- package/color/picker-state.d.ts +20 -0
- package/color/picker-state.js +19 -0
- package/color/slider-state.d.ts +78 -0
- package/color/slider-state.jsx +98 -0
- package/color/value.d.ts +27 -0
- package/color/value.js +36 -0
- package/color/wheel-state.d.ts +77 -0
- package/color/wheel-state.js +152 -0
- package/color-area/behaviour.d.ts +161 -0
- package/color-area/behaviour.jsx +454 -0
- package/color-area/index.d.ts +34 -0
- package/color-area/index.jsx +187 -0
- package/color-field/behaviour.d.ts +112 -0
- package/color-field/behaviour.jsx +262 -0
- package/color-field/index.d.ts +72 -0
- package/color-field/index.jsx +309 -0
- package/color-picker/index.d.ts +19 -0
- package/color-picker/index.jsx +49 -0
- package/color-slider/behaviour.d.ts +103 -0
- package/color-slider/behaviour.jsx +234 -0
- package/color-slider/index.d.ts +40 -0
- package/color-slider/index.jsx +162 -0
- package/color-swatch/behaviour.d.ts +40 -0
- package/color-swatch/behaviour.js +36 -0
- package/color-swatch/index.d.ts +29 -0
- package/color-swatch/index.jsx +82 -0
- package/color-swatch-picker/index.d.ts +62 -0
- package/color-swatch-picker/index.jsx +95 -0
- package/color-swatch-picker/intl.d.ts +3 -0
- package/color-swatch-picker/intl.js +104 -0
- package/color-thumb/index.d.ts +85 -0
- package/color-thumb/index.jsx +93 -0
- package/color-wheel/behaviour.d.ts +123 -0
- package/color-wheel/behaviour.jsx +301 -0
- package/color-wheel/index.d.ts +50 -0
- package/color-wheel/index.jsx +166 -0
- package/combobox/behaviour.d.ts +120 -0
- package/combobox/behaviour.jsx +588 -0
- package/combobox/index.d.ts +101 -0
- package/combobox/index.jsx +365 -0
- package/combobox/intl.d.ts +2 -0
- package/combobox/intl.js +240 -0
- package/compare/behaviour.d.ts +101 -0
- package/compare/behaviour.js +288 -0
- package/compare/index.d.ts +58 -0
- package/compare/index.jsx +129 -0
- package/data/async-list.d.ts +78 -0
- package/data/async-list.jsx +257 -0
- package/data/index.d.ts +3 -0
- package/data/index.jsx +6 -0
- package/data/list-data.d.ts +88 -0
- package/data/list-data.jsx +210 -0
- package/data/tree-data.d.ts +59 -0
- package/data/tree-data.jsx +278 -0
- package/data-grid/behaviour.d.ts +95 -0
- package/data-grid/behaviour.js +725 -0
- package/data-grid/index.d.ts +138 -0
- package/data-grid/index.jsx +452 -0
- package/data-grid/state.d.ts +131 -0
- package/data-grid/state.js +288 -0
- package/date/CalendarDate.d.ts +207 -0
- package/date/CalendarDate.js +374 -0
- package/date/DateFormatter.d.ts +24 -0
- package/date/DateFormatter.js +175 -0
- package/date/calendars/BuddhistCalendar.d.ts +16 -0
- package/date/calendars/BuddhistCalendar.js +46 -0
- package/date/calendars/EthiopicCalendar.d.ts +45 -0
- package/date/calendars/EthiopicCalendar.js +178 -0
- package/date/calendars/GregorianCalendar.d.ts +26 -0
- package/date/calendars/GregorianCalendar.js +122 -0
- package/date/calendars/HebrewCalendar.d.ts +21 -0
- package/date/calendars/HebrewCalendar.js +174 -0
- package/date/calendars/IndianCalendar.d.ts +17 -0
- package/date/calendars/IndianCalendar.js +111 -0
- package/date/calendars/IslamicCalendar.d.ts +51 -0
- package/date/calendars/IslamicCalendar.js +205 -0
- package/date/calendars/JapaneseCalendar.d.ts +22 -0
- package/date/calendars/JapaneseCalendar.js +148 -0
- package/date/calendars/PersianCalendar.d.ts +19 -0
- package/date/calendars/PersianCalendar.js +85 -0
- package/date/calendars/TaiwanCalendar.d.ts +19 -0
- package/date/calendars/TaiwanCalendar.js +70 -0
- package/date/conversion.d.ts +45 -0
- package/date/conversion.js +269 -0
- package/date/createCalendar.d.ts +3 -0
- package/date/createCalendar.js +55 -0
- package/date/index.d.ts +20 -0
- package/date/index.js +30 -0
- package/date/manipulation.d.ts +25 -0
- package/date/manipulation.js +399 -0
- package/date/queries.d.ts +93 -0
- package/date/queries.js +303 -0
- package/date/serialize.d.ts +18 -0
- package/date/serialize.js +55 -0
- package/date/string.d.ts +36 -0
- package/date/string.js +223 -0
- package/date/types.d.ts +136 -0
- package/date/types.js +14 -0
- package/date/utils.d.ts +4 -0
- package/date/utils.js +16 -0
- package/date/weekStartData.d.ts +1 -0
- package/date/weekStartData.js +112 -0
- package/date-field/behaviour.d.ts +188 -0
- package/date-field/behaviour.jsx +1025 -0
- package/date-field/index.d.ts +150 -0
- package/date-field/index.jsx +354 -0
- package/date-field/intl.d.ts +3 -0
- package/date-field/intl.js +36 -0
- package/date-field/live-value.d.ts +22 -0
- package/date-field/live-value.jsx +44 -0
- package/date-picker/behaviour.d.ts +95 -0
- package/date-picker/behaviour.jsx +343 -0
- package/date-picker/index.d.ts +66 -0
- package/date-picker/index.jsx +243 -0
- package/dialog/behaviour.d.ts +63 -0
- package/dialog/behaviour.jsx +90 -0
- package/dialog/contexts.d.ts +12 -0
- package/dialog/contexts.js +8 -0
- package/dialog/index.d.ts +48 -0
- package/dialog/index.jsx +301 -0
- package/disclosure/behaviour.d.ts +50 -0
- package/disclosure/behaviour.jsx +128 -0
- package/disclosure/details.d.ts +21 -0
- package/disclosure/details.jsx +14 -0
- package/disclosure/index.d.ts +92 -0
- package/disclosure/index.jsx +300 -0
- package/drag-drop/cdk-index.d.ts +22 -0
- package/drag-drop/cdk-index.jsx +25 -0
- package/drag-drop/directives/assertions.d.ts +6 -0
- package/drag-drop/directives/assertions.js +13 -0
- package/drag-drop/directives/config.d.ts +30 -0
- package/drag-drop/directives/config.js +7 -0
- package/drag-drop/directives/drag-handle.d.ts +10 -0
- package/drag-drop/directives/drag-handle.js +29 -0
- package/drag-drop/directives/drag.d.ts +194 -0
- package/drag-drop/directives/drag.js +522 -0
- package/drag-drop/directives/drop-list-group.d.ts +25 -0
- package/drag-drop/directives/drop-list-group.js +55 -0
- package/drag-drop/directives/drop-list.d.ts +163 -0
- package/drag-drop/directives/drop-list.js +396 -0
- package/drag-drop/directives/registry.d.ts +32 -0
- package/drag-drop/directives/registry.js +61 -0
- package/drag-drop/dom/clone-node.d.ts +2 -0
- package/drag-drop/dom/clone-node.js +58 -0
- package/drag-drop/dom/coerce.d.ts +6 -0
- package/drag-drop/dom/coerce.js +8 -0
- package/drag-drop/dom/dom-rect.d.ts +37 -0
- package/drag-drop/dom/dom-rect.js +71 -0
- package/drag-drop/dom/fake-event.d.ts +4 -0
- package/drag-drop/dom/fake-event.js +22 -0
- package/drag-drop/dom/inherited-text.d.ts +4 -0
- package/drag-drop/dom/inherited-text.js +44 -0
- package/drag-drop/dom/layout-shift.d.ts +8 -0
- package/drag-drop/dom/layout-shift.js +87 -0
- package/drag-drop/dom/mount-content.d.ts +2 -0
- package/drag-drop/dom/mount-content.js +7 -0
- package/drag-drop/dom/parent-position-tracker.d.ts +32 -0
- package/drag-drop/dom/parent-position-tracker.js +71 -0
- package/drag-drop/dom/root-node.d.ts +21 -0
- package/drag-drop/dom/root-node.js +41 -0
- package/drag-drop/dom/shadow-dom.d.ts +4 -0
- package/drag-drop/dom/shadow-dom.js +18 -0
- package/drag-drop/dom/styling.d.ts +52 -0
- package/drag-drop/dom/styling.js +86 -0
- package/drag-drop/dom/transition-duration.d.ts +2 -0
- package/drag-drop/dom/transition-duration.js +29 -0
- package/drag-drop/drag-drop-registry.d.ts +69 -0
- package/drag-drop/drag-drop-registry.js +224 -0
- package/drag-drop/drag-drop.d.ts +19 -0
- package/drag-drop/drag-drop.js +10 -0
- package/drag-drop/drag-events.d.ts +117 -0
- package/drag-drop/drag-events.js +1 -0
- package/drag-drop/drag-handle.d.ts +18 -0
- package/drag-drop/drag-handle.jsx +53 -0
- package/drag-drop/drag-placeholder.d.ts +8 -0
- package/drag-drop/drag-placeholder.jsx +25 -0
- package/drag-drop/drag-preview.d.ts +10 -0
- package/drag-drop/drag-preview.jsx +31 -0
- package/drag-drop/drag-ref.d.ts +476 -0
- package/drag-drop/drag-ref.js +1306 -0
- package/drag-drop/drag-utils.d.ts +25 -0
- package/drag-drop/drag-utils.js +53 -0
- package/drag-drop/drag.d.ts +23 -0
- package/drag-drop/drag.jsx +126 -0
- package/drag-drop/drop-list-group.d.ts +22 -0
- package/drag-drop/drop-list-group.jsx +19 -0
- package/drag-drop/drop-list-ref.d.ts +295 -0
- package/drag-drop/drop-list-ref.js +707 -0
- package/drag-drop/drop-list.d.ts +19 -0
- package/drag-drop/drop-list.jsx +87 -0
- package/drag-drop/index.d.ts +1 -0
- package/drag-drop/index.jsx +4 -0
- package/drag-drop/lazy-refs.d.ts +28 -0
- package/drag-drop/lazy-refs.js +133 -0
- package/drag-drop/preview-ref.d.ts +38 -0
- package/drag-drop/preview-ref.js +132 -0
- package/drag-drop/sorting/drop-list-sort-strategy.d.ts +29 -0
- package/drag-drop/sorting/drop-list-sort-strategy.js +1 -0
- package/drag-drop/sorting/mixed-sort-strategy.d.ts +99 -0
- package/drag-drop/sorting/mixed-sort-strategy.js +259 -0
- package/drag-drop/sorting/single-axis-sort-strategy.d.ts +112 -0
- package/drag-drop/sorting/single-axis-sort-strategy.js +343 -0
- package/file-trigger/index.d.ts +24 -0
- package/file-trigger/index.jsx +41 -0
- package/flip/index.d.ts +59 -0
- package/flip/index.js +124 -0
- package/focus/focus-ring.d.ts +42 -0
- package/focus/focus-ring.jsx +77 -0
- package/focus/focus-scope.d.ts +51 -0
- package/focus/focus-scope.jsx +431 -0
- package/focus/focusable.d.ts +33 -0
- package/focus/focusable.jsx +93 -0
- package/focus/index.d.ts +74 -0
- package/focus/index.js +274 -0
- package/form/behaviour.d.ts +29 -0
- package/form/behaviour.js +145 -0
- package/form/field-error.d.ts +38 -0
- package/form/field-error.jsx +67 -0
- package/form/index.d.ts +77 -0
- package/form/index.jsx +116 -0
- package/grid/behaviour.d.ts +290 -0
- package/grid/behaviour.js +683 -0
- package/grid/intl.d.ts +2 -0
- package/grid/intl.js +36 -0
- package/grid/keyboard-delegate.d.ts +56 -0
- package/grid/keyboard-delegate.js +316 -0
- package/grid-list/behaviour.d.ts +242 -0
- package/grid-list/behaviour.js +598 -0
- package/grid-list/index.d.ts +202 -0
- package/grid-list/index.jsx +685 -0
- package/grid-list/row.d.ts +24 -0
- package/grid-list/row.js +57 -0
- package/group/index.d.ts +48 -0
- package/group/index.jsx +126 -0
- package/header/index.d.ts +13 -0
- package/header/index.jsx +34 -0
- package/heading/index.d.ts +19 -0
- package/heading/index.jsx +55 -0
- package/highlight/index.d.ts +12 -0
- package/highlight/index.jsx +357 -0
- package/i18n/filter.d.ts +16 -0
- package/i18n/filter.js +66 -0
- package/i18n/i18n-provider.d.ts +10 -0
- package/i18n/i18n-provider.jsx +15 -0
- package/i18n/index.d.ts +27 -0
- package/i18n/index.js +115 -0
- package/i18n/intl-cache.d.ts +4 -0
- package/i18n/intl-cache.js +40 -0
- package/i18n/list-formatter.d.ts +2 -0
- package/i18n/list-formatter.js +11 -0
- package/input/index.d.ts +51 -0
- package/input/index.jsx +95 -0
- package/interactions/controllable.d.ts +42 -0
- package/interactions/controllable.js +67 -0
- package/interactions/focus-visible.d.ts +68 -0
- package/interactions/focus-visible.jsx +291 -0
- package/interactions/focus.d.ts +58 -0
- package/interactions/focus.jsx +152 -0
- package/interactions/hover.d.ts +54 -0
- package/interactions/hover.jsx +139 -0
- package/interactions/index.d.ts +1 -0
- package/interactions/index.js +3 -0
- package/interactions/interact-outside.d.ts +24 -0
- package/interactions/interact-outside.jsx +57 -0
- package/interactions/keyboard.d.ts +28 -0
- package/interactions/keyboard.jsx +51 -0
- package/interactions/long-press.d.ts +41 -0
- package/interactions/long-press.jsx +79 -0
- package/interactions/merge-props.d.ts +54 -0
- package/interactions/merge-props.jsx +257 -0
- package/interactions/move.d.ts +48 -0
- package/interactions/move.jsx +96 -0
- package/interactions/press.d.ts +129 -0
- package/interactions/press.jsx +538 -0
- package/interactions/pressable.d.ts +22 -0
- package/interactions/pressable.jsx +93 -0
- package/interactions/scroll-wheel.d.ts +20 -0
- package/interactions/scroll-wheel.jsx +40 -0
- package/interactions/utils.d.ts +53 -0
- package/interactions/utils.js +252 -0
- package/keyboard/index.d.ts +12 -0
- package/keyboard/index.jsx +34 -0
- package/keys/index.d.ts +68 -0
- package/keys/index.js +199 -0
- package/label/behaviour.d.ts +54 -0
- package/label/behaviour.js +60 -0
- package/label/index.d.ts +35 -0
- package/label/index.jsx +85 -0
- package/landmark/index.d.ts +10 -0
- package/landmark/index.jsx +35 -0
- package/landmark/manager.d.ts +50 -0
- package/landmark/manager.js +364 -0
- package/layout/index.d.ts +90 -0
- package/layout/index.js +207 -0
- package/lightbox/behaviour.d.ts +82 -0
- package/lightbox/behaviour.js +490 -0
- package/lightbox/captions/index.d.ts +39 -0
- package/lightbox/captions/index.jsx +44 -0
- package/lightbox/counter/index.d.ts +10 -0
- package/lightbox/counter/index.jsx +10 -0
- package/lightbox/download/index.d.ts +32 -0
- package/lightbox/download/index.jsx +89 -0
- package/lightbox/embed/index.d.ts +15 -0
- package/lightbox/embed/index.jsx +58 -0
- package/lightbox/fullscreen/index.d.ts +24 -0
- package/lightbox/fullscreen/index.jsx +80 -0
- package/lightbox/index.d.ts +129 -0
- package/lightbox/index.jsx +284 -0
- package/lightbox/inline/index.d.ts +18 -0
- package/lightbox/inline/index.jsx +15 -0
- package/lightbox/pdf/index.d.ts +18 -0
- package/lightbox/pdf/index.jsx +31 -0
- package/lightbox/share/index.d.ts +29 -0
- package/lightbox/share/index.jsx +43 -0
- package/lightbox/slideshow/index.d.ts +24 -0
- package/lightbox/slideshow/index.jsx +118 -0
- package/lightbox/state.d.ts +334 -0
- package/lightbox/state.js +192 -0
- package/lightbox/thumbnails/index.d.ts +54 -0
- package/lightbox/thumbnails/index.jsx +96 -0
- package/lightbox/video/index.d.ts +13 -0
- package/lightbox/video/index.jsx +42 -0
- package/lightbox/zoom/index.d.ts +67 -0
- package/lightbox/zoom/index.jsx +456 -0
- package/link/behaviour.d.ts +41 -0
- package/link/behaviour.js +58 -0
- package/link/index.d.ts +30 -0
- package/link/index.jsx +179 -0
- package/link/router.d.ts +1 -0
- package/link/router.js +5 -0
- package/listbox/behaviour.d.ts +175 -0
- package/listbox/behaviour.jsx +492 -0
- package/listbox/index.d.ts +129 -0
- package/listbox/index.jsx +596 -0
- package/markdown/index.d.ts +82 -0
- package/markdown/index.jsx +654 -0
- package/masonry/behaviour.d.ts +121 -0
- package/masonry/behaviour.js +676 -0
- package/masonry/flip.d.ts +27 -0
- package/masonry/flip.js +61 -0
- package/masonry/geometry.d.ts +44 -0
- package/masonry/geometry.js +184 -0
- package/masonry/index.d.ts +153 -0
- package/masonry/index.jsx +833 -0
- package/masonry/justified.d.ts +49 -0
- package/masonry/justified.js +250 -0
- package/masonry/layout.d.ts +200 -0
- package/masonry/layout.js +668 -0
- package/masonry/masonry-layout.d.ts +57 -0
- package/masonry/masonry-layout.js +159 -0
- package/masonry/masonry.css +29 -0
- package/menu/behaviour.d.ts +205 -0
- package/menu/behaviour.jsx +847 -0
- package/menu/index.d.ts +171 -0
- package/menu/index.jsx +671 -0
- package/menu/intl.d.ts +2 -0
- package/menu/intl.js +36 -0
- package/menu/safely-mouse-to-submenu.d.ts +12 -0
- package/menu/safely-mouse-to-submenu.js +128 -0
- package/meter/behaviour.d.ts +18 -0
- package/meter/behaviour.jsx +17 -0
- package/meter/index.d.ts +30 -0
- package/meter/index.jsx +85 -0
- package/modal/index.d.ts +79 -0
- package/modal/index.jsx +359 -0
- package/modal/provider.d.ts +47 -0
- package/modal/provider.jsx +105 -0
- package/morph/index.d.ts +91 -0
- package/morph/index.jsx +372 -0
- package/morph/item.d.ts +89 -0
- package/morph/item.jsx +546 -0
- package/motion/Animations.d.ts +17 -0
- package/motion/Animations.js +56 -0
- package/motion/DragRelease.d.ts +22 -0
- package/motion/DragRelease.js +26 -0
- package/motion/DragTracker.d.ts +7 -0
- package/motion/DragTracker.js +43 -0
- package/motion/Limit.d.ts +12 -0
- package/motion/Limit.js +37 -0
- package/motion/Motion1D.d.ts +38 -0
- package/motion/Motion1D.js +72 -0
- package/motion/ScrollBody.d.ts +13 -0
- package/motion/ScrollBody.js +75 -0
- package/motion/Vector1d.d.ts +8 -0
- package/motion/Vector1d.js +29 -0
- package/motion/index.d.ts +8 -0
- package/motion/index.js +12 -0
- package/motion/utils.d.ts +5 -0
- package/motion/utils.js +23 -0
- package/native-select/index.d.ts +46 -0
- package/native-select/index.jsx +99 -0
- package/navigation-tree/index.d.ts +43 -0
- package/navigation-tree/index.jsx +110 -0
- package/number/NumberFormatter.d.ts +28 -0
- package/number/NumberFormatter.js +144 -0
- package/number/NumberParser.d.ts +27 -0
- package/number/NumberParser.js +316 -0
- package/number/index.d.ts +5 -0
- package/number/index.jsx +17 -0
- package/number/number-field-state.d.ts +132 -0
- package/number/number-field-state.jsx +364 -0
- package/number-field/behaviour.d.ts +165 -0
- package/number-field/behaviour.jsx +512 -0
- package/number-field/index.d.ts +52 -0
- package/number-field/index.jsx +207 -0
- package/number-field/intl.d.ts +2 -0
- package/number-field/intl.js +36 -0
- package/observers/index.d.ts +70 -0
- package/observers/index.js +279 -0
- package/overflow/index.d.ts +93 -0
- package/overflow/index.jsx +267 -0
- package/overlay/aria-hide-outside.d.ts +12 -0
- package/overlay/aria-hide-outside.js +141 -0
- package/overlay/close-on-scroll.d.ts +1 -0
- package/overlay/close-on-scroll.js +6 -0
- package/overlay/contexts.d.ts +34 -0
- package/overlay/contexts.js +21 -0
- package/overlay/dismiss-button.d.ts +10 -0
- package/overlay/dismiss-button.jsx +18 -0
- package/overlay/hover-trigger.d.ts +54 -0
- package/overlay/hover-trigger.jsx +221 -0
- package/overlay/index.d.ts +40 -0
- package/overlay/index.js +139 -0
- package/overlay/modal-overlay.d.ts +16 -0
- package/overlay/modal-overlay.js +38 -0
- package/overlay/overlay-strings.d.ts +4 -0
- package/overlay/overlay-strings.js +52 -0
- package/overlay/overlay-trigger-state.d.ts +1 -0
- package/overlay/overlay-trigger-state.js +3 -0
- package/overlay/overlay-trigger.d.ts +27 -0
- package/overlay/overlay-trigger.jsx +50 -0
- package/overlay/position.d.ts +160 -0
- package/overlay/position.js +559 -0
- package/overlay/prevent-scroll-ios.d.ts +17 -0
- package/overlay/prevent-scroll-ios.js +331 -0
- package/overlay/prevent-scroll.d.ts +18 -0
- package/overlay/prevent-scroll.js +122 -0
- package/overlay/safe-area.d.ts +28 -0
- package/overlay/safe-area.js +108 -0
- package/overlay-arrow/index.d.ts +23 -0
- package/overlay-arrow/index.jsx +59 -0
- package/overlay-service/connected-position.d.ts +163 -0
- package/overlay-service/connected-position.js +661 -0
- package/overlay-service/global-position.d.ts +34 -0
- package/overlay-service/global-position.js +154 -0
- package/overlay-service/index.d.ts +15 -0
- package/overlay-service/index.js +27 -0
- package/overlay-service/overlay-container.d.ts +27 -0
- package/overlay-service/overlay-container.js +93 -0
- package/overlay-service/overlay-dispatchers.d.ts +44 -0
- package/overlay-service/overlay-dispatchers.js +149 -0
- package/overlay-service/overlay-position-builder.d.ts +8 -0
- package/overlay-service/overlay-position-builder.js +15 -0
- package/overlay-service/overlay-ref.d.ts +155 -0
- package/overlay-service/overlay-ref.js +436 -0
- package/overlay-service/overlay-strategy.d.ts +48 -0
- package/overlay-service/overlay-strategy.js +3 -0
- package/overlay-service/overlay-viewport.d.ts +85 -0
- package/overlay-service/overlay-viewport.js +192 -0
- package/overlay-service/overlay.css +94 -0
- package/overlay-service/scroll-strategies.d.ts +71 -0
- package/overlay-service/scroll-strategies.js +185 -0
- package/package.json +754 -4
- package/platform/index.d.ts +100 -0
- package/platform/index.js +304 -0
- package/popover/behaviour.d.ts +23 -0
- package/popover/behaviour.js +39 -0
- package/popover/index.d.ts +60 -0
- package/popover/index.jsx +285 -0
- package/popover/popover-overlay.d.ts +27 -0
- package/popover/popover-overlay.jsx +60 -0
- package/popover/use-popover.d.ts +57 -0
- package/popover/use-popover.js +92 -0
- package/portal/index.d.ts +47 -0
- package/portal/index.jsx +76 -0
- package/portal/portal-mount.d.ts +8 -0
- package/portal/portal-mount.js +7 -0
- package/portal/portal-outlet.d.ts +88 -0
- package/portal/portal-outlet.js +222 -0
- package/preview-trigger/behaviour.d.ts +70 -0
- package/preview-trigger/behaviour.jsx +258 -0
- package/preview-trigger/index.d.ts +12 -0
- package/preview-trigger/index.jsx +82 -0
- package/progress-bar/behaviour.d.ts +77 -0
- package/progress-bar/behaviour.jsx +75 -0
- package/progress-bar/context.d.ts +4 -0
- package/progress-bar/context.js +7 -0
- package/progress-bar/index.d.ts +38 -0
- package/progress-bar/index.jsx +90 -0
- package/radio-group/behaviour.d.ts +11 -0
- package/radio-group/behaviour.js +85 -0
- package/radio-group/index.d.ts +82 -0
- package/radio-group/index.jsx +139 -0
- package/radio-group/parts.d.ts +223 -0
- package/radio-group/parts.jsx +425 -0
- package/range-calendar/behaviour.d.ts +2 -0
- package/range-calendar/behaviour.jsx +5 -0
- package/range-calendar/index.d.ts +2 -0
- package/range-calendar/index.jsx +4 -0
- package/resizable/engine/components/group/auto-save/getStorageKey.d.ts +1 -0
- package/resizable/engine/components/group/auto-save/getStorageKey.js +5 -0
- package/resizable/engine/components/group/compareDocumentPosition.d.ts +5 -0
- package/resizable/engine/components/group/compareDocumentPosition.js +19 -0
- package/resizable/engine/components/group/readLegacyLayout.d.ts +16 -0
- package/resizable/engine/components/group/readLegacyLayout.js +48 -0
- package/resizable/engine/components/group/sortByElementOffset.d.ts +4 -0
- package/resizable/engine/components/group/sortByElementOffset.js +28 -0
- package/resizable/engine/components/group/types.d.ts +50 -0
- package/resizable/engine/components/group/types.js +1 -0
- package/resizable/engine/components/panel/types.d.ts +90 -0
- package/resizable/engine/components/panel/types.js +4 -0
- package/resizable/engine/constants.d.ts +15 -0
- package/resizable/engine/constants.js +27 -0
- package/resizable/engine/global/cursor/getCursorStyle.d.ts +7 -0
- package/resizable/engine/global/cursor/getCursorStyle.js +94 -0
- package/resizable/engine/global/cursor/supportsAdvancedCursorStyles.d.ts +5 -0
- package/resizable/engine/global/cursor/supportsAdvancedCursorStyles.js +20 -0
- package/resizable/engine/global/cursor/updateCursorStyle.d.ts +1 -0
- package/resizable/engine/global/cursor/updateCursorStyle.js +64 -0
- package/resizable/engine/global/dom/calculateAvailableAxisSize.d.ts +4 -0
- package/resizable/engine/global/dom/calculateAvailableAxisSize.js +10 -0
- package/resizable/engine/global/dom/calculateHitRegions.d.ts +13 -0
- package/resizable/engine/global/dom/calculateHitRegions.js +153 -0
- package/resizable/engine/global/dom/calculateItemConstraints.d.ts +2 -0
- package/resizable/engine/global/dom/calculateItemConstraints.js +82 -0
- package/resizable/engine/global/event-handlers/onDocumentContextMenu.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentContextMenu.js +9 -0
- package/resizable/engine/global/event-handlers/onDocumentDoubleClick.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentDoubleClick.js +28 -0
- package/resizable/engine/global/event-handlers/onDocumentKeyDown.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentKeyDown.js +97 -0
- package/resizable/engine/global/event-handlers/onDocumentLostPointerCapture.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentLostPointerCapture.js +18 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerCancel.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerCancel.js +8 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerDown.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerDown.js +54 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerLeave.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerLeave.js +22 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerMove.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerMove.js +69 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerOut.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerOut.js +20 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerUp.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onDocumentPointerUp.js +15 -0
- package/resizable/engine/global/event-handlers/onWindowBlur.d.ts +1 -0
- package/resizable/engine/global/event-handlers/onWindowBlur.js +11 -0
- package/resizable/engine/global/mountAxis.d.ts +2 -0
- package/resizable/engine/global/mountAxis.js +187 -0
- package/resizable/engine/global/mutable-state/axes.d.ts +37 -0
- package/resizable/engine/global/mutable-state/axes.js +52 -0
- package/resizable/engine/global/mutable-state/interactions.d.ts +17 -0
- package/resizable/engine/global/mutable-state/interactions.js +92 -0
- package/resizable/engine/global/mutable-state/types.d.ts +32 -0
- package/resizable/engine/global/mutable-state/types.js +1 -0
- package/resizable/engine/global/styles/convertEmToPixels.d.ts +1 -0
- package/resizable/engine/global/styles/convertEmToPixels.js +7 -0
- package/resizable/engine/global/styles/convertRemToPixels.d.ts +1 -0
- package/resizable/engine/global/styles/convertRemToPixels.js +7 -0
- package/resizable/engine/global/styles/convertVhToPixels.d.ts +1 -0
- package/resizable/engine/global/styles/convertVhToPixels.js +5 -0
- package/resizable/engine/global/styles/convertVwToPixels.d.ts +1 -0
- package/resizable/engine/global/styles/convertVwToPixels.js +5 -0
- package/resizable/engine/global/styles/parseSizeAndUnit.d.ts +2 -0
- package/resizable/engine/global/styles/parseSizeAndUnit.js +29 -0
- package/resizable/engine/global/styles/sizeStyleToPixels.d.ts +5 -0
- package/resizable/engine/global/styles/sizeStyleToPixels.js +38 -0
- package/resizable/engine/global/types.d.ts +120 -0
- package/resizable/engine/global/types.js +1 -0
- package/resizable/engine/global/utils/abortActivePointerResize.d.ts +9 -0
- package/resizable/engine/global/utils/abortActivePointerResize.js +52 -0
- package/resizable/engine/global/utils/adjustLayoutByDelta.d.ts +9 -0
- package/resizable/engine/global/utils/adjustLayoutByDelta.js +219 -0
- package/resizable/engine/global/utils/adjustLayoutForSeparator.d.ts +1 -0
- package/resizable/engine/global/utils/adjustLayoutForSeparator.js +48 -0
- package/resizable/engine/global/utils/calculateDefaultLayout.d.ts +2 -0
- package/resizable/engine/global/utils/calculateDefaultLayout.js +30 -0
- package/resizable/engine/global/utils/calculateResizePreviews.d.ts +3 -0
- package/resizable/engine/global/utils/calculateResizePreviews.js +39 -0
- package/resizable/engine/global/utils/calculateSeparatorAriaValues.d.ts +12 -0
- package/resizable/engine/global/utils/calculateSeparatorAriaValues.js +43 -0
- package/resizable/engine/global/utils/compareLayoutNumbers.d.ts +1 -0
- package/resizable/engine/global/utils/compareLayoutNumbers.js +11 -0
- package/resizable/engine/global/utils/completeActivePointerResize.d.ts +6 -0
- package/resizable/engine/global/utils/completeActivePointerResize.js +49 -0
- package/resizable/engine/global/utils/doRectsIntersect.d.ts +2 -0
- package/resizable/engine/global/utils/doRectsIntersect.js +3 -0
- package/resizable/engine/global/utils/expandHitTarget.d.ts +10 -0
- package/resizable/engine/global/utils/expandHitTarget.js +19 -0
- package/resizable/engine/global/utils/findClosestHitRegion.d.ts +9 -0
- package/resizable/engine/global/utils/findClosestHitRegion.js +35 -0
- package/resizable/engine/global/utils/findClosestRect.d.ts +6 -0
- package/resizable/engine/global/utils/findClosestRect.js +22 -0
- package/resizable/engine/global/utils/findMatchingHitRegions.d.ts +7 -0
- package/resizable/engine/global/utils/findMatchingHitRegions.js +29 -0
- package/resizable/engine/global/utils/findSeparatorAxis.d.ts +21 -0
- package/resizable/engine/global/utils/findSeparatorAxis.js +12 -0
- package/resizable/engine/global/utils/formatLayoutNumber.d.ts +1 -0
- package/resizable/engine/global/utils/formatLayoutNumber.js +5 -0
- package/resizable/engine/global/utils/getDefaultLayout.d.ts +5 -0
- package/resizable/engine/global/utils/getDefaultLayout.js +11 -0
- package/resizable/engine/global/utils/getDistanceBetweenPointAndRect.d.ts +5 -0
- package/resizable/engine/global/utils/getDistanceBetweenPointAndRect.js +6 -0
- package/resizable/engine/global/utils/getImperativeAxisMethods.d.ts +4 -0
- package/resizable/engine/global/utils/getImperativeAxisMethods.js +53 -0
- package/resizable/engine/global/utils/getImperativeItemMethods.d.ts +5 -0
- package/resizable/engine/global/utils/getImperativeItemMethods.js +169 -0
- package/resizable/engine/global/utils/isCoarsePointer.d.ts +4 -0
- package/resizable/engine/global/utils/isCoarsePointer.js +17 -0
- package/resizable/engine/global/utils/isModal.d.ts +1 -0
- package/resizable/engine/global/utils/isModal.js +11 -0
- package/resizable/engine/global/utils/isViableHitTarget.d.ts +5 -0
- package/resizable/engine/global/utils/isViableHitTarget.js +50 -0
- package/resizable/engine/global/utils/itemConstraintsEqual.d.ts +2 -0
- package/resizable/engine/global/utils/itemConstraintsEqual.js +9 -0
- package/resizable/engine/global/utils/layoutNumbersEqual.d.ts +1 -0
- package/resizable/engine/global/utils/layoutNumbersEqual.js +6 -0
- package/resizable/engine/global/utils/layoutsEqual.d.ts +2 -0
- package/resizable/engine/global/utils/layoutsEqual.js +15 -0
- package/resizable/engine/global/utils/normalizeLayout.d.ts +11 -0
- package/resizable/engine/global/utils/normalizeLayout.js +21 -0
- package/resizable/engine/global/utils/notifyItemOnResize.d.ts +2 -0
- package/resizable/engine/global/utils/notifyItemOnResize.js +23 -0
- package/resizable/engine/global/utils/objectsEqual.d.ts +1 -0
- package/resizable/engine/global/utils/objectsEqual.js +14 -0
- package/resizable/engine/global/utils/preserveFixedItemSizes.d.ts +7 -0
- package/resizable/engine/global/utils/preserveFixedItemSizes.js +53 -0
- package/resizable/engine/global/utils/recordAxisLayoutChange.d.ts +15 -0
- package/resizable/engine/global/utils/recordAxisLayoutChange.js +25 -0
- package/resizable/engine/global/utils/updateActiveHitRegion.d.ts +18 -0
- package/resizable/engine/global/utils/updateActiveHitRegion.js +119 -0
- package/resizable/engine/global/utils/validateAxisLayout.d.ts +5 -0
- package/resizable/engine/global/utils/validateAxisLayout.js +70 -0
- package/resizable/engine/global/utils/validateItemSize.d.ts +7 -0
- package/resizable/engine/global/utils/validateItemSize.js +31 -0
- package/resizable/engine/global/utils/validateLayoutKeys.d.ts +2 -0
- package/resizable/engine/global/utils/validateLayoutKeys.js +13 -0
- package/resizable/engine/types.d.ts +13 -0
- package/resizable/engine/types.js +1 -0
- package/resizable/engine/utils/EventEmitter.d.ts +11 -0
- package/resizable/engine/utils/EventEmitter.js +60 -0
- package/resizable/engine/utils/assert.d.ts +1 -0
- package/resizable/engine/utils/assert.js +7 -0
- package/resizable/engine/utils/isArrayEqual.d.ts +1 -0
- package/resizable/engine/utils/isArrayEqual.js +15 -0
- package/resizable/engine/utils/isHTMLElement.d.ts +1 -0
- package/resizable/engine/utils/isHTMLElement.js +6 -0
- package/resizable/engine/utils/isShadowRoot.d.ts +1 -0
- package/resizable/engine/utils/isShadowRoot.js +6 -0
- package/resizable/engine/vendor/stacking-order.d.ts +7 -0
- package/resizable/engine/vendor/stacking-order.js +122 -0
- package/resizable/index.d.ts +263 -0
- package/resizable/index.jsx +537 -0
- package/resizable/mount.d.ts +115 -0
- package/resizable/mount.js +540 -0
- package/scheduler/behaviour.d.ts +71 -0
- package/scheduler/behaviour.js +243 -0
- package/scheduler/context.d.ts +100 -0
- package/scheduler/context.jsx +7 -0
- package/scheduler/dates.d.ts +53 -0
- package/scheduler/dates.js +183 -0
- package/scheduler/drag.d.ts +20 -0
- package/scheduler/drag.js +361 -0
- package/scheduler/event.d.ts +26 -0
- package/scheduler/event.jsx +93 -0
- package/scheduler/index.d.ts +57 -0
- package/scheduler/index.jsx +303 -0
- package/scheduler/intl.d.ts +16 -0
- package/scheduler/intl.js +529 -0
- package/scheduler/keys-month.d.ts +7 -0
- package/scheduler/keys-month.js +110 -0
- package/scheduler/keys-time-grid.d.ts +9 -0
- package/scheduler/keys-time-grid.js +115 -0
- package/scheduler/keys.d.ts +103 -0
- package/scheduler/keys.js +527 -0
- package/scheduler/layout-index.d.ts +3 -0
- package/scheduler/layout-index.js +6 -0
- package/scheduler/layout.d.ts +285 -0
- package/scheduler/layout.js +378 -0
- package/scheduler/menus.d.ts +66 -0
- package/scheduler/menus.jsx +88 -0
- package/scheduler/month.d.ts +26 -0
- package/scheduler/month.jsx +215 -0
- package/scheduler/pointer.d.ts +64 -0
- package/scheduler/pointer.js +203 -0
- package/scheduler/select.d.ts +11 -0
- package/scheduler/select.js +64 -0
- package/scheduler/selection.d.ts +34 -0
- package/scheduler/selection.js +39 -0
- package/scheduler/state.d.ts +296 -0
- package/scheduler/state.js +496 -0
- package/scheduler/time-grid-client.d.ts +32 -0
- package/scheduler/time-grid-client.jsx +133 -0
- package/scheduler/time-grid.d.ts +26 -0
- package/scheduler/time-grid.jsx +266 -0
- package/scheduler/time.d.ts +35 -0
- package/scheduler/time.js +56 -0
- package/scheduler/toolbar.d.ts +43 -0
- package/scheduler/toolbar.jsx +38 -0
- package/scroll-area/dom.d.ts +11 -0
- package/scroll-area/dom.js +55 -0
- package/scroll-area/index.d.ts +96 -0
- package/scroll-area/index.jsx +884 -0
- package/scroll-area/presence.d.ts +12 -0
- package/scroll-area/presence.jsx +131 -0
- package/scrolling/auto-size-virtual-scroll.d.ts +53 -0
- package/scrolling/auto-size-virtual-scroll.js +213 -0
- package/scrolling/behaviour.d.ts +3 -0
- package/scrolling/behaviour.js +5 -0
- package/scrolling/emitter.d.ts +34 -0
- package/scrolling/emitter.js +144 -0
- package/scrolling/fixed-size-virtual-scroll.d.ts +28 -0
- package/scrolling/fixed-size-virtual-scroll.js +107 -0
- package/scrolling/index.d.ts +11 -0
- package/scrolling/index.jsx +13 -0
- package/scrolling/rtl.d.ts +16 -0
- package/scrolling/rtl.js +64 -0
- package/scrolling/scroll-dispatcher.d.ts +49 -0
- package/scrolling/scroll-dispatcher.js +107 -0
- package/scrolling/scrollable.d.ts +75 -0
- package/scrolling/scrollable.js +149 -0
- package/scrolling/scrolling.css +11 -0
- package/scrolling/state.d.ts +92 -0
- package/scrolling/state.js +94 -0
- package/scrolling/viewport-ruler.d.ts +47 -0
- package/scrolling/viewport-ruler.js +100 -0
- package/scrolling/viewport.d.ts +54 -0
- package/scrolling/viewport.jsx +105 -0
- package/scrolling/virtual-scroll-strategy.d.ts +41 -0
- package/scrolling/virtual-scroll-strategy.js +2 -0
- package/scrolling/virtual-scroll-viewport.d.ts +95 -0
- package/scrolling/virtual-scroll-viewport.js +370 -0
- package/search-field/behaviour.d.ts +62 -0
- package/search-field/behaviour.jsx +116 -0
- package/search-field/index.d.ts +57 -0
- package/search-field/index.jsx +158 -0
- package/search-field/intl.d.ts +2 -0
- package/search-field/intl.js +36 -0
- package/select/behaviour.d.ts +188 -0
- package/select/behaviour.jsx +445 -0
- package/select/hidden-select.d.ts +44 -0
- package/select/hidden-select.jsx +68 -0
- package/select/index.d.ts +123 -0
- package/select/index.jsx +255 -0
- package/select/intl.d.ts +2 -0
- package/select/intl.js +36 -0
- package/select/parts.d.ts +11 -0
- package/select/parts.jsx +12 -0
- package/select/select-parts.d.ts +73 -0
- package/select/select-parts.jsx +293 -0
- package/select/select-value.d.ts +58 -0
- package/select/select-value.jsx +142 -0
- package/selection/dom-utils.d.ts +25 -0
- package/selection/dom-utils.js +77 -0
- package/selection/keyed.d.ts +19 -0
- package/selection/keyed.js +76 -0
- package/selection/list-keyboard-delegate.d.ts +67 -0
- package/selection/list-keyboard-delegate.js +274 -0
- package/selection/manager.d.ts +112 -0
- package/selection/manager.js +340 -0
- package/selection/selectable-collection.d.ts +123 -0
- package/selection/selectable-collection.js +535 -0
- package/selection/selectable-item.d.ts +128 -0
- package/selection/selectable-item.js +486 -0
- package/selection/selectable-list.d.ts +42 -0
- package/selection/selectable-list.js +34 -0
- package/selection/state.d.ts +96 -0
- package/selection/state.js +131 -0
- package/selection/type-select.d.ts +37 -0
- package/selection/type-select.js +114 -0
- package/selection/utils.d.ts +23 -0
- package/selection/utils.js +38 -0
- package/selection-indicator/context.d.ts +10 -0
- package/selection-indicator/context.js +7 -0
- package/selection-indicator/index.d.ts +20 -0
- package/selection-indicator/index.jsx +25 -0
- package/separator/behaviour.d.ts +17 -0
- package/separator/behaviour.js +17 -0
- package/separator/index.d.ts +23 -0
- package/separator/index.jsx +64 -0
- package/shared-element-transition/index.d.ts +36 -0
- package/shared-element-transition/index.jsx +182 -0
- package/shared-element-transition/transition.d.ts +19 -0
- package/shared-element-transition/transition.jsx +20 -0
- package/sheet-motion/index.d.ts +82 -0
- package/sheet-motion/index.js +386 -0
- package/sidebar/index.d.ts +257 -0
- package/sidebar/index.jsx +624 -0
- package/sidebar/pages.d.ts +71 -0
- package/sidebar/pages.jsx +177 -0
- package/sidebar/resize.d.ts +69 -0
- package/sidebar/resize.js +237 -0
- package/sidebar/sheet-motion.d.ts +15 -0
- package/sidebar/sheet-motion.js +170 -0
- package/sidebar/state.d.ts +126 -0
- package/sidebar/state.js +204 -0
- package/slider/behaviour.d.ts +141 -0
- package/slider/behaviour.jsx +492 -0
- package/slider/index.d.ts +171 -0
- package/slider/index.jsx +392 -0
- package/slider/state.d.ts +203 -0
- package/slider/state.js +377 -0
- package/slots/index.d.ts +248 -0
- package/slots/index.jsx +473 -0
- package/spinbutton/behaviour.d.ts +66 -0
- package/spinbutton/behaviour.jsx +312 -0
- package/spinbutton/intl.d.ts +2 -0
- package/spinbutton/intl.js +36 -0
- package/state/autocomplete.d.ts +26 -0
- package/state/autocomplete.js +32 -0
- package/state/calendar.d.ts +284 -0
- package/state/calendar.js +755 -0
- package/state/checkbox-group.d.ts +67 -0
- package/state/checkbox-group.js +76 -0
- package/state/combobox.d.ts +238 -0
- package/state/combobox.js +708 -0
- package/state/date-field.d.ts +407 -0
- package/state/date-field.js +1117 -0
- package/state/date-intl.d.ts +3 -0
- package/state/date-intl.js +36 -0
- package/state/date-picker.d.ts +144 -0
- package/state/date-picker.js +387 -0
- package/state/disclosure.d.ts +90 -0
- package/state/disclosure.js +148 -0
- package/state/form-validation.d.ts +89 -0
- package/state/form-validation.js +158 -0
- package/state/grid.d.ts +62 -0
- package/state/grid.js +127 -0
- package/state/list.d.ts +58 -0
- package/state/list.js +124 -0
- package/state/menu.d.ts +159 -0
- package/state/menu.js +184 -0
- package/state/overlays.d.ts +35 -0
- package/state/overlays.js +29 -0
- package/state/radio-group.d.ts +58 -0
- package/state/radio-group.js +68 -0
- package/state/search-field.d.ts +20 -0
- package/state/search-field.js +21 -0
- package/state/select.d.ts +150 -0
- package/state/select.js +187 -0
- package/state/selection.d.ts +3 -0
- package/state/selection.js +5 -0
- package/state/table-column-resize.d.ts +58 -0
- package/state/table-column-resize.js +76 -0
- package/state/table.d.ts +81 -0
- package/state/table.js +114 -0
- package/state/tabs.d.ts +85 -0
- package/state/tabs.js +161 -0
- package/state/time-field.d.ts +32 -0
- package/state/time-field.js +34 -0
- package/state/toast.d.ts +80 -0
- package/state/toast.js +146 -0
- package/state/toggle-group.d.ts +70 -0
- package/state/toggle-group.js +110 -0
- package/state/toggle.d.ts +40 -0
- package/state/toggle.js +39 -0
- package/state/tooltip.d.ts +53 -0
- package/state/tooltip.js +153 -0
- package/stepper/index.d.ts +117 -0
- package/stepper/index.jsx +405 -0
- package/stepper/state.d.ts +200 -0
- package/stepper/state.js +325 -0
- package/switch/behaviour.d.ts +12 -0
- package/switch/behaviour.jsx +9 -0
- package/switch/index.d.ts +150 -0
- package/switch/index.jsx +186 -0
- package/table/behaviour.d.ts +181 -0
- package/table/behaviour.js +334 -0
- package/table/collection.d.ts +49 -0
- package/table/collection.js +259 -0
- package/table/column-resize.d.ts +48 -0
- package/table/column-resize.jsx +247 -0
- package/table/index.d.ts +339 -0
- package/table/index.jsx +982 -0
- package/table/intl.d.ts +2 -0
- package/table/intl.js +36 -0
- package/table/keyboard-delegate.d.ts +21 -0
- package/table/keyboard-delegate.js +166 -0
- package/table/rac-intl.d.ts +2 -0
- package/table/rac-intl.js +36 -0
- package/tabs/behaviour.d.ts +49 -0
- package/tabs/behaviour.js +173 -0
- package/tabs/index.d.ts +248 -0
- package/tabs/index.jsx +577 -0
- package/tabs/keyboard-delegate.d.ts +17 -0
- package/tabs/keyboard-delegate.js +64 -0
- package/tag-group/behaviour.d.ts +59 -0
- package/tag-group/behaviour.js +112 -0
- package/tag-group/index.d.ts +138 -0
- package/tag-group/index.jsx +565 -0
- package/tag-group/intl.d.ts +2 -0
- package/tag-group/intl.js +36 -0
- package/tailwind.css +12 -0
- package/tests-components/app/src/routes/index.d.ts +4 -0
- package/tests-components/app/src/routes/index.jsx +7 -0
- package/text/index.d.ts +15 -0
- package/text/index.jsx +61 -0
- package/text-area/index.d.ts +19 -0
- package/text-area/index.jsx +76 -0
- package/text-field/autosize.d.ts +70 -0
- package/text-field/autosize.js +355 -0
- package/text-field/behaviour.d.ts +140 -0
- package/text-field/behaviour.jsx +260 -0
- package/text-field/fields.d.ts +12 -0
- package/text-field/fields.js +20 -0
- package/text-field/index.d.ts +50 -0
- package/text-field/index.jsx +174 -0
- package/text-field/text-field.css +45 -0
- package/theme.css +1006 -0
- package/time-wheels/behaviour.d.ts +29 -0
- package/time-wheels/behaviour.js +156 -0
- package/time-wheels/index.d.ts +27 -0
- package/time-wheels/index.jsx +91 -0
- package/toast/behaviour.d.ts +51 -0
- package/toast/behaviour.jsx +273 -0
- package/toast/index.d.ts +94 -0
- package/toast/index.jsx +256 -0
- package/toast/intl.d.ts +2 -0
- package/toast/intl.js +36 -0
- package/toggle-button/behaviour.d.ts +15 -0
- package/toggle-button/behaviour.js +37 -0
- package/toggle-button/index.d.ts +59 -0
- package/toggle-button/index.jsx +206 -0
- package/toggle-button-group/behaviour.d.ts +19 -0
- package/toggle-button-group/behaviour.jsx +13 -0
- package/toggle-button-group/context.d.ts +7 -0
- package/toggle-button-group/context.js +9 -0
- package/toggle-button-group/index.d.ts +39 -0
- package/toggle-button-group/index.jsx +85 -0
- package/toggle-button-group/item.d.ts +30 -0
- package/toggle-button-group/item.jsx +37 -0
- package/toolbar/behaviour.d.ts +22 -0
- package/toolbar/behaviour.js +89 -0
- package/toolbar/index.d.ts +16 -0
- package/toolbar/index.jsx +67 -0
- package/tooltip/behaviour.d.ts +93 -0
- package/tooltip/behaviour.jsx +299 -0
- package/tooltip/index.d.ts +59 -0
- package/tooltip/index.jsx +193 -0
- package/tree/behaviour.d.ts +51 -0
- package/tree/behaviour.jsx +51 -0
- package/tree/cdk-index.d.ts +2 -0
- package/tree/cdk-index.js +6 -0
- package/tree/collection.d.ts +16 -0
- package/tree/collection.js +138 -0
- package/tree/control.d.ts +125 -0
- package/tree/control.js +166 -0
- package/tree/index.d.ts +154 -0
- package/tree/index.jsx +815 -0
- package/tree/intl.d.ts +2 -0
- package/tree/intl.js +36 -0
- package/tree/navigation-context.d.ts +44 -0
- package/tree/navigation-context.jsx +63 -0
- package/tree/tree-key-manager.d.ts +149 -0
- package/tree/tree-key-manager.js +336 -0
- package/utils/animation.d.ts +32 -0
- package/utils/animation.jsx +236 -0
- package/utils/data-attrs.d.ts +71 -0
- package/utils/data-attrs.jsx +193 -0
- package/utils/dev-off.d.ts +3 -0
- package/utils/dev-off.js +7 -0
- package/utils/dev-on.d.ts +3 -0
- package/utils/dev-on.js +17 -0
- package/utils/dom-props.d.ts +44 -0
- package/utils/dom-props.js +73 -0
- package/utils/dom.d.ts +85 -0
- package/utils/dom.js +402 -0
- package/utils/id.d.ts +23 -0
- package/utils/id.js +100 -0
- package/utils/index.d.ts +57 -0
- package/utils/index.js +257 -0
- package/utils/links.d.ts +87 -0
- package/utils/links.jsx +152 -0
- package/utils/live-element.d.ts +8 -0
- package/utils/live-element.jsx +76 -0
- package/utils/live.d.ts +53 -0
- package/utils/live.jsx +169 -0
- package/utils/load-more-sentinel.d.ts +28 -0
- package/utils/load-more-sentinel.jsx +52 -0
- package/utils/motion-token.d.ts +4 -0
- package/utils/motion-token.js +48 -0
- package/utils/render.d.ts +19 -0
- package/utils/render.js +18 -0
- package/utils/types.d.ts +111 -0
- package/utils/types.js +1 -0
- package/virtualizer/behaviour.d.ts +98 -0
- package/virtualizer/behaviour.js +315 -0
- package/virtualizer/collection.d.ts +103 -0
- package/virtualizer/collection.js +155 -0
- package/virtualizer/dom.d.ts +50 -0
- package/virtualizer/dom.js +233 -0
- package/virtualizer/engine.d.ts +21 -0
- package/virtualizer/engine.js +21 -0
- package/virtualizer/grid-layout.d.ts +50 -0
- package/virtualizer/grid-layout.js +247 -0
- package/virtualizer/index.d.ts +2 -0
- package/virtualizer/index.jsx +4 -0
- package/virtualizer/layout-info.d.ts +33 -0
- package/virtualizer/layout-info.js +54 -0
- package/virtualizer/layout.d.ts +44 -0
- package/virtualizer/layout.js +30 -0
- package/virtualizer/list-layout.d.ts +103 -0
- package/virtualizer/list-layout.js +508 -0
- package/virtualizer/overscan-manager.d.ts +9 -0
- package/virtualizer/overscan-manager.js +32 -0
- package/virtualizer/point.d.ts +13 -0
- package/virtualizer/point.js +23 -0
- package/virtualizer/rect.d.ts +49 -0
- package/virtualizer/rect.js +105 -0
- package/virtualizer/reusable-view.d.ts +29 -0
- package/virtualizer/reusable-view.js +56 -0
- package/virtualizer/scroll-anchor.d.ts +62 -0
- package/virtualizer/scroll-anchor.js +130 -0
- package/virtualizer/size.d.ts +11 -0
- package/virtualizer/size.js +21 -0
- package/virtualizer/state.d.ts +35 -0
- package/virtualizer/state.js +79 -0
- package/virtualizer/table-collection.d.ts +45 -0
- package/virtualizer/table-collection.js +80 -0
- package/virtualizer/table-column-layout.d.ts +44 -0
- package/virtualizer/table-column-layout.js +210 -0
- package/virtualizer/table-layout.d.ts +55 -0
- package/virtualizer/table-layout.js +482 -0
- package/virtualizer/types.d.ts +63 -0
- package/virtualizer/types.js +1 -0
- package/virtualizer/utils.d.ts +2 -0
- package/virtualizer/utils.js +12 -0
- package/virtualizer/virtualizer-core.d.ts +61 -0
- package/virtualizer/virtualizer-core.js +304 -0
- package/virtualizer/virtualizer.d.ts +62 -0
- package/virtualizer/virtualizer.jsx +88 -0
- package/virtualizer/waterfall-layout.d.ts +41 -0
- package/virtualizer/waterfall-layout.js +227 -0
- package/wheel-picker/behaviour.d.ts +94 -0
- package/wheel-picker/behaviour.js +482 -0
- package/wheel-picker/index.d.ts +33 -0
- package/wheel-picker/index.jsx +66 -0
|
@@ -0,0 +1,1025 @@
|
|
|
1
|
+
// Ported from react-aria (react-spectrum) src/datepicker/useDateField.ts, useDateSegment.ts,
|
|
2
|
+
// useDatePickerGroup.ts, useDisplayNames.ts, the keyboard / ARIA part of spinbutton/useSpinButton.ts
|
|
3
|
+
// and react-aria-components src/HiddenDateInput.tsx, Apache-2.0, © Adobe.
|
|
4
|
+
// Rivet:
|
|
5
|
+
// - Naming: `useDateField` / `useTimeField` → `dateFieldProps` / `timeFieldProps(props, state)` ({ labelProps,
|
|
6
|
+
// fieldProps, inputProps, descriptionProps, errorMessageProps, isInvalid, validationErrors, validationDetails }),
|
|
7
|
+
// `useDateSegment` → `dateSegmentProps({ key }, state)` ({ segmentProps }), RAC `useHiddenDateInput` →
|
|
8
|
+
// `hiddenDateInputProps` ({ containerProps, inputProps }). State-dependent values are accessors (read in
|
|
9
|
+
// bindings / spreads); handlers are free functions `(event, state)`. `.tsx`: the closures resume.
|
|
10
|
+
// - Segments are server-rendered `contenteditable` spinbuttons keyed by type + occurrence (`segmentKeys`): their
|
|
11
|
+
// text and ARIA are patched in place. Keys / focus / pointer handlers are delegated on the field group
|
|
12
|
+
// (`fieldProps`); `beforeinput` / `input` run on the segment (React Aria: per segment). Typing is handled at
|
|
13
|
+
// keydown (printable keys, so a cold first key — held by `data-rk` while the chunk loads — is not inserted into
|
|
14
|
+
// the segment) and at `beforeinput` for IME / virtual keyboards. The hidden form input's custom validity is
|
|
15
|
+
// synced from the handlers (no layout effect runs before interaction).
|
|
16
|
+
// Deviation: iOS VoiceOver `role="textbox"` switch is not applied (server-rendered: spinbuttons everywhere but the
|
|
17
|
+
// time zone segment).
|
|
18
|
+
import { untrack } from "@rivetjs/reactivity";
|
|
19
|
+
import { CalendarDate, parseDate, parseDateTime, toCalendar, toCalendarDate, toCalendarDateTime, toLocalTimeZone, } from "@rivetjs/cdk/date";
|
|
20
|
+
import { announce, visuallyHidden } from "@rivetjs/cdk/a11y";
|
|
21
|
+
import { createFocusManager, getFocusableTreeWalker } from "@rivetjs/cdk/focus";
|
|
22
|
+
import { formatString, getDateFormatter, getStringsForLocale, isRTL } from "@rivetjs/cdk/i18n";
|
|
23
|
+
import { isMac } from "@rivetjs/cdk/platform";
|
|
24
|
+
import { clearServerErrors, commitValidation, displayValidation, mergeValidation, realtimeValidation, resetValidation, updateValidation, } from "../state/form-validation.js";
|
|
25
|
+
import { nativeValidity, onFormReset, validityError } from "../form/behaviour.js";
|
|
26
|
+
import { labelsProps } from "../label/behaviour.js";
|
|
27
|
+
import { createSlotId, slotIdRef } from "../slots/index.jsx";
|
|
28
|
+
import { timeValue } from "../state/time-field.js";
|
|
29
|
+
import { calendarOf, clearSegment, decrement, decrementPage, decrementToMin, fieldDateValue, fieldDateFormatter, fieldGranularity, fieldValueString, formatValue, increment, incrementPage, incrementToMax, isFieldInvalid, ownerDisabled, ownerOf, ownerReadOnly, ownerRequired, parseValue, resolvedOptionsOf, segments, setSegment, setValue, confirmPlaceholder, syncBuiltin, } from "../state/date-field.js";
|
|
30
|
+
import { datePickerMessages } from "./intl.js";
|
|
31
|
+
export { validityError };
|
|
32
|
+
export const SEGMENT_ATTR = "data-rv-segment";
|
|
33
|
+
export const SEGMENT = "[" + SEGMENT_ATTR + "]";
|
|
34
|
+
// ---------------------------------------------------------------------------------------------
|
|
35
|
+
// Ids and strings
|
|
36
|
+
/** Id of the hidden form input of a field (RAC `<Input>` of DateInput). */
|
|
37
|
+
export const inputId = (state) => state.id + "-input";
|
|
38
|
+
/** Id of the selected-value description (React Aria `useDescription`). */
|
|
39
|
+
export const valueDescriptionId = (state) => state.id + "-value";
|
|
40
|
+
const messages = (locale) => getStringsForLocale(datePickerMessages, locale);
|
|
41
|
+
export const message = (locale, key, variables) => formatString(messages(locale)[key], variables);
|
|
42
|
+
const displayNamesCache = new Map();
|
|
43
|
+
/** @private Field names (`Intl.DisplayNames` dateTimeField, else the bundled strings). */
|
|
44
|
+
export function displayNames(locale) {
|
|
45
|
+
let names = displayNamesCache.get(locale);
|
|
46
|
+
if (names)
|
|
47
|
+
return names;
|
|
48
|
+
// Try to use Intl.DisplayNames if possible. It may be supported in browsers, but not support the dateTimeField
|
|
49
|
+
// type as that was only added in v2. https://github.com/tc39/intl-displaynames-v2
|
|
50
|
+
try {
|
|
51
|
+
names = new Intl.DisplayNames(locale, { type: "dateTimeField" });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
const strings = messages(locale);
|
|
55
|
+
names = { of: (field) => strings[field] };
|
|
56
|
+
}
|
|
57
|
+
displayNamesCache.set(locale, names);
|
|
58
|
+
return names;
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------------------------
|
|
61
|
+
// Segment keys: stable per segment type and occurrence, so the rows (and focus) survive updates.
|
|
62
|
+
/** Keys of the field's segments (`month`, `literal`, `literal-1` …). Reads. */
|
|
63
|
+
export function segmentKeys(state) {
|
|
64
|
+
return keysOf(segments(state)).slice();
|
|
65
|
+
}
|
|
66
|
+
// Keys per segments array (`segments` returns the same array while the value is unchanged): every segment
|
|
67
|
+
// attribute binding asks `segmentOf`, so the keys were rebuilt ~15× per segment and render (HOTPATH 2026-10-09).
|
|
68
|
+
const segmentKeyCache = new WeakMap();
|
|
69
|
+
function keysOf(list) {
|
|
70
|
+
let keys = segmentKeyCache.get(list);
|
|
71
|
+
if (!keys) {
|
|
72
|
+
const seen = {};
|
|
73
|
+
keys = list.map((segment) => {
|
|
74
|
+
const n = (seen[segment.type] = (seen[segment.type] ?? -1) + 1);
|
|
75
|
+
return n ? segment.type + "-" + n : segment.type;
|
|
76
|
+
});
|
|
77
|
+
segmentKeyCache.set(list, keys);
|
|
78
|
+
}
|
|
79
|
+
return keys;
|
|
80
|
+
}
|
|
81
|
+
/** The segment of `key`. Reads. */
|
|
82
|
+
export function segmentOf(state, key) {
|
|
83
|
+
const list = segments(state);
|
|
84
|
+
const index = keysOf(list).indexOf(key);
|
|
85
|
+
return index < 0 ? undefined : list[index];
|
|
86
|
+
}
|
|
87
|
+
export const segmentId = (state, key) => state.id + "-" + key;
|
|
88
|
+
// ---------------------------------------------------------------------------------------------
|
|
89
|
+
// useDateField
|
|
90
|
+
/** The selected-value description of a standalone field (`Selected Date: …`). Reads. */
|
|
91
|
+
export function fieldValueDescription(state) {
|
|
92
|
+
if (!fieldValueString(state))
|
|
93
|
+
return "";
|
|
94
|
+
const time = state.maxGranularity === "hour";
|
|
95
|
+
return message(state.locale, time ? "selectedTimeDescription" : "selectedDateDescription", {
|
|
96
|
+
[time ? "time" : "date"]: formatValue(state, { month: "long" }),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------------------------
|
|
100
|
+
// useDateSegment
|
|
101
|
+
const formatterOf = (state) => fieldDateFormatter(state);
|
|
102
|
+
function textValueOf(state, segment) {
|
|
103
|
+
let textValue = segment.isPlaceholder ? "" : segment.text;
|
|
104
|
+
const options = resolvedOptionsOf(formatterOf(state));
|
|
105
|
+
if (segment.type === "month" && !segment.isPlaceholder) {
|
|
106
|
+
const monthTextValue = getDateFormatter(state.locale, { month: "long", timeZone: options.timeZone }).format(fieldDateValue(state));
|
|
107
|
+
textValue = monthTextValue !== textValue ? `${textValue} – ${monthTextValue}` : monthTextValue;
|
|
108
|
+
}
|
|
109
|
+
else if (segment.type === "hour" && !segment.isPlaceholder) {
|
|
110
|
+
textValue = getDateFormatter(state.locale, { hour: "numeric", hour12: options.hour12, timeZone: options.timeZone }).format(fieldDateValue(state));
|
|
111
|
+
}
|
|
112
|
+
return textValue;
|
|
113
|
+
}
|
|
114
|
+
/** useSpinButton `aria-valuetext`. */
|
|
115
|
+
function ariaTextValue(state, segment) {
|
|
116
|
+
const textValue = textValueOf(state, segment);
|
|
117
|
+
return textValue === "" ? message(state.locale, "Empty") : (textValue || `${segment.value}`).replace("-", "−");
|
|
118
|
+
}
|
|
119
|
+
/** Segment style (caret hidden; RTL: numeric segments embedded left-to-right). Reads. */
|
|
120
|
+
export function segmentStyle(state, key) {
|
|
121
|
+
const segment = segmentOf(state, key);
|
|
122
|
+
const style = { caretColor: "transparent" };
|
|
123
|
+
if (!segment || segment.type === "literal")
|
|
124
|
+
return {};
|
|
125
|
+
if (isRTL(state.locale)) {
|
|
126
|
+
// While the bidirectional algorithm seems to work properly on inline elements with actual values, it returns different results for placeholder strings.
|
|
127
|
+
// To ensure placeholder render in correct format, we apply the CSS equivalent of LRE (left-to-right embedding). See https://www.unicode.org/reports/tr9/#Explicit_Directional_Embeddings.
|
|
128
|
+
// However, we apply this to both placeholders and date segments with an actual value because the date segments will shift around when deleting otherwise.
|
|
129
|
+
style.unicodeBidi = "embed";
|
|
130
|
+
const format = resolvedOptionsOf(formatterOf(state))[segment.type];
|
|
131
|
+
if (format === "numeric" || format === "2-digit")
|
|
132
|
+
style.direction = "ltr";
|
|
133
|
+
}
|
|
134
|
+
return style;
|
|
135
|
+
}
|
|
136
|
+
/** Segment text. Reads. */
|
|
137
|
+
export const segmentText = (state, key) => segmentOf(state, key)?.text ?? "";
|
|
138
|
+
/** Keys held while a cold field's chunk loads (`data-rk`): spin / navigation keys, digits, day period letters. */
|
|
139
|
+
export function fieldKeys(state) {
|
|
140
|
+
const keys = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "PageUp", "PageDown", "Home", "End", "Backspace", "Delete", "Space"];
|
|
141
|
+
for (let i = 0; i < 10; i++)
|
|
142
|
+
keys.push(String(i));
|
|
143
|
+
if (state.hourCycle === "h11" || state.hourCycle === "h12") {
|
|
144
|
+
const { am, pm } = dayPeriods(state.locale);
|
|
145
|
+
for (const text of [am, pm]) {
|
|
146
|
+
const first = text.charAt(0);
|
|
147
|
+
for (const c of new Set([first, first.toLowerCase(), first.toUpperCase()]))
|
|
148
|
+
if (c && c !== " " && !keys.includes(c))
|
|
149
|
+
keys.push(c);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return keys.join(" ");
|
|
153
|
+
}
|
|
154
|
+
// Number parsing (`@internationalized/number` NumberParser, integers only: locale digits + ASCII).
|
|
155
|
+
const digitsCache = new Map();
|
|
156
|
+
function digitsOf(locale) {
|
|
157
|
+
let map = digitsCache.get(locale);
|
|
158
|
+
if (!map) {
|
|
159
|
+
map = new Map();
|
|
160
|
+
const formatter = new Intl.NumberFormat(locale, { useGrouping: false });
|
|
161
|
+
for (let i = 0; i < 10; i++) {
|
|
162
|
+
map.set(formatter.format(i), String(i));
|
|
163
|
+
map.set(String(i), String(i));
|
|
164
|
+
}
|
|
165
|
+
digitsCache.set(locale, map);
|
|
166
|
+
}
|
|
167
|
+
return map;
|
|
168
|
+
}
|
|
169
|
+
const toAscii = (locale, text) => {
|
|
170
|
+
const digits = digitsOf(locale);
|
|
171
|
+
let out = "";
|
|
172
|
+
for (const c of text) {
|
|
173
|
+
const d = digits.get(c);
|
|
174
|
+
if (d === undefined)
|
|
175
|
+
return null;
|
|
176
|
+
out += d;
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
};
|
|
180
|
+
/** NumberParser `isValidPartialNumber` ({maximumFractionDigits: 0}). */
|
|
181
|
+
export const isValidPartialNumber = (locale, text) => toAscii(locale, text) !== null;
|
|
182
|
+
/** NumberParser `parse` (NaN when empty / not a number). */
|
|
183
|
+
export const parseNumber = (locale, text) => {
|
|
184
|
+
const ascii = toAscii(locale, text);
|
|
185
|
+
return ascii ? Number(ascii) : NaN;
|
|
186
|
+
};
|
|
187
|
+
// useFilter({sensitivity: 'base'}).startsWith
|
|
188
|
+
const collators = new Map();
|
|
189
|
+
function startsWith(locale, string, substring) {
|
|
190
|
+
if (substring.length === 0)
|
|
191
|
+
return true;
|
|
192
|
+
let collator = collators.get(locale);
|
|
193
|
+
if (!collator)
|
|
194
|
+
collators.set(locale, (collator = new Intl.Collator(locale, { usage: "search", sensitivity: "base" })));
|
|
195
|
+
string = string.normalize("NFC");
|
|
196
|
+
substring = substring.normalize("NFC");
|
|
197
|
+
return collator.compare(string.slice(0, substring.length), substring) === 0;
|
|
198
|
+
}
|
|
199
|
+
// Safari dayPeriod option doesn't work...
|
|
200
|
+
function dayPeriods(locale) {
|
|
201
|
+
const formatter = getDateFormatter(locale, { hour: "numeric", hour12: true });
|
|
202
|
+
const date = new Date();
|
|
203
|
+
date.setHours(0);
|
|
204
|
+
const am = formatter.formatToParts(date).find((part) => part.type === "dayPeriod")?.value ?? "AM";
|
|
205
|
+
date.setHours(12);
|
|
206
|
+
const pm = formatter.formatToParts(date).find((part) => part.type === "dayPeriod")?.value ?? "PM";
|
|
207
|
+
return { am, pm };
|
|
208
|
+
}
|
|
209
|
+
// Get a list of formatted era names so users can type the first character to choose one.
|
|
210
|
+
function erasOf(state) {
|
|
211
|
+
const calendar = calendarOf(state);
|
|
212
|
+
const eraFormatter = getDateFormatter(state.locale, { year: "numeric", era: "narrow", timeZone: "UTC" });
|
|
213
|
+
const date = toCalendar(new CalendarDate(1, 1, 1), calendar);
|
|
214
|
+
const eras = calendar.getEras().map((era) => {
|
|
215
|
+
const eraDate = date.set({ year: 1, month: 1, day: 1, era }).toDate("UTC");
|
|
216
|
+
const parts = eraFormatter.formatToParts(eraDate);
|
|
217
|
+
// Some eras have no localized name in CLDR (e.g. the Coptic 'BCE' era), in which case
|
|
218
|
+
// Intl omits the era part entirely. Fall back to the era identifier so it stays typeable.
|
|
219
|
+
const formatted = parts.find((p) => p.type === "era")?.value ?? era;
|
|
220
|
+
return { era, formatted };
|
|
221
|
+
});
|
|
222
|
+
// Remove the common prefix from formatted values. This is so that in calendars with eras like
|
|
223
|
+
// ERA0 and ERA1 (e.g. Ethiopic), users can press "0" and "1" to select an era. In other cases,
|
|
224
|
+
// the first letter is used.
|
|
225
|
+
const prefixLength = commonPrefixLength(eras.map((era) => era.formatted));
|
|
226
|
+
if (prefixLength)
|
|
227
|
+
for (const era of eras)
|
|
228
|
+
era.formatted = era.formatted.slice(prefixLength);
|
|
229
|
+
return eras;
|
|
230
|
+
}
|
|
231
|
+
function commonPrefixLength(strings) {
|
|
232
|
+
// Sort the strings, and compare the characters in the first and last to find the common prefix.
|
|
233
|
+
strings.sort();
|
|
234
|
+
const first = strings[0];
|
|
235
|
+
const last = strings[strings.length - 1];
|
|
236
|
+
for (let i = 0; i < first.length; i++)
|
|
237
|
+
if (first[i] !== last[i])
|
|
238
|
+
return i;
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
241
|
+
// Entered keys per field segment (React Aria `enteredKeys` ref; browser-only).
|
|
242
|
+
const enteredKeys = new WeakMap();
|
|
243
|
+
const entered = (state, key) => enteredKeys.get(state)?.[key] ?? "";
|
|
244
|
+
function setEntered(state, key, value) {
|
|
245
|
+
let record = enteredKeys.get(state);
|
|
246
|
+
if (!record)
|
|
247
|
+
enteredKeys.set(state, (record = {}));
|
|
248
|
+
record[key] = value;
|
|
249
|
+
}
|
|
250
|
+
/** The field's focus manager (segments of its scope: the field, or a range picker's group). */
|
|
251
|
+
function fieldFocusManager(segment) {
|
|
252
|
+
const field = segment.closest("[data-rv-date-field]");
|
|
253
|
+
const scopeId = field?.getAttribute("data-rv-focus-scope");
|
|
254
|
+
const scope = (scopeId && segment.ownerDocument.getElementById(scopeId)) || field;
|
|
255
|
+
return createFocusManager(() => scope, { accept: (element) => element.hasAttribute(SEGMENT_ATTR) });
|
|
256
|
+
}
|
|
257
|
+
/** Events a field handler handled (the picker group's handler skips them; cold events are already default-prevented). */
|
|
258
|
+
const handled = new WeakSet();
|
|
259
|
+
export const wasHandled = (event) => handled.has(event);
|
|
260
|
+
function afterChange(state, segmentEl, key) {
|
|
261
|
+
syncFieldInput(state, segmentEl.ownerDocument);
|
|
262
|
+
// useSpinButton announces the new value while the segment is focused.
|
|
263
|
+
const doc = segmentEl.ownerDocument;
|
|
264
|
+
queueMicrotask(() => {
|
|
265
|
+
if (doc.activeElement !== segmentEl)
|
|
266
|
+
return;
|
|
267
|
+
const segment = untrack(() => segmentOf(state, key));
|
|
268
|
+
if (segment && segment.type !== "literal")
|
|
269
|
+
announce(untrack(() => ariaTextValue(state, segment)), "assertive");
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
function backspace(state, segmentEl, key, segment) {
|
|
273
|
+
const owner = ownerOf(state);
|
|
274
|
+
if (segment.text === segment.placeholder)
|
|
275
|
+
fieldFocusManager(segmentEl).focusPrevious();
|
|
276
|
+
if (isValidPartialNumber(state.locale, segment.text) && !ownerReadOnly(owner) && !segment.isPlaceholder) {
|
|
277
|
+
let newValue = segment.text.slice(0, -1);
|
|
278
|
+
const parsed = parseNumber(state.locale, newValue);
|
|
279
|
+
newValue = parsed === 0 ? "" : newValue;
|
|
280
|
+
if (newValue.length === 0 || parsed === 0)
|
|
281
|
+
clearSegment(state, segment.type);
|
|
282
|
+
else
|
|
283
|
+
setSegment(state, segment.type, parsed);
|
|
284
|
+
setEntered(state, key, newValue);
|
|
285
|
+
}
|
|
286
|
+
else if (segment.type === "dayPeriod" || segment.type === "era")
|
|
287
|
+
clearSegment(state, segment.type);
|
|
288
|
+
}
|
|
289
|
+
function onInput(state, segmentEl, key, segment, input) {
|
|
290
|
+
const owner = ownerOf(state);
|
|
291
|
+
if (ownerDisabled(owner) || ownerReadOnly(owner))
|
|
292
|
+
return;
|
|
293
|
+
const newValue = entered(state, key) + input;
|
|
294
|
+
const focusManager = fieldFocusManager(segmentEl);
|
|
295
|
+
switch (segment.type) {
|
|
296
|
+
case "dayPeriod": {
|
|
297
|
+
const { am, pm } = dayPeriods(state.locale);
|
|
298
|
+
if (startsWith(state.locale, am, input))
|
|
299
|
+
setSegment(state, "dayPeriod", 0);
|
|
300
|
+
else if (startsWith(state.locale, pm, input))
|
|
301
|
+
setSegment(state, "dayPeriod", 1);
|
|
302
|
+
else
|
|
303
|
+
break;
|
|
304
|
+
focusManager.focusNext();
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case "era": {
|
|
308
|
+
const matched = erasOf(state).find((e) => startsWith(state.locale, e.formatted, input));
|
|
309
|
+
if (matched) {
|
|
310
|
+
setSegment(state, "era", matched.era);
|
|
311
|
+
focusManager.focusNext();
|
|
312
|
+
}
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
case "day":
|
|
316
|
+
case "hour":
|
|
317
|
+
case "minute":
|
|
318
|
+
case "second":
|
|
319
|
+
case "month":
|
|
320
|
+
case "year": {
|
|
321
|
+
if (!isValidPartialNumber(state.locale, newValue))
|
|
322
|
+
return;
|
|
323
|
+
const numberValue = parseNumber(state.locale, newValue);
|
|
324
|
+
let segmentValue = numberValue;
|
|
325
|
+
if (segment.maxValue !== undefined && numberValue > segment.maxValue)
|
|
326
|
+
segmentValue = parseNumber(state.locale, input);
|
|
327
|
+
if (isNaN(numberValue))
|
|
328
|
+
return;
|
|
329
|
+
setSegment(state, segment.type, segmentValue);
|
|
330
|
+
if (segment.maxValue !== undefined && (Number(numberValue + "0") > segment.maxValue || newValue.length >= String(segment.maxValue).length)) {
|
|
331
|
+
setEntered(state, key, "");
|
|
332
|
+
focusManager.focusNext();
|
|
333
|
+
}
|
|
334
|
+
else
|
|
335
|
+
setEntered(state, key, newValue);
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
function segmentTarget(state, event) {
|
|
341
|
+
const el = event.target?.closest?.(SEGMENT);
|
|
342
|
+
if (!el || !event.currentTarget.contains(el))
|
|
343
|
+
return null;
|
|
344
|
+
const key = el.getAttribute(SEGMENT_ATTR);
|
|
345
|
+
const segment = untrack(() => segmentOf(state, key));
|
|
346
|
+
return segment ? { el, key, segment } : null;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Whether the field group handling `event` is the innermost one around its target: a group nested in another one of the same field (HeroUI
|
|
350
|
+
* `DateInputGroup` = `<Group>` around RAC `DateInput`'s own `<Group>`, both merging the field's GroupContext props) handles the event once
|
|
351
|
+
* (React Aria: the segment's `useKeyboard` stops propagation).
|
|
352
|
+
*/
|
|
353
|
+
const innermostField = (event) => event.target?.closest?.("[data-rv-date-field]") === event.currentTarget;
|
|
354
|
+
const noModifiers = (event) => !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey;
|
|
355
|
+
/**
|
|
356
|
+
* keydown on the field: the segment's spin button keys (useSpinButton), Backspace / Delete, typed
|
|
357
|
+
* characters; a standalone field also moves between segments with ArrowLeft / ArrowRight
|
|
358
|
+
* (useDatePickerGroup; in a picker the group does).
|
|
359
|
+
*/
|
|
360
|
+
export function dateFieldKeyDown(event, state) {
|
|
361
|
+
if (event.isComposing)
|
|
362
|
+
return;
|
|
363
|
+
const target = segmentTarget(state, event);
|
|
364
|
+
if (!target)
|
|
365
|
+
return;
|
|
366
|
+
const { el, key, segment } = target;
|
|
367
|
+
const owner = ownerOf(state);
|
|
368
|
+
const spin = !ownerDisabled(owner) && !ownerReadOnly(owner) && segment.isEditable && segment.type !== "literal";
|
|
369
|
+
const type = segment.type;
|
|
370
|
+
let done = false;
|
|
371
|
+
if (noModifiers(event) && spin) {
|
|
372
|
+
done = true;
|
|
373
|
+
switch (event.key) {
|
|
374
|
+
case "PageUp":
|
|
375
|
+
setEntered(state, key, "");
|
|
376
|
+
incrementPage(state, type);
|
|
377
|
+
break;
|
|
378
|
+
case "ArrowUp":
|
|
379
|
+
setEntered(state, key, "");
|
|
380
|
+
increment(state, type);
|
|
381
|
+
break;
|
|
382
|
+
case "PageDown":
|
|
383
|
+
setEntered(state, key, "");
|
|
384
|
+
decrementPage(state, type);
|
|
385
|
+
break;
|
|
386
|
+
case "ArrowDown":
|
|
387
|
+
setEntered(state, key, "");
|
|
388
|
+
decrement(state, type);
|
|
389
|
+
break;
|
|
390
|
+
case "Home":
|
|
391
|
+
setEntered(state, key, "");
|
|
392
|
+
decrementToMin(state, type);
|
|
393
|
+
break;
|
|
394
|
+
case "End":
|
|
395
|
+
setEntered(state, key, "");
|
|
396
|
+
incrementToMax(state, type);
|
|
397
|
+
break;
|
|
398
|
+
default:
|
|
399
|
+
done = false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (!done && (event.key === "Backspace" || event.key === "Delete") && !event.altKey && !event.ctrlKey && !event.metaKey) {
|
|
403
|
+
backspace(state, el, key, segment);
|
|
404
|
+
done = true;
|
|
405
|
+
}
|
|
406
|
+
else if (!done && (isMac() ? event.metaKey : event.ctrlKey) && !event.altKey && event.key.toLowerCase() === "a") {
|
|
407
|
+
// Firefox does not fire selectstart for Ctrl/Cmd + A
|
|
408
|
+
done = true;
|
|
409
|
+
}
|
|
410
|
+
else if (!done && event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
|
|
411
|
+
onInput(state, el, key, segment, event.key);
|
|
412
|
+
done = true;
|
|
413
|
+
}
|
|
414
|
+
if (!done && noModifiers(event) && el.closest("[data-rv-date-field]")?.getAttribute("role") !== "presentation")
|
|
415
|
+
done = arrowNavigation(state.locale, el.closest("[data-rv-date-field]"), el, event);
|
|
416
|
+
if (!done)
|
|
417
|
+
return;
|
|
418
|
+
event.preventDefault();
|
|
419
|
+
handled.add(event);
|
|
420
|
+
afterChange(state, el, key);
|
|
421
|
+
}
|
|
422
|
+
/** useDatePickerGroup ArrowLeft / ArrowRight within `scope` (RTL: by position). */
|
|
423
|
+
export function arrowNavigation(locale, scope, from, event) {
|
|
424
|
+
if (event.key !== "ArrowLeft" && event.key !== "ArrowRight")
|
|
425
|
+
return false;
|
|
426
|
+
const dir = event.key === "ArrowLeft" ? -1 : 1;
|
|
427
|
+
if (isRTL(locale)) {
|
|
428
|
+
const next = findNextSegment(scope, from.getBoundingClientRect().left, dir);
|
|
429
|
+
if (next) {
|
|
430
|
+
next.focus();
|
|
431
|
+
return true;
|
|
432
|
+
}
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
const manager = createFocusManager(() => scope);
|
|
436
|
+
if (dir < 0)
|
|
437
|
+
manager.focusPrevious({ from });
|
|
438
|
+
else
|
|
439
|
+
manager.focusNext({ from });
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
function findNextSegment(group, fromX, direction) {
|
|
443
|
+
const walker = getFocusableTreeWalker(group, { tabbable: true });
|
|
444
|
+
let node = walker.nextNode();
|
|
445
|
+
let closest = null;
|
|
446
|
+
let closestDistance = Infinity;
|
|
447
|
+
while (node) {
|
|
448
|
+
const x = node.getBoundingClientRect().left;
|
|
449
|
+
const distance = x - fromX;
|
|
450
|
+
const absoluteDistance = Math.abs(distance);
|
|
451
|
+
if (Math.sign(distance) === direction && absoluteDistance < closestDistance) {
|
|
452
|
+
closest = node;
|
|
453
|
+
closestDistance = absoluteDistance;
|
|
454
|
+
}
|
|
455
|
+
node = walker.nextNode();
|
|
456
|
+
}
|
|
457
|
+
return closest;
|
|
458
|
+
}
|
|
459
|
+
// Composition text per segment element (`compositionRef`).
|
|
460
|
+
const composition = new WeakMap();
|
|
461
|
+
/** beforeinput on the field: the DOM never changes; text from IME / virtual keyboards is typed into the segment. */
|
|
462
|
+
export function dateFieldBeforeInput(event, state) {
|
|
463
|
+
const target = segmentTarget(state, event);
|
|
464
|
+
if (!target)
|
|
465
|
+
return;
|
|
466
|
+
const { el, key, segment } = target;
|
|
467
|
+
event.preventDefault();
|
|
468
|
+
switch (event.inputType) {
|
|
469
|
+
case "deleteContentBackward":
|
|
470
|
+
case "deleteContentForward":
|
|
471
|
+
if (isValidPartialNumber(state.locale, segment.text) && !ownerReadOnly(ownerOf(state)))
|
|
472
|
+
backspace(state, el, key, segment);
|
|
473
|
+
break;
|
|
474
|
+
case "insertCompositionText":
|
|
475
|
+
// insertCompositionText cannot be canceled.
|
|
476
|
+
// Record the current state of the element so we can restore it in the `input` event below.
|
|
477
|
+
composition.set(el, el.textContent);
|
|
478
|
+
// Safari gets stuck in a composition state unless we also assign to the value here.
|
|
479
|
+
// eslint-disable-next-line no-self-assign
|
|
480
|
+
el.textContent = el.textContent;
|
|
481
|
+
return;
|
|
482
|
+
default:
|
|
483
|
+
if (event.data != null)
|
|
484
|
+
onInput(state, el, key, segment, event.data);
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
afterChange(state, el, key);
|
|
488
|
+
}
|
|
489
|
+
/** input on the field: restore the DOM after composition text (it cannot be canceled). */
|
|
490
|
+
export function dateFieldInput(event, state) {
|
|
491
|
+
const target = segmentTarget(state, event);
|
|
492
|
+
if (!target || event.inputType !== "insertCompositionText")
|
|
493
|
+
return;
|
|
494
|
+
const { el, key, segment } = target;
|
|
495
|
+
// Reset the DOM to how it was in the beforeinput event.
|
|
496
|
+
el.textContent = composition.get(el) ?? el.textContent;
|
|
497
|
+
// Android sometimes fires key presses of letters as composition events. Need to handle am/pm keys here too.
|
|
498
|
+
// Can also happen e.g. with Pinyin keyboard on iOS.
|
|
499
|
+
const data = event.data;
|
|
500
|
+
const { am, pm } = dayPeriods(state.locale);
|
|
501
|
+
if (data != null && (startsWith(state.locale, am, data) || startsWith(state.locale, pm, data))) {
|
|
502
|
+
onInput(state, el, key, segment, data);
|
|
503
|
+
afterChange(state, el, key);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// Focus within the field (useFocusWithin of useDateField): value on focus, blur commits.
|
|
507
|
+
const valueOnFocus = new WeakMap();
|
|
508
|
+
let selectionListener = false;
|
|
509
|
+
/** focusin on the field: focus within starts (value on focus), the segment's selection collapses. */
|
|
510
|
+
export function dateFieldFocusIn(event, state) {
|
|
511
|
+
const field = event.currentTarget;
|
|
512
|
+
if (!field.contains(event.relatedTarget)) {
|
|
513
|
+
valueOnFocus.set(state, untrack(() => fieldValueString(state)));
|
|
514
|
+
syncBuiltin(ownerOf(state));
|
|
515
|
+
syncFieldInput(state, field.ownerDocument);
|
|
516
|
+
}
|
|
517
|
+
const target = segmentTarget(state, event);
|
|
518
|
+
if (!target)
|
|
519
|
+
return;
|
|
520
|
+
setEntered(state, target.key, "");
|
|
521
|
+
target.el.scrollIntoView?.({ block: "nearest", inline: "nearest" });
|
|
522
|
+
// Collapse selection to start or Chrome won't fire input events.
|
|
523
|
+
const doc = field.ownerDocument;
|
|
524
|
+
doc.defaultView?.getSelection()?.collapse(target.el);
|
|
525
|
+
if (!selectionListener) {
|
|
526
|
+
selectionListener = true;
|
|
527
|
+
doc.addEventListener("selectionchange", () => {
|
|
528
|
+
// Enforce that the selection is collapsed when inside a date segment.
|
|
529
|
+
// Otherwise, when tapping on a segment in Android Chrome and then entering text,
|
|
530
|
+
// composition events will be fired that break the DOM structure and crash the page.
|
|
531
|
+
const selection = doc.defaultView?.getSelection();
|
|
532
|
+
const active = doc.activeElement;
|
|
533
|
+
// Only collapse while focused, otherwise a stale anchor left in the segment (e.g. on Firefox)
|
|
534
|
+
// steals focus back into it on selectionchange. See #10259.
|
|
535
|
+
if (selection?.anchorNode && active?.hasAttribute(SEGMENT_ATTR) && active.contains(selection.anchorNode))
|
|
536
|
+
selection.collapse(active);
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
/** focusout of the field: confirm the placeholder (constrain / emit) and commit the validation when the value changed. */
|
|
541
|
+
export function dateFieldFocusOut(event, state) {
|
|
542
|
+
const field = event.currentTarget;
|
|
543
|
+
if (field.contains(event.relatedTarget))
|
|
544
|
+
return;
|
|
545
|
+
confirmPlaceholder(state);
|
|
546
|
+
syncFieldInput(state, field.ownerDocument);
|
|
547
|
+
if (untrack(() => fieldValueString(state)) !== (valueOnFocus.get(state) ?? null))
|
|
548
|
+
commitValidation(ownerOf(state).validation);
|
|
549
|
+
}
|
|
550
|
+
/** useDatePickerGroup press: focus the first placeholder segment from the end (mouse: press start; touch / pen: press up). */
|
|
551
|
+
export function dateGroupPointerDown(event) {
|
|
552
|
+
if (event.button !== 0 || pressIgnored(event))
|
|
553
|
+
return;
|
|
554
|
+
if (event.pointerType === "mouse") {
|
|
555
|
+
// preventFocusOnPress
|
|
556
|
+
event.preventDefault();
|
|
557
|
+
focusLast(event.currentTarget, event.target);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
export function dateGroupPointerUp(event) {
|
|
561
|
+
if (pressIgnored(event))
|
|
562
|
+
return;
|
|
563
|
+
if (event.pointerType === "touch" || event.pointerType === "pen")
|
|
564
|
+
focusLast(event.currentTarget, event.target);
|
|
565
|
+
}
|
|
566
|
+
// Segments and buttons handle their own presses (React Aria: segments stop pointer propagation, buttons' usePress does).
|
|
567
|
+
function pressIgnored(event) {
|
|
568
|
+
if (handled.has(event))
|
|
569
|
+
return true;
|
|
570
|
+
const target = event.target;
|
|
571
|
+
const own = target.closest?.(SEGMENT + ", button, [data-rv-date-field]");
|
|
572
|
+
if (own && own !== event.currentTarget && (own.hasAttribute(SEGMENT_ATTR) || own.localName === "button" || own.hasAttribute("data-rv-date-field"))) {
|
|
573
|
+
// A nested field handles the press itself (the field inside a picker's group).
|
|
574
|
+
if (own.hasAttribute("data-rv-date-field") && !own.contains(target.closest(SEGMENT)))
|
|
575
|
+
return false;
|
|
576
|
+
return true;
|
|
577
|
+
}
|
|
578
|
+
if (target.closest?.(SEGMENT))
|
|
579
|
+
return true;
|
|
580
|
+
handled.add(event);
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
function focusLast(root, from) {
|
|
584
|
+
// Try to find the segment prior to the element that was clicked on.
|
|
585
|
+
let target = from;
|
|
586
|
+
const walker = getFocusableTreeWalker(root, { tabbable: true });
|
|
587
|
+
if (target) {
|
|
588
|
+
walker.currentNode = target;
|
|
589
|
+
target = walker.previousNode();
|
|
590
|
+
}
|
|
591
|
+
// If no target found, find the last element from the end.
|
|
592
|
+
if (!target) {
|
|
593
|
+
let last;
|
|
594
|
+
do {
|
|
595
|
+
last = walker.lastChild();
|
|
596
|
+
if (last)
|
|
597
|
+
target = last;
|
|
598
|
+
} while (last);
|
|
599
|
+
}
|
|
600
|
+
// Now go backwards until we find an element that is not a placeholder.
|
|
601
|
+
while (target?.hasAttribute("data-placeholder")) {
|
|
602
|
+
const prev = walker.previousNode();
|
|
603
|
+
if (prev && prev.hasAttribute("data-placeholder"))
|
|
604
|
+
target = prev;
|
|
605
|
+
else
|
|
606
|
+
break;
|
|
607
|
+
}
|
|
608
|
+
target?.focus();
|
|
609
|
+
}
|
|
610
|
+
/** Label click: focus the first segment of `scopeId`'s element. */
|
|
611
|
+
export function focusFirstSegment(doc, scopeId) {
|
|
612
|
+
const scope = doc.getElementById(scopeId);
|
|
613
|
+
if (scope)
|
|
614
|
+
createFocusManager(() => scope).focusFirst();
|
|
615
|
+
}
|
|
616
|
+
// ---------------------------------------------------------------------------------------------
|
|
617
|
+
// Hidden form input (useDateField inputProps + useFormValidation / useFormReset)
|
|
618
|
+
/** The value of the field's hidden form input. Reads. */
|
|
619
|
+
export const fieldInputValue = (state) => ownerOf(state).kind === "time" ? (timeValue(state)?.toString() ?? "") : (fieldValueString(state) ?? "");
|
|
620
|
+
/**
|
|
621
|
+
* Sync the hidden input of `state` (value now, ahead of the async binding; native custom validity
|
|
622
|
+
* from the owner's realtime validation; a range picker merges the native validity of both ends).
|
|
623
|
+
*/
|
|
624
|
+
export function syncFieldInput(state, doc) {
|
|
625
|
+
const input = doc.getElementById(inputId(state));
|
|
626
|
+
if (!input)
|
|
627
|
+
return;
|
|
628
|
+
const value = untrack(() => fieldInputValue(state));
|
|
629
|
+
if (input.value !== value)
|
|
630
|
+
input.value = value;
|
|
631
|
+
const owner = ownerOf(state);
|
|
632
|
+
onFormReset(state, input, () => {
|
|
633
|
+
setValue(state, parseValue(state.defaultValue));
|
|
634
|
+
resetValidation(owner.validation);
|
|
635
|
+
});
|
|
636
|
+
const validation = owner.validation;
|
|
637
|
+
if (validation.behavior !== "native" || input.disabled)
|
|
638
|
+
return;
|
|
639
|
+
const realtime = untrack(() => realtimeValidation(validation));
|
|
640
|
+
// A range picker's fields share the validation (React Aria: each field's useFormValidation runs
|
|
641
|
+
// every render): sync the other end's input too (`<picker id>-start-input` / `-end-input`).
|
|
642
|
+
const other = owner.kind === "range"
|
|
643
|
+
? doc.getElementById(state.id.replace(/-(start|end)$/, state.part === "start" ? "-end" : "-start") + "-input")
|
|
644
|
+
: null;
|
|
645
|
+
for (const element of other && !other.disabled ? [input, other] : [input]) {
|
|
646
|
+
element.setCustomValidity(realtime.isInvalid ? realtime.validationErrors.join(" ") || "Invalid value." : "");
|
|
647
|
+
// Prevent the default tooltip for the validation message (Firefox).
|
|
648
|
+
if (!element.hasAttribute("title"))
|
|
649
|
+
element.title = "";
|
|
650
|
+
}
|
|
651
|
+
if (realtime.isInvalid)
|
|
652
|
+
return;
|
|
653
|
+
const native = nativeValidity(input);
|
|
654
|
+
if (owner.kind === "range") {
|
|
655
|
+
const parts = { ...untrack(owner.partValidity), [state.part]: native };
|
|
656
|
+
if (other && !other.disabled)
|
|
657
|
+
parts[state.part === "start" ? "end" : "start"] = nativeValidity(other);
|
|
658
|
+
owner.partValidity.set(parts);
|
|
659
|
+
updateValidation(validation, mergeValidation(parts.start, parts.end));
|
|
660
|
+
}
|
|
661
|
+
else
|
|
662
|
+
updateValidation(validation, native);
|
|
663
|
+
}
|
|
664
|
+
/** `invalid` on the hidden input (submit / checkValidity): commit, focus the first segment, no browser bubble. */
|
|
665
|
+
export function dateFieldInvalid(event, state) {
|
|
666
|
+
const input = event.target;
|
|
667
|
+
const validation = ownerOf(state).validation;
|
|
668
|
+
// Only commit when not already displaying an error: keeps server errors the user did not fix.
|
|
669
|
+
if (!untrack(() => displayValidation(validation)).isInvalid) {
|
|
670
|
+
clearServerErrors(validation);
|
|
671
|
+
syncFieldInput(state, input.ownerDocument);
|
|
672
|
+
commitValidation(validation);
|
|
673
|
+
}
|
|
674
|
+
const form = input.form;
|
|
675
|
+
if (!event.defaultPrevented && form && [...form.elements].find((element) => element.validity?.valid === false) === input) {
|
|
676
|
+
const field = input.ownerDocument.getElementById(state.id);
|
|
677
|
+
const segment = field?.querySelector(SEGMENT + "[tabindex]");
|
|
678
|
+
segment?.focus();
|
|
679
|
+
}
|
|
680
|
+
// Prevent the browser's error bubble.
|
|
681
|
+
event.preventDefault();
|
|
682
|
+
}
|
|
683
|
+
// ---------------------------------------------------------------------------------------------
|
|
684
|
+
// HiddenDateInput (RAC): a native date input for browser autofill.
|
|
685
|
+
const granularityMap = { hour: 1, minute: 2, second: 3 };
|
|
686
|
+
/** input on the autofill input: the browser filled it; set the field (each segment first for a standalone field). */
|
|
687
|
+
export function hiddenDateInputChange(event, state, picker) {
|
|
688
|
+
const targetString = event.target.value.toString();
|
|
689
|
+
if (!targetString)
|
|
690
|
+
return;
|
|
691
|
+
try {
|
|
692
|
+
const granularity = untrack(() => fieldGranularity(state));
|
|
693
|
+
let targetValue = parseDateTime(targetString);
|
|
694
|
+
if (granularity === "day")
|
|
695
|
+
targetValue = parseDate(targetString);
|
|
696
|
+
let timeSegments = ["hour", "minute", "second"];
|
|
697
|
+
// Depending on the granularity, we only want to validate certain time segments
|
|
698
|
+
if (timeSegments.includes(granularity))
|
|
699
|
+
timeSegments = timeSegments.slice(0, granularityMap[granularity]);
|
|
700
|
+
// A DateField sets each segment before committing (its setValue commits complete values only);
|
|
701
|
+
// a DatePicker sets the value directly.
|
|
702
|
+
if (!picker)
|
|
703
|
+
for (const type of ["year", "month", "day", ...timeSegments])
|
|
704
|
+
if (type in targetValue)
|
|
705
|
+
setSegment(state, type, targetValue[type]);
|
|
706
|
+
setValue(state, targetValue);
|
|
707
|
+
syncFieldInput(state, event.target.ownerDocument);
|
|
708
|
+
}
|
|
709
|
+
catch {
|
|
710
|
+
// ignore
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
const focusedWithin = new WeakMap();
|
|
714
|
+
const reported = new WeakMap();
|
|
715
|
+
/**
|
|
716
|
+
* Call the user's handler of `event` once per container: a picker forwards the field's events and
|
|
717
|
+
* (client-created) they also bubble to the group / root.
|
|
718
|
+
*/
|
|
719
|
+
export function onceFor(container, event) {
|
|
720
|
+
if (reported.get(event) === container)
|
|
721
|
+
return false;
|
|
722
|
+
reported.set(event, container);
|
|
723
|
+
return true;
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* useFocusWithin of `container` from a focusin / focusout inside it: `onFocus` + `onFocusChange(true)`
|
|
727
|
+
* when focus enters, `onBlur` + `onFocusChange(false)` when it leaves. `isDisabled` (an open picker):
|
|
728
|
+
* nothing is reported and the focused-within state is kept.
|
|
729
|
+
*/
|
|
730
|
+
export function focusWithinEvent(container, event, handlers, isDisabled = false) {
|
|
731
|
+
if (!container || isDisabled || !onceFor(container, event))
|
|
732
|
+
return;
|
|
733
|
+
if (event.type === "focusin") {
|
|
734
|
+
if (focusedWithin.get(container) || !container.contains(event.target))
|
|
735
|
+
return;
|
|
736
|
+
focusedWithin.set(container, true);
|
|
737
|
+
handlers.onFocus?.(event);
|
|
738
|
+
handlers.onFocusChange?.(true);
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
if (!focusedWithin.get(container) || container.contains(event.relatedTarget))
|
|
742
|
+
return;
|
|
743
|
+
focusedWithin.set(container, false);
|
|
744
|
+
handlers.onBlur?.(event);
|
|
745
|
+
handlers.onFocusChange?.(false);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
const flag = (value) => (value ? "true" : undefined);
|
|
749
|
+
const liveFlagOf = (owner, which) => (which === 0 ? owner.disabled : which === 1 ? owner.readOnly : owner.required);
|
|
750
|
+
const createdFlag = (owner, which) => (which === 0 ? owner.isDisabled : which === 1 ? owner.isReadOnly : owner.isRequired);
|
|
751
|
+
/** The owner flag now (live accessor, else the creation value). Reads. */
|
|
752
|
+
export const ownerFlagNow = (owner, which) => which === 0 ? ownerDisabled(owner) : which === 1 ? ownerReadOnly(owner) : ownerRequired(owner);
|
|
753
|
+
/** An owner flag as a part prop (Group / Button / Calendar `isDisabled`, …): the creation value, or an accessor while live. */
|
|
754
|
+
export function ownerFlag(owner, which) {
|
|
755
|
+
return liveFlagOf(owner, which) ? flagReader(owner, which) : createdFlag(owner, which);
|
|
756
|
+
}
|
|
757
|
+
function flagReader(owner, which) {
|
|
758
|
+
return () => ownerFlagNow(owner, which);
|
|
759
|
+
}
|
|
760
|
+
/** An owner flag as a `"true"` / absent attribute (`aria-*`, `data-*`): the creation value, or an accessor while live. */
|
|
761
|
+
export function ownerFlagAttr(owner, which) {
|
|
762
|
+
return liveFlagOf(owner, which) ? flagAttrReader(owner, which) : flag(createdFlag(owner, which));
|
|
763
|
+
}
|
|
764
|
+
function flagAttrReader(owner, which) {
|
|
765
|
+
return () => flag(ownerFlagNow(owner, which));
|
|
766
|
+
}
|
|
767
|
+
/** An owner flag as a boolean DOM attribute (`disabled`, `required`): `true` / absent, or an accessor while live. */
|
|
768
|
+
export function ownerFlagTrue(owner, which) {
|
|
769
|
+
return liveFlagOf(owner, which) ? flagTrueReader(owner, which) : createdFlag(owner, which) || undefined;
|
|
770
|
+
}
|
|
771
|
+
function flagTrueReader(owner, which) {
|
|
772
|
+
return () => ownerFlagNow(owner, which) || undefined;
|
|
773
|
+
}
|
|
774
|
+
/** A segment's `tabIndex` (`0`, none while disabled): an accessor while `isDisabled` is live. */
|
|
775
|
+
function segmentTabIndex(owner) {
|
|
776
|
+
return owner.disabled ? tabIndexReader(owner) : owner.isDisabled ? undefined : 0;
|
|
777
|
+
}
|
|
778
|
+
function tabIndexReader(owner) {
|
|
779
|
+
return () => (ownerDisabled(owner) ? undefined : 0);
|
|
780
|
+
}
|
|
781
|
+
/** A `boolean | accessor` option as a `true` / absent attribute value (an accessor stays live: a returned arrow). */
|
|
782
|
+
function trueAttr(value) {
|
|
783
|
+
return typeof value === "function" ? trueOf(value) : value || undefined;
|
|
784
|
+
}
|
|
785
|
+
function trueOf(read) {
|
|
786
|
+
return () => read() || undefined;
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* useDateField: the attribute bags of a date field. Also records the labelling the segments read
|
|
790
|
+
* (React Aria `hookData`) on the state.
|
|
791
|
+
*/
|
|
792
|
+
/** useLabel: the visible label labels the field; aria-label + aria-labelledby → the field labels itself too. Reads. */
|
|
793
|
+
export function fieldLabelledBy(state) {
|
|
794
|
+
const aria = state.aria ?? {};
|
|
795
|
+
const own = typeof aria.ownLabelledBy === "function" ? aria.ownLabelledBy() : aria.ownLabelledBy;
|
|
796
|
+
const ids = [(typeof aria.hasLabel === "function" ? aria.hasLabel() : aria.hasLabel) ? state.id + "-label" : undefined, own].filter(Boolean).join(" ") || undefined;
|
|
797
|
+
return labelsProps(state.id, aria.label, ids)["aria-labelledby"];
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* useDescription (the selected value) + useField's description / error message + the user's. Reads.
|
|
801
|
+
* Rivet: the FieldError only renders while invalid (RAC), so its id is skipped while valid; the description id only when
|
|
802
|
+
* its part renders (server: the field's slot probe, `probeSlots`, marks it first): the server markup matches the client.
|
|
803
|
+
*/
|
|
804
|
+
export function fieldDescribedBy(state) {
|
|
805
|
+
const aria = state.aria ?? {};
|
|
806
|
+
const extra = typeof aria.extraDescribedBy === "function" ? aria.extraDescribedBy() : aria.extraDescribedBy;
|
|
807
|
+
// RA: inside a picker the field passes the picker's described-by (value of the whole picker + its slots).
|
|
808
|
+
if (aria.presentation)
|
|
809
|
+
return extra || undefined;
|
|
810
|
+
return ([
|
|
811
|
+
fieldValueDescription(state) ? valueDescriptionId(state) : undefined,
|
|
812
|
+
slotIdRef(aria.descriptionId, false),
|
|
813
|
+
isFieldInvalid(state) ? slotIdRef(aria.errorId) : undefined,
|
|
814
|
+
extra,
|
|
815
|
+
]
|
|
816
|
+
.filter(Boolean)
|
|
817
|
+
.join(" ") || undefined);
|
|
818
|
+
}
|
|
819
|
+
export function dateFieldProps(props, state) {
|
|
820
|
+
const owner = ownerOf(state);
|
|
821
|
+
const validation = owner.validation;
|
|
822
|
+
const labelId = state.id + "-label";
|
|
823
|
+
const label = props.label;
|
|
824
|
+
// A function (createSlot's `hasSlot`, resumable) or a plain boolean: an arrow made here would not serialize.
|
|
825
|
+
const hasLabel = typeof label === "function" ? label : !!label;
|
|
826
|
+
const ariaLabel = props["aria-label"];
|
|
827
|
+
const isInvalid = () => isFieldInvalid(state);
|
|
828
|
+
const descriptionId = createSlotId(state.id + "-description");
|
|
829
|
+
const errorId = createSlotId(state.id + "-error", isInvalid);
|
|
830
|
+
const isPresentation = !!props.isPresentation;
|
|
831
|
+
state.aria = {
|
|
832
|
+
label: ariaLabel,
|
|
833
|
+
ownLabelledBy: props["aria-labelledby"],
|
|
834
|
+
hasLabel,
|
|
835
|
+
descriptionId,
|
|
836
|
+
errorId,
|
|
837
|
+
extraDescribedBy: props["aria-describedby"],
|
|
838
|
+
presentation: isPresentation || undefined,
|
|
839
|
+
};
|
|
840
|
+
const labelledBy = () => fieldLabelledBy(state);
|
|
841
|
+
const describedBy = () => fieldDescribedBy(state);
|
|
842
|
+
const { forward, onFocus, onBlur, onFocusChange, onKeyDown, onKeyUp } = props;
|
|
843
|
+
const focusWithin = onFocus || onBlur || onFocusChange ? { onFocus, onBlur, onFocusChange } : undefined;
|
|
844
|
+
// Resumable closures: every handler is an inline arrow inside an object literal (no post-hoc assignment).
|
|
845
|
+
const common = {
|
|
846
|
+
id: state.id,
|
|
847
|
+
style: { unicodeBidi: "isolate" },
|
|
848
|
+
"data-rv-date-field": "",
|
|
849
|
+
"data-rv-focus-scope": props.focusScope,
|
|
850
|
+
"data-rk": fieldKeys(state),
|
|
851
|
+
isDisabled: ownerFlag(owner, 0),
|
|
852
|
+
isReadOnly: ownerFlag(owner, 1),
|
|
853
|
+
isInvalid,
|
|
854
|
+
onKeyDown: (event) => {
|
|
855
|
+
if (!innermostField(event))
|
|
856
|
+
return;
|
|
857
|
+
dateFieldKeyDown(event, state);
|
|
858
|
+
forward?.(event);
|
|
859
|
+
onKeyDown?.(event);
|
|
860
|
+
},
|
|
861
|
+
onKeyUp,
|
|
862
|
+
onFocusIn: (event) => {
|
|
863
|
+
if (!innermostField(event))
|
|
864
|
+
return;
|
|
865
|
+
dateFieldFocusIn(event, state);
|
|
866
|
+
forward?.(event);
|
|
867
|
+
if (focusWithin)
|
|
868
|
+
focusWithinEvent(event.currentTarget, event, focusWithin);
|
|
869
|
+
},
|
|
870
|
+
onFocusOut: (event) => {
|
|
871
|
+
if (!innermostField(event))
|
|
872
|
+
return;
|
|
873
|
+
dateFieldFocusOut(event, state);
|
|
874
|
+
forward?.(event);
|
|
875
|
+
if (focusWithin)
|
|
876
|
+
focusWithinEvent(event.currentTarget, event, focusWithin);
|
|
877
|
+
},
|
|
878
|
+
};
|
|
879
|
+
const fieldProps = isPresentation
|
|
880
|
+
? { role: "presentation", ...common }
|
|
881
|
+
: {
|
|
882
|
+
role: "group",
|
|
883
|
+
"aria-label": ariaLabel,
|
|
884
|
+
"aria-labelledby": labelledBy,
|
|
885
|
+
"aria-describedby": describedBy,
|
|
886
|
+
"aria-details": props["aria-details"],
|
|
887
|
+
"aria-disabled": ownerFlagAttr(owner, 0),
|
|
888
|
+
...common,
|
|
889
|
+
onPointerDown: (event) => innermostField(event) && dateGroupPointerDown(event),
|
|
890
|
+
onPointerUp: (event) => innermostField(event) && dateGroupPointerUp(event),
|
|
891
|
+
};
|
|
892
|
+
const native = (props.validationBehavior ?? "native") === "native";
|
|
893
|
+
return {
|
|
894
|
+
labelProps: { id: labelId, onClick: (event) => focusFirstSegment(event.currentTarget.ownerDocument, state.id) },
|
|
895
|
+
fieldProps,
|
|
896
|
+
inputProps: {
|
|
897
|
+
id: inputId(state),
|
|
898
|
+
type: native ? "text" : "hidden",
|
|
899
|
+
hidden: native || undefined,
|
|
900
|
+
name: props.name,
|
|
901
|
+
form: props.form,
|
|
902
|
+
required: native ? ownerFlagTrue(owner, 2) : undefined,
|
|
903
|
+
disabled: ownerFlagTrue(owner, 0),
|
|
904
|
+
value: () => fieldInputValue(state),
|
|
905
|
+
"data-rv-error": () => validityError(validation),
|
|
906
|
+
onInvalid: (event) => dateFieldInvalid(event, state),
|
|
907
|
+
},
|
|
908
|
+
descriptionProps: { id: descriptionId },
|
|
909
|
+
errorMessageProps: { id: errorId },
|
|
910
|
+
isInvalid,
|
|
911
|
+
validationErrors: () => displayValidation(validation).validationErrors,
|
|
912
|
+
validationDetails: () => displayValidation(validation).validationDetails,
|
|
913
|
+
};
|
|
914
|
+
}
|
|
915
|
+
/** useTimeField: useDateField over a time field state (`createTimeFieldState`). */
|
|
916
|
+
export const timeFieldProps = dateFieldProps;
|
|
917
|
+
/**
|
|
918
|
+
* useDateSegment (+ useSpinButton): the attributes of the segment `key` (`segmentKeys`). Values are
|
|
919
|
+
* accessors; the field's labelling comes from `dateFieldProps` (hookData on the state).
|
|
920
|
+
*/
|
|
921
|
+
export function dateSegmentProps(props, state) {
|
|
922
|
+
const key = props.key;
|
|
923
|
+
const owner = ownerOf(state);
|
|
924
|
+
const id = segmentId(state, key);
|
|
925
|
+
const segment = () => segmentOf(state, key);
|
|
926
|
+
const type = untrack(segment)?.type;
|
|
927
|
+
const isInvalid = () => isFieldInvalid(state);
|
|
928
|
+
const data = {
|
|
929
|
+
"data-type": type,
|
|
930
|
+
"data-placeholder": () => flag(segment()?.isPlaceholder),
|
|
931
|
+
"data-invalid": () => flag(isInvalid()),
|
|
932
|
+
"data-readonly": ownerFlagAttr(owner, 1),
|
|
933
|
+
"data-disabled": ownerFlagAttr(owner, 0),
|
|
934
|
+
};
|
|
935
|
+
// Literal segments should not be visible to screen readers.
|
|
936
|
+
if (type === "literal")
|
|
937
|
+
return { segmentProps: { "aria-hidden": "true", ...data } };
|
|
938
|
+
const ariaLabel = state.aria?.label;
|
|
939
|
+
// Prepend the label passed from the field to each segment name. This is needed because VoiceOver on iOS does not announce groups.
|
|
940
|
+
const name = displayNames(state.locale).of(type) ?? type;
|
|
941
|
+
const label = () => {
|
|
942
|
+
const by = fieldLabelledBy(state);
|
|
943
|
+
return labelsProps(id, `${name}${ariaLabel ? `, ${ariaLabel}` : ""}${by ? ", " : ""}`, by);
|
|
944
|
+
};
|
|
945
|
+
const textbox = type === "timeZoneName";
|
|
946
|
+
const isEditable = () => !ownerDisabled(owner) && !ownerReadOnly(owner) && !!segment()?.isEditable;
|
|
947
|
+
return {
|
|
948
|
+
segmentProps: {
|
|
949
|
+
[SEGMENT_ATTR]: key,
|
|
950
|
+
id,
|
|
951
|
+
role: textbox ? "textbox" : "spinbutton",
|
|
952
|
+
"aria-valuenow": () => {
|
|
953
|
+
const value = segment()?.value;
|
|
954
|
+
return textbox || value == null || isNaN(value) ? undefined : value;
|
|
955
|
+
},
|
|
956
|
+
"aria-valuetext": () => {
|
|
957
|
+
const s = segment();
|
|
958
|
+
return textbox || !s ? undefined : ariaTextValue(state, s);
|
|
959
|
+
},
|
|
960
|
+
"aria-valuemin": () => (textbox ? undefined : segment()?.minValue),
|
|
961
|
+
"aria-valuemax": () => (textbox ? undefined : segment()?.maxValue),
|
|
962
|
+
"aria-disabled": ownerFlagAttr(owner, 0),
|
|
963
|
+
"aria-required": ownerFlagAttr(owner, 2),
|
|
964
|
+
"aria-label": () => label()["aria-label"],
|
|
965
|
+
"aria-labelledby": () => label()["aria-labelledby"],
|
|
966
|
+
"aria-invalid": () => flag(isInvalid()),
|
|
967
|
+
// Only on the first segment, unless the field is invalid (not read every time the user moves to a new segment).
|
|
968
|
+
"aria-describedby": () => {
|
|
969
|
+
const s = segment();
|
|
970
|
+
const first = segments(state).find((x) => x.isEditable);
|
|
971
|
+
return s && (s === first || isInvalid()) ? fieldDescribedBy(state) : undefined;
|
|
972
|
+
},
|
|
973
|
+
"aria-readonly": () => flag(ownerReadOnly(owner) || !segment()?.isEditable),
|
|
974
|
+
contentEditable: () => (isEditable() ? "true" : undefined),
|
|
975
|
+
spellCheck: () => (isEditable() ? "false" : undefined),
|
|
976
|
+
autoCorrect: () => (isEditable() ? "off" : undefined),
|
|
977
|
+
enterKeyHint: () => (isEditable() ? "next" : undefined),
|
|
978
|
+
inputMode: () => (ownerDisabled(owner) || type === "dayPeriod" || type === "era" || !isEditable() ? undefined : "numeric"),
|
|
979
|
+
tabIndex: segmentTabIndex(owner),
|
|
980
|
+
style: () => segmentStyle(state, key),
|
|
981
|
+
onBeforeInput: (event) => dateFieldBeforeInput(event, state),
|
|
982
|
+
onInput: (event) => dateFieldInput(event, state),
|
|
983
|
+
...data,
|
|
984
|
+
},
|
|
985
|
+
};
|
|
986
|
+
}
|
|
987
|
+
// ---------------------------------------------------------------------------------------------
|
|
988
|
+
// RAC HiddenDateInput (useHiddenDateInput)
|
|
989
|
+
/** Visually hidden; fixed so autofilling it never scrolls the page. */
|
|
990
|
+
const hiddenInputStyle = { ...visuallyHidden, position: "fixed", top: "0", left: "0" };
|
|
991
|
+
/** useHiddenDateInput: the container + native date input browser autofill fills. */
|
|
992
|
+
export function hiddenDateInputProps(props, state) {
|
|
993
|
+
const picker = !!props.isPicker;
|
|
994
|
+
const granularity = () => fieldGranularity(state);
|
|
995
|
+
return {
|
|
996
|
+
containerProps: {
|
|
997
|
+
style: hiddenInputStyle,
|
|
998
|
+
"aria-hidden": "true",
|
|
999
|
+
"data-react-aria-prevent-focus": "true",
|
|
1000
|
+
"data-a11y-ignore": "aria-hidden-focus",
|
|
1001
|
+
"data-testid": "hidden-dateinput-container",
|
|
1002
|
+
},
|
|
1003
|
+
inputProps: {
|
|
1004
|
+
type: () => (granularity() === "day" ? "date" : "datetime-local"),
|
|
1005
|
+
step: () => {
|
|
1006
|
+
const g = granularity();
|
|
1007
|
+
return g === "second" ? 1 : g === "hour" ? 3600 : 60;
|
|
1008
|
+
},
|
|
1009
|
+
value: () => {
|
|
1010
|
+
const value = parseValue(fieldValueString(state));
|
|
1011
|
+
if (!value)
|
|
1012
|
+
return "";
|
|
1013
|
+
if (granularity() === "day")
|
|
1014
|
+
return toCalendarDate(value).toString();
|
|
1015
|
+
return toCalendarDateTime("timeZone" in value ? toLocalTimeZone(value) : value).toString();
|
|
1016
|
+
},
|
|
1017
|
+
autoComplete: props.autoComplete,
|
|
1018
|
+
name: props.name,
|
|
1019
|
+
tabIndex: -1,
|
|
1020
|
+
disabled: trueAttr(props.isDisabled),
|
|
1021
|
+
form: "",
|
|
1022
|
+
onInput: (event) => hiddenDateInputChange(event, state, picker),
|
|
1023
|
+
},
|
|
1024
|
+
};
|
|
1025
|
+
}
|