@funstack/ui 0.1.0-alpha.2 → 0.1.0-alpha.4
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/dist/accordion/accordion-context.mjs.map +1 -1
- package/dist/accordion/accordion-item.mjs +18 -4
- package/dist/accordion/accordion-item.mjs.map +1 -1
- package/dist/accordion/accordion-panel.mjs +2 -3
- package/dist/accordion/accordion-panel.mjs.map +1 -1
- package/dist/accordion/accordion-root.d.mts.map +1 -1
- package/dist/accordion/accordion-root.mjs +34 -15
- package/dist/accordion/accordion-root.mjs.map +1 -1
- package/dist/accordion/accordion-trigger.mjs +4 -5
- package/dist/accordion/accordion-trigger.mjs.map +1 -1
- package/dist/checkbox/checkbox.d.mts +5 -3
- package/dist/checkbox/checkbox.d.mts.map +1 -1
- package/dist/checkbox/checkbox.mjs +25 -9
- package/dist/checkbox/checkbox.mjs.map +1 -1
- package/dist/checkbox-group/checkbox-group-context.mjs.map +1 -1
- package/dist/checkbox-group/checkbox-group-item.d.mts +2 -1
- package/dist/checkbox-group/checkbox-group-item.d.mts.map +1 -1
- package/dist/checkbox-group/checkbox-group-item.mjs +3 -1
- package/dist/checkbox-group/checkbox-group-item.mjs.map +1 -1
- package/dist/checkbox-group/checkbox-group-root.d.mts +5 -2
- package/dist/checkbox-group/checkbox-group-root.d.mts.map +1 -1
- package/dist/checkbox-group/checkbox-group-root.mjs +24 -5
- package/dist/checkbox-group/checkbox-group-root.mjs.map +1 -1
- package/dist/combobox/combobox-clear.mjs +2 -1
- package/dist/combobox/combobox-clear.mjs.map +1 -1
- package/dist/combobox/combobox-context.mjs.map +1 -1
- package/dist/combobox/combobox-input.d.mts +3 -1
- package/dist/combobox/combobox-input.d.mts.map +1 -1
- package/dist/combobox/combobox-input.mjs +16 -2
- package/dist/combobox/combobox-input.mjs.map +1 -1
- package/dist/combobox/combobox-list.mjs +3 -2
- package/dist/combobox/combobox-list.mjs.map +1 -1
- package/dist/combobox/combobox-popup.d.mts.map +1 -1
- package/dist/combobox/combobox-popup.mjs +7 -2
- package/dist/combobox/combobox-popup.mjs.map +1 -1
- package/dist/combobox/combobox-root.d.mts.map +1 -1
- package/dist/combobox/combobox-root.mjs +20 -5
- package/dist/combobox/combobox-root.mjs.map +1 -1
- package/dist/combobox/combobox-trigger.mjs +2 -1
- package/dist/combobox/combobox-trigger.mjs.map +1 -1
- package/dist/dialog/dialog-close.d.mts +17 -10
- package/dist/dialog/dialog-close.d.mts.map +1 -1
- package/dist/dialog/dialog-close.mjs +33 -21
- package/dist/dialog/dialog-close.mjs.map +1 -1
- package/dist/dialog/dialog-context.mjs.map +1 -1
- package/dist/dialog/dialog-form.d.mts +23 -10
- package/dist/dialog/dialog-form.d.mts.map +1 -1
- package/dist/dialog/dialog-form.mjs +51 -32
- package/dist/dialog/dialog-form.mjs.map +1 -1
- package/dist/dialog/dialog-popup.d.mts +10 -4
- package/dist/dialog/dialog-popup.d.mts.map +1 -1
- package/dist/dialog/dialog-popup.mjs +117 -44
- package/dist/dialog/dialog-popup.mjs.map +1 -1
- package/dist/dialog/dialog-root.d.mts +14 -8
- package/dist/dialog/dialog-root.d.mts.map +1 -1
- package/dist/dialog/dialog-root.mjs +67 -12
- package/dist/dialog/dialog-root.mjs.map +1 -1
- package/dist/dialog/dialog-trigger.d.mts +3 -2
- package/dist/dialog/dialog-trigger.d.mts.map +1 -1
- package/dist/dialog/dialog-trigger.mjs +2 -1
- package/dist/dialog/dialog-trigger.mjs.map +1 -1
- package/dist/dialog/index.d.mts +4 -2
- package/dist/dialog/index.d.mts.map +1 -1
- package/dist/dialog/index.mjs +4 -2
- package/dist/dialog/index.mjs.map +1 -1
- package/dist/field/field-control.d.mts +33 -0
- package/dist/field/field-control.d.mts.map +1 -0
- package/dist/field/field-control.mjs +68 -0
- package/dist/field/field-control.mjs.map +1 -0
- package/dist/field/field-description.d.mts +24 -0
- package/dist/field/field-description.d.mts.map +1 -0
- package/dist/field/field-description.mjs +34 -0
- package/dist/field/field-description.mjs.map +1 -0
- package/dist/field/field-error.d.mts +30 -0
- package/dist/field/field-error.d.mts.map +1 -0
- package/dist/field/field-error.mjs +42 -0
- package/dist/field/field-error.mjs.map +1 -0
- package/dist/field/field-label.d.mts +25 -0
- package/dist/field/field-label.d.mts.map +1 -0
- package/dist/field/field-label.mjs +46 -0
- package/dist/field/field-label.mjs.map +1 -0
- package/dist/field/field-root.d.mts +53 -0
- package/dist/field/field-root.d.mts.map +1 -0
- package/dist/field/field-root.mjs +319 -0
- package/dist/field/field-root.mjs.map +1 -0
- package/dist/field/index.d.mts +18 -0
- package/dist/field/index.d.mts.map +1 -0
- package/dist/field/index.mjs +17 -0
- package/dist/field/index.mjs.map +1 -0
- package/dist/form/form-root.d.mts +58 -0
- package/dist/form/form-root.d.mts.map +1 -0
- package/dist/form/form-root.mjs +147 -0
- package/dist/form/form-root.mjs.map +1 -0
- package/dist/form/form-submit.d.mts +31 -0
- package/dist/form/form-submit.d.mts.map +1 -0
- package/dist/form/form-submit.mjs +53 -0
- package/dist/form/form-submit.mjs.map +1 -0
- package/dist/form/index.d.mts +11 -0
- package/dist/form/index.d.mts.map +1 -0
- package/dist/form/index.mjs +11 -0
- package/dist/form/index.mjs.map +1 -0
- package/dist/index.d.mts +53 -1
- package/dist/index.mjs +11 -1
- package/dist/internal/announce.mjs +53 -0
- package/dist/internal/announce.mjs.map +1 -0
- package/dist/internal/content-focus-probe.mjs +42 -0
- package/dist/internal/content-focus-probe.mjs.map +1 -0
- package/dist/internal/decimal.mjs +27 -0
- package/dist/internal/decimal.mjs.map +1 -0
- package/dist/internal/dev-warn.mjs +17 -0
- package/dist/internal/dev-warn.mjs.map +1 -0
- package/dist/internal/field-context.d.mts +19 -0
- package/dist/internal/field-context.d.mts.map +1 -0
- package/dist/internal/field-context.mjs +14 -0
- package/dist/internal/field-context.mjs.map +1 -0
- package/dist/internal/focus-first-invalid.mjs +67 -0
- package/dist/internal/focus-first-invalid.mjs.map +1 -0
- package/dist/internal/form-status-watcher.mjs +31 -0
- package/dist/internal/form-status-watcher.mjs.map +1 -0
- package/dist/internal/modal-registry.mjs +39 -0
- package/dist/internal/modal-registry.mjs.map +1 -0
- package/dist/internal/range-value.mjs +51 -0
- package/dist/internal/range-value.mjs.map +1 -0
- package/dist/internal/render-element.mjs +54 -0
- package/dist/internal/render-element.mjs.map +1 -0
- package/dist/internal/toolbar-context.mjs +17 -0
- package/dist/internal/toolbar-context.mjs.map +1 -0
- package/dist/internal/types.d.mts +3 -1
- package/dist/internal/types.d.mts.map +1 -1
- package/dist/internal/use-controllable-action.mjs +33 -15
- package/dist/internal/use-controllable-action.mjs.map +1 -1
- package/dist/internal/use-exit-animation.mjs +26 -6
- package/dist/internal/use-exit-animation.mjs.map +1 -1
- package/dist/internal/use-field-control.mjs +109 -0
- package/dist/internal/use-field-control.mjs.map +1 -0
- package/dist/internal/use-form-owner-event.mjs +44 -0
- package/dist/internal/use-form-owner-event.mjs.map +1 -0
- package/dist/internal/use-form-reset.mjs +10 -33
- package/dist/internal/use-form-reset.mjs.map +1 -1
- package/dist/internal/use-latest.mjs +32 -0
- package/dist/internal/use-latest.mjs.map +1 -0
- package/dist/internal/use-modal-registration.mjs +47 -0
- package/dist/internal/use-modal-registration.mjs.map +1 -0
- package/dist/internal/use-native-group-reconciliation.mjs +6 -5
- package/dist/internal/use-native-group-reconciliation.mjs.map +1 -1
- package/dist/internal/use-native-select-value.mjs +7 -5
- package/dist/internal/use-native-select-value.mjs.map +1 -1
- package/dist/internal/use-popover-popup.mjs +11 -24
- package/dist/internal/use-popover-popup.mjs.map +1 -1
- package/dist/internal/use-popover-root.mjs +58 -23
- package/dist/internal/use-popover-root.mjs.map +1 -1
- package/dist/internal/use-popover-trigger.mjs +1 -1
- package/dist/internal/use-render.mjs +11 -34
- package/dist/internal/use-render.mjs.map +1 -1
- package/dist/internal/use-roving-focus.mjs +255 -0
- package/dist/internal/use-roving-focus.mjs.map +1 -0
- package/dist/internal/validity.d.mts +24 -0
- package/dist/internal/validity.d.mts.map +1 -0
- package/dist/internal/validity.mjs +108 -0
- package/dist/internal/validity.mjs.map +1 -0
- package/dist/menu/menu-checkbox-item.mjs +2 -1
- package/dist/menu/menu-checkbox-item.mjs.map +1 -1
- package/dist/menu/menu-group.d.mts.map +1 -1
- package/dist/menu/menu-group.mjs +3 -2
- package/dist/menu/menu-group.mjs.map +1 -1
- package/dist/menu/menu-item.mjs +2 -1
- package/dist/menu/menu-item.mjs.map +1 -1
- package/dist/menu/menu-popup.d.mts.map +1 -1
- package/dist/menu/menu-popup.mjs +7 -2
- package/dist/menu/menu-popup.mjs.map +1 -1
- package/dist/menu/menu-radio-group.mjs +9 -4
- package/dist/menu/menu-radio-group.mjs.map +1 -1
- package/dist/menu/menu-radio-item.mjs +2 -1
- package/dist/menu/menu-radio-item.mjs.map +1 -1
- package/dist/menu/menu-root.mjs +1 -1
- package/dist/menu/menu-root.mjs.map +1 -1
- package/dist/menu/menu-trigger.d.mts +2 -1
- package/dist/menu/menu-trigger.d.mts.map +1 -1
- package/dist/menu/menu-trigger.mjs +15 -4
- package/dist/menu/menu-trigger.mjs.map +1 -1
- package/dist/meter/index.d.mts +24 -0
- package/dist/meter/index.d.mts.map +1 -0
- package/dist/meter/index.mjs +23 -0
- package/dist/meter/index.mjs.map +1 -0
- package/dist/meter/meter-context.mjs +13 -0
- package/dist/meter/meter-context.mjs.map +1 -0
- package/dist/meter/meter-indicator.d.mts +19 -0
- package/dist/meter/meter-indicator.d.mts.map +1 -0
- package/dist/meter/meter-indicator.mjs +25 -0
- package/dist/meter/meter-indicator.mjs.map +1 -0
- package/dist/meter/meter-label.d.mts +19 -0
- package/dist/meter/meter-label.d.mts.map +1 -0
- package/dist/meter/meter-label.mjs +28 -0
- package/dist/meter/meter-label.mjs.map +1 -0
- package/dist/meter/meter-region.d.mts +4 -0
- package/dist/meter/meter-region.d.mts.map +1 -0
- package/dist/meter/meter-region.mjs +39 -0
- package/dist/meter/meter-region.mjs.map +1 -0
- package/dist/meter/meter-root.d.mts +71 -0
- package/dist/meter/meter-root.d.mts.map +1 -0
- package/dist/meter/meter-root.mjs +83 -0
- package/dist/meter/meter-root.mjs.map +1 -0
- package/dist/meter/meter-track.d.mts +19 -0
- package/dist/meter/meter-track.d.mts.map +1 -0
- package/dist/meter/meter-track.mjs +25 -0
- package/dist/meter/meter-track.mjs.map +1 -0
- package/dist/meter/meter-value.d.mts +20 -0
- package/dist/meter/meter-value.d.mts.map +1 -0
- package/dist/meter/meter-value.mjs +29 -0
- package/dist/meter/meter-value.mjs.map +1 -0
- package/dist/number-field/index.d.mts +26 -0
- package/dist/number-field/index.d.mts.map +1 -0
- package/dist/number-field/index.mjs +26 -0
- package/dist/number-field/index.mjs.map +1 -0
- package/dist/number-field/number-field-arithmetic.mjs +78 -0
- package/dist/number-field/number-field-arithmetic.mjs.map +1 -0
- package/dist/number-field/number-field-context.d.mts +2 -0
- package/dist/number-field/number-field-context.mjs +13 -0
- package/dist/number-field/number-field-context.mjs.map +1 -0
- package/dist/number-field/number-field-decrement.d.mts +16 -0
- package/dist/number-field/number-field-decrement.d.mts.map +1 -0
- package/dist/number-field/number-field-decrement.mjs +19 -0
- package/dist/number-field/number-field-decrement.mjs.map +1 -0
- package/dist/number-field/number-field-format.mjs +279 -0
- package/dist/number-field/number-field-format.mjs.map +1 -0
- package/dist/number-field/number-field-increment.d.mts +32 -0
- package/dist/number-field/number-field-increment.d.mts.map +1 -0
- package/dist/number-field/number-field-increment.mjs +68 -0
- package/dist/number-field/number-field-increment.mjs.map +1 -0
- package/dist/number-field/number-field-input.d.mts +29 -0
- package/dist/number-field/number-field-input.d.mts.map +1 -0
- package/dist/number-field/number-field-input.mjs +163 -0
- package/dist/number-field/number-field-input.mjs.map +1 -0
- package/dist/number-field/number-field-label.d.mts +23 -0
- package/dist/number-field/number-field-label.d.mts.map +1 -0
- package/dist/number-field/number-field-label.mjs +47 -0
- package/dist/number-field/number-field-label.mjs.map +1 -0
- package/dist/number-field/number-field-root.d.mts +108 -0
- package/dist/number-field/number-field-root.d.mts.map +1 -0
- package/dist/number-field/number-field-root.mjs +523 -0
- package/dist/number-field/number-field-root.mjs.map +1 -0
- package/dist/number-field/use-step-button.mjs +107 -0
- package/dist/number-field/use-step-button.mjs.map +1 -0
- package/dist/popover/popover-close.mjs +2 -1
- package/dist/popover/popover-close.mjs.map +1 -1
- package/dist/popover/popover-popup.d.mts.map +1 -1
- package/dist/popover/popover-popup.mjs +7 -2
- package/dist/popover/popover-popup.mjs.map +1 -1
- package/dist/popover/popover-root.mjs +1 -1
- package/dist/progress/index.d.mts +24 -0
- package/dist/progress/index.d.mts.map +1 -0
- package/dist/progress/index.mjs +24 -0
- package/dist/progress/index.mjs.map +1 -0
- package/dist/progress/progress-context.mjs +13 -0
- package/dist/progress/progress-context.mjs.map +1 -0
- package/dist/progress/progress-indicator.d.mts +19 -0
- package/dist/progress/progress-indicator.d.mts.map +1 -0
- package/dist/progress/progress-indicator.mjs +29 -0
- package/dist/progress/progress-indicator.mjs.map +1 -0
- package/dist/progress/progress-label.d.mts +19 -0
- package/dist/progress/progress-label.d.mts.map +1 -0
- package/dist/progress/progress-label.mjs +30 -0
- package/dist/progress/progress-label.mjs.map +1 -0
- package/dist/progress/progress-root.d.mts +68 -0
- package/dist/progress/progress-root.d.mts.map +1 -0
- package/dist/progress/progress-root.mjs +80 -0
- package/dist/progress/progress-root.mjs.map +1 -0
- package/dist/progress/progress-track.d.mts +19 -0
- package/dist/progress/progress-track.d.mts.map +1 -0
- package/dist/progress/progress-track.mjs +29 -0
- package/dist/progress/progress-track.mjs.map +1 -0
- package/dist/progress/progress-value.d.mts +20 -0
- package/dist/progress/progress-value.d.mts.map +1 -0
- package/dist/progress/progress-value.mjs +33 -0
- package/dist/progress/progress-value.mjs.map +1 -0
- package/dist/radio-group/radio-group-root.d.mts +4 -2
- package/dist/radio-group/radio-group-root.d.mts.map +1 -1
- package/dist/radio-group/radio-group-root.mjs +34 -8
- package/dist/radio-group/radio-group-root.mjs.map +1 -1
- package/dist/select/select-group.d.mts.map +1 -1
- package/dist/select/select-group.mjs +6 -4
- package/dist/select/select-group.mjs.map +1 -1
- package/dist/select/select-root.d.mts +4 -2
- package/dist/select/select-root.d.mts.map +1 -1
- package/dist/select/select-root.mjs +26 -6
- package/dist/select/select-root.mjs.map +1 -1
- package/dist/slider/index.d.mts +32 -0
- package/dist/slider/index.d.mts.map +1 -0
- package/dist/slider/index.mjs +27 -0
- package/dist/slider/index.mjs.map +1 -0
- package/dist/slider/slider-arithmetic.mjs +104 -0
- package/dist/slider/slider-arithmetic.mjs.map +1 -0
- package/dist/slider/slider-context.mjs +13 -0
- package/dist/slider/slider-context.mjs.map +1 -0
- package/dist/slider/slider-indicator.d.mts +22 -0
- package/dist/slider/slider-indicator.d.mts.map +1 -0
- package/dist/slider/slider-indicator.mjs +36 -0
- package/dist/slider/slider-indicator.mjs.map +1 -0
- package/dist/slider/slider-label.d.mts +23 -0
- package/dist/slider/slider-label.d.mts.map +1 -0
- package/dist/slider/slider-label.mjs +44 -0
- package/dist/slider/slider-label.mjs.map +1 -0
- package/dist/slider/slider-root.d.mts +111 -0
- package/dist/slider/slider-root.d.mts.map +1 -0
- package/dist/slider/slider-root.mjs +583 -0
- package/dist/slider/slider-root.mjs.map +1 -0
- package/dist/slider/slider-thumb.d.mts +58 -0
- package/dist/slider/slider-thumb.d.mts.map +1 -0
- package/dist/slider/slider-thumb.mjs +146 -0
- package/dist/slider/slider-thumb.mjs.map +1 -0
- package/dist/slider/slider-track.d.mts +29 -0
- package/dist/slider/slider-track.d.mts.map +1 -0
- package/dist/slider/slider-track.mjs +55 -0
- package/dist/slider/slider-track.mjs.map +1 -0
- package/dist/slider/slider-value.d.mts +34 -0
- package/dist/slider/slider-value.d.mts.map +1 -0
- package/dist/slider/slider-value.mjs +38 -0
- package/dist/slider/slider-value.mjs.map +1 -0
- package/dist/switch/switch.d.mts +5 -3
- package/dist/switch/switch.d.mts.map +1 -1
- package/dist/switch/switch.mjs +24 -8
- package/dist/switch/switch.mjs.map +1 -1
- package/dist/tabs/tabs-indicator.mjs +2 -1
- package/dist/tabs/tabs-indicator.mjs.map +1 -1
- package/dist/tabs/tabs-root.mjs +13 -3
- package/dist/tabs/tabs-root.mjs.map +1 -1
- package/dist/tabs/tabs-tab.mjs +2 -1
- package/dist/tabs/tabs-tab.mjs.map +1 -1
- package/dist/toast/index.d.mts +25 -0
- package/dist/toast/index.d.mts.map +1 -0
- package/dist/toast/index.mjs +26 -0
- package/dist/toast/index.mjs.map +1 -0
- package/dist/toast/toast-action.d.mts +39 -0
- package/dist/toast/toast-action.d.mts.map +1 -0
- package/dist/toast/toast-action.mjs +65 -0
- package/dist/toast/toast-action.mjs.map +1 -0
- package/dist/toast/toast-close.d.mts +25 -0
- package/dist/toast/toast-close.d.mts.map +1 -0
- package/dist/toast/toast-close.mjs +47 -0
- package/dist/toast/toast-close.mjs.map +1 -0
- package/dist/toast/toast-context.mjs +19 -0
- package/dist/toast/toast-context.mjs.map +1 -0
- package/dist/toast/toast-description.d.mts +24 -0
- package/dist/toast/toast-description.d.mts.map +1 -0
- package/dist/toast/toast-description.mjs +35 -0
- package/dist/toast/toast-description.mjs.map +1 -0
- package/dist/toast/toast-root.d.mts +43 -0
- package/dist/toast/toast-root.d.mts.map +1 -0
- package/dist/toast/toast-root.mjs +205 -0
- package/dist/toast/toast-root.mjs.map +1 -0
- package/dist/toast/toast-title.d.mts +24 -0
- package/dist/toast/toast-title.d.mts.map +1 -0
- package/dist/toast/toast-title.mjs +33 -0
- package/dist/toast/toast-title.mjs.map +1 -0
- package/dist/toast/toast-viewport.d.mts +52 -0
- package/dist/toast/toast-viewport.d.mts.map +1 -0
- package/dist/toast/toast-viewport.mjs +644 -0
- package/dist/toast/toast-viewport.mjs.map +1 -0
- package/dist/toast/toast.d.mts +119 -0
- package/dist/toast/toast.d.mts.map +1 -0
- package/dist/toast/toast.mjs +157 -0
- package/dist/toast/toast.mjs.map +1 -0
- package/dist/toggle/toggle.mjs +2 -1
- package/dist/toggle/toggle.mjs.map +1 -1
- package/dist/toggle-group/index.d.mts +16 -0
- package/dist/toggle-group/index.d.mts.map +1 -0
- package/dist/toggle-group/index.mjs +15 -0
- package/dist/toggle-group/index.mjs.map +1 -0
- package/dist/toggle-group/toggle-group-context.d.mts +4 -0
- package/dist/toggle-group/toggle-group-context.d.mts.map +1 -0
- package/dist/toggle-group/toggle-group-context.mjs +13 -0
- package/dist/toggle-group/toggle-group-context.mjs.map +1 -0
- package/dist/toggle-group/toggle-group-item.d.mts +47 -0
- package/dist/toggle-group/toggle-group-item.d.mts.map +1 -0
- package/dist/toggle-group/toggle-group-item.mjs +63 -0
- package/dist/toggle-group/toggle-group-item.mjs.map +1 -0
- package/dist/toggle-group/toggle-group-root.d.mts +95 -0
- package/dist/toggle-group/toggle-group-root.d.mts.map +1 -0
- package/dist/toggle-group/toggle-group-root.mjs +211 -0
- package/dist/toggle-group/toggle-group-root.mjs.map +1 -0
- package/dist/toolbar/index.d.mts +18 -0
- package/dist/toolbar/index.d.mts.map +1 -0
- package/dist/toolbar/index.mjs +18 -0
- package/dist/toolbar/index.mjs.map +1 -0
- package/dist/toolbar/toolbar-button.d.mts +42 -0
- package/dist/toolbar/toolbar-button.d.mts.map +1 -0
- package/dist/toolbar/toolbar-button.mjs +50 -0
- package/dist/toolbar/toolbar-button.mjs.map +1 -0
- package/dist/toolbar/toolbar-root.d.mts +38 -0
- package/dist/toolbar/toolbar-root.d.mts.map +1 -0
- package/dist/toolbar/toolbar-root.mjs +66 -0
- package/dist/toolbar/toolbar-root.mjs.map +1 -0
- package/dist/toolbar/toolbar-separator.d.mts +25 -0
- package/dist/toolbar/toolbar-separator.d.mts.map +1 -0
- package/dist/toolbar/toolbar-separator.mjs +31 -0
- package/dist/toolbar/toolbar-separator.mjs.map +1 -0
- package/dist/tooltip/tooltip-popup.mjs +2 -1
- package/dist/tooltip/tooltip-popup.mjs.map +1 -1
- package/dist/tooltip/tooltip-root.mjs +16 -2
- package/dist/tooltip/tooltip-root.mjs.map +1 -1
- package/dist/tooltip/tooltip-trigger.mjs +2 -1
- package/dist/tooltip/tooltip-trigger.mjs.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createActionDetails } from "../internal/action-details.mjs";
|
|
3
|
+
import { dataAttr } from "../internal/data-attr.mjs";
|
|
4
|
+
import { transitionTypes } from "../internal/transition-types.mjs";
|
|
5
|
+
import { useLatest } from "../internal/use-latest.mjs";
|
|
6
|
+
import { useControllableAction } from "../internal/use-controllable-action.mjs";
|
|
7
|
+
import { mergeTokenLists } from "../internal/merge-props.mjs";
|
|
8
|
+
import { useRender } from "../internal/use-render.mjs";
|
|
9
|
+
import { useDevWarning } from "../internal/use-dev-warning.mjs";
|
|
10
|
+
import { useActionTrigger } from "../internal/use-action-trigger.mjs";
|
|
11
|
+
import { FieldContext } from "../internal/field-context.mjs";
|
|
12
|
+
import { useFieldValueChange } from "../internal/use-field-control.mjs";
|
|
13
|
+
import { useNativeGroupReconciliation } from "../internal/use-native-group-reconciliation.mjs";
|
|
14
|
+
import { boundValue, stepBy, stepValue } from "./number-field-arithmetic.mjs";
|
|
15
|
+
import { NumberFieldContext } from "./number-field-context.mjs";
|
|
16
|
+
import { announce } from "../internal/announce.mjs";
|
|
17
|
+
import { createNumberFormatter, formatKey } from "./number-field-format.mjs";
|
|
18
|
+
import { addTransitionType, use, useCallback, useEffect, useId, useInsertionEffect, useMemo, useRef, useState } from "react";
|
|
19
|
+
import { jsx } from "react/jsx-runtime";
|
|
20
|
+
//#region src/number-field/number-field-root.tsx
|
|
21
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
22
|
+
const STEP_TYPES = transitionTypes("number-field", "change");
|
|
23
|
+
const COMMIT_TYPES = transitionTypes("number-field", "commit");
|
|
24
|
+
/** A finite number, or `null` (`NaN` / `Infinity` are treated as empty). */
|
|
25
|
+
function sanitize(value) {
|
|
26
|
+
if (value === void 0 || value === null) return value;
|
|
27
|
+
return Number.isFinite(value) ? value : null;
|
|
28
|
+
}
|
|
29
|
+
/** The hidden input's value for `value`. */
|
|
30
|
+
function hiddenText(value) {
|
|
31
|
+
return value === null ? "" : String(value);
|
|
32
|
+
}
|
|
33
|
+
function languageOf(tag) {
|
|
34
|
+
return tag.split("-")[0]?.toLowerCase() ?? "";
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Owns the number field's state (design/components/number-field.md 2): the committed value
|
|
38
|
+
* through `useControllableAction` with `valueCommitAction` (once per gesture), each step through
|
|
39
|
+
* its own transition (`valueChangeAction`), the urgent draft text, the urgent value of the open
|
|
40
|
+
* gesture (`live`), the press-and-hold, the formatter and parser, the announcements, mount
|
|
41
|
+
* reconciliation and form reset (through the hidden input the Input renders).
|
|
42
|
+
*
|
|
43
|
+
* Owned keys (conventions 1.2): `role="group"`, `aria-labelledby` (token-merged: the consumer's,
|
|
44
|
+
* then `NumberField.Label`'s id while one is mounted, then a Field's label id), `data-pending`,
|
|
45
|
+
* `data-disabled`, `data-invalid` (inside a Field).
|
|
46
|
+
*/
|
|
47
|
+
function NumberFieldRoot(props) {
|
|
48
|
+
const { value: valueProp, defaultValue: defaultValueProp, valueChangeAction, valueCommitAction, min, max, step: stepProp, largeStep: largeStepProp, format, locale, stepOnWheel = false, name: nameProp, form, disabled: disabledProp = false, readOnly = false, required: requiredProp = false, announce: announce$1, className, style, children, render, ...rest } = props;
|
|
49
|
+
const value = sanitize(valueProp);
|
|
50
|
+
const defaultValue = sanitize(defaultValueProp);
|
|
51
|
+
const key = formatKey(format);
|
|
52
|
+
const localeKey = locale === void 0 ? "" : JSON.stringify(locale);
|
|
53
|
+
const formatter = useMemo(() => createNumberFormatter(locale, format), [localeKey, key]);
|
|
54
|
+
const defaultStep = formatter.percent ? .01 : 1;
|
|
55
|
+
const stepValid = stepProp === void 0 || Number.isFinite(stepProp) && stepProp > 0;
|
|
56
|
+
const stepSize = stepProp !== void 0 && stepValid ? stepProp : defaultStep;
|
|
57
|
+
const largeStepValid = largeStepProp === void 0 || Number.isFinite(largeStepProp) && largeStepProp > 0;
|
|
58
|
+
const largeStep = largeStepProp !== void 0 && largeStepValid ? largeStepProp : 10 * stepSize;
|
|
59
|
+
const bounds = useMemo(() => ({
|
|
60
|
+
min: Number.isFinite(min) ? min : void 0,
|
|
61
|
+
max: Number.isFinite(max) ? max : void 0,
|
|
62
|
+
step: stepSize
|
|
63
|
+
}), [
|
|
64
|
+
min,
|
|
65
|
+
max,
|
|
66
|
+
stepSize
|
|
67
|
+
]);
|
|
68
|
+
const fieldContext = use(FieldContext);
|
|
69
|
+
const disabled = disabledProp || (fieldContext?.disabled ?? false);
|
|
70
|
+
const required = requiredProp || (fieldContext?.required ?? false);
|
|
71
|
+
const name = nameProp ?? fieldContext?.name;
|
|
72
|
+
const fieldInvalid = fieldContext === null ? void 0 : fieldContext.state.invalid;
|
|
73
|
+
const id = useId();
|
|
74
|
+
const inputId = fieldContext?.ids.control ?? `${id}-input`;
|
|
75
|
+
const labelId = `${id}-label`;
|
|
76
|
+
const [draft, setDraft] = useState(null);
|
|
77
|
+
const draftRef = useRef(null);
|
|
78
|
+
/** The value the open gesture has reached (`null` inside: an empty value). */
|
|
79
|
+
const [live, setLive] = useState(null);
|
|
80
|
+
const [hold, setHold] = useState(null);
|
|
81
|
+
const [stepHeld, setStepHeld] = useState(false);
|
|
82
|
+
const [pendingSource, setPendingSource] = useState(null);
|
|
83
|
+
const liveRef = useRef(null);
|
|
84
|
+
/** The shown value when the open gesture began; `null` when no gesture is open. */
|
|
85
|
+
const gestureStart = useRef(null);
|
|
86
|
+
/** The value the next tick of a hold steps from. */
|
|
87
|
+
const holdBase = useRef(null);
|
|
88
|
+
const holdRef = useRef(null);
|
|
89
|
+
const commitSeq = useRef(0);
|
|
90
|
+
const lastReason = useRef(null);
|
|
91
|
+
const shownRef = useRef(null);
|
|
92
|
+
const visibleRef = useRef(null);
|
|
93
|
+
const hiddenRef = useRef(null);
|
|
94
|
+
const clearDraft = useCallback(() => {
|
|
95
|
+
if (draftRef.current === null) return;
|
|
96
|
+
draftRef.current = null;
|
|
97
|
+
setDraft(null);
|
|
98
|
+
}, []);
|
|
99
|
+
/** The visible input is invalid exactly when the hidden one is (6.2). */
|
|
100
|
+
const mirror = useCallback(() => {
|
|
101
|
+
const hidden = hiddenRef.current;
|
|
102
|
+
const visible = visibleRef.current;
|
|
103
|
+
if (hidden === null || visible === null) return;
|
|
104
|
+
const message = hidden.validationMessage;
|
|
105
|
+
if (visible.validationMessage !== message) visible.setCustomValidity(message);
|
|
106
|
+
}, []);
|
|
107
|
+
const writeHidden = useCallback((next) => {
|
|
108
|
+
const hidden = hiddenRef.current;
|
|
109
|
+
if (hidden !== null) {
|
|
110
|
+
const text = hiddenText(next);
|
|
111
|
+
if (hidden.value !== text) hidden.value = text;
|
|
112
|
+
}
|
|
113
|
+
mirror();
|
|
114
|
+
}, [mirror]);
|
|
115
|
+
const { pending: stepPending, run: runStep } = useActionTrigger();
|
|
116
|
+
const runCommit = async (next, details) => {
|
|
117
|
+
const seq = ++commitSeq.current;
|
|
118
|
+
try {
|
|
119
|
+
await valueCommitAction?.(next, details);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (valueProp === void 0 && seq === commitSeq.current) {
|
|
122
|
+
await void 0;
|
|
123
|
+
step(committedRef.current, null, "dismiss", void 0);
|
|
124
|
+
}
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const commitState = useControllableAction({
|
|
129
|
+
controlled: value,
|
|
130
|
+
defaultValue,
|
|
131
|
+
initialValue: null,
|
|
132
|
+
action: runCommit,
|
|
133
|
+
transitionTypes: () => COMMIT_TYPES,
|
|
134
|
+
warn: {
|
|
135
|
+
component: "NumberField.Root",
|
|
136
|
+
prop: "value"
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
const { optimistic, committed, dispatch } = commitState;
|
|
140
|
+
const committedRef = useLatest(committed);
|
|
141
|
+
const shown = (hold !== null || stepHeld || stepPending || commitState.pending) && live !== null ? live.value : optimistic;
|
|
142
|
+
const pending = stepPending || commitState.pending;
|
|
143
|
+
const text = draft ?? formatter.format(shown);
|
|
144
|
+
const parsedDraft = draft === null ? void 0 : formatter.parse(draft);
|
|
145
|
+
const stepBase = parsedDraft === void 0 ? shown : parsedDraft;
|
|
146
|
+
useInsertionEffect(() => {
|
|
147
|
+
shownRef.current = shown;
|
|
148
|
+
});
|
|
149
|
+
const state = useMemo(() => ({
|
|
150
|
+
value: shown,
|
|
151
|
+
text,
|
|
152
|
+
pending,
|
|
153
|
+
disabled,
|
|
154
|
+
readOnly,
|
|
155
|
+
required
|
|
156
|
+
}), [
|
|
157
|
+
shown,
|
|
158
|
+
text,
|
|
159
|
+
pending,
|
|
160
|
+
disabled,
|
|
161
|
+
readOnly,
|
|
162
|
+
required
|
|
163
|
+
]);
|
|
164
|
+
useFieldValueChange(optimistic, () => {
|
|
165
|
+
const edit = lastReason.current === "activate";
|
|
166
|
+
lastReason.current = null;
|
|
167
|
+
return edit;
|
|
168
|
+
});
|
|
169
|
+
const latest = useLatest({
|
|
170
|
+
valueChangeAction,
|
|
171
|
+
runStep,
|
|
172
|
+
formatter,
|
|
173
|
+
bounds,
|
|
174
|
+
largeStep,
|
|
175
|
+
disabled,
|
|
176
|
+
readOnly,
|
|
177
|
+
announce: announce$1,
|
|
178
|
+
state
|
|
179
|
+
});
|
|
180
|
+
const step = useCallback((next, source, reason, event) => {
|
|
181
|
+
const { formatter: f } = latest.current;
|
|
182
|
+
if (next !== null) next = f.round(next);
|
|
183
|
+
if (Object.is(next, shownRef.current)) return false;
|
|
184
|
+
liveRef.current = next;
|
|
185
|
+
shownRef.current = next;
|
|
186
|
+
lastReason.current = reason;
|
|
187
|
+
setLive({ value: next });
|
|
188
|
+
clearDraft();
|
|
189
|
+
setPendingSource(source);
|
|
190
|
+
writeHidden(next);
|
|
191
|
+
if (reason !== "dismiss") setStepHeld(true);
|
|
192
|
+
const { valueChangeAction: action, runStep: run } = latest.current;
|
|
193
|
+
if (action === void 0) return true;
|
|
194
|
+
run(() => {
|
|
195
|
+
for (const type of STEP_TYPES) addTransitionType(type);
|
|
196
|
+
return action(next, createActionDetails(event, {
|
|
197
|
+
reason,
|
|
198
|
+
source
|
|
199
|
+
}));
|
|
200
|
+
});
|
|
201
|
+
return true;
|
|
202
|
+
}, [
|
|
203
|
+
clearDraft,
|
|
204
|
+
latest,
|
|
205
|
+
writeHidden
|
|
206
|
+
]);
|
|
207
|
+
const announceValue = useCallback((next) => {
|
|
208
|
+
const visible = visibleRef.current;
|
|
209
|
+
if (visible === null) return;
|
|
210
|
+
const { announce: compose, formatter: f, state: s } = latest.current;
|
|
211
|
+
const nextState = {
|
|
212
|
+
...s,
|
|
213
|
+
value: next,
|
|
214
|
+
text: f.format(next)
|
|
215
|
+
};
|
|
216
|
+
const message = compose === void 0 ? nextState.text : compose(next, nextState);
|
|
217
|
+
if (message !== null) announce(visible, message);
|
|
218
|
+
}, [latest]);
|
|
219
|
+
const commit = useCallback((source, reason, event) => {
|
|
220
|
+
const start = gestureStart.current;
|
|
221
|
+
gestureStart.current = null;
|
|
222
|
+
setStepHeld(false);
|
|
223
|
+
const next = liveRef.current;
|
|
224
|
+
if (start === null || Object.is(next, start.value)) return false;
|
|
225
|
+
lastReason.current = reason;
|
|
226
|
+
setPendingSource(source);
|
|
227
|
+
dispatch(next, createActionDetails(event, {
|
|
228
|
+
reason,
|
|
229
|
+
source
|
|
230
|
+
}));
|
|
231
|
+
if (reason === "activate" && source !== "input" && source !== null) announceValue(next);
|
|
232
|
+
return true;
|
|
233
|
+
}, [announceValue, dispatch]);
|
|
234
|
+
/** Opens a gesture at the shown value. */
|
|
235
|
+
const openGesture = useCallback(() => {
|
|
236
|
+
gestureStart.current = { value: shownRef.current };
|
|
237
|
+
liveRef.current = shownRef.current;
|
|
238
|
+
}, []);
|
|
239
|
+
/** The value a key or a button steps from: the parsed draft if one is open, else the shown value. */
|
|
240
|
+
const resolveBase = useCallback(() => {
|
|
241
|
+
const open = draftRef.current;
|
|
242
|
+
if (open !== null) {
|
|
243
|
+
const parsed = latest.current.formatter.parse(open);
|
|
244
|
+
clearDraft();
|
|
245
|
+
if (parsed !== void 0) return parsed;
|
|
246
|
+
}
|
|
247
|
+
return shownRef.current;
|
|
248
|
+
}, [clearDraft, latest]);
|
|
249
|
+
/** A one-step gesture: a key press, a wheel event, a click activation. */
|
|
250
|
+
const oneStep = useCallback((compute, source, event) => {
|
|
251
|
+
const base = resolveBase();
|
|
252
|
+
openGesture();
|
|
253
|
+
step(compute(base), source, "activate", event);
|
|
254
|
+
commit(source, "activate", event);
|
|
255
|
+
}, [
|
|
256
|
+
commit,
|
|
257
|
+
openGesture,
|
|
258
|
+
resolveBase,
|
|
259
|
+
step
|
|
260
|
+
]);
|
|
261
|
+
const typed = useCallback((next) => {
|
|
262
|
+
draftRef.current = next;
|
|
263
|
+
setDraft(next);
|
|
264
|
+
}, []);
|
|
265
|
+
const commitDraft = useCallback((event) => {
|
|
266
|
+
const open = draftRef.current;
|
|
267
|
+
if (open === null) return;
|
|
268
|
+
const { formatter: f, disabled: off, readOnly: ro } = latest.current;
|
|
269
|
+
if (off || ro) {
|
|
270
|
+
clearDraft();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const parsed = f.parse(open);
|
|
274
|
+
if (parsed === void 0 || Object.is(parsed, shownRef.current)) {
|
|
275
|
+
clearDraft();
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
openGesture();
|
|
279
|
+
step(parsed, "input", "activate", event);
|
|
280
|
+
commit("input", "activate", event);
|
|
281
|
+
}, [
|
|
282
|
+
clearDraft,
|
|
283
|
+
commit,
|
|
284
|
+
latest,
|
|
285
|
+
openGesture,
|
|
286
|
+
step
|
|
287
|
+
]);
|
|
288
|
+
const keyDown = useCallback((event) => {
|
|
289
|
+
const { disabled: off, readOnly: ro, bounds: b, largeStep: large } = latest.current;
|
|
290
|
+
if (off || ro || event.isComposing || event.keyCode === 229) return;
|
|
291
|
+
if (event.key === "Enter") {
|
|
292
|
+
commitDraft(event);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (event.altKey || event.ctrlKey || event.metaKey) return;
|
|
296
|
+
let compute = null;
|
|
297
|
+
switch (event.key) {
|
|
298
|
+
case "ArrowUp":
|
|
299
|
+
compute = event.shiftKey ? (v) => stepBy(v, large, b) : (v) => stepValue(v, 1, b);
|
|
300
|
+
break;
|
|
301
|
+
case "ArrowDown":
|
|
302
|
+
compute = event.shiftKey ? (v) => stepBy(v, -large, b) : (v) => stepValue(v, -1, b);
|
|
303
|
+
break;
|
|
304
|
+
case "PageUp":
|
|
305
|
+
compute = (v) => stepBy(v, large, b);
|
|
306
|
+
break;
|
|
307
|
+
case "PageDown":
|
|
308
|
+
compute = (v) => stepBy(v, -large, b);
|
|
309
|
+
break;
|
|
310
|
+
case "Home": {
|
|
311
|
+
if (event.shiftKey) break;
|
|
312
|
+
const target = boundValue("min", b);
|
|
313
|
+
if (target !== void 0) compute = () => target;
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
case "End": {
|
|
317
|
+
if (event.shiftKey) break;
|
|
318
|
+
const target = boundValue("max", b);
|
|
319
|
+
if (target !== void 0) compute = () => target;
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (compute === null) return;
|
|
324
|
+
event.preventDefault();
|
|
325
|
+
oneStep(compute, "keyboard", event);
|
|
326
|
+
}, [
|
|
327
|
+
commitDraft,
|
|
328
|
+
latest,
|
|
329
|
+
oneStep
|
|
330
|
+
]);
|
|
331
|
+
const wheel = useCallback((event) => {
|
|
332
|
+
const { disabled: off, readOnly: ro, bounds: b } = latest.current;
|
|
333
|
+
const visible = visibleRef.current;
|
|
334
|
+
if (off || ro || visible === null || event.deltaY === 0) return;
|
|
335
|
+
if (visible.ownerDocument.activeElement !== visible) return;
|
|
336
|
+
event.preventDefault();
|
|
337
|
+
const n = event.deltaY < 0 ? 1 : -1;
|
|
338
|
+
oneStep((v) => stepValue(v, n, b), "wheel", event);
|
|
339
|
+
}, [latest, oneStep]);
|
|
340
|
+
const endHold = useCallback((direction, event) => {
|
|
341
|
+
if (holdRef.current !== direction) return;
|
|
342
|
+
holdRef.current = null;
|
|
343
|
+
setHold(null);
|
|
344
|
+
commit(direction, "activate", event);
|
|
345
|
+
}, [commit]);
|
|
346
|
+
const tickHold = useCallback((direction, event) => {
|
|
347
|
+
if (holdRef.current !== direction) return false;
|
|
348
|
+
const { bounds: b } = latest.current;
|
|
349
|
+
const n = direction === "increment" ? 1 : -1;
|
|
350
|
+
const next = stepValue(holdBase.current, n, b);
|
|
351
|
+
holdBase.current = next;
|
|
352
|
+
step(next, direction, "activate", event);
|
|
353
|
+
if (stepValue(next, n, b) === next) {
|
|
354
|
+
endHold(direction, event);
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
return true;
|
|
358
|
+
}, [
|
|
359
|
+
endHold,
|
|
360
|
+
latest,
|
|
361
|
+
step
|
|
362
|
+
]);
|
|
363
|
+
const beginHold = useCallback((direction, event) => {
|
|
364
|
+
const { disabled: off, readOnly: ro } = latest.current;
|
|
365
|
+
if (off || ro || holdRef.current !== null) return false;
|
|
366
|
+
const base = resolveBase();
|
|
367
|
+
openGesture();
|
|
368
|
+
setLive({ value: shownRef.current });
|
|
369
|
+
holdBase.current = base;
|
|
370
|
+
holdRef.current = direction;
|
|
371
|
+
setHold(direction);
|
|
372
|
+
return tickHold(direction, event);
|
|
373
|
+
}, [
|
|
374
|
+
latest,
|
|
375
|
+
openGesture,
|
|
376
|
+
resolveBase,
|
|
377
|
+
tickHold
|
|
378
|
+
]);
|
|
379
|
+
const activate = useCallback((direction, event) => {
|
|
380
|
+
const { disabled: off, readOnly: ro, bounds: b } = latest.current;
|
|
381
|
+
if (off || ro || holdRef.current !== null) return;
|
|
382
|
+
const n = direction === "increment" ? 1 : -1;
|
|
383
|
+
oneStep((v) => stepValue(v, n, b), direction, event);
|
|
384
|
+
}, [latest, oneStep]);
|
|
385
|
+
const [labelCount, setLabelCount] = useState(0);
|
|
386
|
+
const registerLabel = useCallback(() => {
|
|
387
|
+
setLabelCount((count) => count + 1);
|
|
388
|
+
return () => setLabelCount((count) => count - 1);
|
|
389
|
+
}, []);
|
|
390
|
+
const [mountValue] = useState(value);
|
|
391
|
+
const resetTarget = () => valueProp !== void 0 ? mountValue ?? null : defaultValue ?? null;
|
|
392
|
+
const resetTargetText = hiddenText(resetTarget());
|
|
393
|
+
const { onItemMounted } = useNativeGroupReconciliation({
|
|
394
|
+
element: hiddenRef,
|
|
395
|
+
readCurrent: () => {
|
|
396
|
+
const visible = visibleRef.current;
|
|
397
|
+
const current = shownRef.current;
|
|
398
|
+
if (visible === null) return current;
|
|
399
|
+
const domText = visible.value;
|
|
400
|
+
if (domText === formatter.format(current)) return current;
|
|
401
|
+
if (visible.ownerDocument.activeElement === visible) {
|
|
402
|
+
draftRef.current = domText;
|
|
403
|
+
setDraft(domText);
|
|
404
|
+
return current;
|
|
405
|
+
}
|
|
406
|
+
const parsed = formatter.parse(domText);
|
|
407
|
+
if (parsed === void 0 || Object.is(parsed, current)) {
|
|
408
|
+
visible.value = formatter.format(current);
|
|
409
|
+
return current;
|
|
410
|
+
}
|
|
411
|
+
return parsed;
|
|
412
|
+
},
|
|
413
|
+
readDefault: () => {
|
|
414
|
+
clearDraft();
|
|
415
|
+
return resetTarget();
|
|
416
|
+
},
|
|
417
|
+
base: () => shownRef.current,
|
|
418
|
+
onPlatformChange: (next, event) => {
|
|
419
|
+
openGesture();
|
|
420
|
+
step(next, null, "platform", event);
|
|
421
|
+
commit(null, "platform", event);
|
|
422
|
+
},
|
|
423
|
+
onResetEvent: () => {
|
|
424
|
+
const visible = visibleRef.current;
|
|
425
|
+
if (visible !== null) visible.defaultValue = formatter.format(resetTarget());
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
useDevWarning(valueProp !== void 0 && valueProp !== null && !Number.isFinite(valueProp) || defaultValueProp !== void 0 && defaultValueProp !== null && !Number.isFinite(defaultValueProp), `NumberField.Root: \`value\` / \`defaultValue\` must be a finite number or \`null\`; got ${String(valueProp ?? defaultValueProp)}, treated as empty.`);
|
|
429
|
+
useDevWarning(bounds.min !== void 0 && bounds.max !== void 0 && bounds.min > bounds.max, `NumberField.Root: \`min\` (${String(min)}) is greater than \`max\` (${String(max)}).`);
|
|
430
|
+
useDevWarning(!stepValid || !largeStepValid, "NumberField.Root: `step` and `largeStep` must be positive numbers; using the defaults.");
|
|
431
|
+
useDevWarning(formatter.warning !== null, `NumberField.Root: ${formatter.warning ?? ""}`);
|
|
432
|
+
const warnedLang = useRef(false);
|
|
433
|
+
useEffect(() => {
|
|
434
|
+
if (!isDev || warnedLang.current || locale !== void 0) return;
|
|
435
|
+
const lang = document.documentElement.lang;
|
|
436
|
+
if (lang === "" || languageOf(lang) === languageOf(formatter.locale)) return;
|
|
437
|
+
warnedLang.current = true;
|
|
438
|
+
console.error(`NumberField.Root: the page is \`lang="${lang}"\` but NumberField formats as \`${formatter.locale}\` (the runtime's locale); pass \`locale\`.`);
|
|
439
|
+
}, [locale, formatter]);
|
|
440
|
+
useEffect(() => () => {
|
|
441
|
+
holdRef.current = null;
|
|
442
|
+
}, []);
|
|
443
|
+
const context = useMemo(() => ({
|
|
444
|
+
state,
|
|
445
|
+
bounds,
|
|
446
|
+
stepBase,
|
|
447
|
+
pendingSource: pending ? pendingSource : null,
|
|
448
|
+
inputId,
|
|
449
|
+
labelId,
|
|
450
|
+
name,
|
|
451
|
+
form,
|
|
452
|
+
allowsFractions: formatter.allowsFractions || !Number.isInteger(stepSize),
|
|
453
|
+
stepOnWheel,
|
|
454
|
+
resetTargetText,
|
|
455
|
+
fieldInvalid,
|
|
456
|
+
visibleRef,
|
|
457
|
+
hiddenRef,
|
|
458
|
+
typed,
|
|
459
|
+
commitDraft,
|
|
460
|
+
keyDown,
|
|
461
|
+
wheel,
|
|
462
|
+
beginHold,
|
|
463
|
+
tickHold,
|
|
464
|
+
endHold,
|
|
465
|
+
activate,
|
|
466
|
+
mirror,
|
|
467
|
+
registerLabel,
|
|
468
|
+
onInputMounted: onItemMounted
|
|
469
|
+
}), [
|
|
470
|
+
state,
|
|
471
|
+
bounds,
|
|
472
|
+
stepBase,
|
|
473
|
+
pending,
|
|
474
|
+
pendingSource,
|
|
475
|
+
inputId,
|
|
476
|
+
labelId,
|
|
477
|
+
name,
|
|
478
|
+
form,
|
|
479
|
+
formatter,
|
|
480
|
+
stepSize,
|
|
481
|
+
stepOnWheel,
|
|
482
|
+
resetTargetText,
|
|
483
|
+
fieldInvalid,
|
|
484
|
+
typed,
|
|
485
|
+
commitDraft,
|
|
486
|
+
keyDown,
|
|
487
|
+
wheel,
|
|
488
|
+
beginHold,
|
|
489
|
+
tickHold,
|
|
490
|
+
endHold,
|
|
491
|
+
activate,
|
|
492
|
+
mirror,
|
|
493
|
+
registerLabel,
|
|
494
|
+
onItemMounted
|
|
495
|
+
]);
|
|
496
|
+
const labelledBy = mergeTokenLists(labelCount > 0 ? labelId : void 0, fieldContext?.ids.label);
|
|
497
|
+
const libraryProps = {
|
|
498
|
+
role: "group",
|
|
499
|
+
...labelledBy !== "" ? { "aria-labelledby": labelledBy } : {},
|
|
500
|
+
...fieldContext !== null ? { "data-invalid": dataAttr(fieldInvalid === true) } : {},
|
|
501
|
+
"data-pending": dataAttr(pending),
|
|
502
|
+
"data-disabled": dataAttr(disabled)
|
|
503
|
+
};
|
|
504
|
+
const element = useRender({
|
|
505
|
+
defaultElement: "div",
|
|
506
|
+
render,
|
|
507
|
+
state,
|
|
508
|
+
className,
|
|
509
|
+
style,
|
|
510
|
+
children,
|
|
511
|
+
props: rest,
|
|
512
|
+
libraryProps
|
|
513
|
+
});
|
|
514
|
+
return /* @__PURE__ */ jsx(NumberFieldContext, {
|
|
515
|
+
value: context,
|
|
516
|
+
children: element
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
NumberFieldRoot.displayName = "NumberFieldRoot";
|
|
520
|
+
//#endregion
|
|
521
|
+
export { NumberFieldRoot, hiddenText };
|
|
522
|
+
|
|
523
|
+
//# sourceMappingURL=number-field-root.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number-field-root.mjs","names":[],"sources":["../../src/number-field/number-field-root.tsx"],"sourcesContent":["\"use client\";\nimport {\n addTransitionType,\n use,\n useCallback,\n useEffect,\n useId,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ComponentPropsWithRef, CSSProperties, ReactNode, RefObject } from \"react\";\nimport { createActionDetails } from \"../internal/action-details.js\";\nimport { announce as speak } from \"../internal/announce.js\";\nimport { dataAttr } from \"../internal/data-attr.js\";\nimport { FieldContext } from \"../internal/field-context.js\";\nimport { mergeTokenLists } from \"../internal/merge-props.js\";\nimport { transitionTypes } from \"../internal/transition-types.js\";\nimport type {\n ActionDetails,\n ChangeAction,\n ChangeReason,\n RenderProp,\n StateValue,\n} from \"../internal/types.js\";\nimport { useActionTrigger } from \"../internal/use-action-trigger.js\";\nimport { useControllableAction } from \"../internal/use-controllable-action.js\";\nimport { useDevWarning } from \"../internal/use-dev-warning.js\";\nimport { useFieldValueChange } from \"../internal/use-field-control.js\";\nimport type { FormAssociatedElement } from \"../internal/use-form-reset.js\";\nimport { useLatest } from \"../internal/use-latest.js\";\nimport { useNativeGroupReconciliation } from \"../internal/use-native-group-reconciliation.js\";\nimport { useRender } from \"../internal/use-render.js\";\nimport type { DataAttributes } from \"../internal/use-render.js\";\nimport { boundValue, stepBy, stepValue } from \"./number-field-arithmetic.js\";\nimport type { StepBounds } from \"./number-field-arithmetic.js\";\nimport { NumberFieldContext } from \"./number-field-context.js\";\nimport type {\n NumberFieldContextValue,\n NumberFieldSource,\n StepDirection,\n} from \"./number-field-context.js\";\nimport { createNumberFormatter, formatKey } from \"./number-field-format.js\";\n\n/** Details passed as the second argument of both NumberField actions. */\nexport interface NumberFieldValueChangeDetails extends ActionDetails {\n /**\n * `\"activate\"`: the user typed, pressed a key, a button or turned the wheel (`details.event` is\n * the `focusout` / Enter `keydown` of a typed value, the `keydown` of a key, the `pointerdown` /\n * `pointerup` of a button (`undefined` for the repeats of a held button and for a hold that\n * ended at its bound), the `wheel` event). `\"platform\"`: a form reset (the `reset`\n * event) or text typed before hydration (`undefined`). `\"dismiss\"`: the commit action rejected\n * and the field reverted to the committed value (uncontrolled; `valueChangeAction` only).\n */\n readonly reason: ChangeReason;\n /** What produced the value: typed text, a button, a key, the wheel; `null` for \"platform\" and \"dismiss\". */\n readonly source: \"input\" | \"increment\" | \"decrement\" | \"keyboard\" | \"wheel\" | null;\n}\n\n/** The state every NumberField part's function props receive (one object, Field's precedent). */\nexport interface NumberFieldState {\n /** The shown value: the gesture's value while one is open or in flight, else the optimistic value; `null` when empty. */\n readonly value: number | null;\n /** The shown text: the draft while the user is editing, else `value` formatted. */\n readonly text: string;\n /** A step or commit dispatched through this NumberField is in flight. */\n readonly pending: boolean;\n readonly disabled: boolean;\n readonly readOnly: boolean;\n readonly required: boolean;\n}\n\nexport interface NumberFieldRootProps extends Omit<\n ComponentPropsWithRef<\"div\">,\n \"defaultValue\" | \"role\" | \"className\" | \"style\" | \"children\"\n> {\n /** Controlled value; `null` is empty, `undefined` uncontrolled. */\n value?: number | null;\n /** Initial value in uncontrolled mode, and its form-reset target (latest). Default `null` (empty). */\n defaultValue?: number | null;\n /**\n * Runs inside the Root's step transition on every step: the parse of typed text at commit,\n * each key press, each tick of a hold, each wheel event, each platform change, and the revert\n * after a rejected commit (`reason: \"dismiss\"`, uncontrolled). Keep it cheap: adopt the value\n * (`setValue(next)` in the sync prefix is a transition update), start a deferred render.\n */\n valueChangeAction?: ChangeAction<number | null, NumberFieldValueChangeDetails>;\n /**\n * Runs inside the Root's commit transition once per gesture: a typed text's blur or Enter, a\n * hold's release, each key press, each wheel event, a form reset, text typed before hydration.\n * Where the save goes; uncontrolled state is committed when it resolves and reverts when it\n * rejects. May be a Server Function.\n */\n valueCommitAction?: ChangeAction<number | null, NumberFieldValueChangeDetails>;\n /** Native `min` on the hidden input (a constraint) and the lower bound of stepping. */\n min?: number;\n /** Native `max` on the hidden input (a constraint) and the upper bound of stepping. */\n max?: number;\n /** Native `step` and the stepping grid from `min` (else `0`). Default `1`, or `0.01` when `format.style` is `\"percent\"`. */\n step?: number;\n /** PageUp / PageDown and Shift+Arrow. Default `10 × step`. */\n largeStep?: number;\n /**\n * `Intl.NumberFormatOptions` for the text: `style` `\"decimal\"` (default), `\"percent\"`,\n * `\"currency\"` (with `currency`), `\"unit\"` (with `unit`); fraction digits, grouping, sign\n * display. `notation: \"compact\"` is a dev warning (unparsable).\n */\n format?: Intl.NumberFormatOptions;\n /**\n * BCP 47 tag(s). Default: the runtime's locale (`Intl.NumberFormat().resolvedOptions().locale`).\n * Pass the page's `lang`; a dev warning fires when `document.documentElement.lang` disagrees\n * and this prop is absent.\n */\n locale?: string | readonly string[];\n /** Step with the mouse wheel while the input is focused. Default `false`. */\n stepOnWheel?: boolean;\n /** Native `name` on the hidden input; defaults to the Field's `name` inside a `Field.Root`. */\n name?: string;\n /** Native `form` on the hidden input. */\n form?: string;\n /** Disables both inputs and the buttons; inherited by every part. */\n disabled?: boolean;\n /** Native `readonly` on both inputs; no stepping (buttons disabled, keys and wheel inert). */\n readOnly?: boolean;\n /** Native `required` on the hidden input (empty is `valueMissing`); or the Field's. */\n required?: boolean;\n /**\n * What is announced (`ariaNotify()`, else a live region) after a key press, a wheel event, a\n * click activation and a hold's release. Default: `(_, state) => state.text`. Return `null` to\n * announce nothing.\n */\n announce?: (value: number | null, state: NumberFieldState) => string | null;\n className?: StateValue<string | undefined, NumberFieldState>;\n style?: StateValue<CSSProperties | undefined, NumberFieldState>;\n children?: StateValue<ReactNode, NumberFieldState>;\n render?: RenderProp<ComponentPropsWithRef<\"div\">, NumberFieldState>;\n}\n\nconst isDev = process.env.NODE_ENV !== \"production\";\n\nconst STEP_TYPES = transitionTypes(\"number-field\", \"change\");\nconst COMMIT_TYPES = transitionTypes(\"number-field\", \"commit\");\n\n/** A finite number, or `null` (`NaN` / `Infinity` are treated as empty). */\nfunction sanitize(value: number | null | undefined): number | null | undefined {\n if (value === undefined || value === null) return value;\n return Number.isFinite(value) ? value : null;\n}\n\n/** The hidden input's value for `value`. */\nexport function hiddenText(value: number | null): string {\n return value === null ? \"\" : String(value);\n}\n\nfunction languageOf(tag: string): string {\n return tag.split(\"-\")[0]?.toLowerCase() ?? \"\";\n}\n\n/**\n * Owns the number field's state (design/components/number-field.md 2): the committed value\n * through `useControllableAction` with `valueCommitAction` (once per gesture), each step through\n * its own transition (`valueChangeAction`), the urgent draft text, the urgent value of the open\n * gesture (`live`), the press-and-hold, the formatter and parser, the announcements, mount\n * reconciliation and form reset (through the hidden input the Input renders).\n *\n * Owned keys (conventions 1.2): `role=\"group\"`, `aria-labelledby` (token-merged: the consumer's,\n * then `NumberField.Label`'s id while one is mounted, then a Field's label id), `data-pending`,\n * `data-disabled`, `data-invalid` (inside a Field).\n */\nexport function NumberFieldRoot(props: NumberFieldRootProps) {\n const {\n value: valueProp,\n defaultValue: defaultValueProp,\n valueChangeAction,\n valueCommitAction,\n min,\n max,\n step: stepProp,\n largeStep: largeStepProp,\n format,\n locale,\n stepOnWheel = false,\n name: nameProp,\n form,\n disabled: disabledProp = false,\n readOnly = false,\n required: requiredProp = false,\n announce,\n className,\n style,\n children,\n render,\n ...rest\n } = props;\n\n const value = sanitize(valueProp);\n const defaultValue = sanitize(defaultValueProp);\n\n // --- Format, bounds -----------------------------------------------------------------------\n\n const key = formatKey(format);\n const localeKey = locale === undefined ? \"\" : JSON.stringify(locale);\n // Memoised on the content of `format` and `locale`, not their identity (an inline object).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const formatter = useMemo(() => createNumberFormatter(locale, format), [localeKey, key]);\n const defaultStep = formatter.percent ? 0.01 : 1;\n const stepValid = stepProp === undefined || (Number.isFinite(stepProp) && stepProp > 0);\n const stepSize = stepProp !== undefined && stepValid ? stepProp : defaultStep;\n const largeStepValid =\n largeStepProp === undefined || (Number.isFinite(largeStepProp) && largeStepProp > 0);\n const largeStep = largeStepProp !== undefined && largeStepValid ? largeStepProp : 10 * stepSize;\n const bounds = useMemo<StepBounds>(\n () => ({\n min: Number.isFinite(min) ? min : undefined,\n max: Number.isFinite(max) ? max : undefined,\n step: stepSize,\n }),\n [min, max, stepSize],\n );\n\n // --- Field ----------------------------------------------------------------------------------\n\n const fieldContext = use(FieldContext);\n const disabled = disabledProp || (fieldContext?.disabled ?? false);\n const required = requiredProp || (fieldContext?.required ?? false);\n const name = nameProp ?? fieldContext?.name;\n const fieldInvalid = fieldContext === null ? undefined : fieldContext.state.invalid;\n\n const id = useId();\n const inputId = fieldContext?.ids.control ?? `${id}-input`;\n const labelId = `${id}-label`;\n\n // --- State (design 2) -----------------------------------------------------------------------\n\n const [draft, setDraft] = useState<string | null>(null);\n const draftRef = useRef<string | null>(null);\n /** The value the open gesture has reached (`null` inside: an empty value). */\n const [live, setLive] = useState<{ readonly value: number | null } | null>(null);\n const [hold, setHold] = useState<StepDirection | null>(null);\n const [stepHeld, setStepHeld] = useState(false);\n const [pendingSource, setPendingSource] = useState<NumberFieldSource>(null);\n\n const liveRef = useRef<number | null>(null);\n /** The shown value when the open gesture began; `null` when no gesture is open. */\n const gestureStart = useRef<{ readonly value: number | null } | null>(null);\n /** The value the next tick of a hold steps from. */\n const holdBase = useRef<number | null>(null);\n const holdRef = useRef<StepDirection | null>(null);\n const commitSeq = useRef(0);\n const lastReason = useRef<ChangeReason | null>(null);\n const shownRef = useRef<number | null>(null);\n const visibleRef = useRef<HTMLInputElement | null>(null);\n const hiddenRef = useRef<HTMLInputElement | null>(null);\n\n const clearDraft = useCallback(() => {\n if (draftRef.current === null) return;\n draftRef.current = null;\n setDraft(null);\n }, []);\n\n /** The visible input is invalid exactly when the hidden one is (6.2). */\n const mirror = useCallback(() => {\n const hidden = hiddenRef.current;\n const visible = visibleRef.current;\n if (hidden === null || visible === null) return;\n const message = hidden.validationMessage;\n if (visible.validationMessage !== message) visible.setCustomValidity(message);\n }, []);\n\n const writeHidden = useCallback(\n (next: number | null) => {\n const hidden = hiddenRef.current;\n if (hidden !== null) {\n const text = hiddenText(next);\n if (hidden.value !== text) hidden.value = text;\n }\n mirror();\n },\n [mirror],\n );\n\n const { pending: stepPending, run: runStep } = useActionTrigger();\n\n const runCommit = async (\n next: number | null,\n details: NumberFieldValueChangeDetails,\n ): Promise<void> => {\n const seq = ++commitSeq.current;\n try {\n await valueCommitAction?.(next, details);\n } catch (error) {\n // Design 2.4: in uncontrolled mode, tell the preview channel about the rollback, for the\n // latest commit only. Yield once to leave the commit's transition (conventions 2.6).\n if (valueProp === undefined && seq === commitSeq.current) {\n await undefined;\n // `step` and `committedRef` are declared below; this runs long after the render.\n step(committedRef.current, null, \"dismiss\", undefined);\n }\n throw error;\n }\n };\n\n const commitState = useControllableAction<number | null, NumberFieldValueChangeDetails>({\n controlled: value,\n defaultValue,\n initialValue: null,\n action: runCommit,\n transitionTypes: () => COMMIT_TYPES,\n warn: { component: \"NumberField.Root\", prop: \"value\" },\n });\n const { optimistic, committed, dispatch } = commitState;\n const committedRef = useLatest(committed);\n\n const held = hold !== null || stepHeld || stepPending || commitState.pending;\n const shown = held && live !== null ? live.value : optimistic;\n const pending = stepPending || commitState.pending;\n const text = draft ?? formatter.format(shown);\n // The value a button press steps from (4.3 step 3): the parsed draft while one is open.\n const parsedDraft = draft === null ? undefined : formatter.parse(draft);\n const stepBase = parsedDraft === undefined ? shown : parsedDraft;\n useInsertionEffect(() => {\n shownRef.current = shown;\n });\n\n const state = useMemo<NumberFieldState>(\n () => ({ value: shown, text, pending, disabled, readOnly, required }),\n [shown, text, pending, disabled, readOnly, required],\n );\n\n // A step, a key and a typed commit fire no `input` / `change` on the element the Field hears\n // for the value (the hidden input is written by script): tell it at the commit (design 7.2).\n useFieldValueChange(optimistic, () => {\n const edit = lastReason.current === \"activate\";\n lastReason.current = null;\n return edit;\n });\n\n const latest = useLatest({\n valueChangeAction,\n runStep,\n formatter,\n bounds,\n largeStep,\n disabled,\n readOnly,\n announce,\n state,\n });\n\n // --- Step and commit (design 2.4) -----------------------------------------------------------\n\n const step = useCallback(\n (\n next: number | null,\n source: NumberFieldSource,\n reason: ChangeReason,\n event: Event | undefined,\n ): boolean => {\n // What the text can show is what the form posts (5.4): a step finer than the format's\n // digits is rounded like a typed value.\n const { formatter: f } = latest.current;\n if (next !== null) next = f.round(next);\n // No-op against what the user sees (conventions 2.3 item 8).\n if (Object.is(next, shownRef.current)) return false;\n liveRef.current = next;\n shownRef.current = next;\n lastReason.current = reason;\n setLive({ value: next });\n clearDraft();\n setPendingSource(source);\n writeHidden(next);\n // A revert has no commit after it: the optimistic value already shows the committed one.\n if (reason !== \"dismiss\") setStepHeld(true);\n const { valueChangeAction: action, runStep: run } = latest.current;\n // Without a step action nothing runs and no transition starts (Slider M2).\n if (action === undefined) return true;\n run(() => {\n for (const type of STEP_TYPES) addTransitionType(type);\n return action(next, createActionDetails(event, { reason, source }));\n });\n return true;\n },\n [clearDraft, latest, writeHidden],\n );\n\n const announceValue = useCallback(\n (next: number | null) => {\n const visible = visibleRef.current;\n if (visible === null) return;\n const { announce: compose, formatter: f, state: s } = latest.current;\n const nextState: NumberFieldState = { ...s, value: next, text: f.format(next) };\n const message = compose === undefined ? nextState.text : compose(next, nextState);\n if (message !== null) speak(visible, message);\n },\n [latest],\n );\n\n const commit = useCallback(\n (source: NumberFieldSource, reason: ChangeReason, event: Event | undefined): boolean => {\n const start = gestureStart.current;\n gestureStart.current = null;\n // The commit's own pending state holds `live` from here (set in this same batch).\n setStepHeld(false);\n const next = liveRef.current;\n // Nothing changed since the gesture began (a hold that returned to its start).\n if (start === null || Object.is(next, start.value)) return false;\n lastReason.current = reason;\n setPendingSource(source);\n dispatch(next, createActionDetails(event, { reason, source }));\n if (reason === \"activate\" && source !== \"input\" && source !== null) announceValue(next);\n return true;\n },\n [announceValue, dispatch],\n );\n\n /** Opens a gesture at the shown value. */\n const openGesture = useCallback(() => {\n gestureStart.current = { value: shownRef.current };\n liveRef.current = shownRef.current;\n }, []);\n\n /** The value a key or a button steps from: the parsed draft if one is open, else the shown value. */\n const resolveBase = useCallback((): number | null => {\n const open = draftRef.current;\n if (open !== null) {\n const parsed = latest.current.formatter.parse(open);\n clearDraft();\n if (parsed !== undefined) return parsed;\n }\n return shownRef.current;\n }, [clearDraft, latest]);\n\n /** A one-step gesture: a key press, a wheel event, a click activation. */\n const oneStep = useCallback(\n (compute: (base: number | null) => number | null, source: NumberFieldSource, event: Event) => {\n const base = resolveBase();\n openGesture();\n step(compute(base), source, \"activate\", event);\n commit(source, \"activate\", event);\n },\n [commit, openGesture, resolveBase, step],\n );\n\n // --- Typing (design 4.1) ----------------------------------------------------------------------\n\n const typed = useCallback((next: string) => {\n draftRef.current = next;\n setDraft(next);\n }, []);\n\n const commitDraft = useCallback(\n (event: Event) => {\n const open = draftRef.current;\n if (open === null) return;\n const { formatter: f, disabled: off, readOnly: ro } = latest.current;\n if (off || ro) {\n clearDraft();\n return;\n }\n const parsed = f.parse(open);\n // Unparsable: revert to the committed value's text, no dispatch, no error.\n if (parsed === undefined || Object.is(parsed, shownRef.current)) {\n clearDraft();\n return;\n }\n openGesture();\n step(parsed, \"input\", \"activate\", event);\n commit(\"input\", \"activate\", event);\n },\n [clearDraft, commit, latest, openGesture, step],\n );\n\n // --- Keyboard and wheel (design 4.2, 4.4) ----------------------------------------------------\n\n const keyDown = useCallback(\n (event: KeyboardEvent) => {\n const { disabled: off, readOnly: ro, bounds: b, largeStep: large } = latest.current;\n // WebKit fires `compositionend` before the confirming keydown, which then has\n // `isComposing === false` and `keyCode === 229` (Combobox's guard).\n if (off || ro || event.isComposing || event.keyCode === 229) return;\n if (event.key === \"Enter\") {\n commitDraft(event);\n return;\n }\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n let compute: ((base: number | null) => number | null) | null = null;\n switch (event.key) {\n case \"ArrowUp\":\n compute = event.shiftKey ? (v) => stepBy(v, large, b) : (v) => stepValue(v, 1, b);\n break;\n case \"ArrowDown\":\n compute = event.shiftKey ? (v) => stepBy(v, -large, b) : (v) => stepValue(v, -1, b);\n break;\n case \"PageUp\":\n compute = (v) => stepBy(v, large, b);\n break;\n case \"PageDown\":\n compute = (v) => stepBy(v, -large, b);\n break;\n case \"Home\": {\n // Shift+Home / Shift+End are text selection.\n if (event.shiftKey) break;\n const target = boundValue(\"min\", b);\n if (target !== undefined) compute = () => target;\n break;\n }\n case \"End\": {\n if (event.shiftKey) break;\n const target = boundValue(\"max\", b);\n if (target !== undefined) compute = () => target;\n break;\n }\n default:\n break;\n }\n if (compute === null) return;\n event.preventDefault();\n oneStep(compute, \"keyboard\", event);\n },\n [commitDraft, latest, oneStep],\n );\n\n const wheel = useCallback(\n (event: WheelEvent) => {\n const { disabled: off, readOnly: ro, bounds: b } = latest.current;\n const visible = visibleRef.current;\n if (off || ro || visible === null || event.deltaY === 0) return;\n // Only while the input is focused; unfocused, the page scrolls.\n if (visible.ownerDocument.activeElement !== visible) return;\n event.preventDefault();\n const n = event.deltaY < 0 ? 1 : -1;\n oneStep((v) => stepValue(v, n, b), \"wheel\", event);\n },\n [latest, oneStep],\n );\n\n // --- Buttons (design 4.3) ---------------------------------------------------------------------\n\n const endHold = useCallback(\n (direction: StepDirection, event: Event | undefined) => {\n if (holdRef.current !== direction) return;\n holdRef.current = null;\n setHold(null);\n commit(direction, \"activate\", event);\n },\n [commit],\n );\n\n const tickHold = useCallback(\n (direction: StepDirection, event: Event | undefined): boolean => {\n if (holdRef.current !== direction) return false;\n const { bounds: b } = latest.current;\n const n = direction === \"increment\" ? 1 : -1;\n const next = stepValue(holdBase.current, n, b);\n holdBase.current = next;\n step(next, direction, \"activate\", event);\n // At the bound: end the hold now, before the button re-renders disabled (a disabled\n // element may not deliver the release).\n if (stepValue(next, n, b) === next) {\n endHold(direction, event);\n return false;\n }\n return true;\n },\n [endHold, latest, step],\n );\n\n const beginHold = useCallback(\n (direction: StepDirection, event: Event): boolean => {\n const { disabled: off, readOnly: ro } = latest.current;\n if (off || ro || holdRef.current !== null) return false;\n const base = resolveBase();\n openGesture();\n // A capture alone holds `live` on screen: start it from what is shown.\n setLive({ value: shownRef.current });\n holdBase.current = base;\n holdRef.current = direction;\n setHold(direction);\n return tickHold(direction, event);\n },\n [latest, openGesture, resolveBase, tickHold],\n );\n\n const activate = useCallback(\n (direction: StepDirection, event: Event) => {\n const { disabled: off, readOnly: ro, bounds: b } = latest.current;\n if (off || ro || holdRef.current !== null) return;\n const n = direction === \"increment\" ? 1 : -1;\n oneStep((v) => stepValue(v, n, b), direction, event);\n },\n [latest, oneStep],\n );\n\n // --- Labels ---------------------------------------------------------------------------------\n\n const [labelCount, setLabelCount] = useState(0);\n const registerLabel = useCallback(() => {\n setLabelCount((count) => count + 1);\n return () => setLabelCount((count) => count - 1);\n }, []);\n\n // --- Residual browser paths: mount reconciliation and form reset (design 4.5, 6.4) ----------\n\n const [mountValue] = useState(value);\n const resetTarget = (): number | null =>\n valueProp !== undefined ? (mountValue ?? null) : (defaultValue ?? null);\n const resetTargetText = hiddenText(resetTarget());\n\n const { onItemMounted } = useNativeGroupReconciliation<number | null>({\n element: hiddenRef as RefObject<FormAssociatedElement | null>,\n readCurrent: () => {\n const visible = visibleRef.current;\n const current = shownRef.current;\n if (visible === null) return current;\n const domText = visible.value;\n if (domText === formatter.format(current)) return current;\n if (visible.ownerDocument.activeElement === visible) {\n // Still typing (even a partial `12,` or `-`): adopted as the draft, never overwritten\n // under the caret. The blur commits it, or reverts it by the ordinary rule.\n draftRef.current = domText;\n setDraft(domText);\n return current;\n }\n const parsed = formatter.parse(domText);\n if (parsed === undefined || Object.is(parsed, current)) {\n // Another locale's formatting of the same value, or text that is no number: show the\n // client's text (react-dom kept the hydrated DOM value).\n visible.value = formatter.format(current);\n return current;\n }\n return parsed;\n },\n readDefault: () => {\n // A reset clears an open draft whatever the target.\n clearDraft();\n return resetTarget();\n },\n base: () => shownRef.current,\n onPlatformChange: (next, event) => {\n openGesture();\n step(next, null, \"platform\", event);\n commit(null, \"platform\", event);\n },\n onResetEvent: () => {\n // react-dom rewrites a controlled text input's `defaultValue` after every update; the\n // visible text's reset target is written right before the reset algorithm reads it.\n const visible = visibleRef.current;\n if (visible !== null) visible.defaultValue = formatter.format(resetTarget());\n },\n });\n\n // --- Development warnings -------------------------------------------------------------------\n\n useDevWarning(\n (valueProp !== undefined && valueProp !== null && !Number.isFinite(valueProp)) ||\n (defaultValueProp !== undefined &&\n defaultValueProp !== null &&\n !Number.isFinite(defaultValueProp)),\n \"NumberField.Root: `value` / `defaultValue` must be a finite number or `null`; \" +\n `got ${String(valueProp ?? defaultValueProp)}, treated as empty.`,\n );\n useDevWarning(\n bounds.min !== undefined && bounds.max !== undefined && bounds.min > bounds.max,\n `NumberField.Root: \\`min\\` (${String(min)}) is greater than \\`max\\` (${String(max)}).`,\n );\n useDevWarning(\n !stepValid || !largeStepValid,\n \"NumberField.Root: `step` and `largeStep` must be positive numbers; using the defaults.\",\n );\n useDevWarning(formatter.warning !== null, `NumberField.Root: ${formatter.warning ?? \"\"}`);\n const warnedLang = useRef(false);\n useEffect(() => {\n if (!isDev || warnedLang.current || locale !== undefined) return;\n const lang = document.documentElement.lang;\n if (lang === \"\" || languageOf(lang) === languageOf(formatter.locale)) return;\n warnedLang.current = true;\n console.error(\n `NumberField.Root: the page is \\`lang=\"${lang}\"\\` but NumberField formats as ` +\n `\\`${formatter.locale}\\` (the runtime's locale); pass \\`locale\\`.`,\n );\n }, [locale, formatter]);\n\n // An unmount mid-hold leaves nothing behind (the buttons detach their own listeners).\n useEffect(\n () => () => {\n holdRef.current = null;\n },\n [],\n );\n\n // --- Render ---------------------------------------------------------------------------------\n\n const context = useMemo<NumberFieldContextValue>(\n () => ({\n state,\n bounds,\n stepBase,\n pendingSource: pending ? pendingSource : null,\n inputId,\n labelId,\n name,\n form,\n allowsFractions: formatter.allowsFractions || !Number.isInteger(stepSize),\n stepOnWheel,\n resetTargetText,\n fieldInvalid,\n visibleRef,\n hiddenRef,\n typed,\n commitDraft,\n keyDown,\n wheel,\n beginHold,\n tickHold,\n endHold,\n activate,\n mirror,\n registerLabel,\n onInputMounted: onItemMounted,\n }),\n [\n state,\n bounds,\n stepBase,\n pending,\n pendingSource,\n inputId,\n labelId,\n name,\n form,\n formatter,\n stepSize,\n stepOnWheel,\n resetTargetText,\n fieldInvalid,\n typed,\n commitDraft,\n keyDown,\n wheel,\n beginHold,\n tickHold,\n endHold,\n activate,\n mirror,\n registerLabel,\n onItemMounted,\n ],\n );\n\n const labelledBy = mergeTokenLists(labelCount > 0 ? labelId : undefined, fieldContext?.ids.label);\n const libraryProps: Partial<ComponentPropsWithRef<\"div\">> & DataAttributes = {\n role: \"group\",\n ...(labelledBy !== \"\" ? { \"aria-labelledby\": labelledBy } : {}),\n ...(fieldContext !== null ? { \"data-invalid\": dataAttr(fieldInvalid === true) } : {}),\n \"data-pending\": dataAttr(pending),\n \"data-disabled\": dataAttr(disabled),\n };\n\n const element = useRender<ComponentPropsWithRef<\"div\">, NumberFieldState>({\n defaultElement: \"div\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps,\n });\n\n return <NumberFieldContext value={context}>{element}</NumberFieldContext>;\n}\n\nNumberFieldRoot.displayName = \"NumberFieldRoot\";\n"],"mappings":"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"}
|