@octanejs/base-ui 0.1.49 → 0.1.51
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/MIGRATION.md +47 -0
- package/README.md +62 -5
- package/UPSTREAM.md +164 -64
- package/package.json +458 -27
- package/src/accordion/header/AccordionHeader.tsrx +42 -0
- package/src/accordion/header/AccordionHeaderDataAttributes.ts +13 -0
- package/src/accordion/index.parts.ts +5 -0
- package/src/accordion/index.ts +16 -0
- package/src/accordion/item/AccordionItem.tsrx +195 -0
- package/src/accordion/item/AccordionItemContext.ts +26 -0
- package/src/accordion/item/AccordionItemDataAttributes.ts +13 -0
- package/src/accordion/item/stateAttributesMapping.ts +12 -0
- package/src/accordion/panel/AccordionPanel.tsrx +163 -0
- package/src/accordion/panel/AccordionPanelCssVars.ts +10 -0
- package/src/accordion/panel/AccordionPanelDataAttributes.ts +27 -0
- package/src/accordion/root/AccordionRoot.tsrx +240 -0
- package/src/accordion/root/AccordionRootContext.ts +31 -0
- package/src/accordion/root/AccordionRootDataAttributes.ts +8 -0
- package/src/accordion/trigger/AccordionTrigger.tsrx +81 -0
- package/src/accordion/trigger/AccordionTriggerDataAttributes.ts +8 -0
- package/src/alert-dialog/handle.ts +22 -0
- package/src/alert-dialog/index.parts.ts +10 -0
- package/src/alert-dialog/index.ts +39 -0
- package/src/alert-dialog/root/AlertDialogRoot.tsrx +58 -0
- package/src/alert-dialog/trigger/AlertDialogTrigger.tsrx +38 -0
- package/src/alert-dialog/trigger/AlertDialogTriggerDataAttributes.ts +10 -0
- package/src/autocomplete/clear/AutocompleteClearDataAttributes.ts +1 -0
- package/src/autocomplete/index.parts.ts +25 -0
- package/src/autocomplete/index.ts +78 -0
- package/src/autocomplete/input-group/AutocompleteInputGroup.tsrx +53 -0
- package/src/autocomplete/input-group/AutocompleteInputGroupDataAttributes.ts +49 -0
- package/src/autocomplete/item/AutocompleteItem.tsrx +56 -0
- package/src/autocomplete/item/AutocompleteItemDataAttributes.ts +10 -0
- package/src/autocomplete/root/AutocompleteRoot.tsrx +296 -0
- package/src/autocomplete/separator/AutocompleteSeparator.tsrx +37 -0
- package/src/autocomplete/trigger/AutocompleteTrigger.tsrx +57 -0
- package/src/autocomplete/trigger/AutocompleteTriggerDataAttributes.ts +55 -0
- package/src/autocomplete/value/AutocompleteValue.tsrx +38 -0
- package/src/avatar/fallback/AvatarFallback.tsrx +68 -0
- package/src/avatar/image/AvatarImage.tsrx +210 -0
- package/src/avatar/image/AvatarImageDataAttributes.ts +18 -0
- package/src/avatar/image/useImageLoadingStatus.ts +72 -0
- package/src/avatar/index.parts.ts +3 -0
- package/src/avatar/index.ts +5 -0
- package/src/avatar/root/AvatarRoot.tsrx +60 -0
- package/src/avatar/root/AvatarRootContext.ts +21 -0
- package/src/avatar/root/stateAttributesMapping.ts +3 -0
- package/src/button/Button.tsrx +63 -0
- package/src/button/ButtonDataAttributes.tsrx +4 -0
- package/src/button/index.ts +3 -0
- package/src/checkbox/index.parts.ts +2 -0
- package/src/checkbox/index.ts +4 -0
- package/src/checkbox/indicator/CheckboxIndicator.tsrx +96 -0
- package/src/checkbox/indicator/CheckboxIndicatorDataAttributes.ts +58 -0
- package/src/checkbox/root/CheckboxRoot.tsrx +516 -0
- package/src/checkbox/root/CheckboxRootContext.ts +19 -0
- package/src/checkbox/root/CheckboxRootDataAttributes.ts +48 -0
- package/src/checkbox/utils/getCheckboxStateAttributesMapping.ts +24 -0
- package/src/checkbox-group/CheckboxGroup.tsrx +229 -0
- package/src/checkbox-group/CheckboxGroupContext.ts +33 -0
- package/src/checkbox-group/CheckboxGroupDataAttributes.ts +4 -0
- package/src/checkbox-group/index.ts +2 -0
- package/src/checkbox-group/useCheckboxGroupParent.ts +176 -0
- package/src/collapsible/index.parts.ts +3 -0
- package/src/collapsible/index.ts +12 -0
- package/src/collapsible/panel/CollapsiblePanel.tsrx +168 -0
- package/src/collapsible/panel/CollapsiblePanelCssVars.ts +10 -0
- package/src/collapsible/panel/CollapsiblePanelDataAttributes.ts +18 -0
- package/src/collapsible/panel/useCollapsiblePanel.ts +577 -0
- package/src/collapsible/root/CollapsibleRoot.tsrx +116 -0
- package/src/collapsible/root/CollapsibleRootContext.ts +25 -0
- package/src/collapsible/root/CollapsibleRootDataAttributes.ts +18 -0
- package/src/collapsible/root/stateAttributesMapping.ts +9 -0
- package/src/collapsible/root/useCollapsibleRoot.ts +121 -0
- package/src/collapsible/trigger/CollapsibleTrigger.tsrx +78 -0
- package/src/collapsible/trigger/CollapsibleTriggerDataAttributes.ts +4 -0
- package/src/combobox/arrow/ComboboxArrow.tsrx +72 -0
- package/src/combobox/arrow/ComboboxArrowDataAttributes.ts +24 -0
- package/src/combobox/backdrop/ComboboxBackdrop.tsrx +75 -0
- package/src/combobox/backdrop/ComboboxBackdropDataAttributes.ts +18 -0
- package/src/combobox/chip/ComboboxChip.tsrx +150 -0
- package/src/combobox/chip/ComboboxChipContext.ts +19 -0
- package/src/combobox/chip-remove/ComboboxChipRemove.tsrx +138 -0
- package/src/combobox/chips/ComboboxChips.tsrx +78 -0
- package/src/combobox/chips/ComboboxChipsContext.ts +17 -0
- package/src/combobox/clear/ComboboxClear.tsrx +178 -0
- package/src/combobox/clear/ComboboxClearDataAttributes.ts +25 -0
- package/src/combobox/collection/ComboboxCollection.tsrx +34 -0
- package/src/combobox/collection/GroupCollectionContext.tsrx +31 -0
- package/src/combobox/empty/ComboboxEmpty.tsrx +58 -0
- package/src/combobox/group/ComboboxGroup.tsrx +74 -0
- package/src/combobox/group/ComboboxGroupContext.ts +27 -0
- package/src/combobox/group-label/ComboboxGroupLabel.tsrx +52 -0
- package/src/combobox/icon/ComboboxIcon.tsrx +41 -0
- package/src/combobox/index.parts.ts +31 -0
- package/src/combobox/index.ts +36 -0
- package/src/combobox/input/ComboboxInput.tsrx +507 -0
- package/src/combobox/input/ComboboxInputDataAttributes.ts +55 -0
- package/src/combobox/input-group/ComboboxInputGroup.tsrx +110 -0
- package/src/combobox/input-group/ComboboxInputGroupDataAttributes.ts +53 -0
- package/src/combobox/item/ComboboxItem.tsrx +328 -0
- package/src/combobox/item/ComboboxItemContext.ts +20 -0
- package/src/combobox/item/ComboboxItemDataAttributes.ts +12 -0
- package/src/combobox/item-indicator/ComboboxItemIndicator.tsrx +109 -0
- package/src/combobox/item-indicator/ComboboxItemIndicatorDataAttributes.ts +10 -0
- package/src/combobox/items/createItems.ts +168 -0
- package/src/combobox/items/itemCollection.ts +67 -0
- package/src/combobox/label/ComboboxLabel.tsrx +88 -0
- package/src/combobox/list/ComboboxList.tsrx +152 -0
- package/src/combobox/popup/ComboboxPopup.tsrx +214 -0
- package/src/combobox/popup/ComboboxPopupDataAttributes.ts +36 -0
- package/src/combobox/portal/ComboboxPortal.tsrx +56 -0
- package/src/combobox/portal/ComboboxPortalContext.tsrx +12 -0
- package/src/combobox/positioner/ComboboxPositioner.tsrx +172 -0
- package/src/combobox/positioner/ComboboxPositionerContext.tsrx +30 -0
- package/src/combobox/positioner/ComboboxPositionerCssVars.ts +25 -0
- package/src/combobox/positioner/ComboboxPositionerDataAttributes.ts +28 -0
- package/src/combobox/root/AriaCombobox.tsrx +1970 -0
- package/src/combobox/root/ComboboxRoot.tsrx +183 -0
- package/src/combobox/root/ComboboxRootContext.tsrx +66 -0
- package/src/combobox/root/utils/constants.ts +5 -0
- package/src/combobox/root/utils/index.ts +68 -0
- package/src/combobox/root/utils/useFilter.ts +50 -0
- package/src/combobox/root/utils/useFilteredItems.ts +11 -0
- package/src/combobox/row/ComboboxRow.tsrx +37 -0
- package/src/combobox/row/ComboboxRowContext.ts +9 -0
- package/src/combobox/separator/ComboboxSeparator.tsrx +37 -0
- package/src/combobox/status/ComboboxStatus.tsrx +49 -0
- package/src/combobox/store.ts +206 -0
- package/src/combobox/trigger/ComboboxTrigger.tsrx +302 -0
- package/src/combobox/trigger/ComboboxTriggerDataAttributes.ts +59 -0
- package/src/combobox/utils/ComboboxInternalDismissButton.tsrx +47 -0
- package/src/combobox/utils/handleInputPress.ts +38 -0
- package/src/combobox/utils/parts.ts +59 -0
- package/src/combobox/utils/stateAttributesMapping.ts +19 -0
- package/src/combobox/utils/useInitialLiveRegionTextMutation.ts +66 -0
- package/src/combobox/value/ComboboxValue.tsrx +65 -0
- package/src/context-menu/index.parts.ts +21 -0
- package/src/context-menu/index.ts +66 -0
- package/src/context-menu/positioner/ContextMenuPositioner.tsrx +119 -0
- package/src/context-menu/positioner/ContextMenuPositionerCssVars.ts +1 -0
- package/src/context-menu/positioner/ContextMenuPositionerDataAttributes.ts +1 -0
- package/src/context-menu/root/ContextMenuRoot.tsrx +98 -0
- package/src/context-menu/root/ContextMenuRootContext.ts +34 -0
- package/src/context-menu/trigger/ContextMenuTrigger.tsrx +237 -0
- package/src/context-menu/trigger/ContextMenuTriggerDataAttributes.ts +10 -0
- package/src/csp-provider/CSPProvider.tsrx +43 -0
- package/src/csp-provider/index.parts.ts +1 -0
- package/src/csp-provider/index.ts +3 -0
- package/src/dialog/backdrop/DialogBackdrop.tsrx +76 -0
- package/src/dialog/backdrop/DialogBackdropDataAttributes.ts +18 -0
- package/src/dialog/close/DialogClose.tsrx +67 -0
- package/src/dialog/close/DialogCloseDataAttributes.ts +4 -0
- package/src/dialog/description/DialogDescription.tsrx +41 -0
- package/src/dialog/index.parts.ts +10 -0
- package/src/dialog/index.ts +14 -0
- package/src/dialog/popup/DialogPopup.tsrx +170 -0
- package/src/dialog/popup/DialogPopupCssVars.ts +5 -0
- package/src/dialog/popup/DialogPopupDataAttributes.ts +26 -0
- package/src/dialog/portal/DialogPortal.tsrx +63 -0
- package/src/dialog/portal/DialogPortalContext.ts +13 -0
- package/src/dialog/root/DialogRoot.tsrx +117 -0
- package/src/dialog/root/DialogRootContext.ts +20 -0
- package/src/dialog/root/useDialogRoot.ts +128 -0
- package/src/dialog/root/useRenderDialogRoot.tsrx +108 -0
- package/src/dialog/store/DialogHandle.ts +83 -0
- package/src/dialog/store/DialogStore.ts +149 -0
- package/src/dialog/title/DialogTitle.tsrx +41 -0
- package/src/dialog/trigger/DialogTrigger.tsrx +142 -0
- package/src/dialog/trigger/DialogTriggerDataAttributes.ts +10 -0
- package/src/dialog/utils/stateAttributesMapping.ts +22 -0
- package/src/dialog/viewport/DialogViewport.tsrx +89 -0
- package/src/dialog/viewport/DialogViewportDataAttributes.ts +26 -0
- package/src/direction-provider/DirectionProvider.tsrx +37 -0
- package/src/direction-provider/index.parts.ts +5 -0
- package/src/direction-provider/index.ts +2 -0
- package/src/drawer/backdrop/DrawerBackdrop.tsrx +81 -0
- package/src/drawer/backdrop/DrawerBackdropCssVars.ts +5 -0
- package/src/drawer/backdrop/DrawerBackdropDataAttributes.ts +18 -0
- package/src/drawer/close/DrawerClose.tsrx +31 -0
- package/src/drawer/content/DrawerContent.tsrx +37 -0
- package/src/drawer/content/drawerContentAttribute.ts +1 -0
- package/src/drawer/description/DrawerDescription.tsrx +25 -0
- package/src/drawer/handle.ts +22 -0
- package/src/drawer/indent/DrawerIndent.tsrx +104 -0
- package/src/drawer/indent-background/DrawerIndentBackground.tsrx +61 -0
- package/src/drawer/index.parts.ts +16 -0
- package/src/drawer/index.ts +17 -0
- package/src/drawer/popup/DrawerPopup.tsrx +485 -0
- package/src/drawer/popup/DrawerPopupCssVars.ts +35 -0
- package/src/drawer/popup/DrawerPopupDataAttributes.ts +43 -0
- package/src/drawer/portal/DrawerPortal.tsrx +39 -0
- package/src/drawer/provider/DrawerProvider.tsrx +117 -0
- package/src/drawer/provider/DrawerProviderContext.ts +29 -0
- package/src/drawer/root/DrawerRoot.tsrx +478 -0
- package/src/drawer/root/DrawerRootContext.ts +115 -0
- package/src/drawer/root/useDrawerSnapPoints.ts +198 -0
- package/src/drawer/swipe-area/DrawerSwipeArea.tsrx +528 -0
- package/src/drawer/swipe-area/DrawerSwipeAreaDataAttributes.ts +23 -0
- package/src/drawer/title/DrawerTitle.tsrx +25 -0
- package/src/drawer/trigger/DrawerTrigger.tsrx +53 -0
- package/src/drawer/viewport/DrawerViewport.tsrx +1237 -0
- package/src/drawer/viewport/DrawerViewportContext.tsrx +15 -0
- package/src/drawer/viewport/DrawerViewportCssVars.ts +6 -0
- package/src/drawer/viewport/DrawerViewportDataAttributes.ts +22 -0
- package/src/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardContext.tsrx +19 -0
- package/src/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardProvider.tsrx +858 -0
- package/src/field/control/FieldControl.tsrx +241 -0
- package/src/field/control/FieldControlDataAttributes.ts +28 -0
- package/src/field/description/FieldDescription.tsrx +67 -0
- package/src/field/description/FieldDescriptionDataAttributes.ts +28 -0
- package/src/field/error/FieldError.tsrx +160 -0
- package/src/field/error/FieldErrorDataAttributes.ts +38 -0
- package/src/field/index.parts.ts +9 -0
- package/src/field/index.ts +9 -0
- package/src/field/item/FieldItem.tsrx +66 -0
- package/src/field/item/FieldItemContext.ts +15 -0
- package/src/field/item/FieldItemDataAttributes.ts +28 -0
- package/src/field/label/FieldLabel.tsrx +107 -0
- package/src/field/label/FieldLabelDataAttributes.ts +28 -0
- package/src/field/root/FieldRoot.tsrx +336 -0
- package/src/field/root/FieldRootDataAttributes.ts +28 -0
- package/src/field/root/useFieldValidation.ts +418 -0
- package/src/field/utils/getCombinedFieldValidityData.ts +18 -0
- package/src/field/validity/FieldValidity.tsrx +69 -0
- package/src/fieldset/index.parts.ts +2 -0
- package/src/fieldset/index.ts +4 -0
- package/src/fieldset/legend/FieldsetLegend.tsrx +51 -0
- package/src/fieldset/root/FieldsetRoot.tsrx +74 -0
- package/src/fieldset/root/FieldsetRootContext.ts +23 -0
- package/src/floating-ui-react/components/FloatingDelayGroup.tsrx +281 -0
- package/src/floating-ui-react/components/FloatingFocusManager.tsrx +1004 -0
- package/src/floating-ui-react/components/FloatingPortal.tsrx +319 -0
- package/src/floating-ui-react/components/FloatingRootStore.ts +136 -0
- package/src/floating-ui-react/components/FloatingTree.tsrx +95 -0
- package/src/floating-ui-react/components/FloatingTreeStore.ts +24 -0
- package/src/floating-ui-react/hooks/gridNavigation.ts +50 -0
- package/src/floating-ui-react/hooks/useClick.ts +229 -0
- package/src/floating-ui-react/hooks/useClientPoint.ts +261 -0
- package/src/floating-ui-react/hooks/useDismiss.ts +808 -0
- package/src/floating-ui-react/hooks/useFloating.ts +205 -0
- package/src/floating-ui-react/hooks/useFloatingRootContext.ts +84 -0
- package/src/floating-ui-react/hooks/useFocus.ts +253 -0
- package/src/floating-ui-react/hooks/useHover.ts +468 -0
- package/src/floating-ui-react/hooks/useHoverFloatingInteraction.ts +274 -0
- package/src/floating-ui-react/hooks/useHoverInteractionSharedState.ts +132 -0
- package/src/floating-ui-react/hooks/useHoverReferenceInteraction.ts +523 -0
- package/src/floating-ui-react/hooks/useHoverShared.ts +72 -0
- package/src/floating-ui-react/hooks/useListNavigation.ts +941 -0
- package/src/floating-ui-react/hooks/useSyncedFloatingRootContext.ts +115 -0
- package/src/floating-ui-react/hooks/useTypeahead.ts +248 -0
- package/src/floating-ui-react/index.ts +48 -0
- package/src/floating-ui-react/middleware/arrow.ts +128 -0
- package/src/floating-ui-react/middleware/positioning.ts +28 -0
- package/src/floating-ui-react/safePolygon.ts +451 -0
- package/src/floating-ui-react/types.ts +206 -0
- package/src/floating-ui-react/utils/composite.ts +528 -0
- package/src/floating-ui-react/utils/constants.ts +10 -0
- package/src/floating-ui-react/utils/createAttribute.ts +3 -0
- package/src/floating-ui-react/utils/createEventEmitter.ts +19 -0
- package/src/floating-ui-react/utils/element.ts +96 -0
- package/src/floating-ui-react/utils/enqueueFocus.ts +37 -0
- package/src/floating-ui-react/utils/event.ts +60 -0
- package/src/floating-ui-react/utils/getEmptyRootContext.ts +17 -0
- package/src/floating-ui-react/utils/markOthers.ts +219 -0
- package/src/floating-ui-react/utils/nodes.ts +54 -0
- package/src/floating-ui-react/utils/tabbable.ts +283 -0
- package/src/floating-ui-react/utils.ts +5 -0
- package/src/form/Form.tsrx +248 -0
- package/src/form/index.ts +3 -0
- package/src/global.d.ts +9 -0
- package/src/index.ts +45 -39
- package/src/input/Input.tsrx +44 -0
- package/src/input/InputDataAttributes.ts +28 -0
- package/src/input/index.ts +3 -0
- package/src/internals/PrehydrationScript.tsrx +59 -0
- package/src/internals/RequestQueue.ts +126 -0
- package/src/internals/TimeoutManager.ts +29 -0
- package/src/internals/TransitionStatusDataAttributes.ts +9 -0
- package/src/internals/composite/composite.ts +174 -0
- package/src/internals/composite/constants.ts +1 -0
- package/src/internals/composite/index.ts +19 -0
- package/src/internals/composite/item/CompositeItem.tsrx +57 -0
- package/src/internals/composite/item/useCompositeItem.ts +50 -0
- package/src/internals/composite/list/CompositeList.tsrx +325 -0
- package/src/internals/composite/list/CompositeListContext.ts +28 -0
- package/src/internals/composite/list/useCompositeListItem.ts +100 -0
- package/src/internals/composite/root/CompositeRoot.tsrx +138 -0
- package/src/internals/composite/root/CompositeRootContext.ts +33 -0
- package/src/internals/composite/root/gridNavigation.ts +127 -0
- package/src/internals/composite/root/useCompositeRoot.ts +378 -0
- package/src/internals/constants.ts +41 -0
- package/src/internals/createBaseUIEventDetails.ts +166 -0
- package/src/internals/csp-context/CSPContext.tsrx +17 -0
- package/src/internals/csp-context/index.ts +2 -0
- package/src/internals/direction-context/DirectionContext.tsrx +16 -0
- package/src/internals/direction-context/index.ts +5 -0
- package/src/internals/field-constants/constants.ts +44 -0
- package/src/internals/field-constants/index.ts +6 -0
- package/src/internals/field-register-control/index.ts +6 -0
- package/src/internals/field-register-control/useFieldControlRegistration.ts +185 -0
- package/src/internals/field-register-control/useRegisterFieldControl.ts +47 -0
- package/src/internals/field-root-context/FieldRootContext.ts +79 -0
- package/src/internals/field-root-context/index.ts +2 -0
- package/src/internals/filter.ts +82 -0
- package/src/internals/form-context/FormContext.ts +51 -0
- package/src/internals/form-context/index.ts +2 -0
- package/src/internals/getDisabledMountTransitionStyles.ts +10 -0
- package/src/internals/getStateAttributesProps.ts +32 -0
- package/src/internals/itemEquality.ts +134 -0
- package/src/internals/labelable-provider/LabelableContext.ts +49 -0
- package/src/internals/labelable-provider/LabelableProvider.tsrx +120 -0
- package/src/internals/labelable-provider/index.ts +6 -0
- package/src/internals/labelable-provider/useAriaLabelledBy.ts +73 -0
- package/src/internals/labelable-provider/useLabel.ts +113 -0
- package/src/internals/labelable-provider/useLabelableId.ts +101 -0
- package/src/internals/noop.ts +1 -0
- package/src/internals/prehydrationScript.stub.ts +6 -0
- package/src/internals/reason-parts.ts +42 -0
- package/src/internals/reasons.ts +5 -0
- package/src/internals/resolveValueLabel.tsrx +158 -0
- package/src/internals/serializeValue.ts +13 -0
- package/src/internals/stateAttributesMapping.ts +20 -0
- package/src/internals/temporal/index.ts +2 -0
- package/src/internals/temporal/temporal-adapter.ts +382 -0
- package/src/internals/temporal/temporal.ts +49 -0
- package/src/internals/temporal-adapter-date-fns/TemporalAdapterDateFns.ts +474 -0
- package/src/internals/temporal-adapter-date-fns/index.ts +1 -0
- package/src/internals/temporal-adapter-luxon/TemporalAdapterLuxon.ts +380 -0
- package/src/internals/temporal-adapter-luxon/index.ts +1 -0
- package/src/internals/types.ts +97 -0
- package/src/internals/use-button/index.ts +1 -0
- package/src/internals/use-button/useButton.ts +309 -0
- package/src/internals/useAnchorPositioning.ts +828 -0
- package/src/internals/useAnimationsFinished.ts +161 -0
- package/src/internals/useBaseUiId.ts +12 -0
- package/src/internals/useOpenChangeComplete.tsrx +56 -0
- package/src/internals/usePressAndHold.ts +287 -0
- package/src/internals/useRenderElement.tsrx +284 -0
- package/src/internals/useTransitionStatus.ts +98 -0
- package/src/internals/useValueChanged.ts +18 -0
- package/src/menu/arrow/MenuArrow.tsrx +71 -0
- package/src/menu/arrow/MenuArrowDataAttributes.ts +24 -0
- package/src/menu/backdrop/MenuBackdrop.tsrx +75 -0
- package/src/menu/backdrop/MenuBackdropDataAttributes.ts +18 -0
- package/src/menu/checkbox-item/MenuCheckboxItem.tsrx +184 -0
- package/src/menu/checkbox-item/MenuCheckboxItemContext.ts +24 -0
- package/src/menu/checkbox-item/MenuCheckboxItemDataAttributes.ts +16 -0
- package/src/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.tsrx +96 -0
- package/src/menu/checkbox-item-indicator/MenuCheckboxItemIndicatorDataAttributes.ts +22 -0
- package/src/menu/group/MenuGroup.tsrx +47 -0
- package/src/menu/group/MenuGroupContext.ts +18 -0
- package/src/menu/group-label/MenuGroupLabel.tsrx +51 -0
- package/src/menu/index.parts.ts +21 -0
- package/src/menu/index.ts +24 -0
- package/src/menu/item/MenuItem.tsrx +107 -0
- package/src/menu/item/MenuItemDataAttributes.ts +8 -0
- package/src/menu/item/useMenuItem.ts +142 -0
- package/src/menu/item/useMenuItemCommonProps.ts +139 -0
- package/src/menu/link-item/MenuLinkItem.tsrx +106 -0
- package/src/menu/link-item/MenuLinkItemDataAttributes.ts +4 -0
- package/src/menu/popup/MenuPopup.tsrx +199 -0
- package/src/menu/popup/MenuPopupDataAttributes.ts +33 -0
- package/src/menu/portal/MenuPortal.tsrx +60 -0
- package/src/menu/portal/MenuPortalContext.ts +13 -0
- package/src/menu/positioner/MenuPositioner.tsrx +378 -0
- package/src/menu/positioner/MenuPositionerContext.ts +25 -0
- package/src/menu/positioner/MenuPositionerCssVars.ts +37 -0
- package/src/menu/positioner/MenuPositionerDataAttributes.ts +24 -0
- package/src/menu/radio-group/MenuRadioGroup.tsrx +129 -0
- package/src/menu/radio-group/MenuRadioGroupContext.ts +25 -0
- package/src/menu/radio-item/MenuRadioItem.tsrx +156 -0
- package/src/menu/radio-item/MenuRadioItemContext.ts +24 -0
- package/src/menu/radio-item/MenuRadioItemDataAttributes.ts +16 -0
- package/src/menu/radio-item-indicator/MenuRadioItemIndicator.tsrx +96 -0
- package/src/menu/radio-item-indicator/MenuRadioItemIndicatorDataAttributes.ts +22 -0
- package/src/menu/root/MenuRoot.tsrx +818 -0
- package/src/menu/root/MenuRootContext.ts +25 -0
- package/src/menu/store/MenuHandle.ts +54 -0
- package/src/menu/store/MenuStore.ts +234 -0
- package/src/menu/submenu-root/MenuSubmenuRoot.tsrx +64 -0
- package/src/menu/submenu-root/MenuSubmenuRootContext.ts +16 -0
- package/src/menu/submenu-trigger/MenuSubmenuTrigger.tsrx +278 -0
- package/src/menu/submenu-trigger/MenuSubmenuTriggerDataAttributes.ts +14 -0
- package/src/menu/trigger/MenuTrigger.tsrx +395 -0
- package/src/menu/trigger/MenuTriggerDataAttributes.ts +14 -0
- package/src/menu/utils/findRootOwnerId.ts +13 -0
- package/src/menu/utils/stateAttributesMapping.ts +17 -0
- package/src/menu/utils/types.ts +8 -0
- package/src/menu/viewport/MenuViewport.tsrx +75 -0
- package/src/menu/viewport/MenuViewportCssVars.ts +12 -0
- package/src/menu/viewport/MenuViewportDataAttributes.ts +24 -0
- package/src/menubar/Menubar.tsrx +173 -0
- package/src/menubar/MenubarContext.ts +31 -0
- package/src/menubar/MenubarDataAttributes.ts +13 -0
- package/src/menubar/index.ts +3 -0
- package/src/merge-props/index.ts +1 -0
- package/src/merge-props/mergeProps.ts +302 -0
- package/src/meter/index.parts.ts +5 -0
- package/src/meter/index.ts +7 -0
- package/src/meter/indicator/MeterIndicator.tsrx +46 -0
- package/src/meter/label/MeterLabel.tsrx +46 -0
- package/src/meter/root/MeterRoot.tsrx +129 -0
- package/src/meter/root/MeterRootContext.ts +26 -0
- package/src/meter/track/MeterTrack.tsrx +34 -0
- package/src/meter/value/MeterValue.tsrx +51 -0
- package/src/navigation-menu/arrow/NavigationMenuArrow.tsrx +77 -0
- package/src/navigation-menu/arrow/NavigationMenuArrowDataAttributes.ts +24 -0
- package/src/navigation-menu/backdrop/NavigationMenuBackdrop.tsrx +69 -0
- package/src/navigation-menu/backdrop/NavigationMenuBackdropDataAttributes.ts +18 -0
- package/src/navigation-menu/content/NavigationMenuContent.tsrx +208 -0
- package/src/navigation-menu/content/NavigationMenuContentDataAttributes.ts +23 -0
- package/src/navigation-menu/icon/NavigationMenuIcon.tsrx +56 -0
- package/src/navigation-menu/icon/NavigationMenuIconDataAttributes.ts +6 -0
- package/src/navigation-menu/index.parts.ts +13 -0
- package/src/navigation-menu/index.ts +15 -0
- package/src/navigation-menu/item/NavigationMenuItem.tsrx +59 -0
- package/src/navigation-menu/item/NavigationMenuItemContext.ts +21 -0
- package/src/navigation-menu/link/NavigationMenuLink.tsrx +108 -0
- package/src/navigation-menu/link/NavigationMenuLinkDataAttributes.ts +4 -0
- package/src/navigation-menu/list/NavigationMenuDismissContext.ts +12 -0
- package/src/navigation-menu/list/NavigationMenuList.tsrx +144 -0
- package/src/navigation-menu/popup/NavigationMenuPopup.tsrx +106 -0
- package/src/navigation-menu/popup/NavigationMenuPopupCssVars.ts +10 -0
- package/src/navigation-menu/popup/NavigationMenuPopupDataAttributes.ts +32 -0
- package/src/navigation-menu/portal/NavigationMenuPortal.tsrx +58 -0
- package/src/navigation-menu/portal/NavigationMenuPortalContext.ts +13 -0
- package/src/navigation-menu/positioner/NavigationMenuPositioner.tsrx +219 -0
- package/src/navigation-menu/positioner/NavigationMenuPositionerContext.ts +26 -0
- package/src/navigation-menu/positioner/NavigationMenuPositionerCssVars.ts +35 -0
- package/src/navigation-menu/positioner/NavigationMenuPositionerDataAttributes.ts +28 -0
- package/src/navigation-menu/root/NavigationMenuRoot.tsrx +439 -0
- package/src/navigation-menu/root/NavigationMenuRootContext.ts +84 -0
- package/src/navigation-menu/trigger/NavigationMenuTrigger.tsrx +846 -0
- package/src/navigation-menu/trigger/NavigationMenuTriggerDataAttributes.ts +14 -0
- package/src/navigation-menu/utils/constants.ts +3 -0
- package/src/navigation-menu/utils/isOutsideMenuEvent.ts +36 -0
- package/src/navigation-menu/utils/setSharedFixedSize.ts +20 -0
- package/src/navigation-menu/utils/useNavigationMenuAnchorPositioning.ts +18 -0
- package/src/navigation-menu/viewport/NavigationMenuViewport.tsrx +146 -0
- package/src/number-field/decrement/NumberFieldDecrement.tsrx +30 -0
- package/src/number-field/decrement/NumberFieldDecrementDataAttributes.ts +40 -0
- package/src/number-field/group/NumberFieldGroup.tsrx +42 -0
- package/src/number-field/group/NumberFieldGroupDataAttributes.ts +40 -0
- package/src/number-field/increment/NumberFieldIncrement.tsrx +30 -0
- package/src/number-field/increment/NumberFieldIncrementDataAttributes.ts +40 -0
- package/src/number-field/index.parts.ts +7 -0
- package/src/number-field/index.ts +9 -0
- package/src/number-field/input/NumberFieldInput.tsrx +488 -0
- package/src/number-field/input/NumberFieldInputDataAttributes.ts +40 -0
- package/src/number-field/root/NumberFieldRoot.tsrx +735 -0
- package/src/number-field/root/NumberFieldRootContext.ts +52 -0
- package/src/number-field/root/NumberFieldRootDataAttributes.ts +40 -0
- package/src/number-field/root/useNumberFieldStepperButton.ts +191 -0
- package/src/number-field/scrub-area/NumberFieldScrubArea.tsrx +395 -0
- package/src/number-field/scrub-area/NumberFieldScrubAreaContext.ts +24 -0
- package/src/number-field/scrub-area/NumberFieldScrubAreaDataAttributes.ts +40 -0
- package/src/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.tsrx +73 -0
- package/src/number-field/scrub-area-cursor/NumberFieldScrubAreaCursorDataAttributes.ts +40 -0
- package/src/number-field/utils/constants.ts +2 -0
- package/src/number-field/utils/getViewportRect.ts +34 -0
- package/src/number-field/utils/parse.ts +221 -0
- package/src/number-field/utils/stateAttributesMapping.ts +9 -0
- package/src/number-field/utils/types.ts +27 -0
- package/src/number-field/utils/validate.ts +136 -0
- package/src/otp-field/index.parts.ts +3 -0
- package/src/otp-field/index.ts +4 -0
- package/src/otp-field/input/OTPFieldInput.tsrx +356 -0
- package/src/otp-field/input/OTPFieldInputDataAttributes.ts +40 -0
- package/src/otp-field/root/OTPFieldRoot.tsrx +679 -0
- package/src/otp-field/root/OTPFieldRootContext.ts +58 -0
- package/src/otp-field/root/OTPFieldRootDataAttributes.ts +40 -0
- package/src/otp-field/utils/otp.ts +118 -0
- package/src/otp-field/utils/stateAttributesMapping.ts +16 -0
- package/src/popover/arrow/PopoverArrow.tsrx +69 -0
- package/src/popover/arrow/PopoverArrowDataAttributes.ts +24 -0
- package/src/popover/backdrop/PopoverBackdrop.tsrx +71 -0
- package/src/popover/backdrop/PopoverBackdropDataAttributes.ts +18 -0
- package/src/popover/close/PopoverClose.tsrx +65 -0
- package/src/popover/description/PopoverDescription.tsrx +46 -0
- package/src/popover/index.parts.ts +15 -0
- package/src/popover/index.ts +16 -0
- package/src/popover/popup/PopoverPopup.tsrx +188 -0
- package/src/popover/popup/PopoverPopupCssVars.ts +8 -0
- package/src/popover/popup/PopoverPopupDataAttributes.ts +33 -0
- package/src/popover/portal/PopoverPortal.tsrx +54 -0
- package/src/popover/portal/PopoverPortalContext.ts +13 -0
- package/src/popover/positioner/PopoverPositioner.tsrx +196 -0
- package/src/popover/positioner/PopoverPositionerContext.ts +28 -0
- package/src/popover/positioner/PopoverPositionerCssVars.ts +37 -0
- package/src/popover/positioner/PopoverPositionerDataAttributes.ts +24 -0
- package/src/popover/root/PopoverRoot.tsrx +262 -0
- package/src/popover/root/PopoverRootContext.ts +20 -0
- package/src/popover/store/PopoverHandle.ts +54 -0
- package/src/popover/store/PopoverStore.ts +229 -0
- package/src/popover/title/PopoverTitle.tsrx +46 -0
- package/src/popover/trigger/PopoverTrigger.tsrx +233 -0
- package/src/popover/trigger/PopoverTriggerDataAttributes.ts +14 -0
- package/src/popover/utils/constants.ts +1 -0
- package/src/popover/viewport/PopoverViewport.tsrx +75 -0
- package/src/popover/viewport/PopoverViewportCssVars.ts +12 -0
- package/src/popover/viewport/PopoverViewportDataAttributes.ts +24 -0
- package/src/preview-card/arrow/PreviewCardArrow.tsrx +70 -0
- package/src/preview-card/arrow/PreviewCardArrowDataAttributes.ts +24 -0
- package/src/preview-card/backdrop/PreviewCardBackdrop.tsrx +73 -0
- package/src/preview-card/backdrop/PreviewCardBackdropDataAttributes.ts +18 -0
- package/src/preview-card/index.parts.ts +12 -0
- package/src/preview-card/index.ts +16 -0
- package/src/preview-card/popup/PreviewCardPopup.tsrx +104 -0
- package/src/preview-card/popup/PreviewCardPopupDataAttributes.ts +28 -0
- package/src/preview-card/portal/PreviewCardPortal.tsrx +59 -0
- package/src/preview-card/portal/PreviewCardPortalContext.ts +13 -0
- package/src/preview-card/positioner/PreviewCardPositioner.tsrx +145 -0
- package/src/preview-card/positioner/PreviewCardPositionerContext.ts +24 -0
- package/src/preview-card/positioner/PreviewCardPositionerCssVars.ts +37 -0
- package/src/preview-card/positioner/PreviewCardPositionerDataAttributes.ts +24 -0
- package/src/preview-card/root/PreviewCardContext.ts +23 -0
- package/src/preview-card/root/PreviewCardRoot.tsrx +210 -0
- package/src/preview-card/store/PreviewCardHandle.ts +58 -0
- package/src/preview-card/store/PreviewCardStore.ts +140 -0
- package/src/preview-card/trigger/PreviewCardTrigger.tsrx +148 -0
- package/src/preview-card/trigger/PreviewCardTriggerDataAttributes.ts +6 -0
- package/src/preview-card/utils/constants.ts +2 -0
- package/src/preview-card/viewport/PreviewCardViewport.tsrx +78 -0
- package/src/preview-card/viewport/PreviewCardViewportCssVars.ts +12 -0
- package/src/preview-card/viewport/PreviewCardViewportDataAttributes.ts +24 -0
- package/src/progress/index.parts.ts +7 -0
- package/src/progress/index.ts +7 -0
- package/src/progress/indicator/ProgressIndicator.tsrx +59 -0
- package/src/progress/indicator/ProgressIndicatorDataAttributes.ts +12 -0
- package/src/progress/label/ProgressLabel.tsrx +51 -0
- package/src/progress/label/ProgressLabelDataAttributes.ts +12 -0
- package/src/progress/root/ProgressRoot.tsrx +154 -0
- package/src/progress/root/ProgressRootContext.tsrx +37 -0
- package/src/progress/root/ProgressRootDataAttributes.ts +12 -0
- package/src/progress/root/stateAttributesMapping.ts +18 -0
- package/src/progress/track/ProgressTrack.tsrx +42 -0
- package/src/progress/track/ProgressTrackDataAttributes.ts +12 -0
- package/src/progress/value/ProgressValue.tsrx +62 -0
- package/src/progress/value/ProgressValueDataAttributes.ts +12 -0
- package/src/radio/index.parts.ts +2 -0
- package/src/radio/index.ts +4 -0
- package/src/radio/indicator/RadioIndicator.tsrx +84 -0
- package/src/radio/indicator/RadioIndicatorDataAttributes.ts +54 -0
- package/src/radio/root/RadioRoot.tsrx +337 -0
- package/src/radio/root/RadioRootContext.ts +19 -0
- package/src/radio/root/RadioRootDataAttributes.ts +44 -0
- package/src/radio/utils/stateAttributesMapping.ts +20 -0
- package/src/radio-group/RadioGroup.tsrx +337 -0
- package/src/radio-group/RadioGroupContext.ts +29 -0
- package/src/radio-group/RadioGroupDataAttributes.ts +4 -0
- package/src/radio-group/index.ts +3 -0
- package/src/scroll-area/constants.ts +2 -0
- package/src/scroll-area/content/ScrollAreaContent.tsrx +90 -0
- package/src/scroll-area/content/ScrollAreaContentDataAttributes.ts +28 -0
- package/src/scroll-area/corner/ScrollAreaCorner.tsrx +54 -0
- package/src/scroll-area/index.parts.ts +6 -0
- package/src/scroll-area/index.ts +8 -0
- package/src/scroll-area/root/ScrollAreaRoot.tsrx +424 -0
- package/src/scroll-area/root/ScrollAreaRootContext.ts +61 -0
- package/src/scroll-area/root/ScrollAreaRootCssVars.ts +10 -0
- package/src/scroll-area/root/ScrollAreaRootDataAttributes.ts +28 -0
- package/src/scroll-area/root/stateAttributes.ts +15 -0
- package/src/scroll-area/scrollbar/ScrollAreaScrollbar.tsrx +275 -0
- package/src/scroll-area/scrollbar/ScrollAreaScrollbarContext.ts +19 -0
- package/src/scroll-area/scrollbar/ScrollAreaScrollbarCssVars.ts +10 -0
- package/src/scroll-area/scrollbar/ScrollAreaScrollbarDataAttributes.ts +37 -0
- package/src/scroll-area/thumb/ScrollAreaThumb.tsrx +80 -0
- package/src/scroll-area/thumb/ScrollAreaThumbDataAttributes.ts +9 -0
- package/src/scroll-area/utils/getOffset.ts +21 -0
- package/src/scroll-area/viewport/ScrollAreaViewport.tsrx +492 -0
- package/src/scroll-area/viewport/ScrollAreaViewportContext.ts +21 -0
- package/src/scroll-area/viewport/ScrollAreaViewportCssVars.ts +20 -0
- package/src/scroll-area/viewport/ScrollAreaViewportDataAttributes.ts +28 -0
- package/src/select/arrow/SelectArrow.tsrx +75 -0
- package/src/select/arrow/SelectArrowDataAttributes.ts +24 -0
- package/src/select/backdrop/SelectBackdrop.tsrx +77 -0
- package/src/select/backdrop/SelectBackdropDataAttributes.ts +18 -0
- package/src/select/group/SelectGroup.tsrx +52 -0
- package/src/select/group/SelectGroupContext.ts +20 -0
- package/src/select/group-label/SelectGroupLabel.tsrx +49 -0
- package/src/select/icon/SelectIcon.tsrx +51 -0
- package/src/select/icon/SelectIconDataAttributes.ts +6 -0
- package/src/select/index.parts.ts +19 -0
- package/src/select/index.ts +21 -0
- package/src/select/item/SelectItem.tsrx +291 -0
- package/src/select/item/SelectItemContext.ts +22 -0
- package/src/select/item/SelectItemDataAttributes.ts +12 -0
- package/src/select/item-indicator/SelectItemIndicator.tsrx +108 -0
- package/src/select/item-indicator/SelectItemIndicatorDataAttributes.ts +10 -0
- package/src/select/item-text/SelectItemText.tsrx +56 -0
- package/src/select/label/SelectLabel.tsrx +64 -0
- package/src/select/list/SelectList.tsrx +62 -0
- package/src/select/popup/SelectPopup.tsrx +596 -0
- package/src/select/popup/SelectPopupDataAttributes.ts +28 -0
- package/src/select/popup/utils.ts +13 -0
- package/src/select/portal/SelectPortal.tsrx +45 -0
- package/src/select/positioner/SelectPositioner.tsrx +268 -0
- package/src/select/positioner/SelectPositionerContext.ts +26 -0
- package/src/select/positioner/SelectPositionerCssVars.ts +25 -0
- package/src/select/positioner/SelectPositionerDataAttributes.ts +24 -0
- package/src/select/root/SelectRoot.tsrx +752 -0
- package/src/select/root/SelectRootContext.ts +57 -0
- package/src/select/scroll-arrow/SelectScrollArrow.tsrx +236 -0
- package/src/select/scroll-down-arrow/SelectScrollDownArrow.tsrx +37 -0
- package/src/select/scroll-down-arrow/SelectScrollDownArrowDataAttributes.ts +24 -0
- package/src/select/scroll-up-arrow/SelectScrollUpArrow.tsrx +37 -0
- package/src/select/scroll-up-arrow/SelectScrollUpArrowDataAttributes.ts +24 -0
- package/src/select/separator/SelectSeparator.tsrx +34 -0
- package/src/select/store.ts +155 -0
- package/src/select/trigger/SelectTrigger.tsrx +270 -0
- package/src/select/trigger/SelectTriggerDataAttributes.ts +55 -0
- package/src/select/value/SelectValue.tsrx +112 -0
- package/src/select/value/SelectValueDataAttributes.ts +4 -0
- package/src/separator/Separator.tsrx +49 -0
- package/src/separator/SeparatorDataAttributes.ts +5 -0
- package/src/separator/index.ts +3 -0
- package/src/slider/control/SliderControl.tsrx +540 -0
- package/src/slider/control/SliderControlDataAttributes.ts +33 -0
- package/src/slider/index.parts.ts +7 -0
- package/src/slider/index.ts +9 -0
- package/src/slider/indicator/SliderIndicator.tsrx +102 -0
- package/src/slider/indicator/SliderIndicatorDataAttributes.ts +33 -0
- package/src/slider/label/SliderLabel.tsrx +71 -0
- package/src/slider/root/SliderRoot.tsrx +610 -0
- package/src/slider/root/SliderRootContext.ts +115 -0
- package/src/slider/root/SliderRootDataAttributes.ts +33 -0
- package/src/slider/root/stateAttributesMapping.ts +15 -0
- package/src/slider/thumb/SliderThumb.tsrx +567 -0
- package/src/slider/thumb/SliderThumbDataAttributes.ts +37 -0
- package/src/slider/thumb/prehydrationScript.min.ts +5 -0
- package/src/slider/track/SliderTrack.tsrx +49 -0
- package/src/slider/track/SliderTrackDataAttributes.ts +33 -0
- package/src/slider/utils/asc.ts +3 -0
- package/src/slider/utils/getMidpoint.ts +4 -0
- package/src/slider/utils/getPushedThumbValues.ts +60 -0
- package/src/slider/utils/getSliderValue.ts +22 -0
- package/src/slider/utils/resolveThumbCollision.ts +154 -0
- package/src/slider/utils/roundValueToStep.ts +21 -0
- package/src/slider/utils/test-utils.ts +18 -0
- package/src/slider/utils/validateMinimumDistance.ts +17 -0
- package/src/slider/value/SliderValue.tsrx +82 -0
- package/src/slider/value/SliderValueDataAttributes.ts +33 -0
- package/src/switch/index.parts.ts +2 -0
- package/src/switch/index.ts +4 -0
- package/src/switch/root/SwitchRoot.tsrx +335 -0
- package/src/switch/root/SwitchRootContext.ts +19 -0
- package/src/switch/root/SwitchRootDataAttributes.ts +44 -0
- package/src/switch/stateAttributesMapping.ts +15 -0
- package/src/switch/thumb/SwitchThumb.tsrx +40 -0
- package/src/switch/thumb/SwitchThumbDataAttributes.ts +44 -0
- package/src/tabs/index.parts.ts +5 -0
- package/src/tabs/index.ts +21 -0
- package/src/tabs/indicator/TabsIndicator.tsrx +292 -0
- package/src/tabs/indicator/TabsIndicatorCssVars.ts +30 -0
- package/src/tabs/indicator/TabsIndicatorDataAttributes.ts +10 -0
- package/src/tabs/indicator/prehydrationScript.min.ts +5 -0
- package/src/tabs/list/TabsList.tsrx +153 -0
- package/src/tabs/list/TabsListContext.ts +23 -0
- package/src/tabs/list/TabsListDataAttributes.ts +10 -0
- package/src/tabs/panel/TabsPanel.tsrx +145 -0
- package/src/tabs/panel/TabsPanelDataAttributes.ts +28 -0
- package/src/tabs/root/TabsRoot.tsrx +477 -0
- package/src/tabs/root/TabsRootContext.ts +55 -0
- package/src/tabs/root/TabsRootDataAttributes.ts +10 -0
- package/src/tabs/root/stateAttributesMapping.ts +9 -0
- package/src/tabs/tab/TabsTab.tsrx +280 -0
- package/src/tabs/tab/TabsTabDataAttributes.ts +18 -0
- package/src/toast/action/ToastAction.tsrx +72 -0
- package/src/toast/action/ToastActionDataAttributes.ts +5 -0
- package/src/toast/arrow/ToastArrow.tsrx +57 -0
- package/src/toast/arrow/ToastArrowDataAttributes.ts +16 -0
- package/src/toast/close/ToastClose.tsrx +79 -0
- package/src/toast/close/ToastCloseDataAttributes.ts +5 -0
- package/src/toast/content/ToastContent.tsrx +76 -0
- package/src/toast/content/ToastContentDataAttributes.ts +10 -0
- package/src/toast/createToastManager.ts +104 -0
- package/src/toast/description/ToastDescription.tsrx +54 -0
- package/src/toast/description/ToastDescriptionDataAttributes.ts +5 -0
- package/src/toast/index.parts.ts +14 -0
- package/src/toast/index.ts +18 -0
- package/src/toast/portal/ToastPortal.tsrx +33 -0
- package/src/toast/positioner/ToastPositioner.tsrx +154 -0
- package/src/toast/positioner/ToastPositionerContext.ts +23 -0
- package/src/toast/positioner/ToastPositionerCssVars.ts +25 -0
- package/src/toast/positioner/ToastPositionerDataAttributes.ts +16 -0
- package/src/toast/provider/ToastProvider.tsrx +109 -0
- package/src/toast/provider/ToastProviderContext.ts +16 -0
- package/src/toast/root/ToastRoot.tsrx +563 -0
- package/src/toast/root/ToastRootContext.ts +25 -0
- package/src/toast/root/ToastRootCssVars.ts +25 -0
- package/src/toast/root/ToastRootDataAttributes.ts +35 -0
- package/src/toast/store.ts +527 -0
- package/src/toast/title/ToastTitle.tsrx +53 -0
- package/src/toast/title/ToastTitleDataAttributes.ts +5 -0
- package/src/toast/useToastManager.ts +150 -0
- package/src/toast/utils/focusVisible.ts +1 -0
- package/src/toast/utils/isRenderableNode.ts +18 -0
- package/src/toast/utils/resolvePromiseOptions.ts +22 -0
- package/src/toast/utils/test-utils.tsrx +39 -0
- package/src/toast/utils/useToastLabelPart.ts +53 -0
- package/src/toast/viewport/ToastViewport.tsrx +293 -0
- package/src/toast/viewport/ToastViewportCssVars.ts +5 -0
- package/src/toast/viewport/ToastViewportDataAttributes.ts +5 -0
- package/src/toggle/Toggle.tsrx +198 -0
- package/src/toggle/ToggleDataAttributes.ts +8 -0
- package/src/toggle/index.ts +3 -0
- package/src/toggle-group/ToggleGroup.tsrx +201 -0
- package/src/toggle-group/ToggleGroupContext.ts +28 -0
- package/src/toggle-group/ToggleGroupDataAttributes.ts +13 -0
- package/src/toggle-group/index.ts +3 -0
- package/src/toolbar/button/ToolbarButton.tsrx +108 -0
- package/src/toolbar/button/ToolbarButtonDataAttributes.ts +13 -0
- package/src/toolbar/group/ToolbarGroup.tsrx +69 -0
- package/src/toolbar/group/ToolbarGroupContext.ts +13 -0
- package/src/toolbar/group/ToolbarGroupDataAttributes.ts +9 -0
- package/src/toolbar/index.parts.ts +8 -0
- package/src/toolbar/index.ts +9 -0
- package/src/toolbar/input/ToolbarInput.tsrx +108 -0
- package/src/toolbar/input/ToolbarInputDataAttributes.ts +13 -0
- package/src/toolbar/link/ToolbarLink.tsrx +64 -0
- package/src/toolbar/link/ToolbarLinkDataAttributes.ts +5 -0
- package/src/toolbar/root/ToolbarRoot.tsrx +121 -0
- package/src/toolbar/root/ToolbarRootContext.ts +24 -0
- package/src/toolbar/root/ToolbarRootDataAttributes.ts +9 -0
- package/src/toolbar/separator/ToolbarSeparator.tsrx +37 -0
- package/src/toolbar/separator/ToolbarSeparatorDataAttributes.ts +5 -0
- package/src/tooltip/arrow/TooltipArrow.tsrx +76 -0
- package/src/tooltip/arrow/TooltipArrowDataAttributes.ts +29 -0
- package/src/tooltip/index.parts.ts +12 -0
- package/src/tooltip/index.ts +13 -0
- package/src/tooltip/popup/TooltipPopup.tsrx +108 -0
- package/src/tooltip/popup/TooltipPopupDataAttributes.ts +33 -0
- package/src/tooltip/portal/TooltipPortal.tsrx +54 -0
- package/src/tooltip/portal/TooltipPortalContext.ts +13 -0
- package/src/tooltip/positioner/TooltipPositioner.tsrx +150 -0
- package/src/tooltip/positioner/TooltipPositionerContext.ts +23 -0
- package/src/tooltip/positioner/TooltipPositionerCssVars.ts +37 -0
- package/src/tooltip/positioner/TooltipPositionerDataAttributes.ts +24 -0
- package/src/tooltip/provider/TooltipProvider.tsrx +49 -0
- package/src/tooltip/provider/TooltipProviderContext.ts +12 -0
- package/src/tooltip/root/TooltipRoot.tsrx +282 -0
- package/src/tooltip/root/TooltipRootContext.ts +21 -0
- package/src/tooltip/store/TooltipHandle.ts +54 -0
- package/src/tooltip/store/TooltipStore.ts +148 -0
- package/src/tooltip/trigger/TooltipTrigger.tsrx +351 -0
- package/src/tooltip/trigger/TooltipTriggerDataAttributes.ts +10 -0
- package/src/tooltip/utils/constants.ts +1 -0
- package/src/tooltip/viewport/TooltipViewport.tsrx +75 -0
- package/src/tooltip/viewport/TooltipViewportCssVars.ts +12 -0
- package/src/tooltip/viewport/TooltipViewportDataAttributes.ts +24 -0
- package/src/types/index.ts +29 -0
- package/src/unstable-use-media-query/index.ts +94 -0
- package/src/use-render/index.ts +2 -0
- package/src/use-render/useRender.ts +113 -0
- package/src/utils/CommonPopupCssVars.ts +12 -0
- package/src/utils/CommonPopupDataAttributes.ts +38 -0
- package/src/utils/CommonPositionerCssVars.ts +37 -0
- package/src/utils/CommonTriggerDataAttributes.ts +9 -0
- package/src/utils/CommonViewportDataAttributes.ts +7 -0
- package/src/utils/FloatingPortalLite.tsrx +51 -0
- package/src/utils/FocusGuard.tsrx +44 -0
- package/src/utils/InternalBackdrop.tsrx +50 -0
- package/src/utils/NullStore.ts +26 -0
- package/src/utils/adaptiveOriginConstants.ts +12 -0
- package/src/utils/adaptiveOriginMiddleware.ts +5 -14
- package/src/utils/closePart.tsrx +37 -0
- package/src/utils/collapsibleOpenStateMapping.ts +28 -23
- package/src/utils/dispatchClickWithModifiers.ts +36 -0
- package/src/utils/getCssDimensions.ts +11 -15
- package/src/utils/getElementAtPoint.ts +12 -0
- package/src/utils/getElementTransform.ts +33 -0
- package/src/utils/getPseudoElementBounds.ts +22 -7
- package/src/utils/hideMiddleware.ts +15 -12
- package/src/utils/listbox-separator/ListboxSeparator.tsrx +47 -0
- package/src/utils/mergeStyles.ts +15 -0
- package/src/utils/popupStateMapping.ts +57 -35
- package/src/utils/popups/index.ts +4 -8
- package/src/utils/popups/inlineRect.ts +19 -16
- package/src/utils/popups/popupHandle.ts +291 -0
- package/src/utils/popups/popupStoreUtils.ts +482 -320
- package/src/utils/popups/popupTriggerMap.ts +102 -28
- package/src/utils/popups/store.ts +146 -66
- package/src/utils/popups/usePopupHandleStore.ts +37 -0
- package/src/utils/popups/useTriggerFocusGuards.ts +36 -21
- package/src/utils/resolveAriaLabelledBy.ts +2 -1
- package/src/utils/resolveClassName.ts +8 -3
- package/src/utils/resolveRef.ts +8 -4
- package/src/utils/resolveStyle.ts +10 -6
- package/src/utils/scrollEdges.ts +33 -0
- package/src/utils/scrollable.ts +77 -0
- package/src/utils/styles.tsrx +15 -0
- package/src/utils/useAnchoredPopupScrollLock.ts +31 -37
- package/src/utils/useFocusableWhenDisabled.ts +81 -65
- package/src/utils/useIsHydrating.ts +12 -15
- package/src/utils/useMixedToggleClickHandler.ts +45 -60
- package/src/utils/useOpenInteractionType.ts +43 -45
- package/src/utils/usePopupAutoResize.ts +198 -207
- package/src/utils/usePopupViewport.tsrx +396 -0
- package/src/utils/usePositioner.tsrx +50 -0
- package/src/utils/useRegisteredLabelId.ts +16 -27
- package/src/utils/useSwipeDismiss.ts +1161 -0
- package/src/utils/valueToPercent.ts +1 -2
- package/dist/cjs/accordion.cjs +0 -497
- package/dist/cjs/alert-dialog.cjs +0 -65
- package/dist/cjs/avatar.cjs +0 -234
- package/dist/cjs/button.cjs +0 -54
- package/dist/cjs/checkbox-group.cjs +0 -165
- package/dist/cjs/checkbox.cjs +0 -475
- package/dist/cjs/collapsible.cjs +0 -700
- package/dist/cjs/context-menu.cjs +0 -257
- package/dist/cjs/csp-provider.cjs +0 -40
- package/dist/cjs/dialog.cjs +0 -741
- package/dist/cjs/direction-provider.cjs +0 -35
- package/dist/cjs/field.cjs +0 -559
- package/dist/cjs/fieldset.cjs +0 -101
- package/dist/cjs/form.cjs +0 -177
- package/dist/cjs/index.cjs +0 -133
- package/dist/cjs/input.cjs +0 -32
- package/dist/cjs/internal.cjs +0 -43
- package/dist/cjs/menu.cjs +0 -2420
- package/dist/cjs/menubar.cjs +0 -132
- package/dist/cjs/merge-props.cjs +0 -34
- package/dist/cjs/meter.cjs +0 -169
- package/dist/cjs/number-field.cjs +0 -812
- package/dist/cjs/popover.cjs +0 -966
- package/dist/cjs/preview-card.cjs +0 -632
- package/dist/cjs/progress.cjs +0 -206
- package/dist/cjs/radio-group.cjs +0 -264
- package/dist/cjs/radio.cjs +0 -327
- package/dist/cjs/separator.cjs +0 -44
- package/dist/cjs/slider.cjs +0 -1384
- package/dist/cjs/switch.cjs +0 -306
- package/dist/cjs/tabs.cjs +0 -727
- package/dist/cjs/toast.cjs +0 -1766
- package/dist/cjs/toggle-group.cjs +0 -118
- package/dist/cjs/toggle.cjs +0 -121
- package/dist/cjs/tooltip.cjs +0 -835
- package/dist/cjs/unstable-use-media-query.cjs +0 -79
- package/dist/cjs/use-render.cjs +0 -40
- package/dist/cjs/utils/CSPContext.cjs +0 -38
- package/dist/cjs/utils/CheckboxGroupContext.cjs +0 -40
- package/dist/cjs/utils/CompositeRootContext.cjs +0 -40
- package/dist/cjs/utils/ContextMenuRootContext.cjs +0 -42
- package/dist/cjs/utils/DirectionContext.cjs +0 -34
- package/dist/cjs/utils/FloatingPortalLite.cjs +0 -47
- package/dist/cjs/utils/InternalBackdrop.cjs +0 -49
- package/dist/cjs/utils/MenubarContext.cjs +0 -40
- package/dist/cjs/utils/RadioGroupContext.cjs +0 -34
- package/dist/cjs/utils/RequestQueue.cjs +0 -111
- package/dist/cjs/utils/TimeoutManager.cjs +0 -50
- package/dist/cjs/utils/ToggleGroupContext.cjs +0 -40
- package/dist/cjs/utils/adaptiveOriginMiddleware.cjs +0 -94
- package/dist/cjs/utils/addEventListener.cjs +0 -33
- package/dist/cjs/utils/areArraysEqual.cjs +0 -30
- package/dist/cjs/utils/clamp.cjs +0 -30
- package/dist/cjs/utils/closePart.cjs +0 -70
- package/dist/cjs/utils/collapsibleOpenStateMapping.cjs +0 -42
- package/dist/cjs/utils/composeRefs.cjs +0 -68
- package/dist/cjs/utils/composite/CompositeItem.cjs +0 -59
- package/dist/cjs/utils/composite/CompositeList.cjs +0 -177
- package/dist/cjs/utils/composite/CompositeListContext.cjs +0 -43
- package/dist/cjs/utils/composite/CompositeRoot.cjs +0 -118
- package/dist/cjs/utils/composite/grid-utils.cjs +0 -343
- package/dist/cjs/utils/composite/gridNavigation.cjs +0 -92
- package/dist/cjs/utils/composite/keys.cjs +0 -174
- package/dist/cjs/utils/composite/list-utils.cjs +0 -90
- package/dist/cjs/utils/composite/useCompositeItem.cjs +0 -63
- package/dist/cjs/utils/composite/useCompositeListItem.cjs +0 -104
- package/dist/cjs/utils/composite/useCompositeRoot.cjs +0 -263
- package/dist/cjs/utils/constants.cjs +0 -56
- package/dist/cjs/utils/contains.cjs +0 -46
- package/dist/cjs/utils/createChangeEventDetails.cjs +0 -92
- package/dist/cjs/utils/dom.cjs +0 -35
- package/dist/cjs/utils/empty.cjs +0 -34
- package/dist/cjs/utils/field/FieldItemContext.cjs +0 -34
- package/dist/cjs/utils/field/FieldRootContext.cjs +0 -80
- package/dist/cjs/utils/field/FormContext.cjs +0 -41
- package/dist/cjs/utils/field/LabelableContext.cjs +0 -43
- package/dist/cjs/utils/field/LabelableProvider.cjs +0 -115
- package/dist/cjs/utils/field/constants.cjs +0 -68
- package/dist/cjs/utils/field/getCombinedFieldValidityData.cjs +0 -36
- package/dist/cjs/utils/field/useAriaLabelledBy.cjs +0 -87
- package/dist/cjs/utils/field/useFieldControlRegistration.cjs +0 -165
- package/dist/cjs/utils/field/useFieldValidation.cjs +0 -285
- package/dist/cjs/utils/field/useLabel.cjs +0 -99
- package/dist/cjs/utils/field/useLabelableId.cjs +0 -105
- package/dist/cjs/utils/field/useRegisterFieldControl.cjs +0 -60
- package/dist/cjs/utils/findRootOwnerId.cjs +0 -37
- package/dist/cjs/utils/floating/FloatingDelayGroup.cjs +0 -219
- package/dist/cjs/utils/floating/FloatingFocusManager.cjs +0 -685
- package/dist/cjs/utils/floating/FloatingPortal.cjs +0 -230
- package/dist/cjs/utils/floating/FloatingRootStore.cjs +0 -87
- package/dist/cjs/utils/floating/FloatingTree.cjs +0 -86
- package/dist/cjs/utils/floating/FloatingTreeStore.cjs +0 -41
- package/dist/cjs/utils/floating/FocusGuard.cjs +0 -54
- package/dist/cjs/utils/floating/composite.cjs +0 -42
- package/dist/cjs/utils/floating/constants.cjs +0 -34
- package/dist/cjs/utils/floating/createAttribute.cjs +0 -30
- package/dist/cjs/utils/floating/createEventEmitter.cjs +0 -44
- package/dist/cjs/utils/floating/element.cjs +0 -103
- package/dist/cjs/utils/floating/enqueueFocus.cjs +0 -51
- package/dist/cjs/utils/floating/event.cjs +0 -65
- package/dist/cjs/utils/floating/getEmptyRootContext.cjs +0 -42
- package/dist/cjs/utils/floating/gridNavigation.cjs +0 -45
- package/dist/cjs/utils/floating/markOthers.cjs +0 -181
- package/dist/cjs/utils/floating/nodes.cjs +0 -48
- package/dist/cjs/utils/floating/safePolygon.cjs +0 -301
- package/dist/cjs/utils/floating/tabbable.cjs +0 -242
- package/dist/cjs/utils/floating/types.cjs +0 -16
- package/dist/cjs/utils/floating/useClick.cjs +0 -153
- package/dist/cjs/utils/floating/useClientPoint.cjs +0 -225
- package/dist/cjs/utils/floating/useDismiss.cjs +0 -506
- package/dist/cjs/utils/floating/useFloating.cjs +0 -186
- package/dist/cjs/utils/floating/useFloatingRootContext.cjs +0 -75
- package/dist/cjs/utils/floating/useFocus.cjs +0 -184
- package/dist/cjs/utils/floating/useHoverFloatingInteraction.cjs +0 -231
- package/dist/cjs/utils/floating/useHoverInteractionSharedState.cjs +0 -113
- package/dist/cjs/utils/floating/useHoverReferenceInteraction.cjs +0 -380
- package/dist/cjs/utils/floating/useHoverShared.cjs +0 -65
- package/dist/cjs/utils/floating/useListNavigation.cjs +0 -665
- package/dist/cjs/utils/floating/useSyncedFloatingRootContext.cjs +0 -91
- package/dist/cjs/utils/floating/useTypeahead.cjs +0 -187
- package/dist/cjs/utils/formatNumber.cjs +0 -60
- package/dist/cjs/utils/generateId.cjs +0 -32
- package/dist/cjs/utils/getCssDimensions.cjs +0 -42
- package/dist/cjs/utils/getDefaultFormSubmitter.cjs +0 -42
- package/dist/cjs/utils/getDisabledMountTransitionStyles.cjs +0 -32
- package/dist/cjs/utils/getElementRef.cjs +0 -35
- package/dist/cjs/utils/getPseudoElementBounds.cjs +0 -56
- package/dist/cjs/utils/getStateAttributesProps.cjs +0 -46
- package/dist/cjs/utils/hideMiddleware.cjs +0 -42
- package/dist/cjs/utils/inertValue.cjs +0 -30
- package/dist/cjs/utils/matchesFocusVisible.cjs +0 -38
- package/dist/cjs/utils/mergeCleanups.cjs +0 -37
- package/dist/cjs/utils/mergeObjects.cjs +0 -39
- package/dist/cjs/utils/mergeProps.cjs +0 -182
- package/dist/cjs/utils/noop.cjs +0 -29
- package/dist/cjs/utils/number/constants.cjs +0 -34
- package/dist/cjs/utils/number/parse.cjs +0 -258
- package/dist/cjs/utils/number/types.cjs +0 -16
- package/dist/cjs/utils/number/validate.cjs +0 -104
- package/dist/cjs/utils/owner.cjs +0 -35
- package/dist/cjs/utils/platform.cjs +0 -83
- package/dist/cjs/utils/popupStateMapping.cjs +0 -74
- package/dist/cjs/utils/popups/index.cjs +0 -39
- package/dist/cjs/utils/popups/inlineRect.cjs +0 -218
- package/dist/cjs/utils/popups/popupStoreUtils.cjs +0 -379
- package/dist/cjs/utils/popups/popupTriggerMap.cjs +0 -76
- package/dist/cjs/utils/popups/store.cjs +0 -118
- package/dist/cjs/utils/popups/useTriggerFocusGuards.cjs +0 -72
- package/dist/cjs/utils/resolveAriaLabelledBy.cjs +0 -35
- package/dist/cjs/utils/resolveClassName.cjs +0 -30
- package/dist/cjs/utils/resolveRef.cjs +0 -33
- package/dist/cjs/utils/resolveStyle.cjs +0 -30
- package/dist/cjs/utils/serializeValue.cjs +0 -40
- package/dist/cjs/utils/slider/asc.cjs +0 -30
- package/dist/cjs/utils/slider/getMidpoint.cjs +0 -34
- package/dist/cjs/utils/slider/getPushedThumbValues.cjs +0 -73
- package/dist/cjs/utils/slider/getSliderValue.cjs +0 -42
- package/dist/cjs/utils/slider/replaceArrayItemAtIndex.cjs +0 -33
- package/dist/cjs/utils/slider/resolveThumbCollision.cjs +0 -155
- package/dist/cjs/utils/slider/roundValueToStep.cjs +0 -45
- package/dist/cjs/utils/slider/validateMinimumDistance.cjs +0 -40
- package/dist/cjs/utils/slider/valueArrayToPercentages.cjs +0 -36
- package/dist/cjs/utils/store/ReactStore.cjs +0 -135
- package/dist/cjs/utils/store/Store.cjs +0 -83
- package/dist/cjs/utils/store/createSelector.cjs +0 -74
- package/dist/cjs/utils/store/useStore.cjs +0 -51
- package/dist/cjs/utils/stringifyLocale.cjs +0 -36
- package/dist/cjs/utils/useAnchorPositioning.cjs +0 -421
- package/dist/cjs/utils/useAnchoredPopupScrollLock.cjs +0 -59
- package/dist/cjs/utils/useAnimationFrame.cjs +0 -93
- package/dist/cjs/utils/useAnimationsFinished.cjs +0 -98
- package/dist/cjs/utils/useBaseUiId.cjs +0 -36
- package/dist/cjs/utils/useButton.cjs +0 -177
- package/dist/cjs/utils/useCheckboxGroupParent.cjs +0 -114
- package/dist/cjs/utils/useControlled.cjs +0 -47
- package/dist/cjs/utils/useEnhancedClickHandler.cjs +0 -60
- package/dist/cjs/utils/useFocusableWhenDisabled.cjs +0 -77
- package/dist/cjs/utils/useForcedRerendering.cjs +0 -35
- package/dist/cjs/utils/useIsHydrating.cjs +0 -44
- package/dist/cjs/utils/useMixedToggleClickHandler.cjs +0 -66
- package/dist/cjs/utils/useOnFirstRender.cjs +0 -35
- package/dist/cjs/utils/useOnMount.cjs +0 -36
- package/dist/cjs/utils/useOpenChangeComplete.cjs +0 -57
- package/dist/cjs/utils/useOpenInteractionType.cjs +0 -69
- package/dist/cjs/utils/usePopupAutoResize.cjs +0 -191
- package/dist/cjs/utils/usePopupViewport.cjs +0 -283
- package/dist/cjs/utils/usePositioner.cjs +0 -53
- package/dist/cjs/utils/usePressAndHold.cjs +0 -51
- package/dist/cjs/utils/usePreviousValue.cjs +0 -47
- package/dist/cjs/utils/useRefWithInit.cjs +0 -41
- package/dist/cjs/utils/useRegisteredLabelId.cjs +0 -48
- package/dist/cjs/utils/useRenderElement.cjs +0 -106
- package/dist/cjs/utils/useScrollLock.cjs +0 -232
- package/dist/cjs/utils/useStableCallback.cjs +0 -41
- package/dist/cjs/utils/useTimeout.cjs +0 -66
- package/dist/cjs/utils/useTransitionStatus.cjs +0 -116
- package/dist/cjs/utils/useValueAsRef.cjs +0 -43
- package/dist/cjs/utils/useValueChanged.cjs +0 -55
- package/dist/cjs/utils/valueToPercent.cjs +0 -30
- package/dist/cjs/utils/visuallyHidden.cjs +0 -49
- package/src/accordion.ts +0 -615
- package/src/alert-dialog.ts +0 -49
- package/src/avatar.ts +0 -308
- package/src/button.ts +0 -63
- package/src/checkbox-group.ts +0 -183
- package/src/checkbox.ts +0 -576
- package/src/collapsible.ts +0 -916
- package/src/context-menu.ts +0 -317
- package/src/csp-provider.ts +0 -37
- package/src/dialog.ts +0 -930
- package/src/direction-provider.ts +0 -32
- package/src/field.ts +0 -650
- package/src/fieldset.ts +0 -150
- package/src/form.ts +0 -183
- package/src/input.ts +0 -9
- package/src/internal.ts +0 -29
- package/src/menu.ts +0 -3387
- package/src/menubar.ts +0 -160
- package/src/merge-props.ts +0 -2
- package/src/meter.ts +0 -211
- package/src/number-field.ts +0 -951
- package/src/popover.ts +0 -1282
- package/src/preview-card.ts +0 -812
- package/src/progress.ts +0 -267
- package/src/radio-group.ts +0 -285
- package/src/radio.ts +0 -393
- package/src/separator.ts +0 -43
- package/src/slider.ts +0 -1624
- package/src/switch.ts +0 -363
- package/src/tabs.ts +0 -947
- package/src/toast.ts +0 -2462
- package/src/toggle-group.ts +0 -136
- package/src/toggle.ts +0 -145
- package/src/tooltip.ts +0 -1053
- package/src/unstable-use-media-query.ts +0 -101
- package/src/use-render.ts +0 -41
- package/src/utils/CSPContext.ts +0 -21
- package/src/utils/CheckboxGroupContext.ts +0 -30
- package/src/utils/CompositeRootContext.ts +0 -27
- package/src/utils/ContextMenuRootContext.ts +0 -44
- package/src/utils/DirectionContext.ts +0 -15
- package/src/utils/FloatingPortalLite.ts +0 -34
- package/src/utils/InternalBackdrop.ts +0 -28
- package/src/utils/MenubarContext.ts +0 -38
- package/src/utils/RadioGroupContext.ts +0 -27
- package/src/utils/RequestQueue.ts +0 -132
- package/src/utils/TimeoutManager.ts +0 -32
- package/src/utils/ToggleGroupContext.ts +0 -33
- package/src/utils/addEventListener.ts +0 -13
- package/src/utils/areArraysEqual.ts +0 -11
- package/src/utils/clamp.ts +0 -8
- package/src/utils/closePart.ts +0 -61
- package/src/utils/composeRefs.ts +0 -53
- package/src/utils/composite/CompositeItem.ts +0 -56
- package/src/utils/composite/CompositeList.ts +0 -190
- package/src/utils/composite/CompositeListContext.ts +0 -23
- package/src/utils/composite/CompositeRoot.ts +0 -132
- package/src/utils/composite/grid-utils.ts +0 -437
- package/src/utils/composite/gridNavigation.ts +0 -127
- package/src/utils/composite/keys.ts +0 -179
- package/src/utils/composite/list-utils.ts +0 -106
- package/src/utils/composite/useCompositeItem.ts +0 -58
- package/src/utils/composite/useCompositeListItem.ts +0 -108
- package/src/utils/composite/useCompositeRoot.ts +0 -344
- package/src/utils/constants.ts +0 -41
- package/src/utils/contains.ts +0 -22
- package/src/utils/createChangeEventDetails.ts +0 -95
- package/src/utils/dom.ts +0 -9
- package/src/utils/empty.ts +0 -7
- package/src/utils/field/FieldItemContext.ts +0 -13
- package/src/utils/field/FieldRootContext.ts +0 -98
- package/src/utils/field/FormContext.ts +0 -37
- package/src/utils/field/LabelableContext.ts +0 -32
- package/src/utils/field/LabelableProvider.ts +0 -108
- package/src/utils/field/constants.ts +0 -80
- package/src/utils/field/getCombinedFieldValidityData.ts +0 -16
- package/src/utils/field/useAriaLabelledBy.ts +0 -86
- package/src/utils/field/useFieldControlRegistration.ts +0 -179
- package/src/utils/field/useFieldValidation.ts +0 -311
- package/src/utils/field/useLabel.ts +0 -95
- package/src/utils/field/useLabelableId.ts +0 -99
- package/src/utils/field/useRegisterFieldControl.ts +0 -41
- package/src/utils/findRootOwnerId.ts +0 -19
- package/src/utils/floating/FloatingDelayGroup.ts +0 -280
- package/src/utils/floating/FloatingFocusManager.ts +0 -837
- package/src/utils/floating/FloatingPortal.ts +0 -280
- package/src/utils/floating/FloatingRootStore.ts +0 -127
- package/src/utils/floating/FloatingTree.ts +0 -70
- package/src/utils/floating/FloatingTreeStore.ts +0 -22
- package/src/utils/floating/FocusGuard.ts +0 -34
- package/src/utils/floating/composite.ts +0 -20
- package/src/utils/floating/constants.ts +0 -8
- package/src/utils/floating/createAttribute.ts +0 -4
- package/src/utils/floating/createEventEmitter.ts +0 -20
- package/src/utils/floating/element.ts +0 -88
- package/src/utils/floating/enqueueFocus.ts +0 -38
- package/src/utils/floating/event.ts +0 -53
- package/src/utils/floating/getEmptyRootContext.ts +0 -19
- package/src/utils/floating/gridNavigation.ts +0 -54
- package/src/utils/floating/markOthers.ts +0 -197
- package/src/utils/floating/nodes.ts +0 -31
- package/src/utils/floating/safePolygon.ts +0 -448
- package/src/utils/floating/tabbable.ts +0 -260
- package/src/utils/floating/types.ts +0 -57
- package/src/utils/floating/useClick.ts +0 -174
- package/src/utils/floating/useClientPoint.ts +0 -276
- package/src/utils/floating/useDismiss.ts +0 -639
- package/src/utils/floating/useFloating.ts +0 -198
- package/src/utils/floating/useFloatingRootContext.ts +0 -81
- package/src/utils/floating/useFocus.ts +0 -248
- package/src/utils/floating/useHoverFloatingInteraction.ts +0 -302
- package/src/utils/floating/useHoverInteractionSharedState.ts +0 -139
- package/src/utils/floating/useHoverReferenceInteraction.ts +0 -510
- package/src/utils/floating/useHoverShared.ts +0 -78
- package/src/utils/floating/useListNavigation.ts +0 -1018
- package/src/utils/floating/useSyncedFloatingRootContext.ts +0 -93
- package/src/utils/floating/useTypeahead.ts +0 -287
- package/src/utils/formatNumber.ts +0 -44
- package/src/utils/generateId.ts +0 -10
- package/src/utils/getDefaultFormSubmitter.ts +0 -19
- package/src/utils/getDisabledMountTransitionStyles.ts +0 -12
- package/src/utils/getElementRef.ts +0 -13
- package/src/utils/getStateAttributesProps.ts +0 -34
- package/src/utils/inertValue.ts +0 -5
- package/src/utils/matchesFocusVisible.ts +0 -16
- package/src/utils/mergeCleanups.ts +0 -13
- package/src/utils/mergeObjects.ts +0 -18
- package/src/utils/mergeProps.ts +0 -206
- package/src/utils/noop.ts +0 -4
- package/src/utils/number/constants.ts +0 -4
- package/src/utils/number/parse.ts +0 -227
- package/src/utils/number/types.ts +0 -21
- package/src/utils/number/validate.ts +0 -129
- package/src/utils/owner.ts +0 -9
- package/src/utils/platform.ts +0 -69
- package/src/utils/serializeValue.ts +0 -15
- package/src/utils/slider/asc.ts +0 -4
- package/src/utils/slider/getMidpoint.ts +0 -14
- package/src/utils/slider/getPushedThumbValues.ts +0 -73
- package/src/utils/slider/getSliderValue.ts +0 -27
- package/src/utils/slider/replaceArrayItemAtIndex.ts +0 -8
- package/src/utils/slider/resolveThumbCollision.ts +0 -178
- package/src/utils/slider/roundValueToStep.ts +0 -22
- package/src/utils/slider/validateMinimumDistance.ts +0 -22
- package/src/utils/slider/valueArrayToPercentages.ts +0 -11
- package/src/utils/store/ReactStore.ts +0 -168
- package/src/utils/store/Store.ts +0 -84
- package/src/utils/store/createSelector.ts +0 -66
- package/src/utils/store/useStore.ts +0 -49
- package/src/utils/stringifyLocale.ts +0 -10
- package/src/utils/useAnchorPositioning.ts +0 -581
- package/src/utils/useAnimationFrame.ts +0 -82
- package/src/utils/useAnimationsFinished.ts +0 -100
- package/src/utils/useBaseUiId.ts +0 -19
- package/src/utils/useButton.ts +0 -217
- package/src/utils/useCheckboxGroupParent.ts +0 -113
- package/src/utils/useControlled.ts +0 -42
- package/src/utils/useEnhancedClickHandler.ts +0 -47
- package/src/utils/useForcedRerendering.ts +0 -11
- package/src/utils/useOnFirstRender.ts +0 -11
- package/src/utils/useOnMount.ts +0 -17
- package/src/utils/useOpenChangeComplete.ts +0 -46
- package/src/utils/usePopupViewport.ts +0 -375
- package/src/utils/usePositioner.ts +0 -48
- package/src/utils/usePressAndHold.ts +0 -35
- package/src/utils/usePreviousValue.ts +0 -33
- package/src/utils/useRefWithInit.ts +0 -23
- package/src/utils/useRenderElement.ts +0 -164
- package/src/utils/useScrollLock.ts +0 -253
- package/src/utils/useStableCallback.ts +0 -26
- package/src/utils/useTimeout.ts +0 -51
- package/src/utils/useTransitionStatus.ts +0 -115
- package/src/utils/useValueAsRef.ts +0 -25
- package/src/utils/useValueChanged.ts +0 -37
- package/src/utils/visuallyHidden.ts +0 -24
|
@@ -0,0 +1,858 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import * as React from 'octane';
|
|
3
|
+
import { getComputedStyle, getParentNode, isHTMLElement } from '@floating-ui/utils/dom';
|
|
4
|
+
import { addEventListener } from '@octanejs/base-ui-utils/addEventListener';
|
|
5
|
+
import { ownerDocument, ownerWindow } from '@octanejs/base-ui-utils/owner';
|
|
6
|
+
import { useAnimationFrame } from '@octanejs/base-ui-utils/useAnimationFrame';
|
|
7
|
+
import { useStableCallback } from '@octanejs/base-ui-utils/useStableCallback';
|
|
8
|
+
import { clamp } from '@octanejs/base-ui-utils/clamp';
|
|
9
|
+
import { useTimeout } from '@octanejs/base-ui-utils/useTimeout';
|
|
10
|
+
import { useDialogRootContext } from '../../dialog/root/DialogRootContext';
|
|
11
|
+
import {
|
|
12
|
+
activeElement,
|
|
13
|
+
contains,
|
|
14
|
+
getTarget,
|
|
15
|
+
isInteractiveElement,
|
|
16
|
+
} from '../../floating-ui-react/utils';
|
|
17
|
+
import { findScrollableTouchTarget } from '../../utils/scrollable';
|
|
18
|
+
import { getElementAtPoint } from '../../utils/getElementAtPoint';
|
|
19
|
+
import * as DrawerViewportCssVars from '../viewport/DrawerViewportCssVars';
|
|
20
|
+
import {
|
|
21
|
+
DrawerVirtualKeyboardContext,
|
|
22
|
+
type DrawerVirtualKeyboardContext as DrawerVirtualKeyboardContextValue,
|
|
23
|
+
} from './DrawerVirtualKeyboardContext.tsrx';
|
|
24
|
+
|
|
25
|
+
const KEYBOARD_RESIZE_THRESHOLD = 60;
|
|
26
|
+
const KEYBOARD_VISIBILITY_MARGIN = 16;
|
|
27
|
+
// Extra breathing room (px) added below the focused field, on top of its measured
|
|
28
|
+
// keyboard overlap, so the field can be scrolled clear of the keyboard instead of
|
|
29
|
+
// ending up flush against it. Only applied when there is actual overlap.
|
|
30
|
+
const KEYBOARD_SCROLL_SLACK = 48;
|
|
31
|
+
// Cadence of the settle-watching realign passes after focus moves with the keyboard open:
|
|
32
|
+
// long enough for a smooth scroll to show progress between passes, short enough to recover
|
|
33
|
+
// quickly from a scroll canceled by WebKit's reveal; the pass count covers CSS transitions
|
|
34
|
+
// reacting to the focus change (e.g. a 260ms footer resize) with room to spare.
|
|
35
|
+
const KEYBOARD_REALIGN_INTERVAL = 150;
|
|
36
|
+
const KEYBOARD_REALIGN_MAX_PASSES = 4;
|
|
37
|
+
// Frames the alignment waits for the scroll destination to stop moving (layout reacting to
|
|
38
|
+
// the focus change, e.g. a footer resizing over a CSS transition) before scrolling anyway.
|
|
39
|
+
const KEYBOARD_SETTLE_FRAME_LIMIT = 60;
|
|
40
|
+
const INPUT_TAP_MOVE_THRESHOLD = 10;
|
|
41
|
+
const INPUT_TAP_HIT_SLOP = 16;
|
|
42
|
+
const KEYBOARD_INPUT_TYPES = new Set([
|
|
43
|
+
'email',
|
|
44
|
+
'number',
|
|
45
|
+
'password',
|
|
46
|
+
'search',
|
|
47
|
+
'tel',
|
|
48
|
+
'text',
|
|
49
|
+
'url',
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
// Snapshot of a scroll container's relevant styles taken before keyboard slack is
|
|
53
|
+
// applied. The string fields are the exact inline values to restore on cleanup;
|
|
54
|
+
// the parsed numbers are the computed baselines that slack is added on top of.
|
|
55
|
+
interface ScrollAdjustment {
|
|
56
|
+
readonly element: HTMLElement;
|
|
57
|
+
readonly overflowAnchor: string;
|
|
58
|
+
readonly paddingBottom: string;
|
|
59
|
+
readonly scrollPaddingBottom: string;
|
|
60
|
+
readonly computedPaddingBottom: number;
|
|
61
|
+
readonly computedScrollPaddingBottom: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface KeyboardVisualViewport {
|
|
65
|
+
readonly top: number;
|
|
66
|
+
readonly bottom: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface KeyboardTouchTarget {
|
|
70
|
+
readonly focusTarget: HTMLElement;
|
|
71
|
+
readonly clickTarget: HTMLElement;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Returned by the point-based resolver when the lift point lands on another
|
|
75
|
+
// interactive/label element. It signals that the tap was intentionally rejected, so the
|
|
76
|
+
// caller must NOT fall back to the touchstart target (`touchend.target` stays at the
|
|
77
|
+
// touchstart node on mobile) — doing so would steal a tap meant for that element.
|
|
78
|
+
const KEYBOARD_TAP_BLOCKED = Symbol('KeyboardTapBlocked');
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Provides keyboard-aware focus and scroll handling for bottom-sheet drawers with form fields.
|
|
82
|
+
*
|
|
83
|
+
* Documentation: [Base UI Drawer](https://base-ui.com/react/components/drawer)
|
|
84
|
+
*/
|
|
85
|
+
export function DrawerVirtualKeyboardProvider(props: DrawerVirtualKeyboardProvider.Props) {
|
|
86
|
+
const { children } = props;
|
|
87
|
+
|
|
88
|
+
const store = useDialogRootContext();
|
|
89
|
+
|
|
90
|
+
const open = store.useState('open');
|
|
91
|
+
const mounted = store.useState('mounted');
|
|
92
|
+
const modal = store.useState('modal');
|
|
93
|
+
const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');
|
|
94
|
+
const viewportElement = store.useState('viewportElement');
|
|
95
|
+
|
|
96
|
+
// The provider requires a `<Drawer.Viewport>` to act as the measurement and containment
|
|
97
|
+
// root and to host the keyboard inset variable; `<Drawer.Popup>` already warns when the
|
|
98
|
+
// viewport is missing, so there is no need to fall back to the popup element here.
|
|
99
|
+
const rootElement = viewportElement;
|
|
100
|
+
const nestedDrawerOpen = nestedOpenDialogCount > 0;
|
|
101
|
+
|
|
102
|
+
const pendingKeyboardFocusMovedRef = React.useRef(false);
|
|
103
|
+
const keyboardTouchStartRef = React.useRef<{ x: number; y: number } | null>(null);
|
|
104
|
+
const focusedKeyboardTargetRef = React.useRef<HTMLElement | null>(null);
|
|
105
|
+
const keyboardScrollAdjustmentRef = React.useRef<ScrollAdjustment | null>(null);
|
|
106
|
+
const programmaticKeyboardFocusRef = React.useRef(false);
|
|
107
|
+
const keyboardFocusFrame = useAnimationFrame();
|
|
108
|
+
const keyboardRealignTimeout = useTimeout();
|
|
109
|
+
|
|
110
|
+
const restoreKeyboardScrollAdjustment = useStableCallback(() => {
|
|
111
|
+
const adjustment = keyboardScrollAdjustmentRef.current;
|
|
112
|
+
if (!adjustment) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
adjustment.element.style.overflowAnchor = adjustment.overflowAnchor;
|
|
116
|
+
adjustment.element.style.paddingBottom = adjustment.paddingBottom;
|
|
117
|
+
adjustment.element.style.scrollPaddingBottom = adjustment.scrollPaddingBottom;
|
|
118
|
+
keyboardScrollAdjustmentRef.current = null;
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const setKeyboardScrollSlack = useStableCallback((element: HTMLElement, slack: number) => {
|
|
122
|
+
const roundedSlack = Math.max(0, Math.ceil(slack));
|
|
123
|
+
let adjustment = keyboardScrollAdjustmentRef.current;
|
|
124
|
+
|
|
125
|
+
if (adjustment && !adjustment.element.isConnected) {
|
|
126
|
+
restoreKeyboardScrollAdjustment();
|
|
127
|
+
adjustment = null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (roundedSlack === 0) {
|
|
131
|
+
restoreKeyboardScrollAdjustment();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (adjustment && adjustment.element !== element) {
|
|
136
|
+
restoreKeyboardScrollAdjustment();
|
|
137
|
+
adjustment = null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!adjustment) {
|
|
141
|
+
const styles = getComputedStyle(element);
|
|
142
|
+
adjustment = {
|
|
143
|
+
element,
|
|
144
|
+
overflowAnchor: element.style.overflowAnchor,
|
|
145
|
+
paddingBottom: element.style.paddingBottom,
|
|
146
|
+
scrollPaddingBottom: element.style.scrollPaddingBottom,
|
|
147
|
+
computedPaddingBottom: Number.parseFloat(styles.paddingBottom) || 0,
|
|
148
|
+
computedScrollPaddingBottom: Number.parseFloat(styles.scrollPaddingBottom) || 0,
|
|
149
|
+
};
|
|
150
|
+
keyboardScrollAdjustmentRef.current = adjustment;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
element.style.overflowAnchor = 'none';
|
|
154
|
+
element.style.paddingBottom = `${adjustment.computedPaddingBottom + roundedSlack}px`;
|
|
155
|
+
element.style.scrollPaddingBottom = `${
|
|
156
|
+
adjustment.computedScrollPaddingBottom + KEYBOARD_VISIBILITY_MARGIN
|
|
157
|
+
}px`;
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
const animateKeyboardScroll = useStableCallback((element: HTMLElement, scrollTop: number) => {
|
|
161
|
+
const win = ownerWindow(element);
|
|
162
|
+
const behavior: ScrollBehavior = win.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches
|
|
163
|
+
? 'auto'
|
|
164
|
+
: 'smooth';
|
|
165
|
+
|
|
166
|
+
element.scrollTo({ top: scrollTop, behavior });
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const resetTouchTrackingState = useStableCallback(() => {
|
|
170
|
+
pendingKeyboardFocusMovedRef.current = false;
|
|
171
|
+
keyboardTouchStartRef.current = null;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
React.useEffect(() => {
|
|
175
|
+
if (!mounted || !open) {
|
|
176
|
+
focusedKeyboardTargetRef.current = null;
|
|
177
|
+
restoreKeyboardScrollAdjustment();
|
|
178
|
+
keyboardFocusFrame.cancel();
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (!rootElement) {
|
|
183
|
+
restoreKeyboardScrollAdjustment();
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const doc = ownerDocument(rootElement);
|
|
188
|
+
const win = ownerWindow(rootElement);
|
|
189
|
+
const visualViewport = win.visualViewport;
|
|
190
|
+
|
|
191
|
+
// Alignment scroll bookkeeping: destination stability, whether a scroll was issued,
|
|
192
|
+
// and the last observed progress so delayed passes can distinguish moving from stalled.
|
|
193
|
+
let keyboardScrollElement: HTMLElement | null = null;
|
|
194
|
+
let keyboardScrollDestination = 0;
|
|
195
|
+
let keyboardScrollChecks = 0;
|
|
196
|
+
let keyboardScrollObserved = -1;
|
|
197
|
+
|
|
198
|
+
const setDrawerKeyboardInset = (inset: number) => {
|
|
199
|
+
rootElement.style.setProperty(
|
|
200
|
+
DrawerViewportCssVars.keyboardInset,
|
|
201
|
+
`${Math.max(0, Math.ceil(inset))}px`,
|
|
202
|
+
);
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const clearFocusedKeyboardTarget = () => {
|
|
206
|
+
focusedKeyboardTargetRef.current = null;
|
|
207
|
+
keyboardScrollElement = null;
|
|
208
|
+
setDrawerKeyboardInset(0);
|
|
209
|
+
restoreKeyboardScrollAdjustment();
|
|
210
|
+
keyboardFocusFrame.cancel();
|
|
211
|
+
keyboardRealignTimeout.clear();
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// WebKit's native reveal scroll can move the page even while the scroll lock hides
|
|
215
|
+
// overflow (e.g. when the software keyboard's previous/next field arrows move focus).
|
|
216
|
+
// While the drawer is modal, any window scroll during keyboard interaction is spurious,
|
|
217
|
+
// so pin the page to the position it had when the drawer opened.
|
|
218
|
+
const baseScrollX = win.scrollX;
|
|
219
|
+
const baseScrollY = win.scrollY;
|
|
220
|
+
|
|
221
|
+
const restoreWindowScroll = (): boolean => {
|
|
222
|
+
if (
|
|
223
|
+
modal !== true ||
|
|
224
|
+
nestedDrawerOpen ||
|
|
225
|
+
!focusedKeyboardTargetRef.current ||
|
|
226
|
+
getKeyboardVisualViewport(win) == null
|
|
227
|
+
) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (win.scrollX !== baseScrollX || win.scrollY !== baseScrollY) {
|
|
232
|
+
// Force an instant jump: the two-argument form defaults `behavior` to `auto`, which
|
|
233
|
+
// obeys the page's `scroll-behavior`, so a global `scroll-behavior: smooth` would
|
|
234
|
+
// animate the restore. The measurements that follow assume the page is already back
|
|
235
|
+
// at rest, and a smooth restore also re-emits `scroll`, re-entering this handler.
|
|
236
|
+
win.scrollTo({ left: baseScrollX, top: baseScrollY, behavior: 'instant' });
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return false;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// Focus moved by the drawer itself goes through `focusKeyboardInputWithoutPageScroll`,
|
|
244
|
+
// but native focus changes (the iOS keyboard's previous/next field arrows) commit
|
|
245
|
+
// WebKit's reveal scroll before `focusin` reaches us — cancelling it afterwards
|
|
246
|
+
// visibly jitters the sheet. `focusout` on the outgoing field fires before focus
|
|
247
|
+
// lands, so override the incoming field's geometry there and restore it in `focusin`.
|
|
248
|
+
let restorePreemptedFocus: (() => void) | null = null;
|
|
249
|
+
|
|
250
|
+
const consumePreemptedFocus = () => {
|
|
251
|
+
restorePreemptedFocus?.();
|
|
252
|
+
restorePreemptedFocus = null;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
const preemptFocusReveal = (target: HTMLElement, keyboardViewport: KeyboardVisualViewport) => {
|
|
256
|
+
consumePreemptedFocus();
|
|
257
|
+
|
|
258
|
+
// Native focus carries no preventScroll, so a fake off-screen rect would make WebKit
|
|
259
|
+
// scroll the drawer's own scroll containers thousands of pixels chasing it. Presenting
|
|
260
|
+
// the field as already centered in the visible band above the keyboard instead makes
|
|
261
|
+
// both the in-page reveal and the viewport pan no-ops.
|
|
262
|
+
const rect = target.getBoundingClientRect();
|
|
263
|
+
|
|
264
|
+
restorePreemptedFocus = overrideGeometryDuringFocus(
|
|
265
|
+
target,
|
|
266
|
+
(keyboardViewport.top + keyboardViewport.bottom - rect.top - rect.bottom) / 2,
|
|
267
|
+
);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const alignFocusedKeyboardTarget = () => {
|
|
271
|
+
// If focus never lands on a preempted target, the focusout-scheduled alignment still
|
|
272
|
+
// restores it on the next frame before paint.
|
|
273
|
+
consumePreemptedFocus();
|
|
274
|
+
|
|
275
|
+
const target = focusedKeyboardTargetRef.current;
|
|
276
|
+
// If the focused field is removed from the DOM without firing `focusout` (e.g. it is
|
|
277
|
+
// conditionally rendered away), any applied scroll slack is restored here on the next
|
|
278
|
+
// focus/viewport event or when the drawer closes. This self-corrects rather than
|
|
279
|
+
// tracking each field's lifecycle.
|
|
280
|
+
if (nestedDrawerOpen || !target || !contains(rootElement, target)) {
|
|
281
|
+
setDrawerKeyboardInset(0);
|
|
282
|
+
restoreKeyboardScrollAdjustment();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Undo any reveal scroll WebKit applied to the locked page before measuring, so the
|
|
287
|
+
// keyboard inset and alignment are computed against the resting viewport.
|
|
288
|
+
restoreWindowScroll();
|
|
289
|
+
|
|
290
|
+
const keyboardViewport = getKeyboardVisualViewport(win);
|
|
291
|
+
if (!keyboardViewport) {
|
|
292
|
+
setDrawerKeyboardInset(0);
|
|
293
|
+
restoreKeyboardScrollAdjustment();
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
setDrawerKeyboardInset(Math.max(0, win.innerHeight - keyboardViewport.bottom));
|
|
298
|
+
|
|
299
|
+
const scrollTarget = findKeyboardScrollTarget(target, rootElement);
|
|
300
|
+
if (!scrollTarget) {
|
|
301
|
+
restoreKeyboardScrollAdjustment();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const scrollTargetRect = scrollTarget.getBoundingClientRect();
|
|
306
|
+
const clippedBottom = Math.min(scrollTargetRect.bottom, keyboardViewport.bottom);
|
|
307
|
+
const overlap = Math.max(0, scrollTargetRect.bottom - keyboardViewport.bottom);
|
|
308
|
+
setKeyboardScrollSlack(scrollTarget, overlap > 0 ? overlap + KEYBOARD_SCROLL_SLACK : 0);
|
|
309
|
+
|
|
310
|
+
const maxScrollTop = Math.max(0, scrollTarget.scrollHeight - scrollTarget.clientHeight);
|
|
311
|
+
if (maxScrollTop <= 0) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const clippedTop = Math.max(scrollTargetRect.top, keyboardViewport.top);
|
|
316
|
+
const visibleTop = clippedTop + KEYBOARD_VISIBILITY_MARGIN;
|
|
317
|
+
const visibleBottom = clippedBottom - KEYBOARD_VISIBILITY_MARGIN;
|
|
318
|
+
if (visibleBottom <= visibleTop) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const targetRect = target.getBoundingClientRect();
|
|
323
|
+
const nextScrollTop =
|
|
324
|
+
scrollTarget.scrollTop +
|
|
325
|
+
(targetRect.top + targetRect.bottom - visibleTop - visibleBottom) / 2;
|
|
326
|
+
const destination = Math.round(clamp(nextScrollTop, 0, maxScrollTop));
|
|
327
|
+
|
|
328
|
+
const settled =
|
|
329
|
+
keyboardScrollElement === scrollTarget &&
|
|
330
|
+
Math.abs(keyboardScrollDestination - destination) <= 1;
|
|
331
|
+
|
|
332
|
+
if (!settled) {
|
|
333
|
+
// Commit the scroll only once the destination holds across two consecutive checks.
|
|
334
|
+
// Layout may still be reacting to the focus change (e.g. a footer sized by
|
|
335
|
+
// `:focus-within` resizing over a transition), and scrolling toward a
|
|
336
|
+
// mid-transition destination overshoots, then visibly pulls back once corrected.
|
|
337
|
+
// The destination is scroll-position-invariant, so an in-flight scroll of the
|
|
338
|
+
// container itself never defers the commit.
|
|
339
|
+
const checks = keyboardScrollElement === scrollTarget ? keyboardScrollChecks + 1 : 1;
|
|
340
|
+
keyboardScrollElement = scrollTarget;
|
|
341
|
+
keyboardScrollDestination = destination;
|
|
342
|
+
keyboardScrollChecks = checks;
|
|
343
|
+
keyboardScrollObserved = -1;
|
|
344
|
+
// Re-check next frame; give up and scroll anyway if layout never settles.
|
|
345
|
+
if (checks <= KEYBOARD_SETTLE_FRAME_LIMIT) {
|
|
346
|
+
keyboardFocusFrame.request(alignFocusedKeyboardTarget);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
} else if (keyboardScrollObserved >= 0) {
|
|
350
|
+
// A scroll toward this destination is already out. Leave it alone while it has
|
|
351
|
+
// arrived or is still progressing — re-issuing restarts the smooth-scroll easing
|
|
352
|
+
// curve, a visible stutter on every realign pass — and re-issue only when it
|
|
353
|
+
// stalled short (WebKit cancels in-flight smooth scrolls when its native reveal
|
|
354
|
+
// for the focus resolves).
|
|
355
|
+
const current = scrollTarget.scrollTop;
|
|
356
|
+
if (Math.abs(current - destination) <= 1) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (current !== keyboardScrollObserved) {
|
|
360
|
+
keyboardScrollObserved = current;
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
keyboardScrollElement = scrollTarget;
|
|
366
|
+
keyboardScrollDestination = destination;
|
|
367
|
+
keyboardScrollChecks = 0;
|
|
368
|
+
keyboardScrollObserved = scrollTarget.scrollTop;
|
|
369
|
+
animateKeyboardScroll(scrollTarget, destination);
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
const scheduleKeyboardFocusAlignment = () => {
|
|
373
|
+
keyboardFocusFrame.request(alignFocusedKeyboardTarget);
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
// When focus moves with the keyboard already up, no viewport resize events follow to
|
|
377
|
+
// re-run alignment, and the single frame-scheduled pass is unreliable: WebKit resolves
|
|
378
|
+
// the reveal for the focus asynchronously (a UI-process round trip) and cancels any
|
|
379
|
+
// in-flight scroll the pass started when it lands, and layout reacting to the focus
|
|
380
|
+
// change (e.g. a footer sized by `:focus-within` and the keyboard inset) settles only
|
|
381
|
+
// after its transition, so the pass measures stale geometry. Re-align on an interval
|
|
382
|
+
// until both settle; the alignment's scroll bookkeeping observes before re-issuing,
|
|
383
|
+
// so passes that find the scroll on course are inert.
|
|
384
|
+
const scheduleDelayedKeyboardRealign = () => {
|
|
385
|
+
let remainingPasses = KEYBOARD_REALIGN_MAX_PASSES;
|
|
386
|
+
const realign = () => {
|
|
387
|
+
alignFocusedKeyboardTarget();
|
|
388
|
+
remainingPasses -= 1;
|
|
389
|
+
if (remainingPasses > 0) {
|
|
390
|
+
keyboardRealignTimeout.start(KEYBOARD_REALIGN_INTERVAL, realign);
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
keyboardRealignTimeout.start(KEYBOARD_REALIGN_INTERVAL, realign);
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
const captureFocusedKeyboardTarget = (eventTarget: EventTarget | null) => {
|
|
397
|
+
if (nestedDrawerOpen) {
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Resolve through the same path as taps so contentEditable hosts (and labelled
|
|
402
|
+
// controls) are normalized identically for the focus and touch paths.
|
|
403
|
+
const target = resolveKeyboardInputTarget(eventTarget);
|
|
404
|
+
if (!target || !contains(rootElement, target)) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// A new field starts a fresh alignment; the scroll bookkeeping must not carry
|
|
409
|
+
// over from the previous field's scroll.
|
|
410
|
+
if (focusedKeyboardTargetRef.current !== target) {
|
|
411
|
+
keyboardScrollElement = null;
|
|
412
|
+
}
|
|
413
|
+
focusedKeyboardTargetRef.current = target;
|
|
414
|
+
return true;
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
const handleFocusIn = (event: FocusEvent) => {
|
|
418
|
+
// The programmatic transition is over once focus lands, which happens before
|
|
419
|
+
// `.focus()` returns. Any later `focusout` is the consumer's own — an `onFocus`
|
|
420
|
+
// handler that blurs or moves focus — and must be reconciled rather than
|
|
421
|
+
// suppressed, so stop suppressing here instead of waiting for `.focus()` to return.
|
|
422
|
+
programmaticKeyboardFocusRef.current = false;
|
|
423
|
+
|
|
424
|
+
consumePreemptedFocus();
|
|
425
|
+
|
|
426
|
+
if (!captureFocusedKeyboardTarget(getTarget(event))) {
|
|
427
|
+
// Focus landed outside any drawer keyboard input. The `focusout` on the previous
|
|
428
|
+
// field normally clears the tracked target, but the tap path suppresses that
|
|
429
|
+
// `focusout` via `programmaticKeyboardFocusRef`, so a consumer `onFocus` handler that
|
|
430
|
+
// redirects focus out of the drawer would otherwise leave a stale target holding its
|
|
431
|
+
// inset, slack, and pending realign. Reconcile against the real focus here.
|
|
432
|
+
// A handler that ends focus entirely emits no `focusin` to reconcile from; that case
|
|
433
|
+
// is covered by clearing the suppression flag above so its `focusout` is handled.
|
|
434
|
+
clearFocusedKeyboardTarget();
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Covers every way focus can land with the keyboard already up: native moves (the
|
|
439
|
+
// keyboard's previous/next arrows) and the tap path (which suppresses `focusout`
|
|
440
|
+
// handling via the programmatic flag).
|
|
441
|
+
if (getKeyboardVisualViewport(win) != null) {
|
|
442
|
+
scheduleDelayedKeyboardRealign();
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
scheduleKeyboardFocusAlignment();
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
const handleFocusOut = (event: FocusEvent) => {
|
|
449
|
+
// The blur inside `focusKeyboardInputWithoutPageScroll` is followed synchronously by
|
|
450
|
+
// a re-focus; clearing state here would drop the keyboard inset for a frame.
|
|
451
|
+
if (programmaticKeyboardFocusRef.current) {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (captureFocusedKeyboardTarget(event.relatedTarget)) {
|
|
456
|
+
const target = focusedKeyboardTargetRef.current;
|
|
457
|
+
const keyboardViewport = getKeyboardVisualViewport(win);
|
|
458
|
+
// The delayed realign passes are scheduled by the `focusin` that follows once
|
|
459
|
+
// focus lands on the captured target.
|
|
460
|
+
if (target && keyboardViewport) {
|
|
461
|
+
preemptFocusReveal(target, keyboardViewport);
|
|
462
|
+
}
|
|
463
|
+
scheduleKeyboardFocusAlignment();
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
clearFocusedKeyboardTarget();
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
const handleViewportUpdate = () => {
|
|
471
|
+
if (focusedKeyboardTargetRef.current || captureFocusedKeyboardTarget(activeElement(doc))) {
|
|
472
|
+
scheduleKeyboardFocusAlignment();
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
const cleanupListeners: Array<() => void> = [];
|
|
477
|
+
|
|
478
|
+
if (visualViewport) {
|
|
479
|
+
cleanupListeners.push(
|
|
480
|
+
addEventListener(visualViewport, 'resize', handleViewportUpdate),
|
|
481
|
+
addEventListener(visualViewport, 'scroll', handleViewportUpdate),
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const handleWindowScroll = () => {
|
|
486
|
+
if (restoreWindowScroll()) {
|
|
487
|
+
// Recompute the keyboard inset once the page is back at rest; measurements taken
|
|
488
|
+
// mid-reveal (a non-zero visual viewport offset) inflate it and push the popup up.
|
|
489
|
+
scheduleKeyboardFocusAlignment();
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
// Once the user puts a finger down they own the scroll position. Stop both the frame settle
|
|
494
|
+
// loop, which can center after changing layout settles, and the delayed passes, which can't
|
|
495
|
+
// distinguish a user scroll from a reveal scroll WebKit canceled. A later focus or viewport
|
|
496
|
+
// change reschedules alignment if it's still needed.
|
|
497
|
+
const cancelKeyboardRealignOnPointerDown = () => {
|
|
498
|
+
keyboardFocusFrame.cancel();
|
|
499
|
+
keyboardRealignTimeout.clear();
|
|
500
|
+
keyboardScrollElement = null;
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
cleanupListeners.push(
|
|
504
|
+
addEventListener(doc, 'focusin', handleFocusIn, true),
|
|
505
|
+
addEventListener(doc, 'focusout', handleFocusOut, true),
|
|
506
|
+
addEventListener(win, 'scroll', handleWindowScroll),
|
|
507
|
+
addEventListener(doc, 'pointerdown', cancelKeyboardRealignOnPointerDown, true),
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
if (captureFocusedKeyboardTarget(activeElement(doc))) {
|
|
511
|
+
scheduleKeyboardFocusAlignment();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
return () => {
|
|
515
|
+
cleanupListeners.forEach((cleanup) => cleanup());
|
|
516
|
+
consumePreemptedFocus();
|
|
517
|
+
clearFocusedKeyboardTarget();
|
|
518
|
+
rootElement.style.removeProperty(DrawerViewportCssVars.keyboardInset);
|
|
519
|
+
};
|
|
520
|
+
}, [
|
|
521
|
+
animateKeyboardScroll,
|
|
522
|
+
keyboardFocusFrame,
|
|
523
|
+
keyboardRealignTimeout,
|
|
524
|
+
modal,
|
|
525
|
+
mounted,
|
|
526
|
+
nestedDrawerOpen,
|
|
527
|
+
open,
|
|
528
|
+
restoreKeyboardScrollAdjustment,
|
|
529
|
+
rootElement,
|
|
530
|
+
setKeyboardScrollSlack,
|
|
531
|
+
]);
|
|
532
|
+
|
|
533
|
+
const onTouchStart = useStableCallback((event: React.TouchEvent<Element>) => {
|
|
534
|
+
const touch = event.touches[0];
|
|
535
|
+
pendingKeyboardFocusMovedRef.current = false;
|
|
536
|
+
keyboardTouchStartRef.current = { x: touch.clientX, y: touch.clientY };
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
const onTouchMove = useStableCallback((event: TouchEvent) => {
|
|
540
|
+
const touch = event.touches[0];
|
|
541
|
+
const touchStart = keyboardTouchStartRef.current;
|
|
542
|
+
|
|
543
|
+
if (!touch || !touchStart || pendingKeyboardFocusMovedRef.current) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Treat the gesture as a scroll/swipe (not a tap-to-focus) once the finger
|
|
548
|
+
// moves past the threshold, so we don't open the keyboard on a drag.
|
|
549
|
+
if (
|
|
550
|
+
Math.abs(touch.clientX - touchStart.x) > INPUT_TAP_MOVE_THRESHOLD ||
|
|
551
|
+
Math.abs(touch.clientY - touchStart.y) > INPUT_TAP_MOVE_THRESHOLD
|
|
552
|
+
) {
|
|
553
|
+
pendingKeyboardFocusMovedRef.current = true;
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
const onTouchEnd = useStableCallback((event: React.TouchEvent<Element>) => {
|
|
558
|
+
if (
|
|
559
|
+
!open ||
|
|
560
|
+
!mounted ||
|
|
561
|
+
nestedDrawerOpen ||
|
|
562
|
+
!rootElement ||
|
|
563
|
+
!keyboardTouchStartRef.current ||
|
|
564
|
+
pendingKeyboardFocusMovedRef.current
|
|
565
|
+
) {
|
|
566
|
+
resetTouchTrackingState();
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
const touch = event.changedTouches[0] ?? event.touches[0];
|
|
571
|
+
const root = rootElement.getRootNode();
|
|
572
|
+
const nativeEventTarget = getTarget(event);
|
|
573
|
+
const pointTarget = touch
|
|
574
|
+
? resolveKeyboardTouchTargetFromPoint(root, touch.clientX, touch.clientY)
|
|
575
|
+
: null;
|
|
576
|
+
|
|
577
|
+
// The lift point landed on another interactive/label element; let its native tap
|
|
578
|
+
// through instead of stealing it for the touchstart input.
|
|
579
|
+
if (pointTarget === KEYBOARD_TAP_BLOCKED) {
|
|
580
|
+
resetTouchTrackingState();
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
const keyboardTarget = touch && (pointTarget ?? resolveKeyboardTouchTarget(nativeEventTarget));
|
|
585
|
+
|
|
586
|
+
if (
|
|
587
|
+
keyboardTarget &&
|
|
588
|
+
(!contains(rootElement, keyboardTarget.focusTarget) ||
|
|
589
|
+
!contains(rootElement, keyboardTarget.clickTarget))
|
|
590
|
+
) {
|
|
591
|
+
resetTouchTrackingState();
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
if (keyboardTarget) {
|
|
596
|
+
const { clickTarget: keyboardClickTarget, focusTarget: keyboardFocusTarget } = keyboardTarget;
|
|
597
|
+
const win = ownerWindow(keyboardFocusTarget);
|
|
598
|
+
|
|
599
|
+
// While pinch-zoomed, keyboard alignment is suspended; let native behavior
|
|
600
|
+
// handle focus and caret placement instead of blurring and re-focusing.
|
|
601
|
+
if (win.visualViewport && win.visualViewport.scale !== 1) {
|
|
602
|
+
resetTouchTrackingState();
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// Already focused with the keyboard up: let the native tap through so it can
|
|
607
|
+
// reposition the caret, rather than blurring and re-focusing the same input.
|
|
608
|
+
if (
|
|
609
|
+
activeElement(ownerDocument(keyboardFocusTarget)) === keyboardFocusTarget &&
|
|
610
|
+
(!win.visualViewport || getKeyboardVisualViewport(win) != null)
|
|
611
|
+
) {
|
|
612
|
+
resetTouchTrackingState();
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// iOS only opens the software keyboard when focus happens synchronously
|
|
617
|
+
// inside the touch gesture. The flag suppresses the `focusout` cleanup the
|
|
618
|
+
// intermediate blur would otherwise trigger, so the keyboard inset isn't
|
|
619
|
+
// dropped for a frame between the blur and the re-focus. It is cleared by the
|
|
620
|
+
// `focusin` that lands, so only that blur is suppressed; the `finally` is the
|
|
621
|
+
// backstop for a target that never takes focus.
|
|
622
|
+
event.preventDefault();
|
|
623
|
+
programmaticKeyboardFocusRef.current = true;
|
|
624
|
+
try {
|
|
625
|
+
focusKeyboardInputWithoutPageScroll(keyboardFocusTarget);
|
|
626
|
+
} finally {
|
|
627
|
+
programmaticKeyboardFocusRef.current = false;
|
|
628
|
+
}
|
|
629
|
+
// Preventing the touchend default also suppresses the compatibility mouse
|
|
630
|
+
// events, including `click`; redispatch an untrusted replacement on the
|
|
631
|
+
// original tap target so click handlers still run with the tap coordinates.
|
|
632
|
+
dispatchKeyboardClick(keyboardClickTarget, touch);
|
|
633
|
+
resetTouchTrackingState();
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
resetTouchTrackingState();
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
const contextValue = React.useMemo<DrawerVirtualKeyboardContextValue>(
|
|
641
|
+
() => ({
|
|
642
|
+
onTouchStart,
|
|
643
|
+
onTouchMove,
|
|
644
|
+
onTouchEnd,
|
|
645
|
+
onTouchCancel: resetTouchTrackingState,
|
|
646
|
+
}),
|
|
647
|
+
[onTouchEnd, onTouchMove, onTouchStart, resetTouchTrackingState],
|
|
648
|
+
);
|
|
649
|
+
|
|
650
|
+
return (
|
|
651
|
+
<DrawerVirtualKeyboardContext.Provider value={contextValue}>
|
|
652
|
+
{children}
|
|
653
|
+
</DrawerVirtualKeyboardContext.Provider>
|
|
654
|
+
);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
export interface DrawerVirtualKeyboardProviderState {}
|
|
658
|
+
|
|
659
|
+
export interface DrawerVirtualKeyboardProviderProps {
|
|
660
|
+
children?: React.OctaneNode;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
export namespace DrawerVirtualKeyboardProvider {
|
|
664
|
+
export type State = DrawerVirtualKeyboardProviderState;
|
|
665
|
+
export type Props = DrawerVirtualKeyboardProviderProps;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
function isKeyboardInputElement(element: HTMLElement): boolean {
|
|
669
|
+
if (element.isContentEditable) {
|
|
670
|
+
return true;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
const win = ownerWindow(element);
|
|
674
|
+
|
|
675
|
+
if (
|
|
676
|
+
element instanceof win.HTMLTextAreaElement ||
|
|
677
|
+
(element instanceof win.HTMLInputElement && KEYBOARD_INPUT_TYPES.has(element.type))
|
|
678
|
+
) {
|
|
679
|
+
// Disabled controls can't focus or open the keyboard, so tap-to-focus must skip them —
|
|
680
|
+
// otherwise the dispatched click fires handlers a native tap on a disabled control never would.
|
|
681
|
+
return !element.matches(':disabled');
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
return false;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
function resolveKeyboardInputTarget(target: EventTarget | null): HTMLElement | null {
|
|
688
|
+
if (!isHTMLElement(target)) {
|
|
689
|
+
return null;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
if (isKeyboardInputElement(target)) {
|
|
693
|
+
return target.isContentEditable ? getContentEditableHost(target) : target;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
const label = target.closest('label') as HTMLLabelElement | null;
|
|
697
|
+
const control = label?.control ?? null;
|
|
698
|
+
|
|
699
|
+
return isHTMLElement(control) && isKeyboardInputElement(control) ? control : null;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
function resolveKeyboardTouchTarget(target: EventTarget | null): KeyboardTouchTarget | null {
|
|
703
|
+
if (!isHTMLElement(target)) {
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
const focusTarget = resolveKeyboardInputTarget(target);
|
|
708
|
+
if (!focusTarget) {
|
|
709
|
+
return null;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
return {
|
|
713
|
+
focusTarget,
|
|
714
|
+
clickTarget: target,
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// Inherited-editable descendants (no `contenteditable` attribute of their own) are not
|
|
719
|
+
// focusable, so focusing them is a no-op; resolve taps on them to the editing host.
|
|
720
|
+
function getContentEditableHost(element: HTMLElement): HTMLElement {
|
|
721
|
+
let host = element;
|
|
722
|
+
while (host.parentElement?.isContentEditable) {
|
|
723
|
+
host = host.parentElement;
|
|
724
|
+
}
|
|
725
|
+
return host;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
function resolveKeyboardTouchTargetFromPoint(
|
|
729
|
+
root: Node,
|
|
730
|
+
clientX: number,
|
|
731
|
+
clientY: number,
|
|
732
|
+
): KeyboardTouchTarget | typeof KEYBOARD_TAP_BLOCKED | null {
|
|
733
|
+
const exactTarget = getElementAtPoint(root, clientX, clientY);
|
|
734
|
+
if (isHTMLElement(exactTarget)) {
|
|
735
|
+
const exactKeyboardTarget = resolveKeyboardInputTarget(exactTarget);
|
|
736
|
+
if (exactKeyboardTarget) {
|
|
737
|
+
return {
|
|
738
|
+
focusTarget: exactKeyboardTarget,
|
|
739
|
+
clickTarget: exactTarget,
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// Probing nearby points compensates for iOS retargeting taps while the page reacts
|
|
745
|
+
// to the keyboard, but it must not steal a tap that lands on another interactive
|
|
746
|
+
// element — that would suppress its click and focus a neighboring field instead.
|
|
747
|
+
// `closest('label')` covers labels of non-keyboard controls (e.g. checkboxes).
|
|
748
|
+
// Returning the blocked sentinel (rather than `null`) stops the caller from falling
|
|
749
|
+
// back to the touchstart target, which would re-steal the very tap rejected here.
|
|
750
|
+
if (isInteractiveElement(exactTarget) || exactTarget?.closest('label') != null) {
|
|
751
|
+
return KEYBOARD_TAP_BLOCKED;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
for (const [offsetX, offsetY] of [
|
|
755
|
+
[0, INPUT_TAP_HIT_SLOP],
|
|
756
|
+
[0, -INPUT_TAP_HIT_SLOP],
|
|
757
|
+
[INPUT_TAP_HIT_SLOP, 0],
|
|
758
|
+
[-INPUT_TAP_HIT_SLOP, 0],
|
|
759
|
+
]) {
|
|
760
|
+
const keyboardTarget = resolveKeyboardInputTarget(
|
|
761
|
+
getElementAtPoint(root, clientX + offsetX, clientY + offsetY),
|
|
762
|
+
);
|
|
763
|
+
|
|
764
|
+
if (keyboardTarget) {
|
|
765
|
+
return {
|
|
766
|
+
focusTarget: keyboardTarget,
|
|
767
|
+
clickTarget: keyboardTarget,
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
return null;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
function dispatchKeyboardClick(target: HTMLElement, touch: Pick<Touch, 'clientX' | 'clientY'>) {
|
|
776
|
+
const win = ownerWindow(target);
|
|
777
|
+
const ClickEvent = win.PointerEvent ?? win.MouseEvent;
|
|
778
|
+
|
|
779
|
+
target.dispatchEvent(
|
|
780
|
+
new ClickEvent('click', {
|
|
781
|
+
bubbles: true,
|
|
782
|
+
cancelable: true,
|
|
783
|
+
clientX: touch.clientX,
|
|
784
|
+
clientY: touch.clientY,
|
|
785
|
+
detail: 1,
|
|
786
|
+
view: win,
|
|
787
|
+
}),
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
function focusKeyboardInputWithoutPageScroll(target: HTMLElement) {
|
|
792
|
+
const wasFocused = activeElement(ownerDocument(target)) === target;
|
|
793
|
+
// iOS Safari can still scroll the page for transformed sheets even with preventScroll.
|
|
794
|
+
// Move the input off-screen only for the synchronous focus call; `preventScroll`
|
|
795
|
+
// suppresses the in-page ancestor scrolling that would otherwise chase the fake rect.
|
|
796
|
+
const restoreStyles = overrideGeometryDuringFocus(target, -2000);
|
|
797
|
+
try {
|
|
798
|
+
if (wasFocused) {
|
|
799
|
+
target.blur();
|
|
800
|
+
}
|
|
801
|
+
target.focus({ preventScroll: true });
|
|
802
|
+
} finally {
|
|
803
|
+
restoreStyles();
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
// Overrides the painted geometry WebKit samples when an element gains focus. The rect is
|
|
808
|
+
// hidden (opacity) rather than detached so layout is unaffected; the caller must restore
|
|
809
|
+
// synchronously before the next paint.
|
|
810
|
+
function overrideGeometryDuringFocus(target: HTMLElement, translateY: number): () => void {
|
|
811
|
+
const previousOpacity = target.style.opacity;
|
|
812
|
+
const previousTransform = target.style.transform;
|
|
813
|
+
const previousTransition = target.style.transition;
|
|
814
|
+
|
|
815
|
+
target.style.transition = 'none';
|
|
816
|
+
target.style.opacity = '0';
|
|
817
|
+
target.style.transform = `translateY(${translateY}px)`;
|
|
818
|
+
|
|
819
|
+
return () => {
|
|
820
|
+
target.style.opacity = previousOpacity;
|
|
821
|
+
target.style.transform = previousTransform;
|
|
822
|
+
target.style.transition = previousTransition;
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
function findKeyboardScrollTarget(target: HTMLElement, root: HTMLElement): HTMLElement | null {
|
|
827
|
+
// Start at the parent: scrolling the focused field's own content (an overflowing
|
|
828
|
+
// textarea is scrollable itself) can never move its box out from under the keyboard.
|
|
829
|
+
// `getParentNode` crosses shadow boundaries so an input inside a shadow root still reaches
|
|
830
|
+
// the drawer body scroller. Prefer an already-scrollable ancestor, then fall back to one
|
|
831
|
+
// that only becomes scrollable once keyboard slack is added (overflow intent without
|
|
832
|
+
// current overflow).
|
|
833
|
+
const scrollStart = getParentNode(target);
|
|
834
|
+
return (
|
|
835
|
+
findScrollableTouchTarget(scrollStart, root, 'vertical') ??
|
|
836
|
+
findScrollableTouchTarget(scrollStart, root, 'vertical', true)
|
|
837
|
+
);
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
function getKeyboardVisualViewport(win: Window): KeyboardVisualViewport | null {
|
|
841
|
+
const visualViewport = win.visualViewport;
|
|
842
|
+
|
|
843
|
+
if (!visualViewport || visualViewport.scale !== 1) {
|
|
844
|
+
return null;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
const reducedHeight = win.innerHeight - visualViewport.height;
|
|
848
|
+
// Treat small viewport changes as browser chrome movement, not the software keyboard.
|
|
849
|
+
if (reducedHeight <= KEYBOARD_RESIZE_THRESHOLD) {
|
|
850
|
+
return null;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
const top = Math.max(0, visualViewport.offsetTop);
|
|
854
|
+
return {
|
|
855
|
+
top,
|
|
856
|
+
bottom: Math.min(win.innerHeight, top + visualViewport.height),
|
|
857
|
+
};
|
|
858
|
+
}
|