@multiplatform.one/forms 7.7.6 → 7.8.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/Button/index.cjs +0 -3
- package/dist/cjs/Button/index.native.js +0 -3
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Chip/index.cjs +1 -1
- package/dist/cjs/Chip/index.native.js +1 -1
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/index.cjs +59 -14
- package/dist/cjs/FloatingPanel/index.native.js +16 -7
- package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/nestedAction.cjs +37 -0
- package/dist/cjs/FloatingPanel/nestedAction.native.js +42 -0
- package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -0
- package/dist/cjs/InputParts/index.cjs +8 -6
- package/dist/cjs/InputParts/index.native.js +9 -9
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/Wheel/index.cjs +3 -3
- package/dist/cjs/Wheel/index.native.js +3 -3
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/fieldLayout.cjs +3 -3
- package/dist/cjs/fieldLayout.native.js +3 -3
- package/dist/cjs/fieldLayout.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.cjs +9 -2
- package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
- package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/index.cjs +36 -29
- package/dist/cjs/fields/Combobox/index.native.js +38 -38
- package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/Calendar.cjs +6 -1
- package/dist/cjs/fields/DatePicker/Calendar.native.js +6 -1
- package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +2 -2
- 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.cjs +15 -12
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +39 -14
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MonthPicker.cjs +10 -3
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js +10 -3
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +2 -2
- 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/index.native.js +3 -0
- package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/parts.cjs +26 -14
- package/dist/cjs/fields/DatePicker/parts.native.js +28 -14
- package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/GeolocationMap.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/geocoder.cjs +63 -0
- package/dist/cjs/fields/Geolocation/geocoder.native.js +68 -0
- package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -0
- package/dist/cjs/fields/Geolocation/index.cjs +801 -152
- package/dist/cjs/fields/Geolocation/index.native.js +856 -167
- package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/nativeSearchFocus.cjs +44 -0
- package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js +47 -0
- package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
- package/dist/cjs/fields/Icon/drawnSet.cjs +14 -3
- package/dist/cjs/fields/Icon/drawnSet.native.js +18 -3
- package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/cjs/fields/Icon/index.cjs +102 -27
- package/dist/cjs/fields/Icon/index.native.js +115 -31
- package/dist/cjs/fields/Icon/index.native.js.map +1 -1
- package/dist/cjs/fields/Input/index.cjs +5 -12
- package/dist/cjs/fields/Input/index.native.js +5 -13
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/index.cjs +2 -2
- package/dist/cjs/fields/PhoneInput/index.native.js +2 -2
- package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/cjs/fields/SearchInput/index.cjs +8 -9
- package/dist/cjs/fields/SearchInput/index.native.js +8 -9
- package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +42 -11
- package/dist/cjs/fields/Select/index.native.js +52 -20
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/index.cjs +144 -31
- package/dist/cjs/fields/Stepper/index.native.js +151 -31
- package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/shared/focusManagement.cjs +24 -11
- package/dist/cjs/shared/focusManagement.native.js +24 -11
- package/dist/cjs/shared/focusManagement.native.js.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +0 -3
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +0 -3
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Chip/index.mjs +1 -1
- package/dist/esm/Chip/index.mjs.map +1 -1
- package/dist/esm/Chip/index.native.js +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/index.mjs +58 -15
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +15 -8
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/nestedAction.mjs +11 -0
- package/dist/esm/FloatingPanel/nestedAction.mjs.map +1 -0
- package/dist/esm/FloatingPanel/nestedAction.native.js +13 -0
- package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -0
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/Form/index.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/index.mjs +9 -7
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +10 -10
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/Label/index.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.mjs +3 -3
- package/dist/esm/Wheel/index.mjs.map +1 -1
- package/dist/esm/Wheel/index.native.js +3 -3
- package/dist/esm/Wheel/index.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.mjs +3 -3
- package/dist/esm/fieldLayout.mjs.map +1 -1
- package/dist/esm/fieldLayout.native.js +3 -3
- package/dist/esm/fieldLayout.native.js.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
- package/dist/esm/fields/Barcode/index.native.js.map +1 -1
- package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
- package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
- package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js +10 -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.mjs +36 -29
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +38 -38
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/Calendar.mjs +6 -1
- package/dist/esm/fields/DatePicker/Calendar.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/Calendar.native.js +6 -1
- package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.mjs +2 -2
- package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js +2 -2
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js +39 -14
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MonthPicker.mjs +10 -3
- package/dist/esm/fields/DatePicker/MonthPicker.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/MonthPicker.native.js +10 -3
- package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +2 -2
- package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +2 -2
- 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/index.native.js +3 -0
- package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/parts.mjs +28 -16
- package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/parts.native.js +30 -16
- 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/GeolocationMap.mjs.map +1 -1
- package/dist/esm/fields/Geolocation/GeolocationMap.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.mjs +33 -0
- package/dist/esm/fields/Geolocation/geocoder.mjs.map +1 -0
- package/dist/esm/fields/Geolocation/geocoder.native.js +35 -0
- package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -0
- package/dist/esm/fields/Geolocation/index.mjs +792 -149
- package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
- package/dist/esm/fields/Geolocation/index.native.js +847 -164
- 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.mjs +19 -0
- package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
- package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js +19 -0
- package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
- package/dist/esm/fields/Icon/drawnSet.mjs +14 -3
- package/dist/esm/fields/Icon/drawnSet.mjs.map +1 -1
- package/dist/esm/fields/Icon/drawnSet.native.js +18 -3
- package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.mjs +93 -18
- package/dist/esm/fields/Icon/index.mjs.map +1 -1
- package/dist/esm/fields/Icon/index.native.js +106 -22
- 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.mjs +5 -12
- package/dist/esm/fields/Input/index.mjs.map +1 -1
- package/dist/esm/fields/Input/index.native.js +5 -13
- 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.mjs +2 -2
- package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
- package/dist/esm/fields/PhoneInput/index.native.js +2 -2
- 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/Progress/index.native.js.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/esm/fields/Rating/types.native.js.map +1 -1
- package/dist/esm/fields/SearchInput/index.mjs +9 -10
- package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
- package/dist/esm/fields/SearchInput/index.native.js +9 -10
- package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +42 -11
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +52 -20
- 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.mjs +145 -32
- package/dist/esm/fields/Stepper/index.mjs.map +1 -1
- package/dist/esm/fields/Stepper/index.native.js +152 -32
- 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/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/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.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.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/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.mjs +24 -11
- package/dist/esm/shared/focusManagement.mjs.map +1 -1
- package/dist/esm/shared/focusManagement.native.js +24 -11
- 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/pickerTriggerContract.native.js.map +1 -1
- package/dist/esm/shared/pressSlopProps.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/Button/index.mjs +0 -3
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +0 -3
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/Chip/index.mjs +1 -1
- package/dist/jsx/Chip/index.mjs.map +1 -1
- package/dist/jsx/Chip/index.native.js +1 -1
- package/dist/jsx/Chip/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/index.mjs +58 -15
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +16 -7
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/nestedAction.mjs +11 -0
- package/dist/jsx/FloatingPanel/nestedAction.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/nestedAction.native.js +42 -0
- package/dist/jsx/FloatingPanel/nestedAction.native.js.map +1 -0
- package/dist/jsx/InputParts/index.mjs +9 -7
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +9 -9
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/Wheel/index.mjs +3 -3
- package/dist/jsx/Wheel/index.mjs.map +1 -1
- package/dist/jsx/Wheel/index.native.js +3 -3
- package/dist/jsx/Wheel/index.native.js.map +1 -1
- package/dist/jsx/fieldLayout.mjs +3 -3
- package/dist/jsx/fieldLayout.mjs.map +1 -1
- package/dist/jsx/fieldLayout.native.js +3 -3
- package/dist/jsx/fieldLayout.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
- package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
- package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/jsx/fields/Combobox/index.mjs +36 -29
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +38 -38
- package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/Calendar.mjs +6 -1
- package/dist/jsx/fields/DatePicker/Calendar.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/Calendar.native.js +6 -1
- package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +2 -2
- package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +2 -2
- package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +39 -14
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/MonthPicker.mjs +10 -3
- package/dist/jsx/fields/DatePicker/MonthPicker.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/MonthPicker.native.js +10 -3
- package/dist/jsx/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +2 -2
- package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +2 -2
- package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/index.native.js +3 -0
- package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.mjs +28 -16
- package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.native.js +28 -14
- package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
- package/dist/jsx/fields/Geolocation/GeolocationMap.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/geocoder.mjs +33 -0
- package/dist/jsx/fields/Geolocation/geocoder.mjs.map +1 -0
- package/dist/jsx/fields/Geolocation/geocoder.native.js +68 -0
- package/dist/jsx/fields/Geolocation/geocoder.native.js.map +1 -0
- package/dist/jsx/fields/Geolocation/index.mjs +792 -149
- package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
- package/dist/jsx/fields/Geolocation/index.native.js +856 -167
- package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs +19 -0
- package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
- package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js +47 -0
- package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
- package/dist/jsx/fields/Icon/drawnSet.mjs +14 -3
- package/dist/jsx/fields/Icon/drawnSet.mjs.map +1 -1
- package/dist/jsx/fields/Icon/drawnSet.native.js +18 -3
- package/dist/jsx/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/jsx/fields/Icon/index.mjs +93 -18
- package/dist/jsx/fields/Icon/index.mjs.map +1 -1
- package/dist/jsx/fields/Icon/index.native.js +115 -31
- package/dist/jsx/fields/Icon/index.native.js.map +1 -1
- package/dist/jsx/fields/Input/index.mjs +5 -12
- package/dist/jsx/fields/Input/index.mjs.map +1 -1
- package/dist/jsx/fields/Input/index.native.js +5 -13
- package/dist/jsx/fields/Input/index.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.mjs +2 -2
- package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.native.js +2 -2
- package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/jsx/fields/SearchInput/index.mjs +9 -10
- package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
- package/dist/jsx/fields/SearchInput/index.native.js +8 -9
- package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +42 -11
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +52 -20
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Stepper/index.mjs +145 -32
- package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
- package/dist/jsx/fields/Stepper/index.native.js +151 -31
- package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
- package/dist/jsx/index.js +2 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +2 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/shared/focusManagement.mjs +24 -11
- package/dist/jsx/shared/focusManagement.mjs.map +1 -1
- package/dist/jsx/shared/focusManagement.native.js +24 -11
- package/dist/jsx/shared/focusManagement.native.js.map +1 -1
- package/package.json +8 -7
- package/src/Button/Button.labelInk.spec.tsx +21 -18
- package/src/Button/Button.outlinedChannel.spec.tsx +46 -0
- package/src/Button/Button.sizeLadder.spec.tsx +4 -3
- package/src/Button/Button.stories.tsx +20 -0
- package/src/Button/index.tsx +25 -4
- package/src/Chip/Chip.spec.tsx +3 -1
- package/src/Chip/index.tsx +1 -5
- package/src/FieldLayout.stories.tsx +41 -0
- package/src/FloatingPanel/FloatingPanel.native.spec.tsx +54 -0
- package/src/FloatingPanel/FloatingPanel.spec.tsx +109 -0
- package/src/FloatingPanel/index.native.tsx +24 -7
- package/src/FloatingPanel/index.tsx +80 -13
- package/src/FloatingPanel/nestedAction.spec.ts +36 -0
- package/src/FloatingPanel/nestedAction.ts +15 -0
- package/src/FloatingPanel/panelWidthContract.spec.ts +12 -15
- package/src/FormsIntegration.stories.tsx +2 -6
- package/src/InputParts/index.tsx +15 -5
- package/src/InputParts/layoutGap.spec.tsx +43 -0
- package/src/Wheel/Wheel.spec.tsx +16 -0
- package/src/Wheel/index.tsx +3 -3
- package/src/fieldLayout.spec.tsx +42 -1
- package/src/fieldLayout.tsx +9 -9
- package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +18 -0
- package/src/fields/Checkbox/CheckboxFieldFrame.tsx +6 -1
- package/src/fields/Combobox/Combobox.spec.tsx +48 -1
- package/src/fields/Combobox/index.tsx +53 -39
- package/src/fields/DatePicker/Calendar.tsx +4 -1
- package/src/fields/DatePicker/DatePicker.stories.tsx +22 -1
- package/src/fields/DatePicker/DateRangePicker.tsx +4 -2
- package/src/fields/DatePicker/DatetimePicker.catalog.tsx +21 -19
- package/src/fields/DatePicker/DatetimePicker.native.spec.tsx +144 -0
- package/src/fields/DatePicker/DatetimePicker.native.tsx +57 -32
- package/src/fields/DatePicker/DatetimePicker.stories.tsx +22 -0
- package/src/fields/DatePicker/MonthPicker.tsx +8 -3
- package/src/fields/DatePicker/MultiDatePicker.tsx +4 -2
- package/src/fields/DatePicker/index.native.tsx +1 -0
- package/src/fields/DatePicker/parts.spec.tsx +56 -0
- package/src/fields/DatePicker/parts.tsx +33 -12
- package/src/fields/Geolocation/Geolocation.spec.tsx +287 -35
- package/src/fields/Geolocation/Geolocation.stories.tsx +141 -7
- package/src/fields/Geolocation/GeolocationMap.native.tsx +3 -0
- package/src/fields/Geolocation/GeolocationMap.tsx +4 -0
- package/src/fields/Geolocation/geocoder.spec.ts +59 -0
- package/src/fields/Geolocation/geocoder.ts +84 -0
- package/src/fields/Geolocation/geocoderSeam.spec.tsx +203 -0
- package/src/fields/Geolocation/index.tsx +912 -180
- package/src/fields/Geolocation/nativeSearchFocus.spec.ts +34 -0
- package/src/fields/Geolocation/nativeSearchFocus.ts +19 -0
- package/src/fields/Geolocation/salvage.spec.tsx +398 -0
- package/src/fields/Geolocation/storyProviders.spec.tsx +44 -0
- package/src/fields/Icon/Icon.spec.tsx +215 -1
- package/src/fields/Icon/Icon.stories.tsx +9 -1
- package/src/fields/Icon/drawnSet.tsx +39 -4
- package/src/fields/Icon/index.tsx +118 -18
- package/src/fields/Input/Input.copy.spec.tsx +1 -0
- package/src/fields/Input/Input.spec.tsx +50 -0
- package/src/fields/Input/Input.stories.tsx +1 -1
- package/src/fields/Input/index.tsx +7 -13
- package/src/fields/PhoneInput/index.tsx +2 -2
- package/src/fields/SearchInput/SearchInput.spec.tsx +14 -0
- package/src/fields/SearchInput/index.tsx +5 -6
- package/src/fields/Select/Select.spec.tsx +54 -0
- package/src/fields/Select/index.tsx +52 -17
- package/src/fields/Stepper/Stepper.spec.tsx +34 -1
- package/src/fields/Stepper/index.tsx +193 -33
- package/src/index.ts +9 -0
- package/src/shared/focusManagement.spec.tsx +68 -0
- package/src/shared/focusManagement.ts +20 -10
- package/types/Button/index.d.ts +22 -3
- package/types/Button/index.d.ts.map +1 -1
- package/types/Chip/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.d.ts +11 -1
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts +2 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/FloatingPanel/nestedAction.d.ts +13 -0
- package/types/FloatingPanel/nestedAction.d.ts.map +1 -0
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/fields/Checkbox/CheckboxFieldFrame.d.ts +46 -2
- package/types/fields/Checkbox/CheckboxFieldFrame.d.ts.map +1 -1
- package/types/fields/Checkbox/index.d.ts +3 -3
- package/types/fields/Combobox/index.d.ts +3 -1
- package/types/fields/Combobox/index.d.ts.map +1 -1
- package/types/fields/DatePicker/Calendar.d.ts.map +1 -1
- package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
- package/types/fields/DatePicker/MonthPicker.d.ts.map +1 -1
- package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
- package/types/fields/DatePicker/index.native.d.ts.map +1 -1
- package/types/fields/DatePicker/parts.d.ts.map +1 -1
- package/types/fields/Geolocation/GeolocationMap.d.ts +4 -0
- package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
- package/types/fields/Geolocation/GeolocationMap.native.d.ts +3 -0
- package/types/fields/Geolocation/GeolocationMap.native.d.ts.map +1 -1
- package/types/fields/Geolocation/geocoder.d.ts +53 -0
- package/types/fields/Geolocation/geocoder.d.ts.map +1 -0
- package/types/fields/Geolocation/index.d.ts +18 -2
- package/types/fields/Geolocation/index.d.ts.map +1 -1
- package/types/fields/Geolocation/nativeSearchFocus.d.ts +8 -0
- package/types/fields/Geolocation/nativeSearchFocus.d.ts.map +1 -0
- package/types/fields/Icon/drawnSet.d.ts.map +1 -1
- package/types/fields/Icon/index.d.ts.map +1 -1
- package/types/fields/Input/index.d.ts.map +1 -1
- package/types/fields/PhoneInput/index.d.ts.map +1 -1
- package/types/fields/RadioGroup/index.d.ts +2 -2
- package/types/fields/SearchInput/index.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Stepper/index.d.ts.map +1 -1
- package/types/fields/ToggleGroup/index.d.ts +1 -1
- package/types/index.d.ts +2 -0
- package/types/index.d.ts.map +1 -1
- package/types/shared/focusManagement.d.ts +2 -2
- package/types/shared/focusManagement.d.ts.map +1 -1
- package/src/router.d.ts +0 -16
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { ComponentProps, ReactElement, ReactNode } from "react";
|
|
2
2
|
import { useCallback, useRef } from "react";
|
|
3
|
-
import {
|
|
3
|
+
import { writeToClipboard } from "@multiplatform.one/platform";
|
|
4
4
|
import { MIN_PRESS_TARGET, pressTargetHitSlop } from "@multiplatform.one/theme";
|
|
5
|
+
import { ClipboardIcon, WarningCircleIcon } from "@phosphor-icons/react";
|
|
5
6
|
import type {
|
|
6
7
|
InputKeyboardType,
|
|
7
8
|
InputTextContentType,
|
|
@@ -119,16 +120,6 @@ export interface InputProps {
|
|
|
119
120
|
|
|
120
121
|
const COPY_LABEL = "Copy to clipboard";
|
|
121
122
|
|
|
122
|
-
async function writeClipboard(text: string): Promise<boolean> {
|
|
123
|
-
try {
|
|
124
|
-
if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) return false;
|
|
125
|
-
await navigator.clipboard.writeText(text);
|
|
126
|
-
return true;
|
|
127
|
-
} catch {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
123
|
export function Input({
|
|
133
124
|
name,
|
|
134
125
|
form: formProp,
|
|
@@ -247,7 +238,7 @@ export function Input({
|
|
|
247
238
|
|
|
248
239
|
const handleCopy = useCallback(
|
|
249
240
|
async (text: string) => {
|
|
250
|
-
const ok = await
|
|
241
|
+
const ok = await writeToClipboard(text);
|
|
251
242
|
onCopyResult?.(ok);
|
|
252
243
|
},
|
|
253
244
|
[onCopyResult],
|
|
@@ -361,7 +352,9 @@ export function Input({
|
|
|
361
352
|
{...(placeholder !== undefined ? { placeholder } : undefined)}
|
|
362
353
|
disabled={disabled}
|
|
363
354
|
id={id}
|
|
364
|
-
{...(handleChange
|
|
355
|
+
{...(handleChange || value !== undefined
|
|
356
|
+
? { value: inputValue ?? "" }
|
|
357
|
+
: { defaultValue: inputValue })}
|
|
365
358
|
aria-required={required || undefined}
|
|
366
359
|
aria-invalid={hasError || undefined}
|
|
367
360
|
{...areaName}
|
|
@@ -381,6 +374,7 @@ export function Input({
|
|
|
381
374
|
disabled={disabled}
|
|
382
375
|
tabIndex={disabled ? -1 : 0}
|
|
383
376
|
aria-label={COPY_LABEL}
|
|
377
|
+
accessibilityLabel={COPY_LABEL}
|
|
384
378
|
hitSlop={belowFloor ? pressTargetHitSlop(visualHeight) : undefined}
|
|
385
379
|
onPress={disabled ? undefined : activateCopy}
|
|
386
380
|
onKeyDown={
|
|
@@ -43,8 +43,6 @@ const phoneInputCss = `/* LC-71: flag+dial are adornments of one control. Ring l
|
|
|
43
43
|
.mp-phone-input [data-testid="combobox-trigger"] {
|
|
44
44
|
outline: none !important;
|
|
45
45
|
box-shadow: none !important;
|
|
46
|
-
width: auto !important;
|
|
47
|
-
flex: 0 0 auto;
|
|
48
46
|
}
|
|
49
47
|
.mp-phone-input [data-testid="combobox-trigger"]:focus,
|
|
50
48
|
.mp-phone-input [data-testid="combobox-trigger"]:focus-visible {
|
|
@@ -329,9 +327,11 @@ export function PhoneInput<
|
|
|
329
327
|
alignItems="stretch"
|
|
330
328
|
flexGrow={0}
|
|
331
329
|
flexShrink={0}
|
|
330
|
+
gap="$1.5"
|
|
332
331
|
{...(readOnly ? { pointerEvents: "none" as const } : undefined)}
|
|
333
332
|
>
|
|
334
333
|
<Combobox
|
|
334
|
+
triggerSizing="content"
|
|
335
335
|
options={countryOptions}
|
|
336
336
|
value={regionCode}
|
|
337
337
|
onChange={(val) => handleRegionChange(typeof val === "string" ? val : (val[0] ?? ""))}
|
|
@@ -5,6 +5,7 @@ import { fireEvent } from "@testing-library/react";
|
|
|
5
5
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
6
|
import { SIZE_RECIPE_TOKENS, sizeRecipeForToken } from "@multiplatform.one/theme";
|
|
7
7
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
8
|
+
import { useTheme } from "tamagui";
|
|
8
9
|
import { Form } from "../../Form";
|
|
9
10
|
import { SearchInput } from "./index";
|
|
10
11
|
|
|
@@ -31,6 +32,19 @@ describe("SearchInput", () => {
|
|
|
31
32
|
expect(result.container.querySelector("svg")).toBeTruthy();
|
|
32
33
|
});
|
|
33
34
|
|
|
35
|
+
it("uses readable glyph ink for search and clear rather than the boundary ramp", () => {
|
|
36
|
+
let expectedInk = "";
|
|
37
|
+
function Sample() {
|
|
38
|
+
const theme = useTheme();
|
|
39
|
+
expectedInk = String(theme.color11?.val);
|
|
40
|
+
return <SearchInput placeholder="Search things" defaultValue="corp" />;
|
|
41
|
+
}
|
|
42
|
+
const { container } = renderWithProviders(<Sample />);
|
|
43
|
+
const glyphs = container.querySelectorAll("svg");
|
|
44
|
+
expect(glyphs).toHaveLength(2);
|
|
45
|
+
for (const glyph of glyphs) expect(glyph.getAttribute("fill")).toBe(expectedInk);
|
|
46
|
+
});
|
|
47
|
+
|
|
34
48
|
it("bidi-isolates the default placeholder (LC-58) and passes explicit ones through", () => {
|
|
35
49
|
// Default: FSI…PDI framing so the trailing "..." cannot reorder to
|
|
36
50
|
// "…Search" under RTL; the visible run stays byte-identical inside.
|
|
@@ -28,7 +28,7 @@ import { View, isWeb } from "tamagui";
|
|
|
28
28
|
import { Skeleton } from "../../Skeleton";
|
|
29
29
|
import { Field, FieldLayout } from "../../fieldLayout";
|
|
30
30
|
import { Input as InputParts } from "../../InputParts";
|
|
31
|
-
import {
|
|
31
|
+
import { formCommonColors } from "../../shared/colorRamps";
|
|
32
32
|
import { bidiIsolate, t } from "../../shared/t";
|
|
33
33
|
import type { AnyFormApi } from "../../types";
|
|
34
34
|
import {
|
|
@@ -339,7 +339,7 @@ export function SearchInput({
|
|
|
339
339
|
>
|
|
340
340
|
<InputParts.Icon
|
|
341
341
|
adornment="leading"
|
|
342
|
-
color={
|
|
342
|
+
color={formCommonColors.muted}
|
|
343
343
|
className={isWeb ? "mp-search-leading" : undefined}
|
|
344
344
|
{...leadingWebProps}
|
|
345
345
|
>
|
|
@@ -363,11 +363,8 @@ export function SearchInput({
|
|
|
363
363
|
justifyContent="center"
|
|
364
364
|
cursor="pointer"
|
|
365
365
|
outlineWidth={0}
|
|
366
|
-
hoverStyle={{ opacity: 1 }}
|
|
367
|
-
pressStyle={{ opacity: 0.9 }}
|
|
368
366
|
focusStyle={{ outlineWidth: 0 }}
|
|
369
367
|
focusVisibleStyle={{ outlineWidth: 0 }}
|
|
370
|
-
opacity={0.85}
|
|
371
368
|
flexShrink={0}
|
|
372
369
|
hitSlop={belowFloor ? pressTargetHitSlop(visualHeight) : undefined}
|
|
373
370
|
onPress={() => clearText(fieldChange)}
|
|
@@ -385,8 +382,10 @@ export function SearchInput({
|
|
|
385
382
|
className={isWeb ? "mp-chip-dismiss-ring" : undefined}
|
|
386
383
|
alignItems="center"
|
|
387
384
|
justifyContent="center"
|
|
385
|
+
hoverStyle={{ backgroundColor: "$color4" }}
|
|
386
|
+
pressStyle={{ backgroundColor: "$color5" }}
|
|
388
387
|
>
|
|
389
|
-
<InputParts.Icon aria-hidden color={
|
|
388
|
+
<InputParts.Icon aria-hidden color={formCommonColors.muted}>
|
|
390
389
|
<XIcon size={resolvedIconSize} />
|
|
391
390
|
</InputParts.Icon>
|
|
392
391
|
</View>
|
|
@@ -334,3 +334,57 @@ describe("Select Components", () => {
|
|
|
334
334
|
});
|
|
335
335
|
});
|
|
336
336
|
});
|
|
337
|
+
|
|
338
|
+
describe("Select pointer intent", () => {
|
|
339
|
+
it("commits a deliberate cross-row release immediately after keyboard open", async () => {
|
|
340
|
+
const onChange = vi.fn();
|
|
341
|
+
const result = renderWithProviders(<Select options={mockOptions} onChange={onChange} />);
|
|
342
|
+
const trigger = result.getByTestId("select-trigger");
|
|
343
|
+
fireEvent.keyDown(trigger, { key: "Enter" });
|
|
344
|
+
const options = await result.findAllByRole("option");
|
|
345
|
+
fireEvent.pointerDown(options[0], { button: 0, pointerId: 1 });
|
|
346
|
+
fireEvent.mouseDown(options[0]);
|
|
347
|
+
fireEvent.mouseUp(options[1]);
|
|
348
|
+
expect(onChange).toHaveBeenCalledExactlyOnceWith("option2");
|
|
349
|
+
expect(trigger).toHaveAttribute("aria-expanded", "false");
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
it("consumes the opening gesture release over the covered row", async () => {
|
|
353
|
+
const onChange = vi.fn();
|
|
354
|
+
const result = renderWithProviders(<Select options={mockOptions} onChange={onChange} />);
|
|
355
|
+
const trigger = result.getByTestId("select-trigger");
|
|
356
|
+
fireEvent.mouseDown(trigger);
|
|
357
|
+
const options = await result.findAllByRole("option");
|
|
358
|
+
fireEvent.mouseUp(options[0]);
|
|
359
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
360
|
+
expect(trigger).toHaveAttribute("aria-expanded", "true");
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it("does not select when a background drag releases over an option", async () => {
|
|
364
|
+
const onChange = vi.fn();
|
|
365
|
+
const result = renderWithProviders(<Select options={mockOptions} onChange={onChange} />);
|
|
366
|
+
fireEvent.mouseDown(result.getByTestId("select-trigger"));
|
|
367
|
+
const options = await result.findAllByRole("option");
|
|
368
|
+
fireEvent.mouseUp(options[0]);
|
|
369
|
+
const panel = result.getByTestId("select-dropdown");
|
|
370
|
+
fireEvent.pointerDown(panel, { button: 0, clientY: 10 });
|
|
371
|
+
fireEvent.pointerMove(document, { clientY: 50 });
|
|
372
|
+
fireEvent.pointerUp(document);
|
|
373
|
+
fireEvent.mouseUp(options[1]);
|
|
374
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it("toggles a multiple option exactly once on an immediate click", async () => {
|
|
378
|
+
const onChange = vi.fn();
|
|
379
|
+
const result = renderWithProviders(
|
|
380
|
+
<Select options={mockOptions} multiple onChange={onChange} />,
|
|
381
|
+
);
|
|
382
|
+
fireEvent.keyDown(result.getByTestId("select-trigger"), { key: "Enter" });
|
|
383
|
+
const options = await result.findAllByRole("option");
|
|
384
|
+
fireEvent.pointerDown(options[0], { button: 0, pointerId: 1 });
|
|
385
|
+
fireEvent.mouseDown(options[0]);
|
|
386
|
+
fireEvent.mouseUp(options[0]);
|
|
387
|
+
fireEvent.click(options[0]);
|
|
388
|
+
expect(onChange).toHaveBeenCalledExactlyOnceWith(["option1"]);
|
|
389
|
+
});
|
|
390
|
+
});
|
|
@@ -125,10 +125,13 @@ export interface SelectProps {
|
|
|
125
125
|
// LC-71: Tamagui maps `focusVisibleStyle` onto mouse/:focus, so the ring is
|
|
126
126
|
// painted from `wasKeyboardFocus()` (inset — overlay overflow clips it).
|
|
127
127
|
// LC-72 CONTAINER-CLIP: rows stay square; the panel radius cuts the corners.
|
|
128
|
-
const
|
|
128
|
+
const selectOutlineRest = {
|
|
129
129
|
outlineWidth: 0,
|
|
130
130
|
outlineStyle: "solid" as const,
|
|
131
131
|
outlineColor: "transparent",
|
|
132
|
+
};
|
|
133
|
+
const selectRowOutlineRest = {
|
|
134
|
+
...selectOutlineRest,
|
|
132
135
|
borderRadius: 0,
|
|
133
136
|
};
|
|
134
137
|
|
|
@@ -266,7 +269,8 @@ function selectTriggerRingProps(kbTrigger: boolean, open: boolean) {
|
|
|
266
269
|
if (kbTrigger && !open) {
|
|
267
270
|
return { ...keyboardFocusRingProps, "data-kb-ring": "true" as const };
|
|
268
271
|
}
|
|
269
|
-
|
|
272
|
+
// Focus modality owns the outline; the control recipe owns trigger shape.
|
|
273
|
+
return { ...selectOutlineRest, "data-kb-ring": undefined };
|
|
270
274
|
}
|
|
271
275
|
|
|
272
276
|
function selectItemRingProps(isActive: boolean, kbNav: boolean) {
|
|
@@ -398,6 +402,10 @@ const SelectItem = memo(function SelectItem({
|
|
|
398
402
|
},
|
|
399
403
|
onPointerDown() {
|
|
400
404
|
ctx.setKbNav(false);
|
|
405
|
+
// A press on a mounted row is a new gesture, not the release that
|
|
406
|
+
// opened this covering panel. Arm immediately, regardless of time.
|
|
407
|
+
ctx.allowMouseUpRef.current = true;
|
|
408
|
+
ctx.allowSelectRef.current = true;
|
|
401
409
|
},
|
|
402
410
|
onMouseUp() {
|
|
403
411
|
if (!ctx.allowMouseUpRef.current) {
|
|
@@ -598,6 +606,16 @@ function FloatingSelectCore({
|
|
|
598
606
|
|
|
599
607
|
const { scrollRef: dragScrollRef, dragProps } = useDragScroll({
|
|
600
608
|
direction: "vertical",
|
|
609
|
+
onDragEnd: () => {
|
|
610
|
+
// The following mouseup finishes scrolling; it must not pick a row.
|
|
611
|
+
allowSelectRef.current = false;
|
|
612
|
+
allowMouseUpRef.current = false;
|
|
613
|
+
if (selectTimeoutRef.current) clearTimeout(selectTimeoutRef.current);
|
|
614
|
+
selectTimeoutRef.current = setTimeout(() => {
|
|
615
|
+
allowSelectRef.current = true;
|
|
616
|
+
allowMouseUpRef.current = true;
|
|
617
|
+
});
|
|
618
|
+
},
|
|
601
619
|
});
|
|
602
620
|
|
|
603
621
|
// Sync drag scroll ref with floating ref
|
|
@@ -1006,6 +1024,7 @@ function FloatingSelectCore({
|
|
|
1006
1024
|
suppressFocusRing={open}
|
|
1007
1025
|
size={knobProps.sizeToken}
|
|
1008
1026
|
{...pickerTriggerContract(knobProps.control.height)}
|
|
1027
|
+
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1009
1028
|
{...(inTableCell
|
|
1010
1029
|
? // Chromeless in cells.
|
|
1011
1030
|
{}
|
|
@@ -1017,9 +1036,8 @@ function FloatingSelectCore({
|
|
|
1017
1036
|
<SyncKeyboardFocusToBox active={kbTrigger && !open} />
|
|
1018
1037
|
<View
|
|
1019
1038
|
flex={1}
|
|
1020
|
-
//
|
|
1021
|
-
|
|
1022
|
-
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1039
|
+
// The Box owns the same horizontal inset as the option rows.
|
|
1040
|
+
minWidth={0}
|
|
1023
1041
|
paddingVertical="$2"
|
|
1024
1042
|
justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
1025
1043
|
alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
@@ -1061,7 +1079,7 @@ function FloatingSelectCore({
|
|
|
1061
1079
|
</Text>
|
|
1062
1080
|
)}
|
|
1063
1081
|
</View>
|
|
1064
|
-
<View
|
|
1082
|
+
<View flexShrink={0} alignSelf="center">
|
|
1065
1083
|
<CaretDownIcon size={16} color={glyphColor} />
|
|
1066
1084
|
</View>
|
|
1067
1085
|
</InputParts.Box>
|
|
@@ -1221,6 +1239,8 @@ function NativeSelectCore({
|
|
|
1221
1239
|
const [open, setOpen] = useState(false);
|
|
1222
1240
|
const [activeIndex, setActiveIndex] = useState<number | null>(0);
|
|
1223
1241
|
const listRef = useRef<HTMLElement | null>(null);
|
|
1242
|
+
const listboxId = `${id}-listbox`;
|
|
1243
|
+
const optionId = (index: number) => `${listboxId}-option-${index}`;
|
|
1224
1244
|
const { kbTrigger, kbNav, setKbNav, onTriggerFocus, onTriggerBlur, onTriggerPointerDown } =
|
|
1225
1245
|
useSelectKeyboardRing();
|
|
1226
1246
|
|
|
@@ -1332,12 +1352,22 @@ function NativeSelectCore({
|
|
|
1332
1352
|
// VoiceOver blob.
|
|
1333
1353
|
<View
|
|
1334
1354
|
ref={listRef as any}
|
|
1355
|
+
// React Native's Role type omits listbox; these are DOM-only attributes.
|
|
1335
1356
|
{...(isWeb
|
|
1336
|
-
? {
|
|
1337
|
-
|
|
1357
|
+
? ({
|
|
1358
|
+
id: listboxId,
|
|
1359
|
+
role: "listbox" as const,
|
|
1360
|
+
"aria-label": ariaLabel ?? fieldA11y?.label ?? placeholder,
|
|
1361
|
+
"aria-multiselectable": multiple || undefined,
|
|
1362
|
+
"aria-hidden": !open,
|
|
1363
|
+
"aria-activedescendant":
|
|
1364
|
+
activeIndex != null && displayOptions[activeIndex]
|
|
1365
|
+
? optionId(activeIndex)
|
|
1366
|
+
: undefined,
|
|
1367
|
+
tabIndex: open ? 0 : -1,
|
|
1338
1368
|
onKeyDown: handleListKeyDown,
|
|
1339
1369
|
onFocus: () => setKbNav(wasKeyboardFocus()),
|
|
1340
|
-
}
|
|
1370
|
+
} as Record<string, unknown>)
|
|
1341
1371
|
: undefined)}
|
|
1342
1372
|
outlineStyle="none"
|
|
1343
1373
|
>
|
|
@@ -1360,6 +1390,9 @@ function NativeSelectCore({
|
|
|
1360
1390
|
const row = (
|
|
1361
1391
|
<View
|
|
1362
1392
|
key={isWeb ? option.value : undefined}
|
|
1393
|
+
{...(isWeb
|
|
1394
|
+
? { id: optionId(i), role: "option" as const, "aria-selected": selected }
|
|
1395
|
+
: undefined)}
|
|
1363
1396
|
flexDirection="row"
|
|
1364
1397
|
alignItems="center"
|
|
1365
1398
|
borderRadius={0}
|
|
@@ -1465,6 +1498,7 @@ function NativeSelectCore({
|
|
|
1465
1498
|
disabled={disabled}
|
|
1466
1499
|
size={knobProps.sizeToken}
|
|
1467
1500
|
{...pickerTriggerContract(knobProps.control.height)}
|
|
1501
|
+
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1468
1502
|
pointerEvents="none"
|
|
1469
1503
|
{...(inTableCell
|
|
1470
1504
|
? {}
|
|
@@ -1477,7 +1511,7 @@ function NativeSelectCore({
|
|
|
1477
1511
|
>
|
|
1478
1512
|
<View
|
|
1479
1513
|
flex={1}
|
|
1480
|
-
|
|
1514
|
+
minWidth={0}
|
|
1481
1515
|
paddingVertical="$2"
|
|
1482
1516
|
justifyContent="flex-start"
|
|
1483
1517
|
alignItems="flex-start"
|
|
@@ -1492,7 +1526,7 @@ function NativeSelectCore({
|
|
|
1492
1526
|
{triggerValueText}
|
|
1493
1527
|
</Text>
|
|
1494
1528
|
</View>
|
|
1495
|
-
<View
|
|
1529
|
+
<View flexShrink={0} alignSelf="center">
|
|
1496
1530
|
<CaretDownIcon size={16} />
|
|
1497
1531
|
</View>
|
|
1498
1532
|
</InputParts.Box>
|
|
@@ -1518,6 +1552,7 @@ function NativeSelectCore({
|
|
|
1518
1552
|
disabled={disabled}
|
|
1519
1553
|
size={knobProps.sizeToken}
|
|
1520
1554
|
{...pickerTriggerContract(knobProps.control.height)}
|
|
1555
|
+
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1521
1556
|
{...(inTableCell
|
|
1522
1557
|
? {}
|
|
1523
1558
|
: {
|
|
@@ -1537,6 +1572,7 @@ function NativeSelectCore({
|
|
|
1537
1572
|
role: "combobox" as const,
|
|
1538
1573
|
"aria-haspopup": "listbox",
|
|
1539
1574
|
"aria-expanded": open,
|
|
1575
|
+
"aria-controls": open ? listboxId : undefined,
|
|
1540
1576
|
"aria-autocomplete": "none",
|
|
1541
1577
|
// Standalone (no label): fall back to placeholder so the
|
|
1542
1578
|
// trigger still has a name (axe button-name). Labelled: the
|
|
@@ -1547,8 +1583,8 @@ function NativeSelectCore({
|
|
|
1547
1583
|
tabIndex: disabled ? -1 : 0,
|
|
1548
1584
|
}
|
|
1549
1585
|
: { importantForAccessibility: "no" as const })}
|
|
1550
|
-
//
|
|
1551
|
-
//
|
|
1586
|
+
// The web sheet shares this gesture with FloatingPanel's capture
|
|
1587
|
+
// opener. Both must open idempotently. Native owns its own press.
|
|
1552
1588
|
onPress={isWeb && !disabled ? () => setOpen(true) : undefined}
|
|
1553
1589
|
onFocus={isWeb ? onTriggerFocus : undefined}
|
|
1554
1590
|
onBlur={isWeb ? onTriggerBlur : undefined}
|
|
@@ -1567,9 +1603,8 @@ function NativeSelectCore({
|
|
|
1567
1603
|
<SyncKeyboardFocusToBox active={kbTrigger && !open} />
|
|
1568
1604
|
<View
|
|
1569
1605
|
flex={1}
|
|
1570
|
-
//
|
|
1571
|
-
|
|
1572
|
-
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1606
|
+
// The Box owns the same horizontal inset as the option rows.
|
|
1607
|
+
minWidth={0}
|
|
1573
1608
|
paddingVertical="$2"
|
|
1574
1609
|
justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
1575
1610
|
alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
@@ -1610,7 +1645,7 @@ function NativeSelectCore({
|
|
|
1610
1645
|
</Text>
|
|
1611
1646
|
)}
|
|
1612
1647
|
</View>
|
|
1613
|
-
<View
|
|
1648
|
+
<View flexShrink={0} alignSelf="center">
|
|
1614
1649
|
<CaretDownIcon size={16} color={glyphColor} />
|
|
1615
1650
|
</View>
|
|
1616
1651
|
</InputParts.Box>
|
|
@@ -122,10 +122,13 @@ describe("Stepper", () => {
|
|
|
122
122
|
});
|
|
123
123
|
const increase = result.container.querySelector('[aria-label="Increase"]') as HTMLElement;
|
|
124
124
|
await act(async () => {
|
|
125
|
-
fireEvent.pointerDown(increase);
|
|
125
|
+
expect(fireEvent.pointerDown(increase)).toBe(false);
|
|
126
|
+
fireEvent.pointerUp(increase);
|
|
126
127
|
});
|
|
127
128
|
expect(increase).not.toBe(document.activeElement);
|
|
128
129
|
expect(document.activeElement).toBe(input);
|
|
130
|
+
expect(input.value).toBe("5");
|
|
131
|
+
expect(increase.getAttribute("tabindex")).toBe("-1");
|
|
129
132
|
});
|
|
130
133
|
});
|
|
131
134
|
|
|
@@ -245,6 +248,36 @@ describe("Stepper", () => {
|
|
|
245
248
|
});
|
|
246
249
|
|
|
247
250
|
describe("bound feedback (LC-71)", () => {
|
|
251
|
+
it("steps from empty into a bounded negative range", async () => {
|
|
252
|
+
const result = renderWithProviders(<Stepper min={-10} max={-5} allowEmpty />);
|
|
253
|
+
const increase = result.container.querySelector('[data-stepper-button="increment"]')!;
|
|
254
|
+
await act(async () => {
|
|
255
|
+
fireEvent.pointerDown(increase);
|
|
256
|
+
fireEvent.pointerUp(increase);
|
|
257
|
+
});
|
|
258
|
+
expect((result.getInput() as HTMLInputElement).value).toBe("-5");
|
|
259
|
+
expect(result.container.textContent).not.toContain("Maximum reached");
|
|
260
|
+
const inner = increase.querySelector("button")!;
|
|
261
|
+
expect(inner.getAttribute("tabindex")).toBe("-1");
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it("clears failed-step feedback after a successful step and blur", async () => {
|
|
265
|
+
const result = renderWithProviders(
|
|
266
|
+
<Stepper label="Quantity" defaultValue={1} min={1} max={10} helperText="Choose quantity" />,
|
|
267
|
+
);
|
|
268
|
+
const input = result.getInput() as HTMLInputElement;
|
|
269
|
+
await act(async () => fireEvent.keyDown(input, { key: "ArrowDown" }));
|
|
270
|
+
expect(result.container.textContent).toContain("Minimum reached");
|
|
271
|
+
await act(async () => fireEvent.keyDown(input, { key: "ArrowUp" }));
|
|
272
|
+
expect(result.container.textContent).not.toContain("Minimum reached");
|
|
273
|
+
await act(async () => fireEvent.keyDown(input, { key: "Home" }));
|
|
274
|
+
await act(async () => fireEvent.keyDown(input, { key: "ArrowDown" }));
|
|
275
|
+
expect(result.container.textContent).toContain("Minimum reached");
|
|
276
|
+
await act(async () => fireEvent.blur(input));
|
|
277
|
+
expect(result.container.textContent).not.toContain("Minimum reached");
|
|
278
|
+
expect(result.container.textContent).toContain("Choose quantity");
|
|
279
|
+
});
|
|
280
|
+
|
|
248
281
|
it("does not show Minimum reached at rest when the value is already at min", () => {
|
|
249
282
|
const result = renderWithProviders(
|
|
250
283
|
<Stepper label="Quantity" defaultValue={1} min={1} max={10} />,
|