@multiplatform.one/forms 7.7.4 → 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 +3 -36
- package/dist/cjs/Button/index.native.js +3 -36
- 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/ContextualSaveBar/index.cjs +17 -10
- package/dist/cjs/ContextualSaveBar/index.native.js +18 -10
- package/dist/cjs/ContextualSaveBar/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 +11 -7
- package/dist/cjs/InputParts/index.native.js +12 -10
- 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 +74 -76
- package/dist/cjs/fields/Combobox/index.native.js +78 -86
- 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 +53 -18
- package/dist/cjs/fields/Select/index.native.js +63 -37
- 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/cjs/shared/pickerTriggerContract.cjs +38 -0
- package/dist/cjs/shared/pickerTriggerContract.native.js +41 -0
- package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -0
- package/dist/cjs/shared/pressSlopProps.cjs +68 -0
- package/dist/cjs/shared/pressSlopProps.native.js +72 -0
- package/dist/cjs/shared/pressSlopProps.native.js.map +1 -0
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +1 -34
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +1 -34
- 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.mjs +17 -10
- package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
- package/dist/esm/ContextualSaveBar/index.native.js +18 -10
- 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 +12 -8
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +13 -11
- 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 +74 -76
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +78 -86
- 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 +54 -19
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +64 -38
- 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.mjs +13 -0
- package/dist/esm/shared/pickerTriggerContract.mjs.map +1 -0
- package/dist/esm/shared/pickerTriggerContract.native.js +13 -0
- package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -0
- package/dist/esm/shared/pressSlopProps.mjs +43 -0
- package/dist/esm/shared/pressSlopProps.mjs.map +1 -0
- package/dist/esm/shared/pressSlopProps.native.js +44 -0
- package/dist/esm/shared/pressSlopProps.native.js.map +1 -0
- 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 +1 -34
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +3 -36
- 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/ContextualSaveBar/index.mjs +17 -10
- package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
- package/dist/jsx/ContextualSaveBar/index.native.js +18 -10
- package/dist/jsx/ContextualSaveBar/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 +12 -8
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +12 -10
- 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 +74 -76
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +78 -86
- 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 +54 -19
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +63 -37
- 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/dist/jsx/shared/pickerTriggerContract.mjs +13 -0
- package/dist/jsx/shared/pickerTriggerContract.mjs.map +1 -0
- package/dist/jsx/shared/pickerTriggerContract.native.js +41 -0
- package/dist/jsx/shared/pickerTriggerContract.native.js.map +1 -0
- package/dist/jsx/shared/pressSlopProps.mjs +43 -0
- package/dist/jsx/shared/pressSlopProps.mjs.map +1 -0
- package/dist/jsx/shared/pressSlopProps.native.js +72 -0
- package/dist/jsx/shared/pressSlopProps.native.js.map +1 -0
- 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 +26 -39
- package/src/Chip/Chip.spec.tsx +3 -1
- package/src/Chip/index.tsx +1 -5
- package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +33 -0
- package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +19 -0
- package/src/ContextualSaveBar/index.tsx +12 -8
- package/src/ContextualSaveBar/nativeFlow.spec.tsx +20 -0
- 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 +20 -6
- 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 +90 -80
- 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 +63 -33
- package/src/fields/Stepper/Stepper.spec.tsx +34 -1
- package/src/fields/Stepper/index.tsx +193 -33
- package/src/fields/pickerActivation.spec.tsx +105 -0
- package/src/fields/pickerDensity.spec.tsx +86 -0
- package/src/fields/pickerRows.spec.tsx +66 -0
- package/src/index.ts +9 -0
- package/src/shared/focusManagement.spec.tsx +68 -0
- package/src/shared/focusManagement.ts +20 -10
- package/src/shared/pickerTriggerContract.ts +13 -0
- package/src/shared/pressSlopProps.spec.ts +39 -0
- package/src/shared/pressSlopProps.ts +52 -0
- 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/ContextualSaveBar/index.d.ts +1 -1
- package/types/ContextualSaveBar/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/types/shared/pickerTriggerContract.d.ts +18 -0
- package/types/shared/pickerTriggerContract.d.ts.map +1 -0
- package/types/shared/pressSlopProps.d.ts +8 -0
- package/types/shared/pressSlopProps.d.ts.map +1 -0
- 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
|
+
});
|
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
} from "@floating-ui/react";
|
|
13
13
|
import type { AnyFormApi } from "../../types";
|
|
14
14
|
import {
|
|
15
|
-
MIN_PRESS_TARGET,
|
|
16
15
|
ensureKeyboardModalityTracking,
|
|
17
16
|
keyboardFocusRingProps,
|
|
18
17
|
menuRowFrame,
|
|
@@ -31,6 +30,7 @@ import * as ReactNative from "react-native";
|
|
|
31
30
|
import { Platform, Pressable as RNPressable } from "react-native";
|
|
32
31
|
import { Paragraph, Text, View, YStack, isWeb, styled, useTheme } from "tamagui";
|
|
33
32
|
import { Chip, type ChipProps } from "../../Chip";
|
|
33
|
+
import { pickerTriggerContract } from "../../shared/pickerTriggerContract";
|
|
34
34
|
import { Skeleton } from "../../Skeleton";
|
|
35
35
|
import { Field, FieldLayout, useFieldA11y, useFieldDescribedBy } from "../../fieldLayout";
|
|
36
36
|
import { Input as InputParts, FocusContext } from "../../InputParts";
|
|
@@ -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) {
|
|
@@ -421,7 +429,7 @@ const SelectItem = memo(function SelectItem({
|
|
|
421
429
|
active={isActive}
|
|
422
430
|
aria-selected={isSelected}
|
|
423
431
|
data-state={isSelected ? "active" : "inactive"}
|
|
424
|
-
|
|
432
|
+
height={ctx.knobProps.control.height}
|
|
425
433
|
// LC-18 KNOB-TOTALITY (UX-021): menu rows re-rhythm with the space knob —
|
|
426
434
|
// horizontal inset from the panelPadding token (SP-EDGE, sidebar-row
|
|
427
435
|
// precedent) over menuRowFrame's static $3; in-row gap rides the gap
|
|
@@ -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
|
|
@@ -1005,13 +1023,10 @@ function FloatingSelectCore({
|
|
|
1005
1023
|
// must not paint — it would ghost around the panel's corners.
|
|
1006
1024
|
suppressFocusRing={open}
|
|
1007
1025
|
size={knobProps.sizeToken}
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
// same minHeight floor the house Button holds. Without it a compact
|
|
1011
|
-
// Select sat 36px beside 44px Inputs/Buttons in one control row.
|
|
1012
|
-
minHeight={MIN_PRESS_TARGET}
|
|
1026
|
+
{...pickerTriggerContract(knobProps.control.height)}
|
|
1027
|
+
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1013
1028
|
{...(inTableCell
|
|
1014
|
-
? // Chromeless in cells
|
|
1029
|
+
? // Chromeless in cells.
|
|
1015
1030
|
{}
|
|
1016
1031
|
: {
|
|
1017
1032
|
borderRadius: knobProps.borderRadius.borderRadius,
|
|
@@ -1021,9 +1036,8 @@ function FloatingSelectCore({
|
|
|
1021
1036
|
<SyncKeyboardFocusToBox active={kbTrigger && !open} />
|
|
1022
1037
|
<View
|
|
1023
1038
|
flex={1}
|
|
1024
|
-
//
|
|
1025
|
-
|
|
1026
|
-
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1039
|
+
// The Box owns the same horizontal inset as the option rows.
|
|
1040
|
+
minWidth={0}
|
|
1027
1041
|
paddingVertical="$2"
|
|
1028
1042
|
justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
1029
1043
|
alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
@@ -1054,6 +1068,7 @@ function FloatingSelectCore({
|
|
|
1054
1068
|
</View>
|
|
1055
1069
|
) : (
|
|
1056
1070
|
<Text
|
|
1071
|
+
{...knobProps.controlType}
|
|
1057
1072
|
fontFamily={knobProps.body.fontFamily}
|
|
1058
1073
|
fontWeight={knobProps.body.fontWeight}
|
|
1059
1074
|
color={selectedOption ? textColor : formCommonColors.muted}
|
|
@@ -1064,7 +1079,7 @@ function FloatingSelectCore({
|
|
|
1064
1079
|
</Text>
|
|
1065
1080
|
)}
|
|
1066
1081
|
</View>
|
|
1067
|
-
<View
|
|
1082
|
+
<View flexShrink={0} alignSelf="center">
|
|
1068
1083
|
<CaretDownIcon size={16} color={glyphColor} />
|
|
1069
1084
|
</View>
|
|
1070
1085
|
</InputParts.Box>
|
|
@@ -1224,6 +1239,8 @@ function NativeSelectCore({
|
|
|
1224
1239
|
const [open, setOpen] = useState(false);
|
|
1225
1240
|
const [activeIndex, setActiveIndex] = useState<number | null>(0);
|
|
1226
1241
|
const listRef = useRef<HTMLElement | null>(null);
|
|
1242
|
+
const listboxId = `${id}-listbox`;
|
|
1243
|
+
const optionId = (index: number) => `${listboxId}-option-${index}`;
|
|
1227
1244
|
const { kbTrigger, kbNav, setKbNav, onTriggerFocus, onTriggerBlur, onTriggerPointerDown } =
|
|
1228
1245
|
useSelectKeyboardRing();
|
|
1229
1246
|
|
|
@@ -1335,12 +1352,22 @@ function NativeSelectCore({
|
|
|
1335
1352
|
// VoiceOver blob.
|
|
1336
1353
|
<View
|
|
1337
1354
|
ref={listRef as any}
|
|
1355
|
+
// React Native's Role type omits listbox; these are DOM-only attributes.
|
|
1338
1356
|
{...(isWeb
|
|
1339
|
-
? {
|
|
1340
|
-
|
|
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,
|
|
1341
1368
|
onKeyDown: handleListKeyDown,
|
|
1342
1369
|
onFocus: () => setKbNav(wasKeyboardFocus()),
|
|
1343
|
-
}
|
|
1370
|
+
} as Record<string, unknown>)
|
|
1344
1371
|
: undefined)}
|
|
1345
1372
|
outlineStyle="none"
|
|
1346
1373
|
>
|
|
@@ -1363,6 +1390,9 @@ function NativeSelectCore({
|
|
|
1363
1390
|
const row = (
|
|
1364
1391
|
<View
|
|
1365
1392
|
key={isWeb ? option.value : undefined}
|
|
1393
|
+
{...(isWeb
|
|
1394
|
+
? { id: optionId(i), role: "option" as const, "aria-selected": selected }
|
|
1395
|
+
: undefined)}
|
|
1366
1396
|
flexDirection="row"
|
|
1367
1397
|
alignItems="center"
|
|
1368
1398
|
borderRadius={0}
|
|
@@ -1370,7 +1400,7 @@ function NativeSelectCore({
|
|
|
1370
1400
|
// menu rows — panelPadding inset + gap fragment.
|
|
1371
1401
|
{...knobProps.gap}
|
|
1372
1402
|
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1373
|
-
height={knobProps.
|
|
1403
|
+
height={knobProps.control.height}
|
|
1374
1404
|
onPress={isWeb ? () => handleSelect(option.value) : undefined}
|
|
1375
1405
|
onMouseEnter={() => setActiveIndex(i)}
|
|
1376
1406
|
onPointerDown={isWeb ? () => setKbNav(false) : undefined}
|
|
@@ -1467,7 +1497,8 @@ function NativeSelectCore({
|
|
|
1467
1497
|
<InputParts.Box
|
|
1468
1498
|
disabled={disabled}
|
|
1469
1499
|
size={knobProps.sizeToken}
|
|
1470
|
-
|
|
1500
|
+
{...pickerTriggerContract(knobProps.control.height)}
|
|
1501
|
+
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1471
1502
|
pointerEvents="none"
|
|
1472
1503
|
{...(inTableCell
|
|
1473
1504
|
? {}
|
|
@@ -1480,12 +1511,13 @@ function NativeSelectCore({
|
|
|
1480
1511
|
>
|
|
1481
1512
|
<View
|
|
1482
1513
|
flex={1}
|
|
1483
|
-
|
|
1514
|
+
minWidth={0}
|
|
1484
1515
|
paddingVertical="$2"
|
|
1485
1516
|
justifyContent="flex-start"
|
|
1486
1517
|
alignItems="flex-start"
|
|
1487
1518
|
>
|
|
1488
1519
|
<Text
|
|
1520
|
+
{...knobProps.controlType}
|
|
1489
1521
|
fontFamily={knobProps.body.fontFamily}
|
|
1490
1522
|
fontWeight={knobProps.body.fontWeight}
|
|
1491
1523
|
color={selectedOption ? formCommonColors.text : formCommonColors.muted}
|
|
@@ -1494,7 +1526,7 @@ function NativeSelectCore({
|
|
|
1494
1526
|
{triggerValueText}
|
|
1495
1527
|
</Text>
|
|
1496
1528
|
</View>
|
|
1497
|
-
<View
|
|
1529
|
+
<View flexShrink={0} alignSelf="center">
|
|
1498
1530
|
<CaretDownIcon size={16} />
|
|
1499
1531
|
</View>
|
|
1500
1532
|
</InputParts.Box>
|
|
@@ -1519,9 +1551,8 @@ function NativeSelectCore({
|
|
|
1519
1551
|
<InputParts.Box
|
|
1520
1552
|
disabled={disabled}
|
|
1521
1553
|
size={knobProps.sizeToken}
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
minHeight={MIN_PRESS_TARGET}
|
|
1554
|
+
{...pickerTriggerContract(knobProps.control.height)}
|
|
1555
|
+
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1525
1556
|
{...(inTableCell
|
|
1526
1557
|
? {}
|
|
1527
1558
|
: {
|
|
@@ -1541,6 +1572,7 @@ function NativeSelectCore({
|
|
|
1541
1572
|
role: "combobox" as const,
|
|
1542
1573
|
"aria-haspopup": "listbox",
|
|
1543
1574
|
"aria-expanded": open,
|
|
1575
|
+
"aria-controls": open ? listboxId : undefined,
|
|
1544
1576
|
"aria-autocomplete": "none",
|
|
1545
1577
|
// Standalone (no label): fall back to placeholder so the
|
|
1546
1578
|
// trigger still has a name (axe button-name). Labelled: the
|
|
@@ -1551,11 +1583,9 @@ function NativeSelectCore({
|
|
|
1551
1583
|
tabIndex: disabled ? -1 : 0,
|
|
1552
1584
|
}
|
|
1553
1585
|
: { importantForAccessibility: "no" as const })}
|
|
1554
|
-
//
|
|
1555
|
-
//
|
|
1556
|
-
|
|
1557
|
-
// appears (batched true then !prev → false).
|
|
1558
|
-
onPress={isWeb && !disabled ? () => setOpen((prev) => !prev) : undefined}
|
|
1586
|
+
// The web sheet shares this gesture with FloatingPanel's capture
|
|
1587
|
+
// opener. Both must open idempotently. Native owns its own press.
|
|
1588
|
+
onPress={isWeb && !disabled ? () => setOpen(true) : undefined}
|
|
1559
1589
|
onFocus={isWeb ? onTriggerFocus : undefined}
|
|
1560
1590
|
onBlur={isWeb ? onTriggerBlur : undefined}
|
|
1561
1591
|
onPointerDown={isWeb ? onTriggerPointerDown : undefined}
|
|
@@ -1573,9 +1603,8 @@ function NativeSelectCore({
|
|
|
1573
1603
|
<SyncKeyboardFocusToBox active={kbTrigger && !open} />
|
|
1574
1604
|
<View
|
|
1575
1605
|
flex={1}
|
|
1576
|
-
//
|
|
1577
|
-
|
|
1578
|
-
paddingHorizontal={knobProps.panelPadding.padding}
|
|
1606
|
+
// The Box owns the same horizontal inset as the option rows.
|
|
1607
|
+
minWidth={0}
|
|
1579
1608
|
paddingVertical="$2"
|
|
1580
1609
|
justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
1581
1610
|
alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
|
|
@@ -1606,6 +1635,7 @@ function NativeSelectCore({
|
|
|
1606
1635
|
</View>
|
|
1607
1636
|
) : (
|
|
1608
1637
|
<Text
|
|
1638
|
+
{...knobProps.controlType}
|
|
1609
1639
|
fontFamily={knobProps.body.fontFamily}
|
|
1610
1640
|
fontWeight={knobProps.body.fontWeight}
|
|
1611
1641
|
color={selectedOption ? textColor : formCommonColors.muted}
|
|
@@ -1615,7 +1645,7 @@ function NativeSelectCore({
|
|
|
1615
1645
|
</Text>
|
|
1616
1646
|
)}
|
|
1617
1647
|
</View>
|
|
1618
|
-
<View
|
|
1648
|
+
<View flexShrink={0} alignSelf="center">
|
|
1619
1649
|
<CaretDownIcon size={16} color={glyphColor} />
|
|
1620
1650
|
</View>
|
|
1621
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} />,
|