@multiplatform.one/forms 7.66.0 → 7.67.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.native.js +1 -1
- package/dist/cjs/AdaptivePopup/index.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/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/RegularPanel.cjs +164 -0
- package/dist/cjs/FloatingPanel/RegularPanel.native.js +169 -0
- package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/compactFace.cjs +6 -0
- package/dist/cjs/FloatingPanel/compactFace.native.js +6 -0
- package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/containingBlock.cjs +46 -0
- package/dist/cjs/FloatingPanel/containingBlock.native.js +51 -0
- package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/index.cjs +2 -20
- package/dist/cjs/FloatingPanel/index.native.js +79 -45
- 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 +25 -0
- package/dist/cjs/FloatingPanel/pointAnchor.native.js +26 -0
- package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/regularPlacement.cjs +61 -0
- package/dist/cjs/FloatingPanel/regularPlacement.native.js +65 -0
- package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -0
- 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/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.cjs +1 -1
- package/dist/cjs/fields/Combobox/index.native.js +8 -6
- 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.cjs +5 -0
- package/dist/cjs/fields/Input/index.native.js +8 -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.cjs +3 -2
- package/dist/cjs/fields/Select/InlineChoices.native.js +5 -2
- package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/Select/SheetPickerRow.cjs +154 -0
- package/dist/cjs/fields/Select/SheetPickerRow.native.js +165 -0
- package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -0
- package/dist/cjs/fields/Select/index.cjs +63 -4
- package/dist/cjs/fields/Select/index.native.js +89 -30
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.cjs +14 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.native.js +15 -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.cjs +96 -4
- package/dist/cjs/fields/Slider/index.native.js +104 -6
- 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 +71 -1
- package/dist/cjs/fields/Switch/index.native.js +74 -3
- 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.cjs +67 -1
- package/dist/cjs/fields/ToggleGroup/index.native.js +76 -2
- package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +34 -19
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +44 -21
- 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.cjs +54 -0
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
- 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.cjs +11 -0
- package/dist/cjs/index.native.js +56 -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.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/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/overlaySizeClass.cjs +42 -0
- package/dist/cjs/shared/overlaySizeClass.native.js +45 -0
- package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -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/sheetNavigation.cjs +76 -0
- package/dist/cjs/shared/sheetNavigation.native.js +129 -0
- package/dist/cjs/shared/sheetNavigation.native.js.map +1 -0
- package/dist/cjs/shared/systemControlModules.cjs +34 -0
- package/dist/cjs/shared/systemControlModules.gnome.cjs +34 -0
- package/dist/cjs/shared/systemControlModules.gnome.native.js +37 -0
- package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -0
- package/dist/cjs/shared/systemControlModules.native.js +77 -0
- package/dist/cjs/shared/systemControlModules.native.js.map +1 -0
- package/dist/cjs/shared/systemControls.cjs +47 -0
- package/dist/cjs/shared/systemControls.native.js +51 -0
- package/dist/cjs/shared/systemControls.native.js.map +1 -0
- package/dist/cjs/shared/t.native.js.map +1 -1
- package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
- package/dist/cjs/shared/touchWebPicker.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/FloatingPanel/RegularPanel.mjs +139 -0
- package/dist/esm/FloatingPanel/RegularPanel.mjs.map +1 -0
- package/dist/esm/FloatingPanel/RegularPanel.native.js +141 -0
- package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -0
- package/dist/esm/FloatingPanel/compactFace.mjs +5 -1
- package/dist/esm/FloatingPanel/compactFace.mjs.map +1 -1
- package/dist/esm/FloatingPanel/compactFace.native.js +5 -1
- package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/esm/FloatingPanel/containingBlock.mjs +21 -0
- package/dist/esm/FloatingPanel/containingBlock.mjs.map +1 -0
- package/dist/esm/FloatingPanel/containingBlock.native.js +23 -0
- package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -0
- package/dist/esm/FloatingPanel/index.mjs +1 -19
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +83 -49
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.mjs +25 -1
- package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.native.js +26 -1
- package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/esm/FloatingPanel/regularPlacement.mjs +35 -0
- package/dist/esm/FloatingPanel/regularPlacement.mjs.map +1 -0
- package/dist/esm/FloatingPanel/regularPlacement.native.js +36 -0
- package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -0
- package/dist/esm/fields/Combobox/index.mjs +1 -1
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +3 -1
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/Input/index.mjs +6 -1
- package/dist/esm/fields/Input/index.mjs.map +1 -1
- package/dist/esm/fields/Input/index.native.js +6 -1
- package/dist/esm/fields/Input/index.native.js.map +1 -1
- package/dist/esm/fields/Select/InlineChoices.mjs +3 -2
- package/dist/esm/fields/Select/InlineChoices.mjs.map +1 -1
- package/dist/esm/fields/Select/InlineChoices.native.js +5 -2
- package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/esm/fields/Select/SheetPickerRow.mjs +129 -0
- package/dist/esm/fields/Select/SheetPickerRow.mjs.map +1 -0
- package/dist/esm/fields/Select/SheetPickerRow.native.js +137 -0
- package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -0
- package/dist/esm/fields/Select/index.mjs +64 -5
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +86 -27
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Select/shouldInlineChoices.mjs +12 -1
- package/dist/esm/fields/Select/shouldInlineChoices.mjs.map +1 -1
- package/dist/esm/fields/Select/shouldInlineChoices.native.js +13 -1
- package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.mjs +96 -4
- package/dist/esm/fields/Slider/index.mjs.map +1 -1
- package/dist/esm/fields/Slider/index.native.js +103 -5
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/Switch/index.mjs +71 -1
- package/dist/esm/fields/Switch/index.mjs.map +1 -1
- package/dist/esm/fields/Switch/index.native.js +72 -1
- package/dist/esm/fields/Switch/index.native.js.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.mjs +67 -1
- package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.native.js +75 -1
- package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +36 -21
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +46 -23
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js +21 -0
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
- package/dist/esm/index.mjs +3 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +3 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/shared/overlaySizeClass.mjs +14 -0
- package/dist/esm/shared/overlaySizeClass.mjs.map +1 -0
- package/dist/esm/shared/overlaySizeClass.native.js +14 -0
- package/dist/esm/shared/overlaySizeClass.native.js.map +1 -0
- package/dist/esm/shared/sheetNavigation.mjs +47 -0
- package/dist/esm/shared/sheetNavigation.mjs.map +1 -0
- package/dist/esm/shared/sheetNavigation.native.js +97 -0
- package/dist/esm/shared/sheetNavigation.native.js.map +1 -0
- package/dist/esm/shared/systemControlModules.gnome.mjs +8 -0
- package/dist/esm/shared/systemControlModules.gnome.mjs.map +1 -0
- package/dist/esm/shared/systemControlModules.gnome.native.js +8 -0
- package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -0
- package/dist/esm/shared/systemControlModules.mjs +8 -0
- package/dist/esm/shared/systemControlModules.mjs.map +1 -0
- package/dist/esm/shared/systemControlModules.native.js +47 -0
- package/dist/esm/shared/systemControlModules.native.js.map +1 -0
- package/dist/esm/shared/systemControls.mjs +19 -0
- package/dist/esm/shared/systemControls.mjs.map +1 -0
- package/dist/esm/shared/systemControls.native.js +20 -0
- package/dist/esm/shared/systemControls.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/RegularPanel.mjs +139 -0
- package/dist/jsx/FloatingPanel/RegularPanel.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/RegularPanel.native.js +169 -0
- package/dist/jsx/FloatingPanel/RegularPanel.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/compactFace.mjs +5 -1
- package/dist/jsx/FloatingPanel/compactFace.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/compactFace.native.js +6 -0
- package/dist/jsx/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/containingBlock.mjs +21 -0
- package/dist/jsx/FloatingPanel/containingBlock.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/containingBlock.native.js +51 -0
- package/dist/jsx/FloatingPanel/containingBlock.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/index.mjs +1 -19
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +79 -45
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/pointAnchor.mjs +25 -1
- package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/pointAnchor.native.js +26 -0
- package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/regularPlacement.mjs +35 -0
- package/dist/jsx/FloatingPanel/regularPlacement.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/regularPlacement.native.js +65 -0
- package/dist/jsx/FloatingPanel/regularPlacement.native.js.map +1 -0
- package/dist/jsx/fields/Combobox/index.mjs +1 -1
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +3 -1
- package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
- package/dist/jsx/fields/Input/index.mjs +6 -1
- package/dist/jsx/fields/Input/index.mjs.map +1 -1
- package/dist/jsx/fields/Input/index.native.js +5 -0
- package/dist/jsx/fields/Input/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/InlineChoices.mjs +3 -2
- package/dist/jsx/fields/Select/InlineChoices.mjs.map +1 -1
- package/dist/jsx/fields/Select/InlineChoices.native.js +5 -2
- package/dist/jsx/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/jsx/fields/Select/SheetPickerRow.mjs +129 -0
- package/dist/jsx/fields/Select/SheetPickerRow.mjs.map +1 -0
- package/dist/jsx/fields/Select/SheetPickerRow.native.js +165 -0
- package/dist/jsx/fields/Select/SheetPickerRow.native.js.map +1 -0
- package/dist/jsx/fields/Select/index.mjs +64 -5
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +85 -26
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.mjs +12 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.mjs.map +1 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.native.js +15 -1
- package/dist/jsx/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/jsx/fields/Slider/index.mjs +96 -4
- package/dist/jsx/fields/Slider/index.mjs.map +1 -1
- package/dist/jsx/fields/Slider/index.native.js +103 -5
- package/dist/jsx/fields/Slider/index.native.js.map +1 -1
- package/dist/jsx/fields/Switch/index.mjs +71 -1
- package/dist/jsx/fields/Switch/index.mjs.map +1 -1
- package/dist/jsx/fields/Switch/index.native.js +72 -1
- package/dist/jsx/fields/Switch/index.native.js.map +1 -1
- package/dist/jsx/fields/ToggleGroup/index.mjs +67 -1
- package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
- package/dist/jsx/fields/ToggleGroup/index.native.js +75 -1
- package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +36 -21
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +44 -21
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
- package/dist/jsx/index.js +3 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +3 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +11 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/shared/overlaySizeClass.mjs +14 -0
- package/dist/jsx/shared/overlaySizeClass.mjs.map +1 -0
- package/dist/jsx/shared/overlaySizeClass.native.js +45 -0
- package/dist/jsx/shared/overlaySizeClass.native.js.map +1 -0
- package/dist/jsx/shared/sheetNavigation.mjs +47 -0
- package/dist/jsx/shared/sheetNavigation.mjs.map +1 -0
- package/dist/jsx/shared/sheetNavigation.native.js +129 -0
- package/dist/jsx/shared/sheetNavigation.native.js.map +1 -0
- package/dist/jsx/shared/systemControlModules.gnome.mjs +8 -0
- package/dist/jsx/shared/systemControlModules.gnome.mjs.map +1 -0
- package/dist/jsx/shared/systemControlModules.gnome.native.js +37 -0
- package/dist/jsx/shared/systemControlModules.gnome.native.js.map +1 -0
- package/dist/jsx/shared/systemControlModules.mjs +8 -0
- package/dist/jsx/shared/systemControlModules.mjs.map +1 -0
- package/dist/jsx/shared/systemControlModules.native.js +77 -0
- package/dist/jsx/shared/systemControlModules.native.js.map +1 -0
- package/dist/jsx/shared/systemControls.mjs +19 -0
- package/dist/jsx/shared/systemControls.mjs.map +1 -0
- package/dist/jsx/shared/systemControls.native.js +51 -0
- package/dist/jsx/shared/systemControls.native.js.map +1 -0
- package/package.json +16 -8
- package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +73 -3
- package/src/FloatingPanel/FloatingPanel.regularWidth.native.spec.tsx +193 -0
- package/src/FloatingPanel/RegularPanel.tsx +159 -0
- package/src/FloatingPanel/compactFace.spec.ts +24 -1
- package/src/FloatingPanel/compactFace.ts +16 -0
- package/src/FloatingPanel/containingBlock.ts +32 -0
- package/src/FloatingPanel/index.native.tsx +80 -35
- package/src/FloatingPanel/index.tsx +1 -33
- package/src/FloatingPanel/pointAnchor.spec.ts +29 -0
- package/src/FloatingPanel/pointAnchor.ts +30 -0
- package/src/FloatingPanel/regularPlacement.spec.ts +65 -0
- package/src/FloatingPanel/regularPlacement.ts +40 -0
- package/src/fields/Combobox/Combobox.regularWidth.native.spec.tsx +94 -0
- package/src/fields/Combobox/index.tsx +3 -1
- package/src/fields/Input/Input.formName.spec.tsx +53 -0
- package/src/fields/Input/index.tsx +6 -1
- package/src/fields/Select/InlineChoices.tsx +6 -3
- package/src/fields/Select/SheetPickerRow.tsx +160 -0
- package/src/fields/Select/index.tsx +65 -4
- package/src/fields/Select/shouldInlineChoices.spec.ts +21 -1
- package/src/fields/Select/shouldInlineChoices.ts +26 -0
- package/src/fields/Slider/Slider.system.native.spec.tsx +168 -0
- package/src/fields/Slider/index.tsx +166 -30
- package/src/fields/Switch/Switch.system.native.spec.tsx +162 -0
- package/src/fields/Switch/index.tsx +98 -0
- package/src/fields/ToggleGroup/ToggleGroup.system.native.spec.tsx +192 -0
- package/src/fields/ToggleGroup/index.tsx +111 -0
- package/src/fields/nativeDateTime/OsDateTimeSheet.presentation.spec.tsx +167 -0
- package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +36 -18
- package/src/fields/nativeDateTime/sheetKeyboard.spec.ts +60 -0
- package/src/fields/nativeDateTime/sheetKeyboard.ts +45 -0
- package/src/index.ts +15 -0
- package/src/shared/overlaySizeClass.spec.ts +27 -0
- package/src/shared/overlaySizeClass.ts +36 -0
- package/src/shared/sheetNavigation.ts +82 -0
- package/src/shared/systemControlModules.gnome.ts +10 -0
- package/src/shared/systemControlModules.native.spec.ts +52 -0
- package/src/shared/systemControlModules.native.ts +66 -0
- package/src/shared/systemControlModules.ts +10 -0
- package/src/shared/systemControls.ts +70 -0
- package/types/FloatingPanel/RegularPanel.d.ts +29 -0
- package/types/FloatingPanel/RegularPanel.d.ts.map +1 -0
- package/types/FloatingPanel/compactFace.d.ts +12 -0
- package/types/FloatingPanel/compactFace.d.ts.map +1 -1
- package/types/FloatingPanel/containingBlock.d.ts +14 -0
- package/types/FloatingPanel/containingBlock.d.ts.map +1 -0
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts +6 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/FloatingPanel/pointAnchor.d.ts +12 -0
- package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
- package/types/FloatingPanel/regularPlacement.d.ts +20 -0
- package/types/FloatingPanel/regularPlacement.d.ts.map +1 -0
- package/types/fields/Combobox/index.d.ts.map +1 -1
- package/types/fields/Input/index.d.ts.map +1 -1
- package/types/fields/Select/InlineChoices.d.ts.map +1 -1
- package/types/fields/Select/SheetPickerRow.d.ts +23 -0
- package/types/fields/Select/SheetPickerRow.d.ts.map +1 -0
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Select/shouldInlineChoices.d.ts +15 -0
- package/types/fields/Select/shouldInlineChoices.d.ts.map +1 -1
- package/types/fields/Slider/index.d.ts +7 -1
- package/types/fields/Slider/index.d.ts.map +1 -1
- package/types/fields/Switch/index.d.ts +7 -1
- package/types/fields/Switch/index.d.ts.map +1 -1
- package/types/fields/ToggleGroup/index.d.ts +8 -1
- package/types/fields/ToggleGroup/index.d.ts.map +1 -1
- package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -1
- package/types/fields/nativeDateTime/sheetKeyboard.d.ts +20 -0
- package/types/fields/nativeDateTime/sheetKeyboard.d.ts.map +1 -0
- package/types/index.d.ts +4 -0
- package/types/index.d.ts.map +1 -1
- package/types/shared/overlaySizeClass.d.ts +24 -0
- package/types/shared/overlaySizeClass.d.ts.map +1 -0
- package/types/shared/sheetNavigation.d.ts +31 -0
- package/types/shared/sheetNavigation.d.ts.map +1 -0
- package/types/shared/systemControlModules.d.ts +5 -0
- package/types/shared/systemControlModules.d.ts.map +1 -0
- package/types/shared/systemControlModules.gnome.d.ts +5 -0
- package/types/shared/systemControlModules.gnome.d.ts.map +1 -0
- package/types/shared/systemControlModules.native.d.ts +20 -0
- package/types/shared/systemControlModules.native.d.ts.map +1 -0
- package/types/shared/systemControls.d.ts +53 -0
- package/types/shared/systemControls.d.ts.map +1 -0
|
@@ -33,6 +33,13 @@ import {
|
|
|
33
33
|
import { Skeleton } from "../../Skeleton";
|
|
34
34
|
import { Field, FieldLayout, useFieldA11y, useFieldDescribedBy } from "../../fieldLayout";
|
|
35
35
|
import { formCommonColors, formControlColors, formSelectedColors } from "../../shared/colorRamps";
|
|
36
|
+
import { loadSystemSlider } from "../../shared/systemControlModules";
|
|
37
|
+
import {
|
|
38
|
+
type SystemPlatform,
|
|
39
|
+
type SystemSliderComponent,
|
|
40
|
+
systemControlPlatform,
|
|
41
|
+
useThemeLiteral,
|
|
42
|
+
} from "../../shared/systemControls";
|
|
36
43
|
import { t } from "../../shared/t";
|
|
37
44
|
import {
|
|
38
45
|
getElevationWrapperProps,
|
|
@@ -180,6 +187,12 @@ export interface SliderProps {
|
|
|
180
187
|
/** When true, renders a skeleton placeholder instead of the slider */
|
|
181
188
|
skeleton?: boolean;
|
|
182
189
|
"aria-label"?: string;
|
|
190
|
+
/**
|
|
191
|
+
* LC-266: on iOS and Android a single-thumb horizontal slider renders the
|
|
192
|
+
* system slider when the binary carries `@react-native-community/slider`.
|
|
193
|
+
* `false` keeps the MPO slider there.
|
|
194
|
+
*/
|
|
195
|
+
native?: boolean;
|
|
183
196
|
}
|
|
184
197
|
|
|
185
198
|
type SliderControlProps = {
|
|
@@ -219,6 +232,91 @@ type SliderControlProps = {
|
|
|
219
232
|
* (track click, keyboard, controlled value change). Drag and first paint stay
|
|
220
233
|
* transition-off so the handle never lags the pointer or wiggles on mount.
|
|
221
234
|
*/
|
|
235
|
+
/**
|
|
236
|
+
* LC-266: the system slider (UISlider, Android SeekBar). The theme paints the
|
|
237
|
+
* fill and the rail, and the Android thumb; iOS keeps its system thumb. The
|
|
238
|
+
* value readout stays beside it, as on the MPO slider.
|
|
239
|
+
*/
|
|
240
|
+
function SystemSliderControl({
|
|
241
|
+
Component,
|
|
242
|
+
platform,
|
|
243
|
+
id,
|
|
244
|
+
value,
|
|
245
|
+
min,
|
|
246
|
+
max,
|
|
247
|
+
step,
|
|
248
|
+
disabled,
|
|
249
|
+
readOnly,
|
|
250
|
+
hasError,
|
|
251
|
+
accessibilityLabel,
|
|
252
|
+
accessibilityHint,
|
|
253
|
+
height,
|
|
254
|
+
onChangeValue,
|
|
255
|
+
onBlur,
|
|
256
|
+
}: {
|
|
257
|
+
Component: SystemSliderComponent;
|
|
258
|
+
platform: SystemPlatform;
|
|
259
|
+
id: string;
|
|
260
|
+
value: number;
|
|
261
|
+
min: number;
|
|
262
|
+
max: number;
|
|
263
|
+
step: number;
|
|
264
|
+
disabled?: boolean;
|
|
265
|
+
readOnly?: boolean;
|
|
266
|
+
hasError?: boolean;
|
|
267
|
+
accessibilityLabel?: string;
|
|
268
|
+
accessibilityHint?: string;
|
|
269
|
+
height: SizeTokens;
|
|
270
|
+
onChangeValue: (value: number) => void;
|
|
271
|
+
onBlur?: (...args: any[]) => void;
|
|
272
|
+
}) {
|
|
273
|
+
const literal = useThemeLiteral();
|
|
274
|
+
const [displayValue, setDisplayValue] = useState(value);
|
|
275
|
+
useEffect(() => setDisplayValue(value), [value]);
|
|
276
|
+
const fill = literal(hasError ? formCommonColors.error : formSelectedColors.mark);
|
|
277
|
+
return (
|
|
278
|
+
<XStack height={height} alignItems="center" width="100%" gap="$3">
|
|
279
|
+
<View
|
|
280
|
+
flex={1}
|
|
281
|
+
minWidth={0}
|
|
282
|
+
justifyContent="center"
|
|
283
|
+
{...(readOnly ? { pointerEvents: "none" as const } : undefined)}
|
|
284
|
+
data-mp-system-control="slider"
|
|
285
|
+
>
|
|
286
|
+
<Component
|
|
287
|
+
id={id}
|
|
288
|
+
style={{ width: "100%" }}
|
|
289
|
+
value={value}
|
|
290
|
+
minimumValue={min}
|
|
291
|
+
maximumValue={max}
|
|
292
|
+
step={step}
|
|
293
|
+
disabled={disabled}
|
|
294
|
+
minimumTrackTintColor={fill}
|
|
295
|
+
maximumTrackTintColor={literal(formControlColors.background)}
|
|
296
|
+
{...(platform === "android" && { thumbTintColor: fill })}
|
|
297
|
+
accessibilityLabel={accessibilityLabel}
|
|
298
|
+
accessibilityHint={accessibilityHint}
|
|
299
|
+
onValueChange={(next) => {
|
|
300
|
+
setDisplayValue(next);
|
|
301
|
+
if (disabled || readOnly) return;
|
|
302
|
+
onChangeValue(next);
|
|
303
|
+
}}
|
|
304
|
+
onSlidingComplete={() => onBlur?.()}
|
|
305
|
+
/>
|
|
306
|
+
</View>
|
|
307
|
+
<Paragraph
|
|
308
|
+
size="$2"
|
|
309
|
+
color={formCommonColors.text}
|
|
310
|
+
minWidth={32}
|
|
311
|
+
textAlign="right"
|
|
312
|
+
aria-hidden
|
|
313
|
+
>
|
|
314
|
+
{formatSliderOutput([displayValue], step)}
|
|
315
|
+
</Paragraph>
|
|
316
|
+
</XStack>
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
|
|
222
320
|
function SliderControl({
|
|
223
321
|
id,
|
|
224
322
|
sliderValue,
|
|
@@ -712,6 +810,7 @@ export function Slider({
|
|
|
712
810
|
sliderProps,
|
|
713
811
|
skeleton,
|
|
714
812
|
"aria-label": ariaLabel,
|
|
813
|
+
native = true,
|
|
715
814
|
}: SliderProps) {
|
|
716
815
|
// Canonical `onChange` and the alias `onValueChange` both fire from the
|
|
717
816
|
// single emit site below (same reconciliation as Switch).
|
|
@@ -740,41 +839,70 @@ export function Slider({
|
|
|
740
839
|
);
|
|
741
840
|
}
|
|
742
841
|
|
|
842
|
+
const systemPlatform = native ? systemControlPlatform() : null;
|
|
843
|
+
const SystemSlider =
|
|
844
|
+
systemPlatform && sliderProps?.orientation !== "vertical" && sliderProps?.dir !== "rtl"
|
|
845
|
+
? loadSystemSlider()
|
|
846
|
+
: null;
|
|
847
|
+
|
|
743
848
|
const control = (
|
|
744
849
|
sliderValue: number[],
|
|
745
850
|
isControlled: boolean,
|
|
746
851
|
handleChange?: (values: number[]) => void,
|
|
747
852
|
handleBlur?: (...args: any[]) => void,
|
|
748
853
|
hasError?: boolean,
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
854
|
+
errorMessage?: string,
|
|
855
|
+
) =>
|
|
856
|
+
SystemSlider && systemPlatform && sliderValue.length === 1 ? (
|
|
857
|
+
<SystemSliderControl
|
|
858
|
+
Component={SystemSlider}
|
|
859
|
+
platform={systemPlatform}
|
|
860
|
+
id={id}
|
|
861
|
+
value={sliderValue[0] ?? min}
|
|
862
|
+
min={min}
|
|
863
|
+
max={max}
|
|
864
|
+
step={step}
|
|
865
|
+
disabled={disabled}
|
|
866
|
+
readOnly={readOnly}
|
|
867
|
+
hasError={hasError}
|
|
868
|
+
accessibilityLabel={ariaLabel ?? (typeof label === "string" ? label : undefined)}
|
|
869
|
+
accessibilityHint={errorMessage ?? helperText}
|
|
870
|
+
height={size || knobProps.sizeToken}
|
|
871
|
+
onChangeValue={(next) => {
|
|
872
|
+
handleChange?.([next]);
|
|
873
|
+
handleValueChange([next]);
|
|
874
|
+
}}
|
|
875
|
+
onBlur={handleBlur}
|
|
876
|
+
/>
|
|
877
|
+
) : (
|
|
878
|
+
<SliderControl
|
|
879
|
+
id={id}
|
|
880
|
+
sliderValue={sliderValue}
|
|
881
|
+
controlled={isControlled}
|
|
882
|
+
min={min}
|
|
883
|
+
max={max}
|
|
884
|
+
step={step}
|
|
885
|
+
disabled={disabled}
|
|
886
|
+
readOnly={readOnly}
|
|
887
|
+
required={required}
|
|
888
|
+
hasError={hasError}
|
|
889
|
+
hasLabel={hasLabel}
|
|
890
|
+
labelText={typeof label === "string" ? label : undefined}
|
|
891
|
+
aria-label={ariaLabel}
|
|
892
|
+
size={size}
|
|
893
|
+
sizeToken={knobProps.sizeToken}
|
|
894
|
+
outlined={knobProps.outlined}
|
|
895
|
+
borderRadius={knobProps.borderRadius.borderRadius}
|
|
896
|
+
transitionToken={transitionToken}
|
|
897
|
+
elevationWrapperProps={elevationWrapperProps}
|
|
898
|
+
sliderProps={sliderProps}
|
|
899
|
+
onChangeValues={(values) => {
|
|
900
|
+
handleChange?.(values);
|
|
901
|
+
handleValueChange(values);
|
|
902
|
+
}}
|
|
903
|
+
onBlur={handleBlur}
|
|
904
|
+
/>
|
|
905
|
+
);
|
|
778
906
|
|
|
779
907
|
if (!resolvedForm || !name) {
|
|
780
908
|
return (
|
|
@@ -789,7 +917,14 @@ export function Slider({
|
|
|
789
917
|
knobProps={knobProps}
|
|
790
918
|
disabled={disabled}
|
|
791
919
|
>
|
|
792
|
-
{control(
|
|
920
|
+
{control(
|
|
921
|
+
value ?? defaultValue ?? [min],
|
|
922
|
+
value !== undefined,
|
|
923
|
+
undefined,
|
|
924
|
+
onBlur,
|
|
925
|
+
!!error,
|
|
926
|
+
typeof error === "string" && error ? error : undefined,
|
|
927
|
+
)}
|
|
793
928
|
</FieldLayout>
|
|
794
929
|
);
|
|
795
930
|
}
|
|
@@ -832,6 +967,7 @@ export function Slider({
|
|
|
832
967
|
},
|
|
833
968
|
mergeFieldHandler(field, "handleBlur", onBlur),
|
|
834
969
|
!!resolvedError,
|
|
970
|
+
typeof resolvedError === "string" && resolvedError ? resolvedError : undefined,
|
|
835
971
|
)}
|
|
836
972
|
</FieldLayout>
|
|
837
973
|
);
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
2
|
+
import { createDefaultThemeConfig } from "@multiplatform.one/theme";
|
|
3
|
+
import { useForm } from "@tanstack/react-form";
|
|
4
|
+
import { cleanup, fireEvent, render } from "@testing-library/react";
|
|
5
|
+
import type { ReactElement } from "react";
|
|
6
|
+
import { TamaguiProvider } from "tamagui";
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
import { Form } from "../../Form";
|
|
9
|
+
import { Switch } from "./index";
|
|
10
|
+
|
|
11
|
+
const platform = vi.hoisted(() => ({ os: "ios" as "ios" | "android" | null }));
|
|
12
|
+
|
|
13
|
+
// The system Switch as a probe: it shows the props React Native's Switch got
|
|
14
|
+
// and flips through onValueChange the way a tap on UISwitch does.
|
|
15
|
+
const SystemSwitchProbe = vi.hoisted(
|
|
16
|
+
() =>
|
|
17
|
+
function SystemSwitchProbe(props: Record<string, any>) {
|
|
18
|
+
return (
|
|
19
|
+
<button
|
|
20
|
+
type="button"
|
|
21
|
+
data-testid="system-switch"
|
|
22
|
+
data-value={String(props.value)}
|
|
23
|
+
data-disabled={String(Boolean(props.disabled))}
|
|
24
|
+
data-track-on={props.trackColor?.true}
|
|
25
|
+
data-track-off={props.trackColor?.false}
|
|
26
|
+
data-ios-off={props.ios_backgroundColor}
|
|
27
|
+
data-thumb={props.thumbColor ?? ""}
|
|
28
|
+
data-label={props.accessibilityLabel ?? ""}
|
|
29
|
+
onClick={() => props.disabled || props.onValueChange?.(!props.value)}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
vi.mock("../../shared/systemControls", async (importOriginal) => ({
|
|
36
|
+
...(await importOriginal<typeof import("../../shared/systemControls")>()),
|
|
37
|
+
systemControlPlatform: () => platform.os,
|
|
38
|
+
SystemSwitchView: SystemSwitchProbe,
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
const mpoTheme = createDefaultThemeConfig();
|
|
42
|
+
const renderInScheme = (ui: ReactElement, scheme: "light" | "dark") =>
|
|
43
|
+
render(
|
|
44
|
+
<TamaguiProvider config={mpoTheme.tamagui} defaultTheme={scheme} disableInjectCSS>
|
|
45
|
+
{ui}
|
|
46
|
+
</TamaguiProvider>,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
afterEach(cleanup);
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
platform.os = "ios";
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const literal = (value: string | null) => Boolean(value) && !value!.startsWith("$");
|
|
55
|
+
|
|
56
|
+
function FormSwitch({ onSubmit }: { onSubmit: (value: { alerts: boolean }) => void }) {
|
|
57
|
+
const form = useForm({
|
|
58
|
+
defaultValues: { alerts: false },
|
|
59
|
+
onSubmit: ({ value }) => onSubmit(value),
|
|
60
|
+
});
|
|
61
|
+
return (
|
|
62
|
+
<Form form={form}>
|
|
63
|
+
<Switch name="alerts" label="Alerts" />
|
|
64
|
+
<button type="button" onClick={() => form.handleSubmit()}>
|
|
65
|
+
Save
|
|
66
|
+
</button>
|
|
67
|
+
</Form>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// LC-266 PLATFORM-ERGONOMICS (FZ-8117). iOS and Android render React Native's
|
|
72
|
+
// own Switch, tinted from the theme; web and GNOME keep the MPO switch.
|
|
73
|
+
describe("Switch on iOS and Android", () => {
|
|
74
|
+
it.each(["light", "dark"] as const)(
|
|
75
|
+
"renders the system switch with the %s theme's accent and off track as literals",
|
|
76
|
+
(scheme) => {
|
|
77
|
+
const result = renderInScheme(<Switch label="Alerts" defaultValue />, scheme);
|
|
78
|
+
const view = result.getByTestId("system-switch");
|
|
79
|
+
expect(view.dataset.value).toBe("true");
|
|
80
|
+
expect(literal(view.getAttribute("data-track-on"))).toBe(true);
|
|
81
|
+
expect(literal(view.getAttribute("data-track-off"))).toBe(true);
|
|
82
|
+
expect(view.getAttribute("data-ios-off")).toBe(view.getAttribute("data-track-off"));
|
|
83
|
+
expect(view.dataset.thumb).toBe("");
|
|
84
|
+
expect(view.dataset.label).toBe("Alerts");
|
|
85
|
+
expect(result.container.querySelector('[role="switch"]')).toBeNull();
|
|
86
|
+
},
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
it.each(["light", "dark"] as const)(
|
|
90
|
+
"paints the %s theme's off track and thumb on Android",
|
|
91
|
+
(scheme) => {
|
|
92
|
+
platform.os = "android";
|
|
93
|
+
const view = renderInScheme(<Switch label="Alerts" />, scheme).getByTestId("system-switch");
|
|
94
|
+
expect(literal(view.getAttribute("data-track-off"))).toBe(true);
|
|
95
|
+
expect(literal(view.getAttribute("data-thumb"))).toBe(true);
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
it("toggles standalone and reports through onChange and onCheckedChange", () => {
|
|
100
|
+
const onChange = vi.fn();
|
|
101
|
+
const onCheckedChange = vi.fn();
|
|
102
|
+
const result = renderWithProviders(
|
|
103
|
+
<Switch label="Alerts" onChange={onChange} onCheckedChange={onCheckedChange} />,
|
|
104
|
+
);
|
|
105
|
+
const view = result.getByTestId("system-switch");
|
|
106
|
+
fireEvent.click(view);
|
|
107
|
+
expect(onChange).toHaveBeenCalledExactlyOnceWith(true);
|
|
108
|
+
expect(onCheckedChange).toHaveBeenCalledExactlyOnceWith(true);
|
|
109
|
+
expect(view.dataset.value).toBe("true");
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("follows a controlled value", () => {
|
|
113
|
+
const result = renderWithProviders(<Switch label="Alerts" checked={false} />);
|
|
114
|
+
fireEvent.click(result.getByTestId("system-switch"));
|
|
115
|
+
expect(result.getByTestId("system-switch").dataset.value).toBe("false");
|
|
116
|
+
result.rerender(<Switch label="Alerts" checked />);
|
|
117
|
+
expect(result.getByTestId("system-switch").dataset.value).toBe("true");
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("passes disabled to the system switch and never changes a disabled or read-only value", () => {
|
|
121
|
+
const onChange = vi.fn();
|
|
122
|
+
const result = renderWithProviders(
|
|
123
|
+
<>
|
|
124
|
+
<Switch label="Off limits" onChange={onChange} disabled />
|
|
125
|
+
<Switch label="Look only" onChange={onChange} readOnly />
|
|
126
|
+
</>,
|
|
127
|
+
);
|
|
128
|
+
const [disabledView, readOnlyView] = result.getAllByTestId("system-switch");
|
|
129
|
+
expect(disabledView!.dataset.disabled).toBe("true");
|
|
130
|
+
expect(readOnlyView!.dataset.disabled).toBe("false");
|
|
131
|
+
fireEvent.click(disabledView!);
|
|
132
|
+
fireEvent.click(readOnlyView!);
|
|
133
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("writes the form field it is bound to", async () => {
|
|
137
|
+
const onSubmit = vi.fn();
|
|
138
|
+
const result = renderWithProviders(<FormSwitch onSubmit={onSubmit} />);
|
|
139
|
+
fireEvent.click(result.getByTestId("system-switch"));
|
|
140
|
+
fireEvent.click(result.getByText("Save"));
|
|
141
|
+
await vi.waitFor(() => expect(onSubmit).toHaveBeenCalledWith({ alerts: true }));
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("keeps the MPO switch for native={false}, track icons and switchProps", () => {
|
|
145
|
+
const result = renderWithProviders(
|
|
146
|
+
<>
|
|
147
|
+
<Switch label="Opted out" native={false} />
|
|
148
|
+
<Switch label="Iconed" leftIcon={<span>i</span>} />
|
|
149
|
+
<Switch label="Styled" switchProps={{ opacity: 1 }} />
|
|
150
|
+
</>,
|
|
151
|
+
);
|
|
152
|
+
expect(result.queryByTestId("system-switch")).toBeNull();
|
|
153
|
+
expect(result.container.querySelectorAll('[role="switch"]')).toHaveLength(3);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("keeps the MPO switch on web and GNOME", () => {
|
|
157
|
+
platform.os = null;
|
|
158
|
+
const result = renderWithProviders(<Switch label="Alerts" />);
|
|
159
|
+
expect(result.queryByTestId("system-switch")).toBeNull();
|
|
160
|
+
expect(result.container.querySelector('[role="switch"]')).not.toBeNull();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
@@ -51,6 +51,12 @@ import {
|
|
|
51
51
|
} from "../../shared/utils";
|
|
52
52
|
import { choiceLabelPressProps, choiceRowPressProps } from "../../shared/choiceRowPress";
|
|
53
53
|
import { pressSlopProps } from "../../shared/pressSlopProps";
|
|
54
|
+
import {
|
|
55
|
+
type SystemPlatform,
|
|
56
|
+
SystemSwitchView,
|
|
57
|
+
systemControlPlatform,
|
|
58
|
+
useThemeLiteral,
|
|
59
|
+
} from "../../shared/systemControls";
|
|
54
60
|
import { useIsInTableCell } from "../../shared/tableCellContext";
|
|
55
61
|
import { switchFootprint, type SwitchFootprint } from "./footprint";
|
|
56
62
|
|
|
@@ -687,6 +693,65 @@ function SwitchControl({
|
|
|
687
693
|
);
|
|
688
694
|
}
|
|
689
695
|
|
|
696
|
+
/**
|
|
697
|
+
* LC-266: React Native's own Switch, so iOS and Android get the system toggle's
|
|
698
|
+
* feel, haptics and VoiceOver/TalkBack behaviour. The theme paints it: the
|
|
699
|
+
* accent on track and the theme's off track in both schemes, and on Android
|
|
700
|
+
* the theme thumb. iOS keeps its system white thumb.
|
|
701
|
+
*/
|
|
702
|
+
function SystemSwitch({
|
|
703
|
+
platform,
|
|
704
|
+
checked,
|
|
705
|
+
onCheckedChange,
|
|
706
|
+
onBlur,
|
|
707
|
+
disabled,
|
|
708
|
+
readOnly,
|
|
709
|
+
id,
|
|
710
|
+
minHeight,
|
|
711
|
+
accessibilityLabel,
|
|
712
|
+
accessibilityHint,
|
|
713
|
+
}: {
|
|
714
|
+
platform: SystemPlatform;
|
|
715
|
+
checked: boolean;
|
|
716
|
+
onCheckedChange: (checked: boolean) => void;
|
|
717
|
+
onBlur?: (...args: any[]) => void;
|
|
718
|
+
disabled?: boolean;
|
|
719
|
+
readOnly?: boolean;
|
|
720
|
+
id: string;
|
|
721
|
+
minHeight?: number;
|
|
722
|
+
accessibilityLabel?: string;
|
|
723
|
+
accessibilityHint?: string;
|
|
724
|
+
}) {
|
|
725
|
+
const literal = useThemeLiteral();
|
|
726
|
+
const on = literal(formSwitchColors.track.on);
|
|
727
|
+
const off = literal(formSwitchColors.track.off);
|
|
728
|
+
return (
|
|
729
|
+
<View
|
|
730
|
+
justifyContent="center"
|
|
731
|
+
{...(minHeight !== undefined && { minHeight })}
|
|
732
|
+
{...(readOnly ? { pointerEvents: "none" as const } : undefined)}
|
|
733
|
+
data-mp-system-control="switch"
|
|
734
|
+
>
|
|
735
|
+
<SystemSwitchView
|
|
736
|
+
id={id}
|
|
737
|
+
value={checked}
|
|
738
|
+
disabled={disabled}
|
|
739
|
+
onValueChange={(next) => {
|
|
740
|
+
if (disabled || readOnly) return;
|
|
741
|
+
onCheckedChange(next);
|
|
742
|
+
onBlur?.();
|
|
743
|
+
}}
|
|
744
|
+
trackColor={{ false: off, true: on }}
|
|
745
|
+
ios_backgroundColor={off}
|
|
746
|
+
{...(platform === "android" && { thumbColor: literal(formSwitchColors.thumb) })}
|
|
747
|
+
accessibilityLabel={accessibilityLabel}
|
|
748
|
+
accessibilityHint={accessibilityHint}
|
|
749
|
+
accessibilityState={{ disabled: !!disabled, checked }}
|
|
750
|
+
/>
|
|
751
|
+
</View>
|
|
752
|
+
);
|
|
753
|
+
}
|
|
754
|
+
|
|
690
755
|
// ─── Form-aware Switch ────────────────────────────────────────────────────────
|
|
691
756
|
|
|
692
757
|
export interface SwitchProps {
|
|
@@ -743,6 +808,12 @@ export interface SwitchProps {
|
|
|
743
808
|
* Dense toggle lists pass 44 so every toggle is individually hittable.
|
|
744
809
|
*/
|
|
745
810
|
minTargetHeight?: number;
|
|
811
|
+
/**
|
|
812
|
+
* LC-266: on iOS and Android the field renders the system switch. `false`
|
|
813
|
+
* keeps the MPO switch there. Track icons, `switchProps` and `pointy` draw
|
|
814
|
+
* on the MPO switch only, so passing any of them keeps it too.
|
|
815
|
+
*/
|
|
816
|
+
native?: boolean;
|
|
746
817
|
}
|
|
747
818
|
|
|
748
819
|
export function Switch({
|
|
@@ -772,6 +843,7 @@ export function Switch({
|
|
|
772
843
|
pointy,
|
|
773
844
|
skeleton,
|
|
774
845
|
minTargetHeight,
|
|
846
|
+
native = true,
|
|
775
847
|
}: SwitchProps) {
|
|
776
848
|
// The switch stays first in the DOM (focus and reading order); the row
|
|
777
849
|
// reverses so the label leads and the switch sits at the trailing edge.
|
|
@@ -841,6 +913,11 @@ export function Switch({
|
|
|
841
913
|
handleValueChange(!current);
|
|
842
914
|
};
|
|
843
915
|
|
|
916
|
+
const systemPlatform =
|
|
917
|
+
native && !leftIcon && !rightIcon && !switchProps && pointy === undefined
|
|
918
|
+
? systemControlPlatform()
|
|
919
|
+
: null;
|
|
920
|
+
|
|
844
921
|
const renderSwitch = (
|
|
845
922
|
switchChecked: boolean,
|
|
846
923
|
handleChange?: (val: boolean) => void,
|
|
@@ -848,6 +925,27 @@ export function Switch({
|
|
|
848
925
|
hasError?: boolean,
|
|
849
926
|
errorMessage?: string,
|
|
850
927
|
) => {
|
|
928
|
+
if (systemPlatform) {
|
|
929
|
+
return (
|
|
930
|
+
<SystemSwitch
|
|
931
|
+
platform={systemPlatform}
|
|
932
|
+
checked={switchChecked}
|
|
933
|
+
onCheckedChange={(val) => {
|
|
934
|
+
handleChange?.(val);
|
|
935
|
+
handleValueChange(val);
|
|
936
|
+
}}
|
|
937
|
+
onBlur={handleBlur}
|
|
938
|
+
disabled={disabled}
|
|
939
|
+
readOnly={readOnly}
|
|
940
|
+
id={id}
|
|
941
|
+
minHeight={targetHeight}
|
|
942
|
+
accessibilityLabel={
|
|
943
|
+
typeof label === "string" ? `${label}${required ? " *" : ""}` : ariaLabel
|
|
944
|
+
}
|
|
945
|
+
accessibilityHint={errorMessage ?? helperText}
|
|
946
|
+
/>
|
|
947
|
+
);
|
|
948
|
+
}
|
|
851
949
|
const overrideRadius = (switchProps as any)?.borderRadius;
|
|
852
950
|
const radiusStop = resolveSwitchRadiusStop(pointy, knobProps.borderRadius.borderRadius);
|
|
853
951
|
const thumbPaintedHeight = footprint.thumbSize;
|