@multiplatform.one/forms 7.57.0 → 7.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AdaptivePopup/index.cjs +5 -1
- package/dist/cjs/AdaptivePopup/index.native.js +6 -2
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +2 -1
- package/dist/cjs/Button/index.native.js +4 -3
- package/dist/cjs/Button/index.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/compactFace.cjs +38 -0
- package/dist/cjs/FloatingPanel/compactFace.native.js +42 -0
- package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/index.cjs +38 -9
- package/dist/cjs/FloatingPanel/index.native.js +154 -6
- package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/pointAnchor.cjs +22 -0
- package/dist/cjs/FloatingPanel/pointAnchor.native.js +23 -0
- package/dist/cjs/FloatingPanel/pointAnchor.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.cjs +13 -7
- package/dist/cjs/InputParts/index.native.js +13 -7
- package/dist/cjs/InputParts/index.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.cjs +24 -14
- package/dist/cjs/fields/Checkbox/Checkbox.native.js +39 -23
- 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/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/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/durationMath.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.cjs +6 -1
- package/dist/cjs/fields/RadioGroup/index.native.js +7 -2
- 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/index.cjs +13 -2
- package/dist/cjs/fields/Select/index.native.js +26 -7
- package/dist/cjs/fields/Select/index.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.cjs +22 -10
- package/dist/cjs/fields/Switch/index.native.js +30 -16
- 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.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/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/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/choiceRowPress.cjs +46 -0
- package/dist/cjs/shared/choiceRowPress.native.js +50 -0
- package/dist/cjs/shared/choiceRowPress.native.js.map +1 -0
- package/dist/cjs/shared/colorRamps.native.js.map +1 -1
- package/dist/cjs/shared/devWarn.native.js.map +1 -1
- package/dist/cjs/shared/floatingList.native.js +1 -1
- 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/overlayStack.cjs +4 -0
- package/dist/cjs/shared/overlayStack.native.js +4 -0
- 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/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/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 +6 -2
- package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js +6 -2
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +3 -2
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +3 -2
- package/dist/esm/Button/index.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/compactFace.mjs +11 -0
- package/dist/esm/FloatingPanel/compactFace.mjs.map +1 -0
- package/dist/esm/FloatingPanel/compactFace.native.js +12 -0
- package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -0
- package/dist/esm/FloatingPanel/index.mjs +40 -11
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +156 -8
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.mjs +22 -1
- package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.native.js +23 -1
- package/dist/esm/FloatingPanel/pointAnchor.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.mjs +13 -7
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +13 -7
- package/dist/esm/InputParts/index.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.mjs +24 -14
- package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.native.js +38 -22
- 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/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/parts.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/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.mjs +6 -1
- package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js +6 -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/index.mjs +15 -4
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +24 -5
- package/dist/esm/fields/Select/index.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.mjs +22 -10
- package/dist/esm/fields/Switch/index.mjs.map +1 -1
- package/dist/esm/fields/Switch/index.native.js +28 -14
- 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/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/TimeColumn.native.js.map +1 -1
- package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
- package/dist/esm/shared/choiceRowPress.mjs +20 -0
- package/dist/esm/shared/choiceRowPress.mjs.map +1 -0
- package/dist/esm/shared/choiceRowPress.native.js +21 -0
- package/dist/esm/shared/choiceRowPress.native.js.map +1 -0
- package/dist/esm/shared/colorRamps.native.js.map +1 -1
- package/dist/esm/shared/devWarn.native.js.map +1 -1
- 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/overlayStack.mjs +4 -1
- package/dist/esm/shared/overlayStack.mjs.map +1 -1
- package/dist/esm/shared/overlayStack.native.js +4 -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/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/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 +6 -2
- package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
- package/dist/jsx/AdaptivePopup/index.native.js +5 -1
- package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +3 -2
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +2 -1
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/compactFace.mjs +11 -0
- package/dist/jsx/FloatingPanel/compactFace.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/compactFace.native.js +42 -0
- package/dist/jsx/FloatingPanel/compactFace.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/index.mjs +40 -11
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +154 -6
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/pointAnchor.mjs +22 -1
- package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/pointAnchor.native.js +23 -0
- package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/jsx/InputParts/index.mjs +13 -7
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +13 -7
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.mjs +24 -14
- package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.native.js +38 -22
- package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/jsx/fields/RadioGroup/index.mjs +6 -1
- package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
- package/dist/jsx/fields/RadioGroup/index.native.js +6 -1
- package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +15 -4
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +22 -3
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Switch/index.mjs +22 -10
- package/dist/jsx/fields/Switch/index.mjs.map +1 -1
- package/dist/jsx/fields/Switch/index.native.js +28 -14
- package/dist/jsx/fields/Switch/index.native.js.map +1 -1
- package/dist/jsx/shared/choiceRowPress.mjs +20 -0
- package/dist/jsx/shared/choiceRowPress.mjs.map +1 -0
- package/dist/jsx/shared/choiceRowPress.native.js +50 -0
- package/dist/jsx/shared/choiceRowPress.native.js.map +1 -0
- package/dist/jsx/shared/overlayStack.mjs +4 -1
- package/dist/jsx/shared/overlayStack.mjs.map +1 -1
- package/dist/jsx/shared/overlayStack.native.js +4 -0
- package/dist/jsx/shared/overlayStack.native.js.map +1 -1
- package/package.json +8 -8
- package/src/AdaptivePopup/index.tsx +6 -1
- package/src/Button/Button.controlTiers.spec.tsx +29 -0
- package/src/Button/index.tsx +3 -1
- package/src/FloatingPanel/FloatingPanel.compactFace.spec.tsx +187 -0
- package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +183 -0
- package/src/FloatingPanel/compactFace.spec.ts +40 -0
- package/src/FloatingPanel/compactFace.ts +32 -0
- package/src/FloatingPanel/index.native.tsx +171 -4
- package/src/FloatingPanel/index.tsx +55 -11
- package/src/FloatingPanel/pointAnchor.spec.ts +80 -0
- package/src/FloatingPanel/pointAnchor.ts +52 -0
- package/src/InputParts/index.tsx +18 -7
- package/src/fields/Checkbox/Checkbox.native.spec.tsx +44 -0
- package/src/fields/Checkbox/Checkbox.tsx +31 -18
- package/src/fields/DatePicker/columnFit.spec.tsx +85 -0
- package/src/fields/RadioGroup/RadioGroup.native.spec.tsx +65 -0
- package/src/fields/RadioGroup/RadioGroup.stories.tsx +49 -0
- package/src/fields/RadioGroup/index.tsx +14 -2
- package/src/fields/Select/index.tsx +36 -6
- package/src/fields/Switch/Switch.rowPress.native.spec.tsx +69 -0
- package/src/fields/Switch/index.tsx +29 -11
- package/src/fields/pickerRows.spec.tsx +2 -0
- package/src/overlayGround.spec.ts +181 -0
- package/src/shared/choiceRowPress.ts +40 -0
- package/src/shared/overlayStack.tsx +5 -0
- package/types/AdaptivePopup/index.d.ts.map +1 -1
- package/types/Button/index.d.ts.map +1 -1
- package/types/FloatingPanel/compactFace.d.ts +21 -0
- package/types/FloatingPanel/compactFace.d.ts.map +1 -0
- package/types/FloatingPanel/index.d.ts +10 -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/FloatingPanel/pointAnchor.d.ts +29 -0
- package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
- package/types/fields/RadioGroup/index.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Switch/index.d.ts.map +1 -1
- package/types/shared/choiceRowPress.d.ts +40 -0
- package/types/shared/choiceRowPress.d.ts.map +1 -0
- package/types/shared/overlayStack.d.ts +2 -0
- package/types/shared/overlayStack.d.ts.map +1 -1
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { useTouchSurface } from "@multiplatform.one/theme";
|
|
2
2
|
import type { KeyboardEvent, MouseEvent, ReactNode, RefObject, UIEvent } from "react";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
useCallback,
|
|
5
|
+
useEffect,
|
|
6
|
+
useLayoutEffect,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useState,
|
|
10
|
+
useSyncExternalStore,
|
|
11
|
+
memo,
|
|
12
|
+
} from "react";
|
|
4
13
|
import { CaretDownIcon, CheckIcon } from "@phosphor-icons/react";
|
|
5
14
|
import {
|
|
6
15
|
useClick,
|
|
@@ -54,8 +63,9 @@ import {
|
|
|
54
63
|
panelViewportPadding,
|
|
55
64
|
useViewportGtSm,
|
|
56
65
|
} from "../../FloatingPanel";
|
|
66
|
+
import { pickerCompactFace, resolveCompactFace } from "../../FloatingPanel/compactFace";
|
|
57
67
|
import { PanelPortal } from "../../FloatingPanel/PanelPortal";
|
|
58
|
-
import { useOverlayZIndex } from "../../shared/overlayStack";
|
|
68
|
+
import { useInsideOverlay, useOverlayZIndex } from "../../shared/overlayStack";
|
|
59
69
|
import { useDragScroll } from "../../shared/useDragScroll";
|
|
60
70
|
import { useIsInTableCell } from "../../shared/tableCellContext";
|
|
61
71
|
import { t } from "../../shared/t";
|
|
@@ -1247,6 +1257,9 @@ function NativeSelectCore({
|
|
|
1247
1257
|
dismissible,
|
|
1248
1258
|
native,
|
|
1249
1259
|
}: FloatingSelectCoreProps) {
|
|
1260
|
+
const insideOverlay = useInsideOverlay();
|
|
1261
|
+
const compactFace = pickerCompactFace(options.length);
|
|
1262
|
+
const asMenu = resolveCompactFace(compactFace, insideOverlay) === "menu";
|
|
1250
1263
|
const hydrationTouch = useTouchSurface();
|
|
1251
1264
|
const describedBy = useFieldDescribedBy();
|
|
1252
1265
|
const fieldA11y = useFieldA11y();
|
|
@@ -1481,7 +1494,9 @@ function NativeSelectCore({
|
|
|
1481
1494
|
: placeholder
|
|
1482
1495
|
: (selectedOption?.label ?? placeholder);
|
|
1483
1496
|
|
|
1484
|
-
|
|
1497
|
+
// The iOS action sheet is a sheet too: a short list, or any list inside an
|
|
1498
|
+
// overlay, opens as a menu over the trigger instead (FZ-7830).
|
|
1499
|
+
if (!asMenu && shouldUseIosNativeSelect({ native, multiple, isWeb, os: Platform.OS })) {
|
|
1485
1500
|
const openNative = () => {
|
|
1486
1501
|
if (disabled) return;
|
|
1487
1502
|
const labels = options.map((o) => o.label);
|
|
@@ -1556,6 +1571,9 @@ function NativeSelectCore({
|
|
|
1556
1571
|
if (!val) onBlur?.();
|
|
1557
1572
|
}}
|
|
1558
1573
|
sheet
|
|
1574
|
+
// A short list opens as a menu over its trigger; a long one keeps its
|
|
1575
|
+
// sheet at page level and opens as a menu inside another overlay (FZ-7830).
|
|
1576
|
+
compactFace={compactFace}
|
|
1559
1577
|
triggerA11y={{
|
|
1560
1578
|
label: ariaLabel ?? fieldA11y?.label,
|
|
1561
1579
|
value: triggerValueText,
|
|
@@ -1676,6 +1694,10 @@ function NativeSelectCore({
|
|
|
1676
1694
|
|
|
1677
1695
|
// ── Select (public API) ──────────────────────────────────────
|
|
1678
1696
|
|
|
1697
|
+
const subscribeNothing = () => () => {};
|
|
1698
|
+
const clientSnapshot = () => true;
|
|
1699
|
+
const serverSnapshot = () => false;
|
|
1700
|
+
|
|
1679
1701
|
export function Select({
|
|
1680
1702
|
name,
|
|
1681
1703
|
form: formProp,
|
|
@@ -1733,10 +1755,18 @@ export function Select({
|
|
|
1733
1755
|
id,
|
|
1734
1756
|
});
|
|
1735
1757
|
const viewportGtSm = useViewportGtSm();
|
|
1736
|
-
|
|
1737
|
-
//
|
|
1758
|
+
const insideOverlay = useInsideOverlay();
|
|
1759
|
+
// Sheet core on native and below `$sm` (viewport < 640, OVERLAY_BREAKPOINT).
|
|
1760
|
+
// Floating from `$sm` up, and on a phone-width web for a short list or
|
|
1761
|
+
// inside another overlay, where a sheet would stack on a sheet (FZ-7830).
|
|
1762
|
+
// Native keeps the sheet core, whose FloatingPanel opens the same menu.
|
|
1763
|
+
// SSR and the hydration render keep the sheet core, as the viewport does.
|
|
1738
1764
|
const effectiveGtSm = typeof window !== "undefined" ? viewportGtSm : false;
|
|
1739
|
-
const
|
|
1765
|
+
const hydrated = useSyncExternalStore(subscribeNothing, clientSnapshot, serverSnapshot);
|
|
1766
|
+
const compactMenu =
|
|
1767
|
+
hydrated &&
|
|
1768
|
+
resolveCompactFace(pickerCompactFace(options?.length ?? 0), insideOverlay) === "menu";
|
|
1769
|
+
const shouldUseSheet = !isWeb || (!effectiveGtSm && !compactMenu);
|
|
1740
1770
|
|
|
1741
1771
|
// Render skeleton placeholder
|
|
1742
1772
|
if (skeleton) {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
2
|
+
import { useForm } from "@tanstack/react-form";
|
|
3
|
+
import { cleanup, fireEvent } from "@testing-library/react";
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { Form } from "../../Form";
|
|
6
|
+
import { Switch } from "./index";
|
|
7
|
+
import { muteBubbleInputs } from "../../../tests/muteBubbleInputs";
|
|
8
|
+
|
|
9
|
+
vi.mock("tamagui", async (importOriginal) => ({
|
|
10
|
+
...(await importOriginal<typeof import("tamagui")>()),
|
|
11
|
+
isWeb: false,
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
afterEach(cleanup);
|
|
15
|
+
|
|
16
|
+
function FormSwitch({ onChange }: { onChange: (checked: boolean) => void }) {
|
|
17
|
+
const form = useForm({ defaultValues: { alerts: false } });
|
|
18
|
+
return (
|
|
19
|
+
<Form form={form}>
|
|
20
|
+
<Switch name="alerts" label="Alerts" onChange={onChange} />
|
|
21
|
+
</Form>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// FZ-7849. Same contract as RadioGroup's row press: the row and the label flip
|
|
26
|
+
// the switch directly on native instead of through tamagui's focusable
|
|
27
|
+
// registry, and each press flips it exactly once.
|
|
28
|
+
describe("native Switch row press", () => {
|
|
29
|
+
muteBubbleInputs();
|
|
30
|
+
|
|
31
|
+
const rowOf = (label: HTMLElement) => label.parentElement as HTMLElement;
|
|
32
|
+
|
|
33
|
+
it("flips once from the row and once from the label, standalone", () => {
|
|
34
|
+
const onChange = vi.fn();
|
|
35
|
+
const result = renderWithProviders(<Switch label="Dark mode" onChange={onChange} />);
|
|
36
|
+
const label = result.getByText("Dark mode");
|
|
37
|
+
expect(label.hasAttribute("for")).toBe(false);
|
|
38
|
+
fireEvent.click(rowOf(label));
|
|
39
|
+
expect(onChange).toHaveBeenCalledExactlyOnceWith(true);
|
|
40
|
+
fireEvent.click(label);
|
|
41
|
+
expect(onChange).toHaveBeenCalledTimes(2);
|
|
42
|
+
expect(onChange).toHaveBeenLastCalledWith(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("flips a form field once from its label", () => {
|
|
46
|
+
const onChange = vi.fn();
|
|
47
|
+
const result = renderWithProviders(<FormSwitch onChange={onChange} />);
|
|
48
|
+
fireEvent.click(result.getByText("Alerts"));
|
|
49
|
+
expect(onChange).toHaveBeenCalledExactlyOnceWith(true);
|
|
50
|
+
fireEvent.click(rowOf(result.getByText("Alerts")));
|
|
51
|
+
expect(onChange).toHaveBeenLastCalledWith(false);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("leaves a disabled or read-only switch's row and label dead", () => {
|
|
55
|
+
const onChange = vi.fn();
|
|
56
|
+
const result = renderWithProviders(
|
|
57
|
+
<>
|
|
58
|
+
<Switch label="Off limits" onChange={onChange} disabled />
|
|
59
|
+
<Switch label="Look only" onChange={onChange} readOnly />
|
|
60
|
+
</>,
|
|
61
|
+
);
|
|
62
|
+
for (const text of ["Off limits", "Look only"]) {
|
|
63
|
+
const label = result.getByText(text);
|
|
64
|
+
fireEvent.click(rowOf(label));
|
|
65
|
+
fireEvent.click(label);
|
|
66
|
+
}
|
|
67
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
useFormField,
|
|
50
50
|
useResolvedValidators,
|
|
51
51
|
} from "../../shared/utils";
|
|
52
|
+
import { choiceLabelPressProps, choiceRowPressProps } from "../../shared/choiceRowPress";
|
|
52
53
|
import { pressSlopProps } from "../../shared/pressSlopProps";
|
|
53
54
|
import { useIsInTableCell } from "../../shared/tableCellContext";
|
|
54
55
|
import { switchFootprint, type SwitchFootprint } from "./footprint";
|
|
@@ -830,6 +831,15 @@ export function Switch({
|
|
|
830
831
|
: undefined;
|
|
831
832
|
const grownTarget = targetHeight !== undefined;
|
|
832
833
|
const rowMinHeight = !inTableCell && grownTarget ? targetHeight : undefined;
|
|
834
|
+
// FZ-7849: the row and label flip the switch on native, through the same
|
|
835
|
+
// path as a press on the track.
|
|
836
|
+
const rowToggle = (current: boolean, handleChange?: (val: boolean) => void) =>
|
|
837
|
+
disabled || readOnly
|
|
838
|
+
? undefined
|
|
839
|
+
: () => {
|
|
840
|
+
handleChange?.(!current);
|
|
841
|
+
handleValueChange(!current);
|
|
842
|
+
};
|
|
833
843
|
|
|
834
844
|
const renderSwitch = (
|
|
835
845
|
switchChecked: boolean,
|
|
@@ -1037,6 +1047,9 @@ export function Switch({
|
|
|
1037
1047
|
|
|
1038
1048
|
if (!resolvedForm || !name) {
|
|
1039
1049
|
const resolvedChecked = checked !== undefined ? checked : internalChecked;
|
|
1050
|
+
const handleChange =
|
|
1051
|
+
checked === undefined ? (val: boolean) => setInternalChecked(val) : undefined;
|
|
1052
|
+
const toggle = rowToggle(resolvedChecked, handleChange);
|
|
1040
1053
|
return (
|
|
1041
1054
|
<FieldLayout
|
|
1042
1055
|
id={id}
|
|
@@ -1054,17 +1067,18 @@ export function Switch({
|
|
|
1054
1067
|
height={sizeToken}
|
|
1055
1068
|
{...(rowMinHeight !== undefined && { minHeight: rowMinHeight })}
|
|
1056
1069
|
{...labelLeadingRow}
|
|
1070
|
+
{...(label ? choiceRowPressProps(toggle) : undefined)}
|
|
1057
1071
|
>
|
|
1058
1072
|
{renderSwitch(
|
|
1059
1073
|
resolvedChecked,
|
|
1060
|
-
|
|
1074
|
+
handleChange,
|
|
1061
1075
|
onBlur,
|
|
1062
1076
|
!!error,
|
|
1063
1077
|
typeof error === "string" && error ? error : undefined,
|
|
1064
1078
|
)}
|
|
1065
1079
|
{label && (
|
|
1066
1080
|
<Label
|
|
1067
|
-
|
|
1081
|
+
{...choiceLabelPressProps(id, toggle)}
|
|
1068
1082
|
size={(size || "$true") as FontSizeTokens}
|
|
1069
1083
|
{...knobProps.textWeight}
|
|
1070
1084
|
color={error ? formCommonColors.error : knobProps.textAccentColor}
|
|
@@ -1098,6 +1112,15 @@ export function Switch({
|
|
|
1098
1112
|
{(field) => {
|
|
1099
1113
|
const resolvedError = getFieldError(field, error);
|
|
1100
1114
|
const formLabelColor = resolvedError ? formCommonColors.error : knobProps.textAccentColor;
|
|
1115
|
+
const formChecked = checked !== undefined ? checked : Boolean(field.state.value);
|
|
1116
|
+
const handleChange = (val: boolean) => {
|
|
1117
|
+
field.handleChange(val as any);
|
|
1118
|
+
if (saveMode === "declarative") {
|
|
1119
|
+
commitImmediateField(resolvedForm, name, val);
|
|
1120
|
+
onAutoCommit?.(name, val);
|
|
1121
|
+
}
|
|
1122
|
+
};
|
|
1123
|
+
const toggle = rowToggle(formChecked, handleChange);
|
|
1101
1124
|
return (
|
|
1102
1125
|
<FieldLayout
|
|
1103
1126
|
id={id}
|
|
@@ -1114,23 +1137,18 @@ export function Switch({
|
|
|
1114
1137
|
height={sizeToken}
|
|
1115
1138
|
{...(rowMinHeight !== undefined && { minHeight: rowMinHeight })}
|
|
1116
1139
|
{...labelLeadingRow}
|
|
1140
|
+
{...(label ? choiceRowPressProps(toggle) : undefined)}
|
|
1117
1141
|
>
|
|
1118
1142
|
{renderSwitch(
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
field.handleChange(val as any);
|
|
1122
|
-
if (saveMode === "declarative") {
|
|
1123
|
-
commitImmediateField(resolvedForm, name, val);
|
|
1124
|
-
onAutoCommit?.(name, val);
|
|
1125
|
-
}
|
|
1126
|
-
},
|
|
1143
|
+
formChecked,
|
|
1144
|
+
handleChange,
|
|
1127
1145
|
mergeFieldHandler(field, "handleBlur", onBlur),
|
|
1128
1146
|
!!resolvedError,
|
|
1129
1147
|
typeof resolvedError === "string" && resolvedError ? resolvedError : undefined,
|
|
1130
1148
|
)}
|
|
1131
1149
|
{label && (
|
|
1132
1150
|
<Label
|
|
1133
|
-
|
|
1151
|
+
{...choiceLabelPressProps(id, toggle)}
|
|
1134
1152
|
size={(size || "$true") as FontSizeTokens}
|
|
1135
1153
|
{...knobProps.textWeight}
|
|
1136
1154
|
color={formLabelColor}
|
|
@@ -48,9 +48,11 @@ describe("picker sheet rows consume resolved control height", () => {
|
|
|
48
48
|
<Picker
|
|
49
49
|
value="one"
|
|
50
50
|
onValueChange={onValueChange}
|
|
51
|
+
// Eight options: a shorter Select opens as a menu, not its sheet (FZ-7830).
|
|
51
52
|
options={[
|
|
52
53
|
{ value: "one", label: "First choice" },
|
|
53
54
|
{ value: "two", label: "Second choice" },
|
|
55
|
+
...[3, 4, 5, 6, 7, 8].map((n) => ({ value: `c${n}`, label: `Choice ${n}` })),
|
|
54
56
|
]}
|
|
55
57
|
/>,
|
|
56
58
|
);
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FZ-7944, LC-153 on an elevated ground. Dark `elevatedSurface` paints
|
|
3
|
+
* `$color4`, the tinted wash's own step, so a plain Button on a dark sheet,
|
|
4
|
+
* dialog, popover or floating panel had no plate (1.00:1). Over every preset
|
|
5
|
+
* the package exports and every colour scope a preset or Tint can name, the
|
|
6
|
+
* controls an overlay hosts must separate from the ground the overlay paints.
|
|
7
|
+
* Apple HIG: a control's fill sits above the elevated background it is on.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as themePackage from "@multiplatform.one/theme";
|
|
11
|
+
import {
|
|
12
|
+
controlTierPaint,
|
|
13
|
+
createDefaultThemeConfig,
|
|
14
|
+
holdInkFloor,
|
|
15
|
+
measureContrast,
|
|
16
|
+
pickReadableForeground,
|
|
17
|
+
resolveKnobs,
|
|
18
|
+
type PresetDefinition as Preset,
|
|
19
|
+
} from "@multiplatform.one/theme";
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
import { describe, expect, it } from "vitest";
|
|
24
|
+
import { formControlColors, formSelectedColors, formSwitchColors } from "./shared/colorRamps";
|
|
25
|
+
|
|
26
|
+
/** The card's floor: the console's "a plain Button on an overlay's ground" asks the same. */
|
|
27
|
+
const plateFloor = 1.1;
|
|
28
|
+
|
|
29
|
+
type RawThemes = Record<string, Record<string, { val: string } | string>>;
|
|
30
|
+
const themes = createDefaultThemeConfig().tamagui.themes as unknown as RawThemes;
|
|
31
|
+
const schemes = ["light", "dark"] as const;
|
|
32
|
+
|
|
33
|
+
function isPreset(value: unknown): value is Preset {
|
|
34
|
+
return (
|
|
35
|
+
typeof value === "object" &&
|
|
36
|
+
value !== null &&
|
|
37
|
+
"knobs" in value &&
|
|
38
|
+
"intents" in value &&
|
|
39
|
+
typeof (value as Preset).knobs === "object"
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const presets = Object.entries(themePackage).filter(
|
|
44
|
+
(entry): entry is [string, Preset] => isPreset(entry[1]) && entry[0].endsWith("Preset"),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
/** A token the way Tamagui resolves it in a component sub-theme: its own key, then the scope's. */
|
|
48
|
+
function resolve(scope: string, token: string, component?: string): string {
|
|
49
|
+
if (!token.startsWith("$")) return token;
|
|
50
|
+
const key = token.slice(1);
|
|
51
|
+
const own = component ? themes[`${scope}_${component}`]?.[key] : undefined;
|
|
52
|
+
const entry = own ?? themes[scope]?.[key];
|
|
53
|
+
const value = typeof entry === "object" ? entry.val : entry;
|
|
54
|
+
if (!value)
|
|
55
|
+
throw new Error(`${token} does not resolve in ${scope}${component ? `_${component}` : ""}`);
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function ratio(foreground: string, background: string): number {
|
|
60
|
+
return measureContrast({ foreground, background }).ratio;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface Case {
|
|
64
|
+
label: string;
|
|
65
|
+
scope: string;
|
|
66
|
+
scheme: (typeof schemes)[number];
|
|
67
|
+
knobs: Preset["knobs"];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const presetCases: Case[] = presets.flatMap(([name, preset]) =>
|
|
71
|
+
schemes.map((scheme) => ({
|
|
72
|
+
label: `${name} ${scheme}`,
|
|
73
|
+
scope: preset.theme ? `${scheme}_${preset.theme}` : scheme,
|
|
74
|
+
scheme,
|
|
75
|
+
knobs: preset.knobs,
|
|
76
|
+
})),
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
// Every hue scope with house component themes: a preset's `theme` or a Tint.
|
|
80
|
+
const hueCases: Case[] = Object.keys(themes)
|
|
81
|
+
.filter((name) => /^(light|dark)_[a-z]+$/.test(name) && themes[`${name}_Button`])
|
|
82
|
+
.map((scope) => ({
|
|
83
|
+
label: scope,
|
|
84
|
+
scope,
|
|
85
|
+
scheme: scope.startsWith("dark") ? "dark" : "light",
|
|
86
|
+
knobs: themePackage.defaultPreset.knobs,
|
|
87
|
+
}));
|
|
88
|
+
|
|
89
|
+
function groundOf({ scope, scheme, knobs }: Case): string {
|
|
90
|
+
const { elevatedSurface } = resolveKnobs(knobs, undefined, scheme).knobProps;
|
|
91
|
+
return resolve(scope, elevatedSurface.backgroundColor as string);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
describe("FZ-7944: a control on an overlay has a plate distinct from the overlay's ground", () => {
|
|
95
|
+
it("covers the exported presets and the hue scopes", () => {
|
|
96
|
+
expect(presets.map(([name]) => name)).toEqual(
|
|
97
|
+
expect.arrayContaining(["defaultPreset", "boldPreset"]),
|
|
98
|
+
);
|
|
99
|
+
expect(hueCases.length).toBeGreaterThanOrEqual(16);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// The floor is the dark ask; light keeps its own wash, asserted below.
|
|
103
|
+
const darkCases = [...presetCases, ...hueCases].filter((c) => c.scheme === "dark");
|
|
104
|
+
|
|
105
|
+
describe.each(darkCases)("$label", (c) => {
|
|
106
|
+
const ground = groundOf(c);
|
|
107
|
+
|
|
108
|
+
it("a tinted Button's rest, hover and press each clear the plate floor on the ground", () => {
|
|
109
|
+
if (c.knobs.fillStyle === "outlined") return;
|
|
110
|
+
const paint = controlTierPaint("tinted", true, true);
|
|
111
|
+
for (const [state, token] of Object.entries(paint)) {
|
|
112
|
+
const plate = resolve(c.scope, token, "Button");
|
|
113
|
+
expect(
|
|
114
|
+
ratio(plate, ground),
|
|
115
|
+
`${state} ${token} ${plate} on ${ground}`,
|
|
116
|
+
).toBeGreaterThanOrEqual(plateFloor);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("a plain Button's hover and press wash clear the plate floor on the ground", () => {
|
|
121
|
+
const paint = controlTierPaint("plain", true, true);
|
|
122
|
+
for (const token of [paint.hover, paint.press]) {
|
|
123
|
+
const plate = resolve(c.scope, token, "Button");
|
|
124
|
+
expect(ratio(plate, ground), `${token} ${plate} on ${ground}`).toBeGreaterThanOrEqual(
|
|
125
|
+
plateFloor,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("Slider and Progress tracks read on the ground", () => {
|
|
131
|
+
for (const component of ["Slider", "Progress"]) {
|
|
132
|
+
const track = resolve(c.scope, formControlColors.background, component);
|
|
133
|
+
expect(
|
|
134
|
+
ratio(track, ground),
|
|
135
|
+
`${component} track ${track} on ${ground}`,
|
|
136
|
+
).toBeGreaterThanOrEqual(plateFloor);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("the Switch off track and the Slider thumb read on the ground", () => {
|
|
141
|
+
const track = resolve(c.scope, formSwitchColors.track.off, "Switch");
|
|
142
|
+
expect(ratio(track, ground), `Switch off ${track} on ${ground}`).toBeGreaterThanOrEqual(
|
|
143
|
+
plateFloor,
|
|
144
|
+
);
|
|
145
|
+
// Slider.tsx: the thumb is the readable anchor on the accent fill, read at field scope.
|
|
146
|
+
const mark = resolve(c.scope, formSelectedColors.mark);
|
|
147
|
+
const thumb = holdInkFloor(
|
|
148
|
+
mark,
|
|
149
|
+
pickReadableForeground(mark, resolve(c.scope, "$color1"), resolve(c.scope, "$color12")),
|
|
150
|
+
);
|
|
151
|
+
expect(ratio(thumb, ground), `SliderThumb ${thumb} on ${ground}`).toBeGreaterThanOrEqual(
|
|
152
|
+
plateFloor,
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("dark keeps the MPO-69 elevation tint and light keeps the page ground", () => {
|
|
158
|
+
const knobs = themePackage.defaultPreset.knobs;
|
|
159
|
+
const ground = (scheme: "light" | "dark") =>
|
|
160
|
+
resolveKnobs(knobs, undefined, scheme).knobProps.elevatedSurface.backgroundColor;
|
|
161
|
+
expect(ground("dark")).toBe("$color4");
|
|
162
|
+
expect(ground("light")).toBe("$background");
|
|
163
|
+
expect(controlTierPaint("tinted", false, true)).toEqual(controlTierPaint("tinted", false));
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
describe("FZ-7944: every frame that paints the elevated ground marks its subtree elevated", () => {
|
|
168
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
169
|
+
const frames = [
|
|
170
|
+
"../../theme/src/theme/overlaySurfaces.tsx",
|
|
171
|
+
"./FloatingPanel/index.tsx",
|
|
172
|
+
"./FloatingPanel/index.native.tsx",
|
|
173
|
+
"./AdaptivePopup/index.tsx",
|
|
174
|
+
];
|
|
175
|
+
it.each(frames)("%s", (file) => {
|
|
176
|
+
const src = readFileSync(join(here, file), "utf8");
|
|
177
|
+
const resets = src.match(/<Surface\b[^>]*\bpainted=\{false\}[^>]*>/g) ?? [];
|
|
178
|
+
expect(resets.length, "the frame wraps its content in a Surface").toBeGreaterThan(0);
|
|
179
|
+
for (const tag of resets) expect(tag).toMatch(/\belevated\b/);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { isWeb } from "tamagui";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* FZ-7849: on native the whole row of a labelled choice control (RadioGroup
|
|
5
|
+
* option, Checkbox, Switch) is one press target, as `<label for>` makes it on
|
|
6
|
+
* web.
|
|
7
|
+
*
|
|
8
|
+
* tamagui's Label emulates `for` on native through `focusFocusable(htmlFor)`, a
|
|
9
|
+
* process-global registry keyed by element id. A second copy of
|
|
10
|
+
* `@tamagui/focusable` in a consumer's tree, or a duplicate id whose unmount
|
|
11
|
+
* deletes the live entry, leaves the label dead while the control still works,
|
|
12
|
+
* as the SHC console's Catalog filters did in a sheet on MPO 7.37.0. The gap between control
|
|
13
|
+
* and label and the row past the label text were never targets at all.
|
|
14
|
+
*
|
|
15
|
+
* So the component that owns the value wires the press: row and label both
|
|
16
|
+
* call `select`, and the label drops `htmlFor` so the registry cannot fire a
|
|
17
|
+
* second toggle that undoes the first. RN gives a tap to the innermost
|
|
18
|
+
* handler, so a tap on the control still fires only the control. Web keeps
|
|
19
|
+
* `htmlFor`: a row handler there would also get the click bubbling up from the
|
|
20
|
+
* control.
|
|
21
|
+
*/
|
|
22
|
+
export function choiceRowPressProps(select: (() => void) | undefined) {
|
|
23
|
+
return !isWeb && select ? { onPress: select } : undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A disabled or read-only row passes no `select`, so its label takes no press.
|
|
28
|
+
* The label consumes its press so a renderer that bubbles it (the web renderer
|
|
29
|
+
* the native specs run on) cannot hand the row a second toggle.
|
|
30
|
+
*/
|
|
31
|
+
export function choiceLabelPressProps(htmlFor: string, select: (() => void) | undefined) {
|
|
32
|
+
if (isWeb) return { htmlFor };
|
|
33
|
+
if (!select) return {};
|
|
34
|
+
return {
|
|
35
|
+
onPress: (event?: { stopPropagation?: () => void }) => {
|
|
36
|
+
event?.stopPropagation?.();
|
|
37
|
+
select();
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -100,3 +100,8 @@ export function withOverlayStack<P extends ComponentType<any>>(
|
|
|
100
100
|
Stacked.displayName = displayName;
|
|
101
101
|
return Stacked as unknown as P;
|
|
102
102
|
}
|
|
103
|
+
|
|
104
|
+
/** True inside a house overlay (a sheet, dialog, popover or floating panel). */
|
|
105
|
+
export function useInsideOverlay(): boolean {
|
|
106
|
+
return useContext(OverlayStackContext) !== undefined;
|
|
107
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AdaptivePopup/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0B5D,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,gFAAgF;IAChF,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,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;AA6ED,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,GACT,EAAE,kBAAkB,2CAyRpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAwBL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAEhB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAEL,KAAK,WAAW,IAAI,kBAAkB,EAavC,MAAM,SAAS,CAAC;AAKjB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,KAAK,EAAE,UAAU,EAAuB,MAAM,cAAc,CAAC;AAMpE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAE1C,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAkC,CAAC;AAElG,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,EACrC,MAAM,GAAE,gBAA4B,EACpC,KAAK,UAAQ,GACZ,gBAAgB,CAOlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQnE;AAaD,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElE,KAAK,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA2F7E,eAAO,MAAM,WAAW;;;;;;;;6CA2DtB,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CACvC,kBAAkB,EAClB,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAC1C;IACC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,MAAM,EACN,IAAI,EAAE,QAAQ,EACd,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,MAAc,EACd,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,cAAc,EACd,uBAAiC,EACjC,gBAAgB,EAChB,YAAwB,EACxB,MAAM,EAAE,UAAU,EAClB,iBAAiB,EAAE,qBAAqB,EACxC,GAAG,KAAK,EACT,EAAE,WAAW,2CA2nBb;yBA7pBe,MAAM;;;iBAjGoC,CAAC;YACvD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a FloatingPanel becomes where it would otherwise be a bottom sheet:
|
|
3
|
+
* on native, and on the web at or below OVERLAY_BREAKPOINT.
|
|
4
|
+
*
|
|
5
|
+
* - `"sheet"`: the bottom sheet, wherever it opens.
|
|
6
|
+
* - `"menu"`: a menu over its trigger (LC-112) wherever it opens.
|
|
7
|
+
* - `"auto"`: the sheet at page level, the menu inside another overlay. A
|
|
8
|
+
* sheet over a sheet is the one thing a phone must never show (FZ-7830).
|
|
9
|
+
*/
|
|
10
|
+
export type CompactFace = "sheet" | "menu" | "auto";
|
|
11
|
+
export declare function resolveCompactFace(face: CompactFace | undefined, insideOverlay: boolean): "sheet" | "menu";
|
|
12
|
+
/** The longest list a picker opens as a menu over its trigger (FZ-7830). */
|
|
13
|
+
export declare const SHORT_LIST_MAX = 7;
|
|
14
|
+
/**
|
|
15
|
+
* A picker's face (FZ-7830, LC-112): a short list with no search opens as a
|
|
16
|
+
* menu over its trigger at every level, the iOS 14+ pull-down picker. A long or
|
|
17
|
+
* searchable list keeps the sheet at page level and opens as a scrolling menu
|
|
18
|
+
* inside another overlay.
|
|
19
|
+
*/
|
|
20
|
+
export declare function pickerCompactFace(optionCount: number, searchable?: boolean): CompactFace;
|
|
21
|
+
//# sourceMappingURL=compactFace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactFace.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/compactFace.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,aAAa,EAAE,OAAO,GACrB,OAAO,GAAG,MAAM,CAIlB;AAED,4EAA4E;AAC5E,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,WAAW,CAEtF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ReactNode, RefObject } from "react";
|
|
2
2
|
import type { PanelWidthMode } from "./useFloatingPanel";
|
|
3
|
+
import { type CompactFace } from "./compactFace";
|
|
3
4
|
export { floatingPanelActionProps, isNestedPanelAction } from "./nestedAction";
|
|
4
5
|
export { useFloatingPanel, panelAnimationDuration, panelGrowDuration, panelTransition, panelViewportPadding, panelAnchorOffset, resolvePanelWidthMode, } from "./useFloatingPanel";
|
|
5
6
|
export type { PanelWidthMode, UseFloatingPanelOptions, UseFloatingPanelReturn, } from "./useFloatingPanel";
|
|
@@ -45,6 +46,15 @@ export interface FloatingPanelProps {
|
|
|
45
46
|
* OVERLAY_BREAKPOINT), floating panel from `$sm` up.
|
|
46
47
|
*/
|
|
47
48
|
sheet?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* What the panel becomes where it would be a bottom sheet (native, and web
|
|
51
|
+
* at or below 640). `"sheet"` (default) keeps the sheet; `"menu"` opens a
|
|
52
|
+
* menu over the trigger; `"auto"` keeps the sheet at page level and opens
|
|
53
|
+
* the menu inside another overlay, so a sheet never stacks on a sheet
|
|
54
|
+
* (FZ-7830). A menu inside an overlay slides back on screen instead of
|
|
55
|
+
* taking LC-139's collision sheet. An explicit `sheet` wins on the web.
|
|
56
|
+
*/
|
|
57
|
+
compactFace?: CompactFace;
|
|
48
58
|
/**
|
|
49
59
|
* Sizing mode for the web floating panel.
|
|
50
60
|
* - `"grow"` (default): opens from the trigger to the nearest viewport
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AA4B3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FloatingPanel/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AA4B3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAerE,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;;;;;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;;;;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;AAuPD,wBAAgB,eAAe,YAE9B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAwBtD"}
|
|
@@ -44,6 +44,13 @@
|
|
|
44
44
|
* - Opening a Modal under the same finger can synthesize a backdrop press;
|
|
45
45
|
* backdrop dismiss is armed a short delay after the present begins.
|
|
46
46
|
*
|
|
47
|
+
* Menu face (`compactFace`, FZ-7830): instead of the sheet, a menu opens
|
|
48
|
+
* over the trigger (LC-112), its top start corner on the trigger's, the
|
|
49
|
+
* trigger echoed as its first row, sliding back inside the safe area where it
|
|
50
|
+
* would run off screen. DropdownMenu always opens this way (a UIMenu
|
|
51
|
+
* pull-down); Select opens this way for a short list, and for any list inside
|
|
52
|
+
* another overlay, so a sheet never stacks on a sheet.
|
|
53
|
+
*
|
|
47
54
|
* ContextMenu (`openOn="contextmenu"`): long-press opens it. On a window wider
|
|
48
55
|
* than OVERLAY_BREAKPOINT (a tablet) it opens at the long-press point, the
|
|
49
56
|
* same free overlay the web draws at the pointer; a phone keeps the sheet,
|
|
@@ -56,5 +63,5 @@ export type { FloatingPanelProps } from "./index";
|
|
|
56
63
|
export { floatingPanelActionProps, isNestedPanelAction } from "./nestedAction";
|
|
57
64
|
/** Native never has a >sm web viewport; AdaptivePopup uses this to pick Sheet mode. */
|
|
58
65
|
export declare function useViewportGtSm(): boolean;
|
|
59
|
-
export declare function FloatingPanel({ open, onOpenChange, onNativeShow, trigger, triggerEnd, triggerSizing, children: panelChildren, scrollable, disabled, contentPadding, header, scrollViewProps, triggerA11y, sheetFill, openOn, }: FloatingPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
66
|
+
export declare function FloatingPanel({ open, onOpenChange, onNativeShow, trigger, triggerEnd, triggerSizing, children: panelChildren, scrollable, disabled, contentPadding, header, scrollViewProps, triggerA11y, sheetFill, openOn, compactFace, triggerRow, triggerEcho, }: FloatingPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
60
67
|
//# sourceMappingURL=index.native.d.ts.map
|
|
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAuCH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAelD,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,GACnB,EAAE,kBAAkB,2CA4iBpB"}
|
|
@@ -63,4 +63,33 @@ export interface PointReference {
|
|
|
63
63
|
}
|
|
64
64
|
/** The target's bottom start corner: where a menu with no pointer opens. */
|
|
65
65
|
export declare function referenceCornerPoint(reference: PointReference, rtl?: boolean): PanelPoint;
|
|
66
|
+
/** A trigger's box in the same coordinates as the bounds (window or viewport). */
|
|
67
|
+
export interface TriggerRect {
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
width: number;
|
|
71
|
+
height: number;
|
|
72
|
+
}
|
|
73
|
+
export interface TriggerPlacement {
|
|
74
|
+
left: number;
|
|
75
|
+
top: number;
|
|
76
|
+
width: number;
|
|
77
|
+
maxHeight: number;
|
|
78
|
+
/** The menu moved off the trigger's top start corner to stay on screen. */
|
|
79
|
+
shifted: boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A menu opened over its trigger (LC-112) where no bottom sheet may take it:
|
|
83
|
+
* on native, and inside another overlay (FZ-7830). Its top start corner sits
|
|
84
|
+
* on the trigger's, it is at least the trigger's width, and where it would
|
|
85
|
+
* run off screen it slides back inside the bounds the way a UIMenu does,
|
|
86
|
+
* scrolling whatever still does not fit.
|
|
87
|
+
*/
|
|
88
|
+
export declare function placeOverTrigger({ trigger, width, height, bounds, rtl, }: {
|
|
89
|
+
trigger: TriggerRect;
|
|
90
|
+
width: number;
|
|
91
|
+
height: number;
|
|
92
|
+
bounds: PanelBounds;
|
|
93
|
+
rtl?: boolean;
|
|
94
|
+
}): TriggerPlacement;
|
|
66
95
|
//# sourceMappingURL=pointAnchor.d.ts.map
|