@multiplatform.one/forms 7.81.0 → 7.81.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AdaptivePopup/index.cjs +1 -0
- package/dist/cjs/AdaptivePopup/index.native.js +3 -2
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
- package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/cjs/Button/index.native.js +2 -2
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Button/webGlass.native.js.map +1 -1
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/index.native.js +3 -3
- package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
- package/dist/cjs/ControlGroup/index.native.js +1 -1
- package/dist/cjs/ControlGroup/index.native.js.map +1 -1
- package/dist/cjs/DescriptionList/index.native.js +2 -2
- package/dist/cjs/DescriptionList/index.native.js.map +1 -1
- package/dist/cjs/ErrorSummary.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/index.native.js +1 -1
- package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
- package/dist/cjs/FieldGroup.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/index.native.js +212 -66
- package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
- package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/cjs/Form/index.native.js +1 -1
- package/dist/cjs/Form/index.native.js.map +1 -1
- package/dist/cjs/Form/submissionController.native.js.map +1 -1
- package/dist/cjs/Form/validateOn.native.js.map +1 -1
- package/dist/cjs/FormGrid.native.js.map +1 -1
- package/dist/cjs/FormSection.native.js.map +1 -1
- package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/InputParts/keyboardAppearance.native.js.map +1 -1
- package/dist/cjs/Label/index.native.js.map +1 -1
- package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
- package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
- package/dist/cjs/MediaPicker/types.native.js.map +1 -1
- package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
- package/dist/cjs/Skeleton/index.native.js.map +1 -1
- package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
- package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
- package/dist/cjs/Table/index.native.js.map +1 -1
- package/dist/cjs/Wheel/haptic.native.js.map +1 -1
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
- package/dist/cjs/actionLabel.native.js.map +1 -1
- package/dist/cjs/fieldDefaults.native.js.map +1 -1
- package/dist/cjs/fieldLayout.native.js +1 -1
- package/dist/cjs/fieldLayout.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
- package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/index.native.js +2 -2
- package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
- package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
- package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
- package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/index.native.js +5 -5
- package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
- package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/index.native.js +2 -2
- package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
- package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
- package/dist/cjs/fields/Duration/DurationWheel.native.js +1 -1
- package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/cjs/fields/Duration/durationWheelTypes.native.js.map +1 -1
- package/dist/cjs/fields/Duration/index.native.js +3 -3
- package/dist/cjs/fields/Duration/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/index.native.js +2 -2
- package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/index.native.js +5 -5
- package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
- package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/cjs/fields/Icon/index.native.js +3 -3
- package/dist/cjs/fields/Icon/index.native.js.map +1 -1
- package/dist/cjs/fields/ImageField/index.native.js +2 -2
- package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
- package/dist/cjs/fields/Input/index.native.js +3 -3
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.native.js +3 -3
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/index.native.js +3 -3
- package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
- package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
- package/dist/cjs/fields/Progress/index.native.js +1 -1
- package/dist/cjs/fields/Progress/index.native.js.map +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/index.native.js +1 -1
- package/dist/cjs/fields/Rating/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/cjs/fields/Rating/types.native.js.map +1 -1
- package/dist/cjs/fields/SearchInput/index.native.js +2 -2
- package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +19 -2
- package/dist/cjs/fields/Select/index.native.js +26 -6
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.native.js +2 -2
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.native.js +1 -1
- package/dist/cjs/fields/Slider/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/index.native.js +2 -2
- package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
- package/dist/cjs/fields/Switch/index.native.js +2 -2
- package/dist/cjs/fields/Switch/index.native.js.map +1 -1
- package/dist/cjs/fields/TextArea/index.native.js +2 -2
- package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/index.native.js +2 -2
- package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
- package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
- package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
- package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
- package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +1 -1
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
- package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
- package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
- package/dist/cjs/formSpacing.native.js.map +1 -1
- package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
- package/dist/cjs/index.native.js +45 -45
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
- package/dist/cjs/keyboard/chain.native.js.map +1 -1
- package/dist/cjs/keyboard/index.native.js.map +1 -1
- package/dist/cjs/keyboard/types.native.js.map +1 -1
- package/dist/cjs/requiredMarking.native.js.map +1 -1
- package/dist/cjs/shared/CheckGlyph.native.js.map +1 -1
- package/dist/cjs/shared/TimeColumn.native.js +1 -1
- package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
- package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
- package/dist/cjs/shared/checkedOnField.cjs +104 -0
- package/dist/cjs/shared/checkedOnField.native.js +117 -0
- package/dist/cjs/shared/checkedOnField.native.js.map +1 -0
- package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
- package/dist/cjs/shared/colorRamps.native.js.map +1 -1
- package/dist/cjs/shared/devWarn.native.js.map +1 -1
- package/dist/cjs/shared/fieldRowContext.native.js.map +1 -1
- package/dist/cjs/shared/floatingList.cjs +7 -79
- package/dist/cjs/shared/floatingList.native.js +8 -90
- package/dist/cjs/shared/floatingList.native.js.map +1 -1
- package/dist/cjs/shared/focusManagement.native.js.map +1 -1
- package/dist/cjs/shared/groupContext.native.js.map +1 -1
- package/dist/cjs/shared/i18n.native.js.map +1 -1
- package/dist/cjs/shared/instantMotion.native.js.map +1 -1
- package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
- package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
- package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
- package/dist/cjs/shared/overlayStack.native.js.map +1 -1
- package/dist/cjs/shared/panelPortal.native.js.map +1 -1
- package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
- package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
- package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
- package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
- package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
- package/dist/cjs/shared/systemControls.native.js.map +1 -1
- package/dist/cjs/shared/t.native.js.map +1 -1
- package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
- package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
- package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/cjs/shared/utils.native.js +1 -1
- package/dist/cjs/shared/utils.native.js.map +1 -1
- package/dist/cjs/shared/zIndex.native.js.map +1 -1
- package/dist/cjs/standardActions.native.js.map +1 -1
- package/dist/cjs/themedPrimitives.native.js.map +1 -1
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/utils/LinkCell.native.js.map +1 -1
- package/dist/esm/AdaptivePopup/index.mjs +2 -1
- package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js +2 -1
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/esm/Button/circleGlyph.native.js.map +1 -1
- package/dist/esm/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Button/webGlass.native.js.map +1 -1
- package/dist/esm/Chip/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
- package/dist/esm/ControlGroup/index.native.js.map +1 -1
- package/dist/esm/DescriptionList/index.native.js.map +1 -1
- package/dist/esm/ErrorSummary.native.js.map +1 -1
- package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/esm/FieldDisplay/index.native.js.map +1 -1
- package/dist/esm/FieldGroup.native.js.map +1 -1
- package/dist/esm/FloatingPanel/PanelHeader.native.js.map +1 -1
- package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -1
- package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -1
- package/dist/esm/FloatingPanel/coverRect.native.js.map +1 -1
- package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -1
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +174 -28
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/esm/FloatingPanel/paintedBox.native.js.map +1 -1
- package/dist/esm/FloatingPanel/panelWidth.native.js.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -1
- package/dist/esm/FloatingPanel/trailingAction.native.js.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/Form/index.native.js.map +1 -1
- package/dist/esm/Form/submissionController.native.js.map +1 -1
- package/dist/esm/Form/validateOn.native.js.map +1 -1
- package/dist/esm/FormGrid.native.js.map +1 -1
- package/dist/esm/FormSection.native.js.map +1 -1
- package/dist/esm/InputParts/PasswordReveal.native.js.map +1 -1
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/InputParts/keyboardAppearance.native.js.map +1 -1
- package/dist/esm/Label/index.native.js.map +1 -1
- package/dist/esm/MediaPicker/base64.native.js.map +1 -1
- package/dist/esm/MediaPicker/payload.native.js.map +1 -1
- package/dist/esm/MediaPicker/types.native.js.map +1 -1
- package/dist/esm/MediaPicker/useMediaPicker.native.js.map +1 -1
- package/dist/esm/Skeleton/index.native.js.map +1 -1
- package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
- package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
- package/dist/esm/Table/index.native.js.map +1 -1
- package/dist/esm/Wheel/haptic.native.js.map +1 -1
- package/dist/esm/Wheel/index.native.js.map +1 -1
- package/dist/esm/Wheel/wheelShared.native.js.map +1 -1
- package/dist/esm/actionLabel.native.js.map +1 -1
- package/dist/esm/fieldDefaults.native.js.map +1 -1
- package/dist/esm/fieldLayout.native.js.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
- package/dist/esm/fields/Barcode/index.native.js.map +1 -1
- package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
- package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/SystemColorField.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
- package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
- package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/esm/fields/Duration/durationWheelTypes.native.js.map +1 -1
- package/dist/esm/fields/Duration/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -1
- package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.native.js.map +1 -1
- package/dist/esm/fields/ImageField/index.native.js.map +1 -1
- package/dist/esm/fields/Input/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -1
- package/dist/esm/fields/Progress/index.native.js.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/esm/fields/Rating/types.native.js.map +1 -1
- package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
- package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +19 -2
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +22 -2
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/esm/fields/Signature/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/esm/fields/Stepper/index.native.js.map +1 -1
- package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/esm/fields/Switch/footprint.native.js.map +1 -1
- package/dist/esm/fields/Switch/index.native.js.map +1 -1
- package/dist/esm/fields/TextArea/index.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
- package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
- package/dist/esm/fields/nativeSelect.native.js.map +1 -1
- package/dist/esm/fields/selectedOrder.native.js.map +1 -1
- package/dist/esm/formSpacing.native.js.map +1 -1
- package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/keyboard/chain.native.js.map +1 -1
- package/dist/esm/keyboard/index.native.js.map +1 -1
- package/dist/esm/keyboard/types.native.js.map +1 -1
- package/dist/esm/requiredMarking.native.js.map +1 -1
- package/dist/esm/shared/CheckGlyph.native.js.map +1 -1
- package/dist/esm/shared/TimeColumn.native.js.map +1 -1
- package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
- package/dist/esm/shared/checkedOnField.mjs +76 -0
- package/dist/esm/shared/checkedOnField.mjs.map +1 -0
- package/dist/esm/shared/checkedOnField.native.js +86 -0
- package/dist/esm/shared/checkedOnField.native.js.map +1 -0
- package/dist/esm/shared/choiceRowPress.native.js.map +1 -1
- package/dist/esm/shared/colorRamps.native.js.map +1 -1
- package/dist/esm/shared/devWarn.native.js.map +1 -1
- package/dist/esm/shared/fieldRowContext.native.js.map +1 -1
- package/dist/esm/shared/floatingList.mjs +3 -75
- package/dist/esm/shared/floatingList.mjs.map +1 -1
- package/dist/esm/shared/floatingList.native.js +3 -85
- package/dist/esm/shared/floatingList.native.js.map +1 -1
- package/dist/esm/shared/focusManagement.native.js.map +1 -1
- package/dist/esm/shared/groupContext.native.js.map +1 -1
- package/dist/esm/shared/i18n.native.js.map +1 -1
- package/dist/esm/shared/instantMotion.native.js.map +1 -1
- package/dist/esm/shared/nativeA11y.native.js.map +1 -1
- package/dist/esm/shared/nativeAutoFocus.native.js.map +1 -1
- package/dist/esm/shared/overlaySizeClass.native.js.map +1 -1
- package/dist/esm/shared/overlayStack.native.js.map +1 -1
- package/dist/esm/shared/panelPortal.native.js.map +1 -1
- package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
- package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
- package/dist/esm/shared/restoreRetries.native.js.map +1 -1
- package/dist/esm/shared/sheetNavigation.native.js.map +1 -1
- package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -1
- package/dist/esm/shared/systemControls.native.js.map +1 -1
- package/dist/esm/shared/t.native.js.map +1 -1
- package/dist/esm/shared/tableCellContext.native.js.map +1 -1
- package/dist/esm/shared/useDragScroll.native.js.map +1 -1
- package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/esm/shared/utils.native.js.map +1 -1
- package/dist/esm/shared/zIndex.native.js.map +1 -1
- package/dist/esm/standardActions.native.js.map +1 -1
- package/dist/esm/themedPrimitives.native.js.map +1 -1
- package/dist/esm/types.native.js.map +1 -1
- package/dist/esm/utils/LinkCell.native.js.map +1 -1
- package/dist/jsx/AdaptivePopup/index.mjs +2 -1
- package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
- package/dist/jsx/AdaptivePopup/index.native.js +1 -0
- package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +212 -66
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +19 -2
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +22 -2
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/shared/checkedOnField.mjs +76 -0
- package/dist/jsx/shared/checkedOnField.mjs.map +1 -0
- package/dist/jsx/shared/checkedOnField.native.js +117 -0
- package/dist/jsx/shared/checkedOnField.native.js.map +1 -0
- package/dist/jsx/shared/floatingList.mjs +3 -75
- package/dist/jsx/shared/floatingList.mjs.map +1 -1
- package/dist/jsx/shared/floatingList.native.js +7 -89
- package/dist/jsx/shared/floatingList.native.js.map +1 -1
- package/package.json +8 -8
- package/src/AdaptivePopup/index.tsx +5 -2
- package/src/FloatingPanel/index.native.tsx +194 -20
- package/src/FloatingPanel/index.tsx +10 -0
- package/src/FloatingPanel/sheetGrabber.spec.tsx +53 -0
- package/src/fields/Select/Select.popUp.native.spec.tsx +276 -0
- package/src/fields/Select/Select.stories.tsx +16 -0
- package/src/fields/Select/index.tsx +18 -2
- package/src/shared/checkedOnField.ts +116 -0
- package/src/shared/floatingList.tsx +8 -116
- package/types/AdaptivePopup/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.d.ts +15 -0
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts +8 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/shared/checkedOnField.d.ts +54 -0
- package/types/shared/checkedOnField.d.ts.map +1 -0
- package/types/shared/floatingList.d.ts +2 -53
- package/types/shared/floatingList.d.ts.map +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FZ-8655 (LC-112, Round 40 parity): a native Select opens the way the web's
|
|
3
|
+
* covering Select does, a macOS pop-up. The rows are measured in the native
|
|
4
|
+
* FloatingPanel and placed by the placement code the web shares
|
|
5
|
+
* (`placeCheckedOnField`): the checked row on the field, or the first row with
|
|
6
|
+
* no value, and never a field echo. A list that fits shows whole, a taller one
|
|
7
|
+
* scrolls with its clipped edges on the safe edges. On a phone a long list
|
|
8
|
+
* keeps its sheet at page level.
|
|
9
|
+
*/
|
|
10
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
11
|
+
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
12
|
+
import { act } from "@testing-library/react";
|
|
13
|
+
import type { ReactNode } from "react";
|
|
14
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
15
|
+
import { panelViewportPadding } from "../../FloatingPanel/useFloatingPanel";
|
|
16
|
+
import { OverlayStackProvider } from "../../shared/overlayStack";
|
|
17
|
+
import { placeCheckedOnField, scrollArrowBand } from "../../shared/checkedOnField";
|
|
18
|
+
import { Select } from "./index";
|
|
19
|
+
|
|
20
|
+
const screen = vi.hoisted(() => ({ width: 1024, height: 1366 }));
|
|
21
|
+
|
|
22
|
+
vi.mock("tamagui", async (importOriginal) => ({
|
|
23
|
+
...(await importOriginal<typeof import("tamagui")>()),
|
|
24
|
+
isWeb: false,
|
|
25
|
+
}));
|
|
26
|
+
vi.mock("react-native-web", async (importOriginal) => ({
|
|
27
|
+
...(await importOriginal<typeof import("react-native")>()),
|
|
28
|
+
ActionSheetIOS: undefined,
|
|
29
|
+
Modal: ({ children, visible }: { children: ReactNode; visible: boolean }) =>
|
|
30
|
+
visible ? children : null,
|
|
31
|
+
useWindowDimensions: () => ({ ...screen, scale: 2, fontScale: 1 }),
|
|
32
|
+
}));
|
|
33
|
+
vi.mock("../../FloatingPanel", async (importOriginal) => {
|
|
34
|
+
const actual = await importOriginal<typeof import("../../FloatingPanel")>();
|
|
35
|
+
const native = await import("../../FloatingPanel/index.native");
|
|
36
|
+
return { ...actual, FloatingPanel: native.FloatingPanel };
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const rowHeight = 44;
|
|
40
|
+
let band = 0;
|
|
41
|
+
let field = { x: 40, y: 400, width: 320, height: 44 };
|
|
42
|
+
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
vi.useFakeTimers();
|
|
45
|
+
field = { x: 40, y: 400, width: 320, height: 44 };
|
|
46
|
+
screen.width = 1024;
|
|
47
|
+
screen.height = 1366;
|
|
48
|
+
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(() => ({
|
|
49
|
+
...field,
|
|
50
|
+
left: field.x,
|
|
51
|
+
top: field.y,
|
|
52
|
+
right: field.x + field.width,
|
|
53
|
+
bottom: field.y + field.height,
|
|
54
|
+
toJSON: () => ({}),
|
|
55
|
+
}));
|
|
56
|
+
});
|
|
57
|
+
afterEach(() => {
|
|
58
|
+
vi.restoreAllMocks();
|
|
59
|
+
vi.useRealTimers();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/** The band the panel lays out for: half this preset's menu row. */
|
|
63
|
+
function BandProbe() {
|
|
64
|
+
const { knobProps } = useResolvedKnobs({ painted: false });
|
|
65
|
+
band = scrollArrowBand(knobProps.menuRow.minHeight);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const cities = (count: number) =>
|
|
70
|
+
Array.from({ length: count }, (_, i) => ({ value: `c${i}`, label: `City ${i}` }));
|
|
71
|
+
|
|
72
|
+
function tap(target: Element) {
|
|
73
|
+
act(() => {
|
|
74
|
+
target.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, button: 0 }));
|
|
75
|
+
target.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, button: 0 }));
|
|
76
|
+
target.dispatchEvent(new MouseEvent("click", { bubbles: true, button: 0 }));
|
|
77
|
+
});
|
|
78
|
+
act(() => {
|
|
79
|
+
vi.advanceTimersByTime(1);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** RN-web parks onLayout on the node for a ResizeObserver happy-dom never fires. */
|
|
84
|
+
function layout(node: Element, box: { y?: number; width: number; height: number }) {
|
|
85
|
+
const onLayout = (node as unknown as { __reactLayoutHandler?: (event: unknown) => void })
|
|
86
|
+
.__reactLayoutHandler;
|
|
87
|
+
expect(onLayout).toBeTypeOf("function");
|
|
88
|
+
act(() => {
|
|
89
|
+
onLayout?.({ nativeEvent: { layout: { x: 0, y: 0, ...box } } });
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const byTestId = (id: string) => document.querySelector<HTMLElement>(`[data-testid="${id}"]`);
|
|
94
|
+
const menu = () => byTestId("floating-panel-menu");
|
|
95
|
+
const px = (value: string | undefined) => Number.parseFloat(value ?? "");
|
|
96
|
+
|
|
97
|
+
function open({
|
|
98
|
+
count,
|
|
99
|
+
checked,
|
|
100
|
+
inOverlay = false,
|
|
101
|
+
}: {
|
|
102
|
+
count: number;
|
|
103
|
+
checked?: number;
|
|
104
|
+
inOverlay?: boolean;
|
|
105
|
+
}) {
|
|
106
|
+
const options = cities(count);
|
|
107
|
+
const select = (
|
|
108
|
+
<Select
|
|
109
|
+
aria-label="City"
|
|
110
|
+
options={options}
|
|
111
|
+
value={checked === undefined ? undefined : `c${checked}`}
|
|
112
|
+
/>
|
|
113
|
+
);
|
|
114
|
+
const view = renderWithProviders(
|
|
115
|
+
<>
|
|
116
|
+
<BandProbe />
|
|
117
|
+
{inOverlay ? <OverlayStackProvider zIndex={100_000}>{select}</OverlayStackProvider> : select}
|
|
118
|
+
</>,
|
|
119
|
+
);
|
|
120
|
+
tap(view.getByRole("button", { name: "City" }));
|
|
121
|
+
return { view, options, contentHeight: count * rowHeight };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function measureRows(
|
|
125
|
+
view: ReturnType<typeof renderWithProviders>,
|
|
126
|
+
index: number,
|
|
127
|
+
contentHeight: number,
|
|
128
|
+
) {
|
|
129
|
+
const frame = menu();
|
|
130
|
+
expect(frame).not.toBeNull();
|
|
131
|
+
layout(frame as HTMLElement, { width: 320, height: Math.min(contentHeight + 2, 900) });
|
|
132
|
+
layout(view.getByRole("button", { name: `City ${index}` }), {
|
|
133
|
+
y: index * rowHeight,
|
|
134
|
+
width: 320,
|
|
135
|
+
height: rowHeight,
|
|
136
|
+
});
|
|
137
|
+
layout(byTestId("floating-panel-menu-content") as HTMLElement, {
|
|
138
|
+
width: 320,
|
|
139
|
+
height: contentHeight,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** The padding box the shared helper asks for, from the screen under test. */
|
|
144
|
+
function expected(index: number, contentHeight: number, border: number) {
|
|
145
|
+
return placeCheckedOnField({
|
|
146
|
+
fieldTop: field.y,
|
|
147
|
+
fieldBottom: field.y + field.height,
|
|
148
|
+
rowTop: index * rowHeight,
|
|
149
|
+
rowHeight,
|
|
150
|
+
contentHeight,
|
|
151
|
+
boundsTop: panelViewportPadding + border,
|
|
152
|
+
boundsBottom: screen.height - panelViewportPadding - border,
|
|
153
|
+
band,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function border() {
|
|
158
|
+
const surface = byTestId("floating-panel-menu-surface") as HTMLElement;
|
|
159
|
+
return Math.round(px(getComputedStyle(surface).borderTopWidth)) || 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
describe("Select native pop-up (FZ-8655)", () => {
|
|
163
|
+
it("never echoes the field, and paints nothing until its rows are measured", () => {
|
|
164
|
+
const { view, contentHeight } = open({ count: 5, checked: 2 });
|
|
165
|
+
expect(menu()?.style.opacity).toBe("0");
|
|
166
|
+
measureRows(view, 2, contentHeight);
|
|
167
|
+
expect(menu()?.style.opacity).toBe("1");
|
|
168
|
+
expect(byTestId("floating-panel-menu-echo")).toBeNull();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("centres the checked row on the field, the rows before it running up", () => {
|
|
172
|
+
const { view, contentHeight } = open({ count: 5, checked: 2 });
|
|
173
|
+
measureRows(view, 2, contentHeight);
|
|
174
|
+
const b = border();
|
|
175
|
+
const fit = expected(2, contentHeight, b);
|
|
176
|
+
expect(px(menu()?.style.top)).toBe(fit.top - b);
|
|
177
|
+
expect(fit.top + 2 * rowHeight).toBe(field.y);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("puts the first row on the field with no value", () => {
|
|
181
|
+
const { view, contentHeight } = open({ count: 5 });
|
|
182
|
+
measureRows(view, 0, contentHeight);
|
|
183
|
+
const b = border();
|
|
184
|
+
expect(px(menu()?.style.top) + b).toBe(field.y);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("shows a short list by the bottom edge whole, slid inside the safe edge", () => {
|
|
188
|
+
field = { ...field, y: 1300 };
|
|
189
|
+
const { view, contentHeight } = open({ count: 7, checked: 3 });
|
|
190
|
+
measureRows(view, 3, contentHeight);
|
|
191
|
+
const b = border();
|
|
192
|
+
const top = px(menu()?.style.top);
|
|
193
|
+
expect(top + b + contentHeight).toBe(screen.height - panelViewportPadding - b);
|
|
194
|
+
expect(px(menu()?.style.maxHeight)).toBe(contentHeight + 2 * b);
|
|
195
|
+
expect(byTestId("floating-panel-scroll-up")).toBeNull();
|
|
196
|
+
expect(byTestId("floating-panel-scroll-down")).toBeNull();
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("opens at every list length at regular width, not a sheet or a regular panel", () => {
|
|
200
|
+
const { view, contentHeight } = open({ count: 20, checked: 10 });
|
|
201
|
+
measureRows(view, 10, contentHeight);
|
|
202
|
+
expect(byTestId("floating-panel-sheet")).toBeNull();
|
|
203
|
+
expect(byTestId("floating-panel-regular")).toBeNull();
|
|
204
|
+
expect(byTestId("floating-panel-menu-echo")).toBeNull();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("scrolls a list taller than the safe viewport, its clipped edges on the safe edges", () => {
|
|
208
|
+
const { view, contentHeight } = open({ count: 60, checked: 30 });
|
|
209
|
+
measureRows(view, 30, contentHeight);
|
|
210
|
+
const b = border();
|
|
211
|
+
const fit = expected(30, contentHeight, b);
|
|
212
|
+
expect(fit.scrollTop).toBeGreaterThan(0);
|
|
213
|
+
expect(px(menu()?.style.top)).toBe(panelViewportPadding);
|
|
214
|
+
expect(px(menu()?.style.maxHeight)).toBe(screen.height - 2 * panelViewportPadding);
|
|
215
|
+
expect(byTestId("floating-panel-scroll-up")).not.toBeNull();
|
|
216
|
+
expect(byTestId("floating-panel-scroll-down")).not.toBeNull();
|
|
217
|
+
const checkedTop = fit.top - fit.scrollTop + 30 * rowHeight;
|
|
218
|
+
expect(checkedTop + rowHeight / 2).toBe(field.y + field.height / 2);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("keeps an arrow only on the side that's clipped", () => {
|
|
222
|
+
const { view, contentHeight } = open({ count: 60, checked: 1 });
|
|
223
|
+
measureRows(view, 1, contentHeight);
|
|
224
|
+
expect(byTestId("floating-panel-scroll-up")).toBeNull();
|
|
225
|
+
expect(byTestId("floating-panel-scroll-down")).not.toBeNull();
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it.each([
|
|
229
|
+
["top", 20],
|
|
230
|
+
["middle", 640],
|
|
231
|
+
["bottom", 1290],
|
|
232
|
+
])("keeps the checked row inside the panel, clear of its bands, at the %s", (_name, y) => {
|
|
233
|
+
field = { ...field, y };
|
|
234
|
+
for (const checked of [0, 1, 29, 58, 59]) {
|
|
235
|
+
const { view, contentHeight } = open({ count: 60, checked });
|
|
236
|
+
measureRows(view, checked, contentHeight);
|
|
237
|
+
const b = border();
|
|
238
|
+
const fit = expected(checked, contentHeight, b);
|
|
239
|
+
const rowTop = fit.top - fit.scrollTop + checked * rowHeight;
|
|
240
|
+
expect(px(menu()?.style.top)).toBe(fit.top - b);
|
|
241
|
+
expect(rowTop).toBeGreaterThanOrEqual(fit.top);
|
|
242
|
+
expect(rowTop + rowHeight).toBeLessThanOrEqual(fit.top + fit.height);
|
|
243
|
+
view.unmount();
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it("keeps the sheet for a long list on a phone at page level", () => {
|
|
248
|
+
screen.width = 390;
|
|
249
|
+
screen.height = 844;
|
|
250
|
+
open({ count: 20, checked: 10 });
|
|
251
|
+
expect(byTestId("floating-panel-sheet")).not.toBeNull();
|
|
252
|
+
expect(menu()).toBeNull();
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it("opens a long list as a pop-up on a phone inside an overlay", () => {
|
|
256
|
+
screen.width = 390;
|
|
257
|
+
screen.height = 844;
|
|
258
|
+
field = { ...field, y: 300 };
|
|
259
|
+
const { view, contentHeight } = open({ count: 20, checked: 10, inOverlay: true });
|
|
260
|
+
measureRows(view, 10, contentHeight);
|
|
261
|
+
expect(byTestId("floating-panel-sheet")).toBeNull();
|
|
262
|
+
expect(byTestId("floating-panel-menu-echo")).toBeNull();
|
|
263
|
+
const b = border();
|
|
264
|
+
expect(px(menu()?.style.top)).toBe(expected(10, contentHeight, b).top - b);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it("keeps a short list inside an overlay attached beside its field (LC-262)", () => {
|
|
268
|
+
screen.width = 390;
|
|
269
|
+
screen.height = 844;
|
|
270
|
+
open({ count: 4, checked: 1, inOverlay: true });
|
|
271
|
+
const frame = menu() as HTMLElement;
|
|
272
|
+
layout(frame, { width: 320, height: 178 });
|
|
273
|
+
expect(frame.style.opacity).toBe("1");
|
|
274
|
+
expect(px(frame.style.top)).toBe(field.y + field.height);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
@@ -623,3 +623,19 @@ export const LowOnPage: StoryObj<{ spaceAbove: number; count: number }> = {
|
|
|
623
623
|
);
|
|
624
624
|
},
|
|
625
625
|
};
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* LC-112 (FZ-8655): a field mid-screen. A list taller than the safe viewport
|
|
629
|
+
* reaches both safe edges and scrolls under its bands, the checked row on the
|
|
630
|
+
* field.
|
|
631
|
+
*/
|
|
632
|
+
export const MidOnPage: StoryObj<{ spaceAbove: number; count: number }> = {
|
|
633
|
+
...LowOnPage,
|
|
634
|
+
args: { ...LowOnPage.args, spaceAbove: 440 },
|
|
635
|
+
};
|
|
636
|
+
|
|
637
|
+
/** LC-112 (FZ-8655): a short list by the bottom edge shows whole, slid inside the safe edge. */
|
|
638
|
+
export const ShortLowOnPage: StoryObj<{ spaceAbove: number; count: number }> = {
|
|
639
|
+
...LowOnPage,
|
|
640
|
+
args: { ...LowOnPage.args, count: 7 },
|
|
641
|
+
};
|
|
@@ -1247,6 +1247,7 @@ function NativeSelectCore({
|
|
|
1247
1247
|
const insideOverlay = useInsideOverlay();
|
|
1248
1248
|
const compactFace = pickerCompactFace(options.length);
|
|
1249
1249
|
const asMenu = resolveCompactFace(compactFace, insideOverlay) === "menu";
|
|
1250
|
+
const beside = asMenu && insideOverlay && opensBesideTrigger(options.length);
|
|
1250
1251
|
const hydrationTouch = useTouchSurface();
|
|
1251
1252
|
const describedBy = useFieldDescribedBy();
|
|
1252
1253
|
const fieldA11y = useFieldA11y();
|
|
@@ -1310,6 +1311,13 @@ function NativeSelectCore({
|
|
|
1310
1311
|
}
|
|
1311
1312
|
}, [open, selectedIndex]);
|
|
1312
1313
|
|
|
1314
|
+
// LC-112 (FZ-8655): the native pop-up puts this row on the field, measured
|
|
1315
|
+
// fresh each open.
|
|
1316
|
+
const [onFieldRow, setOnFieldRow] = useState<{ top: number; height: number } | null>(null);
|
|
1317
|
+
useEffect(() => {
|
|
1318
|
+
if (!open) setOnFieldRow(null);
|
|
1319
|
+
}, [open]);
|
|
1320
|
+
|
|
1313
1321
|
const handleSelect = useCallback(
|
|
1314
1322
|
(optionValue: string) => {
|
|
1315
1323
|
if (multiple) {
|
|
@@ -1454,6 +1462,12 @@ function NativeSelectCore({
|
|
|
1454
1462
|
accessibilityRole="button"
|
|
1455
1463
|
accessibilityLabel={option.label}
|
|
1456
1464
|
accessibilityState={{ selected }}
|
|
1465
|
+
onLayout={
|
|
1466
|
+
i === Math.max(selectedIndex, 0)
|
|
1467
|
+
? ({ nativeEvent: { layout } }) =>
|
|
1468
|
+
setOnFieldRow({ top: layout.y, height: layout.height })
|
|
1469
|
+
: undefined
|
|
1470
|
+
}
|
|
1457
1471
|
>
|
|
1458
1472
|
{row}
|
|
1459
1473
|
</RNPressable>
|
|
@@ -1555,9 +1569,11 @@ function NativeSelectCore({
|
|
|
1555
1569
|
// sheet at page level and opens as a menu inside another overlay (FZ-7830).
|
|
1556
1570
|
compactFace={compactFace}
|
|
1557
1571
|
panelWidth={panelWidth}
|
|
1558
|
-
{...(
|
|
1572
|
+
{...(beside
|
|
1559
1573
|
? { anchorMode: "attach" as const, triggerEcho: false }
|
|
1560
|
-
:
|
|
1574
|
+
: isWeb || displayOptions.length === 0
|
|
1575
|
+
? null
|
|
1576
|
+
: { popUp: { row: onFieldRow } })}
|
|
1561
1577
|
triggerA11y={{
|
|
1562
1578
|
label: ariaLabel ?? fieldA11y?.label,
|
|
1563
1579
|
value: triggerValueText,
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export const scrollArrowThreshold = 8;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A scroll arrow's band: half a menu row, opaque in the panel's own fill.
|
|
5
|
+
* Rows scroll under it, and a row cut at a clipped edge hides under it
|
|
6
|
+
* (FZ-8557, LC-112).
|
|
7
|
+
*/
|
|
8
|
+
export function scrollArrowBand(rowHeight: number): number {
|
|
9
|
+
return Math.round(rowHeight / 2);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ArrowBandFit {
|
|
13
|
+
/** The padding box's top edge, in viewport pixels. */
|
|
14
|
+
top: number;
|
|
15
|
+
/** The padding box's visible height. */
|
|
16
|
+
height: number;
|
|
17
|
+
scrollTop: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface CheckedOnFieldInput {
|
|
21
|
+
/** The field's edges, in viewport pixels: the checked row centres on them. */
|
|
22
|
+
fieldTop: number;
|
|
23
|
+
fieldBottom: number;
|
|
24
|
+
/** The checked row's offset in the scroll content, and its height. */
|
|
25
|
+
rowTop: number;
|
|
26
|
+
rowHeight: number;
|
|
27
|
+
/** The scroll content's full height. */
|
|
28
|
+
contentHeight: number;
|
|
29
|
+
/** The safe edges the panel's padding box may reach. */
|
|
30
|
+
boundsTop: number;
|
|
31
|
+
boundsBottom: number;
|
|
32
|
+
band: number;
|
|
33
|
+
threshold?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, value));
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A Select covering its field opens the way a macOS pop-up does: its checked
|
|
40
|
+
* row sits on the field, centred on it, so the value stays where the closed
|
|
41
|
+
* field drew it (FZ-8557, LC-112).
|
|
42
|
+
*
|
|
43
|
+
* A list that fits between the safe edges shows every row with no scrolling,
|
|
44
|
+
* slid the least distance that keeps it on screen. A taller list keeps the
|
|
45
|
+
* checked row on the field and clips at the safe edges: a clipped edge sits on
|
|
46
|
+
* the safe edge, and the rows past it scroll under the opaque arrow band there.
|
|
47
|
+
* The checked row is never under a band; where one would cover it, the panel
|
|
48
|
+
* or the list shifts by that much. Returns the padding box.
|
|
49
|
+
*/
|
|
50
|
+
export function placeCheckedOnField(input: CheckedOnFieldInput): ArrowBandFit {
|
|
51
|
+
const { fieldTop, fieldBottom, rowTop, rowHeight, contentHeight, boundsTop, boundsBottom, band } =
|
|
52
|
+
input;
|
|
53
|
+
const threshold = input.threshold ?? scrollArrowThreshold;
|
|
54
|
+
const target = clamp(
|
|
55
|
+
(fieldTop + fieldBottom) / 2 - rowHeight / 2,
|
|
56
|
+
boundsTop,
|
|
57
|
+
boundsBottom - rowHeight,
|
|
58
|
+
);
|
|
59
|
+
if (contentHeight <= boundsBottom - boundsTop) {
|
|
60
|
+
const top = clamp(target - rowTop, boundsTop, boundsBottom - contentHeight);
|
|
61
|
+
return { top, height: contentHeight, scrollTop: 0 };
|
|
62
|
+
}
|
|
63
|
+
let top = target - rowTop;
|
|
64
|
+
let scrollTop = 0;
|
|
65
|
+
if (top < boundsTop) {
|
|
66
|
+
scrollTop = boundsTop - top;
|
|
67
|
+
top = boundsTop;
|
|
68
|
+
}
|
|
69
|
+
const end = () => top - scrollTop + contentHeight;
|
|
70
|
+
const bottom = () => Math.min(boundsBottom, end());
|
|
71
|
+
const checkedTop = () => top - scrollTop + rowTop;
|
|
72
|
+
// Clear of the down band: the panel's top lifts first, then the list scrolls.
|
|
73
|
+
if (end() - bottom() > threshold) {
|
|
74
|
+
const short = checkedTop() + rowHeight - (bottom() - band);
|
|
75
|
+
if (short > 0) {
|
|
76
|
+
const lift = scrollTop > 0 ? 0 : Math.min(short, top - boundsTop);
|
|
77
|
+
top -= lift;
|
|
78
|
+
scrollTop += short - lift;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Clear of the up band: the list drops, never past its start.
|
|
82
|
+
if (scrollTop > threshold) {
|
|
83
|
+
const short = top + band - checkedTop();
|
|
84
|
+
if (short > 0) scrollTop = Math.max(0, scrollTop - short);
|
|
85
|
+
}
|
|
86
|
+
// A scroll too small to show an arrow is the panel's own offset instead.
|
|
87
|
+
if (scrollTop > 0 && scrollTop <= threshold) {
|
|
88
|
+
top += scrollTop;
|
|
89
|
+
scrollTop = 0;
|
|
90
|
+
}
|
|
91
|
+
return { top, height: bottom() - top, scrollTop };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* A scrolled list whose panel stops short of a safe edge grows toward it, the
|
|
96
|
+
* way a macOS menu does: the edge follows the rows until it meets the safe
|
|
97
|
+
* edge, and the rows stay where the scroll put them (FZ-8463, FZ-8557). The
|
|
98
|
+
* panel never shrinks. Takes and returns the padding box.
|
|
99
|
+
*/
|
|
100
|
+
export function growOnScroll({
|
|
101
|
+
top,
|
|
102
|
+
height,
|
|
103
|
+
scrollTop,
|
|
104
|
+
contentHeight,
|
|
105
|
+
boundsTop,
|
|
106
|
+
boundsBottom,
|
|
107
|
+
}: ArrowBandFit & {
|
|
108
|
+
contentHeight: number;
|
|
109
|
+
boundsTop: number;
|
|
110
|
+
boundsBottom: number;
|
|
111
|
+
}): ArrowBandFit {
|
|
112
|
+
const origin = top - scrollTop;
|
|
113
|
+
const nextTop = Math.min(top, Math.max(boundsTop, origin));
|
|
114
|
+
const nextBottom = Math.max(top + height, Math.min(boundsBottom, origin + contentHeight));
|
|
115
|
+
return { top: nextTop, height: nextBottom - nextTop, scrollTop: nextTop - origin };
|
|
116
|
+
}
|
|
@@ -4,6 +4,7 @@ import { CaretDownIcon, CaretUpIcon } from "@phosphor-icons/react";
|
|
|
4
4
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
5
5
|
import { View } from "tamagui";
|
|
6
6
|
import { FocusContext } from "../InputParts";
|
|
7
|
+
import { scrollArrowBand } from "./checkedOnField";
|
|
7
8
|
|
|
8
9
|
const dropdownMaxRadiusTokenNum = 8;
|
|
9
10
|
|
|
@@ -24,122 +25,13 @@ export function SyncFocusToOpen({ open }: { open: boolean }) {
|
|
|
24
25
|
return null;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
export function scrollArrowBand(rowHeight: number): number {
|
|
35
|
-
return Math.round(rowHeight / 2);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface ArrowBandFit {
|
|
39
|
-
/** The padding box's top edge, in viewport pixels. */
|
|
40
|
-
top: number;
|
|
41
|
-
/** The padding box's visible height. */
|
|
42
|
-
height: number;
|
|
43
|
-
scrollTop: number;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface CheckedOnFieldInput {
|
|
47
|
-
/** The field's edges, in viewport pixels: the checked row centres on them. */
|
|
48
|
-
fieldTop: number;
|
|
49
|
-
fieldBottom: number;
|
|
50
|
-
/** The checked row's offset in the scroll content, and its height. */
|
|
51
|
-
rowTop: number;
|
|
52
|
-
rowHeight: number;
|
|
53
|
-
/** The scroll content's full height. */
|
|
54
|
-
contentHeight: number;
|
|
55
|
-
/** The safe edges the panel's padding box may reach. */
|
|
56
|
-
boundsTop: number;
|
|
57
|
-
boundsBottom: number;
|
|
58
|
-
band: number;
|
|
59
|
-
threshold?: number;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, value));
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* A Select covering its field opens the way a macOS pop-up does: its checked
|
|
66
|
-
* row sits on the field, centred on it, so the value stays where the closed
|
|
67
|
-
* field drew it (FZ-8557, LC-112).
|
|
68
|
-
*
|
|
69
|
-
* A list that fits between the safe edges shows every row with no scrolling,
|
|
70
|
-
* slid the least distance that keeps it on screen. A taller list keeps the
|
|
71
|
-
* checked row on the field and clips at the safe edges: a clipped edge sits on
|
|
72
|
-
* the safe edge, and the rows past it scroll under the opaque arrow band there.
|
|
73
|
-
* The checked row is never under a band; where one would cover it, the panel
|
|
74
|
-
* or the list shifts by that much. Returns the padding box.
|
|
75
|
-
*/
|
|
76
|
-
export function placeCheckedOnField(input: CheckedOnFieldInput): ArrowBandFit {
|
|
77
|
-
const { fieldTop, fieldBottom, rowTop, rowHeight, contentHeight, boundsTop, boundsBottom, band } =
|
|
78
|
-
input;
|
|
79
|
-
const threshold = input.threshold ?? scrollArrowThreshold;
|
|
80
|
-
const target = clamp(
|
|
81
|
-
(fieldTop + fieldBottom) / 2 - rowHeight / 2,
|
|
82
|
-
boundsTop,
|
|
83
|
-
boundsBottom - rowHeight,
|
|
84
|
-
);
|
|
85
|
-
if (contentHeight <= boundsBottom - boundsTop) {
|
|
86
|
-
const top = clamp(target - rowTop, boundsTop, boundsBottom - contentHeight);
|
|
87
|
-
return { top, height: contentHeight, scrollTop: 0 };
|
|
88
|
-
}
|
|
89
|
-
let top = target - rowTop;
|
|
90
|
-
let scrollTop = 0;
|
|
91
|
-
if (top < boundsTop) {
|
|
92
|
-
scrollTop = boundsTop - top;
|
|
93
|
-
top = boundsTop;
|
|
94
|
-
}
|
|
95
|
-
const end = () => top - scrollTop + contentHeight;
|
|
96
|
-
const bottom = () => Math.min(boundsBottom, end());
|
|
97
|
-
const checkedTop = () => top - scrollTop + rowTop;
|
|
98
|
-
// Clear of the down band: the panel's top lifts first, then the list scrolls.
|
|
99
|
-
if (end() - bottom() > threshold) {
|
|
100
|
-
const short = checkedTop() + rowHeight - (bottom() - band);
|
|
101
|
-
if (short > 0) {
|
|
102
|
-
const lift = scrollTop > 0 ? 0 : Math.min(short, top - boundsTop);
|
|
103
|
-
top -= lift;
|
|
104
|
-
scrollTop += short - lift;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Clear of the up band: the list drops, never past its start.
|
|
108
|
-
if (scrollTop > threshold) {
|
|
109
|
-
const short = top + band - checkedTop();
|
|
110
|
-
if (short > 0) scrollTop = Math.max(0, scrollTop - short);
|
|
111
|
-
}
|
|
112
|
-
// A scroll too small to show an arrow is the panel's own offset instead.
|
|
113
|
-
if (scrollTop > 0 && scrollTop <= threshold) {
|
|
114
|
-
top += scrollTop;
|
|
115
|
-
scrollTop = 0;
|
|
116
|
-
}
|
|
117
|
-
return { top, height: bottom() - top, scrollTop };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* A scrolled list whose panel stops short of a safe edge grows toward it, the
|
|
122
|
-
* way a macOS menu does: the edge follows the rows until it meets the safe
|
|
123
|
-
* edge, and the rows stay where the scroll put them (FZ-8463, FZ-8557). The
|
|
124
|
-
* panel never shrinks. Takes and returns the padding box.
|
|
125
|
-
*/
|
|
126
|
-
export function growOnScroll({
|
|
127
|
-
top,
|
|
128
|
-
height,
|
|
129
|
-
scrollTop,
|
|
130
|
-
contentHeight,
|
|
131
|
-
boundsTop,
|
|
132
|
-
boundsBottom,
|
|
133
|
-
}: ArrowBandFit & {
|
|
134
|
-
contentHeight: number;
|
|
135
|
-
boundsTop: number;
|
|
136
|
-
boundsBottom: number;
|
|
137
|
-
}): ArrowBandFit {
|
|
138
|
-
const origin = top - scrollTop;
|
|
139
|
-
const nextTop = Math.min(top, Math.max(boundsTop, origin));
|
|
140
|
-
const nextBottom = Math.max(top + height, Math.min(boundsBottom, origin + contentHeight));
|
|
141
|
-
return { top: nextTop, height: nextBottom - nextTop, scrollTop: nextTop - origin };
|
|
142
|
-
}
|
|
28
|
+
export {
|
|
29
|
+
growOnScroll,
|
|
30
|
+
placeCheckedOnField,
|
|
31
|
+
scrollArrowBand,
|
|
32
|
+
scrollArrowThreshold,
|
|
33
|
+
} from "./checkedOnField";
|
|
34
|
+
export type { ArrowBandFit, CheckedOnFieldInput } from "./checkedOnField";
|
|
143
35
|
|
|
144
36
|
// ── Scroll Arrow (sticky inside scrollable panels) ────────────
|
|
145
37
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA6Bf,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;IAChD;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrD,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,yBAAyB,CAK5B;AAyFD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAW,EACX,IAAe,EACf,eAAsB,EACtB,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAoB,EACpB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA6Bf,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;IAChD;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrD,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,yBAAyB,CAK5B;AAyFD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAW,EACX,IAAe,EACf,eAAsB,EACtB,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAoB,EACpB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,EAAE,kBAAkB,2CAqUpB"}
|
|
@@ -38,6 +38,21 @@ export interface FloatingPanelProps {
|
|
|
38
38
|
* it opens down from the button's top edge, or up from its bottom edge.
|
|
39
39
|
*/
|
|
40
40
|
iconCover?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Native only: the panel opens the way a macOS pop-up does (LC-112, FZ-8655).
|
|
43
|
+
* `row` is the row that sits on the trigger, its offset and height in the
|
|
44
|
+
* panel's content, `null` until the caller has measured it. There's no
|
|
45
|
+
* trigger echo, a list that fits the safe edges shows whole, and a taller one
|
|
46
|
+
* scrolls under opaque arrow bands (`placeCheckedOnField`). At regular width
|
|
47
|
+
* this is the panel's face at every list length, so a Select never takes
|
|
48
|
+
* RegularPanel's echo or a sheet there.
|
|
49
|
+
*/
|
|
50
|
+
popUp?: {
|
|
51
|
+
row: {
|
|
52
|
+
top: number;
|
|
53
|
+
height: number;
|
|
54
|
+
} | null;
|
|
55
|
+
};
|
|
41
56
|
/**
|
|
42
57
|
* Optional control rendered beside the trigger but OUTSIDE the native press
|
|
43
58
|
* capture (e.g. DatePicker/ColorPicker clear). On native the trigger subtree
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AA6B3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACL,UAAU,EACV,KAAK,UAAU,EAIhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAkBrE,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG/E,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,cAAc,EACd,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,eAAe,GAAG,QAAQ,CAAC;IACxC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,CAAC;IACxD;;;;;OAKG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IACjC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAyHD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,EACV,MAAM,EACN,cAAsB,GACvB,EAAE;IACD,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,2CAsFA;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,WAAW,EACzB,QAAQ,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,EAC1C,EAAE,OAAe,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,QA6BhD;AAiCD,wBAAgB,eAAe,YAE9B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAwBtD"}
|
|
@@ -61,6 +61,13 @@
|
|
|
61
61
|
* OVERLAY_BREAKPOINT the sheet is the wrong form. The panel opens over its
|
|
62
62
|
* field the way the web float does (LC-105, LC-112), sized by `widthMode`;
|
|
63
63
|
* compact windows (iPhone, Slide Over) keep the sheet. `sheet` forces it.
|
|
64
|
+
*
|
|
65
|
+
* Pop-up (`popUp`, FZ-8655): a Select's menu face opens the way a macOS pop-up
|
|
66
|
+
* does, as the web's covering Select does. The rows are measured here, the
|
|
67
|
+
* caller reports the row that goes on the field, and `placeCheckedOnField`
|
|
68
|
+
* (shared with the web) places the panel. It's a touch list, so a panel keeps
|
|
69
|
+
* its box as it scrolls, as a UIMenu does, where a pointer's grows
|
|
70
|
+
* (`growOnScroll`).
|
|
64
71
|
*/
|
|
65
72
|
import type { FloatingPanelProps } from "./index";
|
|
66
73
|
export { useFloatingPanel, panelAnimationDuration, panelGrowDuration, panelTransition, panelViewportPadding, } from "./useFloatingPanel";
|
|
@@ -69,7 +76,7 @@ export type { FloatingPanelProps } from "./index";
|
|
|
69
76
|
export { floatingPanelActionProps, isNestedPanelAction } from "./nestedAction";
|
|
70
77
|
/** Native never has a >sm web viewport; AdaptivePopup uses this to pick Sheet mode. */
|
|
71
78
|
export declare function useViewportGtSm(): boolean;
|
|
72
|
-
export declare function FloatingPanel({ open, onOpenChange, onNativeShow, trigger, triggerEnd, triggerSizing, children: panelChildren, scrollable, disabled, contentPadding, header, scrollViewProps, triggerA11y, sheetFill, openOn, compactFace, triggerRow, triggerEcho, coverAlign, iconCover, anchorMode, panelWidth, sheet, widthMode, fitContent, }: FloatingPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
79
|
+
export declare function FloatingPanel({ open, onOpenChange, onNativeShow, trigger, triggerEnd, triggerSizing, children: panelChildren, scrollable, disabled, contentPadding, header, scrollViewProps, triggerA11y, sheetFill, openOn, compactFace, triggerRow, triggerEcho, coverAlign, iconCover, popUp, anchorMode, panelWidth, sheet, widthMode, fitContent, }: FloatingPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
73
80
|
/** Web only: native echoes the trigger inside its own menu face. */
|
|
74
81
|
export declare function TriggerEchoRow(_props: {
|
|
75
82
|
[key: string]: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.native.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AAwDH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAyBlD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,uFAAuF;AACvF,wBAAgB,eAAe,YAE9B;AAiBD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,aAAyB,EACzB,QAAQ,EAAE,aAAa,EACvB,UAAU,EACV,QAAQ,EACR,cAA0B,EAC1B,MAAM,EACN,eAAe,EACf,WAAW,EACX,SAAS,EACT,MAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAkB,EAClB,UAAoB,EACpB,SAAiB,EACjB,KAAK,EACL,UAAU,EACV,UAAsB,EACtB,KAAK,EACL,SAAS,EACT,UAAU,GACX,EAAE,kBAAkB,2CA8nBpB;AAmaD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAEvE;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,OAAO,EAClB,QAAQ,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,IAAI,CAAG"}
|