@multiplatform.one/forms 7.10.0 → 7.15.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/README.md +1 -1
- package/dist/cjs/AdaptivePopup/index.cjs +0 -10
- package/dist/cjs/AdaptivePopup/index.native.js +0 -10
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +6 -3
- package/dist/cjs/Button/index.native.js +6 -3
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.cjs +2 -11
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/index.cjs +12 -10
- package/dist/cjs/ContextualSaveBar/index.native.js +12 -19
- package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/index.cjs +24 -12
- package/dist/cjs/FieldDisplay/index.native.js +25 -13
- package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/PanelPortal.cjs +145 -0
- package/dist/cjs/FloatingPanel/PanelPortal.native.js +43 -0
- package/dist/cjs/FloatingPanel/PanelPortal.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/index.cjs +115 -67
- package/dist/cjs/FloatingPanel/index.native.js +67 -12
- package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +4 -2
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +4 -2
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/cjs/Form/index.cjs +2 -1
- package/dist/cjs/Form/index.native.js +2 -1
- package/dist/cjs/Form/index.native.js.map +1 -1
- package/dist/cjs/Form/submissionController.cjs +74 -0
- package/dist/cjs/Form/submissionController.native.js +99 -0
- package/dist/cjs/Form/submissionController.native.js.map +1 -0
- package/dist/cjs/InputParts/index.cjs +66 -12
- package/dist/cjs/InputParts/index.native.js +72 -12
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/Wheel/index.cjs +0 -2
- package/dist/cjs/Wheel/index.native.js +0 -2
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodePreview.cjs +18 -15
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js +21 -18
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/Checkbox.cjs +1 -3
- package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -3
- package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxBox.cjs +2 -3
- package/dist/cjs/fields/Checkbox/CheckboxBox.native.js +2 -3
- package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/index.cjs +2 -0
- package/dist/cjs/fields/ColorPicker/index.native.js +2 -0
- package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/parts.cjs +1 -0
- package/dist/cjs/fields/ColorPicker/parts.native.js +1 -0
- package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/index.cjs +206 -200
- package/dist/cjs/fields/Combobox/index.native.js +214 -208
- package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +7 -7
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +7 -7
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +6 -4
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +6 -4
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/cjs/fields/Duration/index.cjs +5 -3
- package/dist/cjs/fields/Duration/index.native.js +5 -3
- package/dist/cjs/fields/Duration/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/index.cjs +10 -8
- package/dist/cjs/fields/FileUpload/index.native.js +10 -8
- package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/nativePickerLoader.cjs +7 -2
- package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js +7 -2
- package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/GeolocationMap.cjs +3 -0
- package/dist/cjs/fields/Geolocation/geocoderContext.cjs +71 -0
- package/dist/cjs/fields/Geolocation/geocoderContext.native.js +75 -0
- package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -0
- package/dist/cjs/fields/Geolocation/index.cjs +72 -82
- package/dist/cjs/fields/Geolocation/index.native.js +72 -82
- package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/photonGeocoder.cjs +138 -0
- package/dist/cjs/fields/Geolocation/photonGeocoder.native.js +179 -0
- package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -0
- package/dist/cjs/fields/Input/index.cjs +7 -5
- package/dist/cjs/fields/Input/index.native.js +7 -5
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.cjs +118 -112
- package/dist/cjs/fields/MentionInput/index.native.js +130 -124
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/index.cjs +11 -8
- package/dist/cjs/fields/OTPInput/index.native.js +11 -8
- package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/index.cjs +9 -6
- package/dist/cjs/fields/PhoneInput/index.native.js +9 -6
- package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/phone.cjs +6 -5
- package/dist/cjs/fields/PhoneInput/phone.native.js +7 -6
- package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/regionNames.cjs +274 -0
- package/dist/cjs/fields/PhoneInput/regionNames.native.js +277 -0
- package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -0
- package/dist/cjs/fields/RadioGroup/index.cjs +2 -6
- package/dist/cjs/fields/RadioGroup/index.native.js +2 -6
- package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/SearchInput/index.cjs +10 -8
- package/dist/cjs/fields/SearchInput/index.native.js +10 -8
- package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +20 -17
- package/dist/cjs/fields/Select/index.native.js +20 -17
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.cjs +10 -9
- package/dist/cjs/fields/Signature/index.native.js +10 -9
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.cjs +21 -15
- package/dist/cjs/fields/Slider/index.native.js +21 -17
- package/dist/cjs/fields/Slider/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/jumpMotion.cjs +2 -2
- package/dist/cjs/fields/Slider/jumpMotion.native.js +2 -1
- package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/index.cjs +25 -6
- package/dist/cjs/fields/Stepper/index.native.js +25 -6
- package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
- package/dist/cjs/fields/Switch/footprint.cjs +54 -0
- package/dist/cjs/fields/Switch/footprint.native.js +57 -0
- package/dist/cjs/fields/Switch/footprint.native.js.map +1 -0
- package/dist/cjs/fields/Switch/index.cjs +60 -43
- package/dist/cjs/fields/Switch/index.native.js +60 -50
- package/dist/cjs/fields/Switch/index.native.js.map +1 -1
- package/dist/cjs/fields/TextArea/index.cjs +6 -3
- package/dist/cjs/fields/TextArea/index.native.js +6 -3
- package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/catalog.cjs +1 -0
- package/dist/cjs/fields/TimePicker/catalog.native.js +1 -0
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/parts.cjs +5 -0
- package/dist/cjs/fields/TimePicker/parts.native.js +7 -0
- package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/cjs/index.cjs +12 -0
- package/dist/cjs/index.native.js +12 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/shared/panelPortal.cjs +52 -0
- package/dist/cjs/shared/panelPortal.native.js +65 -0
- package/dist/cjs/shared/panelPortal.native.js.map +1 -0
- package/dist/cjs/shared/pressSlopProps.cjs +16 -11
- package/dist/cjs/shared/pressSlopProps.native.js +18 -12
- package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
- package/dist/cjs/shared/utils.cjs +2 -2
- package/dist/cjs/shared/utils.native.js +3 -2
- package/dist/cjs/shared/utils.native.js.map +1 -1
- package/dist/cjs/themedPrimitives.cjs +15 -2
- package/dist/cjs/themedPrimitives.native.js +16 -3
- package/dist/cjs/themedPrimitives.native.js.map +1 -1
- package/dist/esm/AdaptivePopup/index.mjs +0 -10
- package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js +0 -10
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +6 -3
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +6 -3
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js +3 -12
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/index.mjs +13 -11
- package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
- package/dist/esm/ContextualSaveBar/index.native.js +13 -20
- package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/esm/FieldDisplay/index.mjs +24 -12
- package/dist/esm/FieldDisplay/index.mjs.map +1 -1
- package/dist/esm/FieldDisplay/index.native.js +25 -13
- package/dist/esm/FieldDisplay/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/PanelPortal.mjs +119 -0
- package/dist/esm/FloatingPanel/PanelPortal.mjs.map +1 -0
- package/dist/esm/FloatingPanel/PanelPortal.native.js +14 -0
- package/dist/esm/FloatingPanel/PanelPortal.native.js.map +1 -0
- package/dist/esm/FloatingPanel/index.mjs +117 -69
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +68 -13
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs +4 -2
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js +4 -2
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/Form/index.mjs +2 -1
- package/dist/esm/Form/index.mjs.map +1 -1
- package/dist/esm/Form/index.native.js +2 -1
- package/dist/esm/Form/index.native.js.map +1 -1
- package/dist/esm/Form/submissionController.mjs +49 -0
- package/dist/esm/Form/submissionController.mjs.map +1 -0
- package/dist/esm/Form/submissionController.native.js +71 -0
- package/dist/esm/Form/submissionController.native.js.map +1 -0
- package/dist/esm/InputParts/index.mjs +67 -13
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +73 -13
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/Wheel/index.mjs +0 -2
- package/dist/esm/Wheel/index.mjs.map +1 -1
- package/dist/esm/Wheel/index.native.js +0 -2
- package/dist/esm/Wheel/index.native.js.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.mjs +19 -16
- package/dist/esm/fields/Barcode/BarcodePreview.mjs.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.native.js +22 -19
- package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.mjs +2 -4
- package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.native.js +2 -4
- package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxBox.mjs +3 -4
- package/dist/esm/fields/Checkbox/CheckboxBox.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxBox.native.js +3 -4
- package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/index.mjs +2 -0
- package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
- package/dist/esm/fields/ColorPicker/index.native.js +2 -0
- package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/parts.mjs +1 -0
- package/dist/esm/fields/ColorPicker/parts.mjs.map +1 -1
- package/dist/esm/fields/ColorPicker/parts.native.js +1 -0
- package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.mjs +197 -191
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +205 -199
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.mjs +5 -5
- package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js +5 -5
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +3 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +3 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/esm/fields/Duration/index.mjs +3 -1
- package/dist/esm/fields/Duration/index.mjs.map +1 -1
- package/dist/esm/fields/Duration/index.native.js +3 -1
- package/dist/esm/fields/Duration/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/index.mjs +5 -3
- package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
- package/dist/esm/fields/FileUpload/index.native.js +5 -3
- package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/nativePickerLoader.mjs +7 -3
- package/dist/esm/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
- package/dist/esm/fields/FileUpload/nativePickerLoader.native.js +7 -3
- package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/GeolocationMap.mjs +3 -0
- package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
- package/dist/esm/fields/Geolocation/geocoderContext.mjs +44 -0
- package/dist/esm/fields/Geolocation/geocoderContext.mjs.map +1 -0
- package/dist/esm/fields/Geolocation/geocoderContext.native.js +45 -0
- package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -0
- package/dist/esm/fields/Geolocation/index.mjs +73 -83
- package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
- package/dist/esm/fields/Geolocation/index.native.js +73 -83
- package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/photonGeocoder.mjs +112 -0
- package/dist/esm/fields/Geolocation/photonGeocoder.mjs.map +1 -0
- package/dist/esm/fields/Geolocation/photonGeocoder.native.js +150 -0
- package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -0
- package/dist/esm/fields/Input/index.mjs +3 -1
- package/dist/esm/fields/Input/index.mjs.map +1 -1
- package/dist/esm/fields/Input/index.native.js +3 -1
- package/dist/esm/fields/Input/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.mjs +115 -109
- package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js +127 -121
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/index.mjs +7 -4
- package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
- package/dist/esm/fields/OTPInput/index.native.js +7 -4
- package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/index.mjs +6 -3
- package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
- package/dist/esm/fields/PhoneInput/index.native.js +6 -3
- package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/phone.mjs +6 -5
- package/dist/esm/fields/PhoneInput/phone.mjs.map +1 -1
- package/dist/esm/fields/PhoneInput/phone.native.js +7 -6
- package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/regionNames.mjs +249 -0
- package/dist/esm/fields/PhoneInput/regionNames.mjs.map +1 -0
- package/dist/esm/fields/PhoneInput/regionNames.native.js +249 -0
- package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -0
- package/dist/esm/fields/RadioGroup/index.mjs +3 -7
- package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js +3 -7
- package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/esm/fields/SearchInput/index.mjs +5 -3
- package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
- package/dist/esm/fields/SearchInput/index.native.js +5 -3
- package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +10 -7
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +10 -7
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Signature/index.mjs +7 -6
- package/dist/esm/fields/Signature/index.mjs.map +1 -1
- package/dist/esm/fields/Signature/index.native.js +7 -6
- package/dist/esm/fields/Signature/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.mjs +10 -4
- package/dist/esm/fields/Slider/index.mjs.map +1 -1
- package/dist/esm/fields/Slider/index.native.js +10 -6
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/jumpMotion.mjs +2 -2
- package/dist/esm/fields/Slider/jumpMotion.mjs.map +1 -1
- package/dist/esm/fields/Slider/jumpMotion.native.js +2 -1
- package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/esm/fields/Stepper/index.mjs +24 -5
- package/dist/esm/fields/Stepper/index.mjs.map +1 -1
- package/dist/esm/fields/Stepper/index.native.js +24 -5
- package/dist/esm/fields/Stepper/index.native.js.map +1 -1
- package/dist/esm/fields/Switch/footprint.mjs +29 -0
- package/dist/esm/fields/Switch/footprint.mjs.map +1 -0
- package/dist/esm/fields/Switch/footprint.native.js +29 -0
- package/dist/esm/fields/Switch/footprint.native.js.map +1 -0
- package/dist/esm/fields/Switch/index.mjs +44 -27
- package/dist/esm/fields/Switch/index.mjs.map +1 -1
- package/dist/esm/fields/Switch/index.native.js +44 -34
- package/dist/esm/fields/Switch/index.native.js.map +1 -1
- package/dist/esm/fields/TextArea/index.mjs +6 -3
- package/dist/esm/fields/TextArea/index.mjs.map +1 -1
- package/dist/esm/fields/TextArea/index.native.js +6 -3
- package/dist/esm/fields/TextArea/index.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.mjs +1 -0
- package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.native.js +1 -0
- package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/parts.mjs +5 -0
- package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/parts.native.js +7 -0
- package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/esm/index.mjs +6 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +6 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/shared/panelPortal.mjs +24 -0
- package/dist/esm/shared/panelPortal.mjs.map +1 -0
- package/dist/esm/shared/panelPortal.native.js +34 -0
- package/dist/esm/shared/panelPortal.native.js.map +1 -0
- package/dist/esm/shared/pressSlopProps.mjs +16 -12
- package/dist/esm/shared/pressSlopProps.mjs.map +1 -1
- package/dist/esm/shared/pressSlopProps.native.js +18 -13
- package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
- package/dist/esm/shared/utils.mjs +2 -2
- package/dist/esm/shared/utils.mjs.map +1 -1
- package/dist/esm/shared/utils.native.js +3 -2
- package/dist/esm/shared/utils.native.js.map +1 -1
- package/dist/esm/themedPrimitives.mjs +16 -3
- package/dist/esm/themedPrimitives.mjs.map +1 -1
- package/dist/esm/themedPrimitives.native.js +17 -4
- package/dist/esm/themedPrimitives.native.js.map +1 -1
- package/dist/jsx/AdaptivePopup/index.mjs +0 -10
- package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
- package/dist/jsx/AdaptivePopup/index.native.js +0 -10
- package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +6 -3
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +6 -3
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/index.mjs +13 -11
- package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
- package/dist/jsx/ContextualSaveBar/index.native.js +12 -19
- package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/jsx/FieldDisplay/index.mjs +24 -12
- package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
- package/dist/jsx/FieldDisplay/index.native.js +25 -13
- package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/PanelPortal.mjs +119 -0
- package/dist/jsx/FloatingPanel/PanelPortal.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/PanelPortal.native.js +43 -0
- package/dist/jsx/FloatingPanel/PanelPortal.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/index.mjs +117 -69
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +67 -12
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +4 -2
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +4 -2
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/jsx/Form/index.mjs +2 -1
- package/dist/jsx/Form/index.mjs.map +1 -1
- package/dist/jsx/Form/index.native.js +2 -1
- package/dist/jsx/Form/index.native.js.map +1 -1
- package/dist/jsx/Form/submissionController.mjs +49 -0
- package/dist/jsx/Form/submissionController.mjs.map +1 -0
- package/dist/jsx/Form/submissionController.native.js +99 -0
- package/dist/jsx/Form/submissionController.native.js.map +1 -0
- package/dist/jsx/InputParts/index.mjs +67 -13
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +72 -12
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/Wheel/index.mjs +0 -2
- package/dist/jsx/Wheel/index.mjs.map +1 -1
- package/dist/jsx/Wheel/index.native.js +0 -2
- package/dist/jsx/Wheel/index.native.js.map +1 -1
- package/dist/jsx/fields/Barcode/BarcodePreview.mjs +19 -16
- package/dist/jsx/fields/Barcode/BarcodePreview.mjs.map +1 -1
- package/dist/jsx/fields/Barcode/BarcodePreview.native.js +21 -18
- package/dist/jsx/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.mjs +2 -4
- package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.native.js +1 -3
- package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxBox.mjs +3 -4
- package/dist/jsx/fields/Checkbox/CheckboxBox.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxBox.native.js +2 -3
- package/dist/jsx/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/index.mjs +2 -0
- package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
- package/dist/jsx/fields/ColorPicker/index.native.js +2 -0
- package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/parts.mjs +1 -0
- package/dist/jsx/fields/ColorPicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/ColorPicker/parts.native.js +1 -0
- package/dist/jsx/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/Combobox/index.mjs +197 -191
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +214 -208
- package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +5 -5
- package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +7 -7
- package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +3 -1
- package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +6 -4
- package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/jsx/fields/Duration/index.mjs +3 -1
- package/dist/jsx/fields/Duration/index.mjs.map +1 -1
- package/dist/jsx/fields/Duration/index.native.js +5 -3
- package/dist/jsx/fields/Duration/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload/index.mjs +5 -3
- package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload/index.native.js +10 -8
- package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs +7 -3
- package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js +7 -2
- package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/GeolocationMap.mjs +3 -0
- package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
- package/dist/jsx/fields/Geolocation/geocoderContext.mjs +44 -0
- package/dist/jsx/fields/Geolocation/geocoderContext.mjs.map +1 -0
- package/dist/jsx/fields/Geolocation/geocoderContext.native.js +75 -0
- package/dist/jsx/fields/Geolocation/geocoderContext.native.js.map +1 -0
- package/dist/jsx/fields/Geolocation/index.mjs +73 -83
- package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
- package/dist/jsx/fields/Geolocation/index.native.js +72 -82
- package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/photonGeocoder.mjs +112 -0
- package/dist/jsx/fields/Geolocation/photonGeocoder.mjs.map +1 -0
- package/dist/jsx/fields/Geolocation/photonGeocoder.native.js +179 -0
- package/dist/jsx/fields/Geolocation/photonGeocoder.native.js.map +1 -0
- package/dist/jsx/fields/Input/index.mjs +3 -1
- package/dist/jsx/fields/Input/index.mjs.map +1 -1
- package/dist/jsx/fields/Input/index.native.js +7 -5
- package/dist/jsx/fields/Input/index.native.js.map +1 -1
- package/dist/jsx/fields/MentionInput/index.mjs +115 -109
- package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
- package/dist/jsx/fields/MentionInput/index.native.js +130 -124
- package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
- package/dist/jsx/fields/OTPInput/index.mjs +7 -4
- package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
- package/dist/jsx/fields/OTPInput/index.native.js +11 -8
- package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.mjs +6 -3
- package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.native.js +9 -6
- package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/phone.mjs +6 -5
- package/dist/jsx/fields/PhoneInput/phone.mjs.map +1 -1
- package/dist/jsx/fields/PhoneInput/phone.native.js +7 -6
- package/dist/jsx/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/regionNames.mjs +249 -0
- package/dist/jsx/fields/PhoneInput/regionNames.mjs.map +1 -0
- package/dist/jsx/fields/PhoneInput/regionNames.native.js +277 -0
- package/dist/jsx/fields/PhoneInput/regionNames.native.js.map +1 -0
- package/dist/jsx/fields/RadioGroup/index.mjs +3 -7
- package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
- package/dist/jsx/fields/RadioGroup/index.native.js +2 -6
- package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/jsx/fields/SearchInput/index.mjs +5 -3
- package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
- package/dist/jsx/fields/SearchInput/index.native.js +10 -8
- package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +10 -7
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +20 -17
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Signature/index.mjs +7 -6
- package/dist/jsx/fields/Signature/index.mjs.map +1 -1
- package/dist/jsx/fields/Signature/index.native.js +10 -9
- package/dist/jsx/fields/Signature/index.native.js.map +1 -1
- package/dist/jsx/fields/Slider/index.mjs +10 -4
- package/dist/jsx/fields/Slider/index.mjs.map +1 -1
- package/dist/jsx/fields/Slider/index.native.js +21 -17
- package/dist/jsx/fields/Slider/index.native.js.map +1 -1
- package/dist/jsx/fields/Slider/jumpMotion.mjs +2 -2
- package/dist/jsx/fields/Slider/jumpMotion.mjs.map +1 -1
- package/dist/jsx/fields/Slider/jumpMotion.native.js +2 -1
- package/dist/jsx/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/jsx/fields/Stepper/index.mjs +24 -5
- package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
- package/dist/jsx/fields/Stepper/index.native.js +25 -6
- package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
- package/dist/jsx/fields/Switch/footprint.mjs +29 -0
- package/dist/jsx/fields/Switch/footprint.mjs.map +1 -0
- package/dist/jsx/fields/Switch/footprint.native.js +57 -0
- package/dist/jsx/fields/Switch/footprint.native.js.map +1 -0
- package/dist/jsx/fields/Switch/index.mjs +44 -27
- package/dist/jsx/fields/Switch/index.mjs.map +1 -1
- package/dist/jsx/fields/Switch/index.native.js +60 -50
- package/dist/jsx/fields/Switch/index.native.js.map +1 -1
- package/dist/jsx/fields/TextArea/index.mjs +6 -3
- package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
- package/dist/jsx/fields/TextArea/index.native.js +6 -3
- package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.mjs +1 -0
- package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.native.js +1 -0
- package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.mjs +5 -0
- package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.native.js +7 -0
- package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/jsx/index.js +6 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +6 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +12 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/shared/panelPortal.mjs +24 -0
- package/dist/jsx/shared/panelPortal.mjs.map +1 -0
- package/dist/jsx/shared/panelPortal.native.js +65 -0
- package/dist/jsx/shared/panelPortal.native.js.map +1 -0
- package/dist/jsx/shared/pressSlopProps.mjs +16 -12
- package/dist/jsx/shared/pressSlopProps.mjs.map +1 -1
- package/dist/jsx/shared/pressSlopProps.native.js +18 -12
- package/dist/jsx/shared/pressSlopProps.native.js.map +1 -1
- package/dist/jsx/shared/utils.mjs +2 -2
- package/dist/jsx/shared/utils.mjs.map +1 -1
- package/dist/jsx/shared/utils.native.js +3 -2
- package/dist/jsx/shared/utils.native.js.map +1 -1
- package/dist/jsx/themedPrimitives.mjs +16 -3
- package/dist/jsx/themedPrimitives.mjs.map +1 -1
- package/dist/jsx/themedPrimitives.native.js +16 -3
- package/dist/jsx/themedPrimitives.native.js.map +1 -1
- package/package.json +17 -13
- package/src/AdaptivePopup/AdaptivePopup.spec.tsx +2 -3
- package/src/AdaptivePopup/index.tsx +11 -10
- package/src/Button/Button.borderLadder.spec.tsx +82 -0
- package/src/Button/Button.labelInk.spec.tsx +4 -1
- package/src/Button/Button.radiusLaw.spec.tsx +153 -0
- package/src/Button/index.tsx +6 -3
- package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +24 -0
- package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +37 -1
- package/src/ContextualSaveBar/UnsavedChangesDialog.tsx +3 -11
- package/src/ContextualSaveBar/index.tsx +17 -11
- package/src/ErrorSummary.stories.tsx +20 -11
- package/src/FieldDisplay/FieldDisplay.spec.tsx +47 -2
- package/src/FieldDisplay/index.tsx +21 -13
- package/src/FloatingPanel/FloatingPanel.detentLayout.spec.tsx +148 -0
- package/src/FloatingPanel/FloatingPanel.spec.tsx +140 -1
- package/src/FloatingPanel/FloatingPanel.stories.tsx +86 -1
- package/src/FloatingPanel/PanelPortal.native.tsx +15 -0
- package/src/FloatingPanel/PanelPortal.tsx +149 -0
- package/src/FloatingPanel/index.native.tsx +96 -19
- package/src/FloatingPanel/index.tsx +172 -86
- package/src/FloatingPanel/panelPortal.spec.tsx +142 -0
- package/src/FloatingPanel/panelWidthContract.spec.ts +17 -5
- package/src/FloatingPanel/touchRecipeHydration.spec.tsx +82 -0
- package/src/FloatingPanel/useFloatingPanel.ts +5 -2
- package/src/FloatingPanel/viewportHydration.spec.tsx +118 -0
- package/src/Form/index.tsx +2 -1
- package/src/Form/submission.spec.tsx +148 -0
- package/src/Form/submissionController.spec.ts +73 -0
- package/src/Form/submissionController.ts +59 -0
- package/src/Form/submissionDiscard.spec.tsx +41 -0
- package/src/Form/submissionPaths.spec.tsx +214 -0
- package/src/InputParts/index.tsx +48 -12
- package/src/Label/Label.stories.tsx +27 -11
- package/src/Wheel/Wheel.spec.tsx +9 -2
- package/src/Wheel/index.tsx +0 -2
- package/src/fieldFamilyStories.radius.spec.tsx +48 -0
- package/src/fields/Barcode/BarcodePreview.spec.tsx +32 -12
- package/src/fields/Barcode/BarcodePreview.stories.tsx +5 -4
- package/src/fields/Barcode/BarcodePreview.tsx +31 -25
- package/src/fields/Checkbox/Checkbox.native.spec.tsx +92 -0
- package/src/fields/Checkbox/Checkbox.stories.tsx +1 -0
- package/src/fields/Checkbox/Checkbox.tsx +2 -2
- package/src/fields/Checkbox/CheckboxBox.spec.tsx +13 -13
- package/src/fields/Checkbox/CheckboxBox.tsx +7 -1
- package/src/fields/ColorPicker/index.tsx +6 -1
- package/src/fields/ColorPicker/parts.tsx +1 -0
- package/src/fields/Combobox/Combobox.spec.tsx +85 -55
- package/src/fields/Combobox/index.tsx +259 -240
- package/src/fields/DatePicker/DateRangePicker.tsx +5 -3
- package/src/fields/DatePicker/MultiDatePicker.tsx +3 -1
- package/src/fields/Duration/index.tsx +3 -1
- package/src/fields/FileUpload/index.tsx +13 -3
- package/src/fields/FileUpload/nativePickerLoader.spec.ts +34 -0
- package/src/fields/FileUpload/nativePickerLoader.ts +11 -2
- package/src/fields/Geolocation/Geolocation.spec.tsx +165 -4
- package/src/fields/Geolocation/Geolocation.stories.tsx +110 -26
- package/src/fields/Geolocation/GeolocationMap.tsx +3 -0
- package/src/fields/Geolocation/geocoderContext.tsx +56 -0
- package/src/fields/Geolocation/index.tsx +75 -80
- package/src/fields/Geolocation/photonGeocoder.spec.ts +214 -0
- package/src/fields/Geolocation/photonGeocoder.ts +150 -0
- package/src/fields/Input/index.tsx +3 -1
- package/src/fields/MentionInput/MentionInput.spec.tsx +41 -30
- package/src/fields/MentionInput/index.tsx +128 -119
- package/src/fields/OTPInput/index.tsx +7 -4
- package/src/fields/PhoneInput/PhoneInput.spec.tsx +63 -0
- package/src/fields/PhoneInput/index.tsx +13 -8
- package/src/fields/PhoneInput/phone.native.spec.ts +32 -0
- package/src/fields/PhoneInput/phone.ts +5 -2
- package/src/fields/PhoneInput/regionNames.ts +250 -0
- package/src/fields/RadioGroup/RadioGroup.stories.tsx +4 -3
- package/src/fields/RadioGroup/index.tsx +3 -2
- package/src/fields/Rating/StarInk.native.spec.tsx +1 -1
- package/src/fields/SearchInput/index.tsx +4 -3
- package/src/fields/Select/Select.spec.tsx +36 -29
- package/src/fields/Select/index.tsx +14 -5
- package/src/fields/Signature/index.tsx +7 -3
- package/src/fields/Slider/index.tsx +14 -4
- package/src/fields/Slider/jumpMotion.ts +6 -2
- package/src/fields/Stepper/Stepper.spec.tsx +30 -0
- package/src/fields/Stepper/index.tsx +34 -4
- package/src/fields/Switch/Switch.footprint.native.spec.tsx +58 -0
- package/src/fields/Switch/Switch.footprint.spec.tsx +79 -0
- package/src/fields/Switch/Switch.radius.spec.tsx +37 -6
- package/src/fields/Switch/footprint.ts +45 -0
- package/src/fields/Switch/index.tsx +46 -49
- package/src/fields/TextArea/TextArea.spec.tsx +30 -1
- package/src/fields/TextArea/index.tsx +6 -3
- package/src/fields/TimePicker/TimePicker.native.spec.tsx +48 -0
- package/src/fields/TimePicker/catalog.tsx +1 -0
- package/src/fields/TimePicker/parts.tsx +4 -0
- package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +17 -8
- package/src/fields/pickerShellPadding.spec.tsx +54 -0
- package/src/index.ts +8 -0
- package/src/shared/panelPortal.ts +36 -0
- package/src/shared/pressSlopProps.spec.ts +27 -1
- package/src/shared/pressSlopProps.ts +26 -17
- package/src/shared/utils.ts +2 -2
- package/src/themedPrimitives.tsx +16 -3
- package/types/AdaptivePopup/index.d.ts.map +1 -1
- package/types/Button/index.d.ts.map +1 -1
- package/types/ContextualSaveBar/UnsavedChangesDialog.d.ts.map +1 -1
- package/types/ContextualSaveBar/index.d.ts.map +1 -1
- package/types/FieldDisplay/index.d.ts.map +1 -1
- package/types/FloatingPanel/PanelPortal.d.ts +24 -0
- package/types/FloatingPanel/PanelPortal.d.ts.map +1 -0
- package/types/FloatingPanel/PanelPortal.native.d.ts +9 -0
- package/types/FloatingPanel/PanelPortal.native.d.ts.map +1 -0
- package/types/FloatingPanel/index.d.ts +0 -5
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
- package/types/Form/index.d.ts.map +1 -1
- package/types/Form/submissionController.d.ts +21 -0
- package/types/Form/submissionController.d.ts.map +1 -0
- package/types/InputParts/index.d.ts +34 -2
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/Wheel/index.d.ts.map +1 -1
- package/types/fields/Barcode/BarcodePreview.d.ts +7 -3
- package/types/fields/Barcode/BarcodePreview.d.ts.map +1 -1
- package/types/fields/Checkbox/CheckboxBox.d.ts +5 -0
- package/types/fields/Checkbox/CheckboxBox.d.ts.map +1 -1
- package/types/fields/ColorPicker/index.d.ts.map +1 -1
- package/types/fields/ColorPicker/parts.d.ts +2 -0
- package/types/fields/ColorPicker/parts.d.ts.map +1 -1
- package/types/fields/Combobox/index.d.ts.map +1 -1
- package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
- package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
- package/types/fields/Duration/index.d.ts.map +1 -1
- package/types/fields/FileUpload/index.d.ts.map +1 -1
- package/types/fields/FileUpload/nativePickerLoader.d.ts +8 -0
- package/types/fields/FileUpload/nativePickerLoader.d.ts.map +1 -1
- package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
- package/types/fields/Geolocation/geocoderContext.d.ts +24 -0
- package/types/fields/Geolocation/geocoderContext.d.ts.map +1 -0
- package/types/fields/Geolocation/index.d.ts +2 -1
- package/types/fields/Geolocation/index.d.ts.map +1 -1
- package/types/fields/Geolocation/photonGeocoder.d.ts +46 -0
- package/types/fields/Geolocation/photonGeocoder.d.ts.map +1 -0
- package/types/fields/Input/index.d.ts +19 -1
- package/types/fields/Input/index.d.ts.map +1 -1
- package/types/fields/MentionInput/index.d.ts.map +1 -1
- package/types/fields/OTPInput/index.d.ts +1 -1
- package/types/fields/OTPInput/index.d.ts.map +1 -1
- package/types/fields/PhoneInput/index.d.ts.map +1 -1
- package/types/fields/PhoneInput/phone.d.ts.map +1 -1
- package/types/fields/PhoneInput/regionNames.d.ts +2 -0
- package/types/fields/PhoneInput/regionNames.d.ts.map +1 -0
- package/types/fields/RadioGroup/index.d.ts.map +1 -1
- package/types/fields/SearchInput/index.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Signature/index.d.ts.map +1 -1
- package/types/fields/Slider/index.d.ts.map +1 -1
- package/types/fields/Slider/jumpMotion.d.ts +1 -1
- package/types/fields/Slider/jumpMotion.d.ts.map +1 -1
- package/types/fields/Stepper/index.d.ts +6 -0
- package/types/fields/Stepper/index.d.ts.map +1 -1
- package/types/fields/Switch/footprint.d.ts +12 -0
- package/types/fields/Switch/footprint.d.ts.map +1 -0
- package/types/fields/Switch/index.d.ts.map +1 -1
- package/types/fields/TextArea/index.d.ts.map +1 -1
- package/types/fields/TimePicker/catalog.d.ts.map +1 -1
- package/types/fields/TimePicker/parts.d.ts.map +1 -1
- package/types/index.d.ts +8 -0
- package/types/index.d.ts.map +1 -1
- package/types/shared/panelPortal.d.ts +13 -0
- package/types/shared/panelPortal.d.ts.map +1 -0
- package/types/shared/pressSlopProps.d.ts +9 -2
- package/types/shared/pressSlopProps.d.ts.map +1 -1
- package/types/shared/utils.d.ts +1 -1
- package/types/shared/utils.d.ts.map +1 -1
- package/types/themedPrimitives.d.ts +48 -1
- package/types/themedPrimitives.d.ts.map +1 -1
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
pressTargetHitSlop,
|
|
4
4
|
useResolvedKnobs,
|
|
5
5
|
useGlyphColor,
|
|
6
|
+
useTouchSurface,
|
|
6
7
|
type KnobProps,
|
|
7
8
|
} from "@multiplatform.one/theme";
|
|
8
9
|
import { MagnifyingGlassIcon, MapPinIcon, NavigationArrowIcon, XIcon } from "@phosphor-icons/react";
|
|
@@ -18,6 +19,7 @@ import { Input as InputParts } from "../../InputParts";
|
|
|
18
19
|
import { Skeleton } from "../../Skeleton";
|
|
19
20
|
import { GeolocationMap } from "./GeolocationMap";
|
|
20
21
|
import { createNativeSearchFocus } from "./nativeSearchFocus";
|
|
22
|
+
import { useGeocoder } from "./geocoderContext";
|
|
21
23
|
import { detectGeoShape, formatGeoValue, parseGeoValue } from "./geoValue";
|
|
22
24
|
import {
|
|
23
25
|
queryPermissionState,
|
|
@@ -303,7 +305,7 @@ export interface GeolocationMapProps {
|
|
|
303
305
|
knobProps: KnobProps;
|
|
304
306
|
}
|
|
305
307
|
|
|
306
|
-
/**
|
|
308
|
+
/** The map frame and the coordinate line take a 2px ring at offset 0 (media-13). */
|
|
307
309
|
const overlayFocusRing = ensureFocusVisibleRing({ outlineOffset: 0 });
|
|
308
310
|
|
|
309
311
|
function ResultRow({
|
|
@@ -646,7 +648,7 @@ function GeoMapSurface({
|
|
|
646
648
|
/>
|
|
647
649
|
)}
|
|
648
650
|
|
|
649
|
-
{!hasValue
|
|
651
|
+
{!hasValue ? (
|
|
650
652
|
<YStack
|
|
651
653
|
testID="geolocation-empty"
|
|
652
654
|
position="absolute"
|
|
@@ -657,89 +659,71 @@ function GeoMapSurface({
|
|
|
657
659
|
zIndex={2}
|
|
658
660
|
alignItems="center"
|
|
659
661
|
justifyContent="center"
|
|
660
|
-
|
|
661
|
-
pointerEvents="box-none"
|
|
662
|
+
pointerEvents="none"
|
|
662
663
|
>
|
|
663
|
-
<Text {...knobProps.body} color={formCommonColors.muted}
|
|
664
|
+
<Text {...knobProps.body} color={formCommonColors.muted}>
|
|
664
665
|
{t("No location set")}
|
|
665
666
|
</Text>
|
|
666
|
-
{!readOnly && !disabled ? (
|
|
667
|
-
<Button
|
|
668
|
-
size="$4"
|
|
669
|
-
onPress={onUseMyLocation}
|
|
670
|
-
disabled={locating}
|
|
671
|
-
testID="geolocation-empty-locate"
|
|
672
|
-
aria-label={t("Use my current location")}
|
|
673
|
-
>
|
|
674
|
-
<Button.Text>{t("Use my current location")}</Button.Text>
|
|
675
|
-
</Button>
|
|
676
|
-
) : null}
|
|
677
667
|
</YStack>
|
|
678
668
|
) : null}
|
|
669
|
+
</YStack>
|
|
679
670
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
671
|
+
{locateErrorOpen ? (
|
|
672
|
+
<YStack
|
|
673
|
+
testID="geolocation-locate-panel"
|
|
674
|
+
role="alert"
|
|
675
|
+
{...knobProps.borderRadius}
|
|
676
|
+
{...knobProps.inputSurface}
|
|
677
|
+
borderColor={formInputColors.border.base}
|
|
678
|
+
padding="$3"
|
|
679
|
+
gap="$2"
|
|
680
|
+
alignItems="center"
|
|
681
|
+
>
|
|
682
|
+
<Text {...knobProps.body} color={formCommonColors.error} textAlign="center">
|
|
683
|
+
{locateError}
|
|
684
|
+
</Text>
|
|
685
|
+
<XStack gap="$2">
|
|
686
|
+
<Button size="$2" onPress={onRetryLocate} aria-label={t("Retry location")}>
|
|
687
|
+
{t("Retry")}
|
|
693
688
|
</Button>
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
size="$2"
|
|
701
|
-
circular
|
|
702
|
-
disabled={disabled || locating}
|
|
703
|
-
onPress={onUseMyLocation}
|
|
704
|
-
backgroundColor="$background"
|
|
705
|
-
icon={locating ? <Spinner size="small" /> : locationIcon}
|
|
706
|
-
aria-label={locating ? t("Locating") : t("Locate")}
|
|
707
|
-
focusVisibleStyle={overlayFocusRing}
|
|
708
|
-
hitSlop={pressTargetHitSlop(32)}
|
|
709
|
-
/>
|
|
710
|
-
</View>
|
|
711
|
-
)}
|
|
689
|
+
<Button size="$2" onPress={onCloseLocate} aria-label={t("Close location")}>
|
|
690
|
+
{t("Close")}
|
|
691
|
+
</Button>
|
|
692
|
+
</XStack>
|
|
693
|
+
</YStack>
|
|
694
|
+
) : null}
|
|
712
695
|
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
{
|
|
722
|
-
{
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
696
|
+
<XStack testID="geolocation-map-footer" alignItems="center" flexWrap="wrap" gap="$2">
|
|
697
|
+
<YStack flexGrow={1} flexShrink={1} flexBasis={0} minWidth={160}>
|
|
698
|
+
{coordLine}
|
|
699
|
+
</YStack>
|
|
700
|
+
{!readOnly && !locateErrorOpen ? (
|
|
701
|
+
<Button
|
|
702
|
+
size="$2"
|
|
703
|
+
disabled={disabled || locating}
|
|
704
|
+
onPress={onUseMyLocation}
|
|
705
|
+
icon={locating ? <Spinner size="small" /> : locationIcon}
|
|
706
|
+
testID={hasValue ? "geolocation-locate" : "geolocation-empty-locate"}
|
|
707
|
+
aria-label={hasValue ? t("Locate") : t("Use my current location")}
|
|
708
|
+
aria-busy={locating || undefined}
|
|
709
|
+
hitSlop={pressTargetHitSlop(32)}
|
|
727
710
|
>
|
|
728
|
-
<Text
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
711
|
+
<Button.Text>{hasValue ? t("Locate") : t("Use my current location")}</Button.Text>
|
|
712
|
+
</Button>
|
|
713
|
+
) : null}
|
|
714
|
+
{handleExpand && expandIcon ? (
|
|
715
|
+
<Button
|
|
716
|
+
size="$2"
|
|
717
|
+
disabled={disabled}
|
|
718
|
+
onPress={handleExpand}
|
|
719
|
+
icon={expandIcon}
|
|
720
|
+
aria-label={t("Expand map")}
|
|
721
|
+
hitSlop={pressTargetHitSlop(32)}
|
|
722
|
+
>
|
|
723
|
+
<Button.Text>{t("Expand")}</Button.Text>
|
|
724
|
+
</Button>
|
|
725
|
+
) : null}
|
|
726
|
+
</XStack>
|
|
743
727
|
|
|
744
728
|
{expandIcon && (
|
|
745
729
|
<AdaptivePopup
|
|
@@ -805,8 +789,9 @@ export interface GeolocationProps {
|
|
|
805
789
|
/**
|
|
806
790
|
* Convenience bag for `geocode` + `reverseGeocode`. Explicit props win.
|
|
807
791
|
* Any object satisfying `Geocoder` works. No provider is constructed for you.
|
|
792
|
+
* Omitted, the nearest `GeocoderProvider` supplies one; `null` opts out.
|
|
808
793
|
*/
|
|
809
|
-
geocoder?: Geocoder;
|
|
794
|
+
geocoder?: Geocoder | null;
|
|
810
795
|
}
|
|
811
796
|
|
|
812
797
|
function CellFace({
|
|
@@ -880,6 +865,7 @@ export function Geolocation({
|
|
|
880
865
|
reverseGeocode: reverseGeocodeProp,
|
|
881
866
|
geocoder,
|
|
882
867
|
}: GeolocationProps) {
|
|
868
|
+
const hydrationTouch = useTouchSurface();
|
|
883
869
|
const { resolvedForm, knobProps, id } = useFormField({ form: formProp, id: idProp, compact });
|
|
884
870
|
const resolvedValidators = useResolvedValidators(required, validators, label, name);
|
|
885
871
|
const glyphColor = useGlyphColor();
|
|
@@ -892,10 +878,11 @@ export function Geolocation({
|
|
|
892
878
|
const inTableCell = useIsInTableCell();
|
|
893
879
|
const viewportGtSm = useViewportGtSm();
|
|
894
880
|
const shouldUseSheet = !isWeb || !viewportGtSm;
|
|
881
|
+
const contextGeocoder = useGeocoder();
|
|
895
882
|
const { geocode, reverseGeocode } = resolveGeocoder({
|
|
896
883
|
geocode: geocodeProp,
|
|
897
884
|
reverseGeocode: reverseGeocodeProp,
|
|
898
|
-
geocoder,
|
|
885
|
+
geocoder: geocoder === undefined ? (contextGeocoder ?? undefined) : (geocoder ?? undefined),
|
|
899
886
|
});
|
|
900
887
|
const searchEnabled = Boolean(geocode) && !disabled && !readOnly;
|
|
901
888
|
const listId = useId();
|
|
@@ -1182,7 +1169,11 @@ export function Geolocation({
|
|
|
1182
1169
|
[startLocate, requestPosition, cancelLocate, applyAddress, closeSearch],
|
|
1183
1170
|
);
|
|
1184
1171
|
|
|
1185
|
-
const mapHeight = getFieldHeight(
|
|
1172
|
+
const mapHeight = getFieldHeight(
|
|
1173
|
+
(size ?? knobProps.sizeToken) as SizeTokens,
|
|
1174
|
+
compact ? 4 : 5,
|
|
1175
|
+
hydrationTouch,
|
|
1176
|
+
);
|
|
1186
1177
|
const displayError = error || preflightError;
|
|
1187
1178
|
|
|
1188
1179
|
const renderSearch = (
|
|
@@ -1271,11 +1262,15 @@ export function Geolocation({
|
|
|
1271
1262
|
}
|
|
1272
1263
|
: {})}
|
|
1273
1264
|
onFocus={() => {
|
|
1265
|
+
// Web opens on a press, typing or ArrowDown only: a panel
|
|
1266
|
+
// that moves focus in on open (a cell editor, a sheet) must
|
|
1267
|
+
// not drop the idle results over the map (MPO-360).
|
|
1274
1268
|
if (
|
|
1269
|
+
!isWeb &&
|
|
1275
1270
|
searchEnabled &&
|
|
1276
1271
|
!opts.editingCell &&
|
|
1277
1272
|
!closingSearchRef.current &&
|
|
1278
|
-
|
|
1273
|
+
nativeSearchFocus.canOpen(!!opts.sheetHeader)
|
|
1279
1274
|
)
|
|
1280
1275
|
setResultsOpen(true);
|
|
1281
1276
|
}}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createPhotonGeocoder, photonFeatureToResult } from "./photonGeocoder";
|
|
3
|
+
|
|
4
|
+
// Recorded from https://photon.komoot.io on 2026-09-26 (trimmed to the fields
|
|
5
|
+
// the adapter reads). Photon returns one feature per OSM way, so a long street
|
|
6
|
+
// arrives as several segments with the same name.
|
|
7
|
+
const mannerheimSearch = {
|
|
8
|
+
type: "FeatureCollection",
|
|
9
|
+
features: [
|
|
10
|
+
{
|
|
11
|
+
type: "Feature",
|
|
12
|
+
properties: {
|
|
13
|
+
osm_key: "highway",
|
|
14
|
+
type: "street",
|
|
15
|
+
name: "Mannerheimintie",
|
|
16
|
+
locality: "Keskusta",
|
|
17
|
+
district: "Kluuvi",
|
|
18
|
+
city: "Helsinki",
|
|
19
|
+
state: "Uusimaa",
|
|
20
|
+
country: "Suomi",
|
|
21
|
+
},
|
|
22
|
+
geometry: { type: "Point", coordinates: [24.9374103, 60.1707623] },
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
type: "Feature",
|
|
26
|
+
properties: {
|
|
27
|
+
osm_key: "highway",
|
|
28
|
+
type: "street",
|
|
29
|
+
name: "Mannerheimintie",
|
|
30
|
+
locality: "Keskusta",
|
|
31
|
+
district: "Kluuvi",
|
|
32
|
+
city: "Helsinki",
|
|
33
|
+
state: "Uusimaa",
|
|
34
|
+
country: "Suomi",
|
|
35
|
+
},
|
|
36
|
+
geometry: { type: "Point", coordinates: [24.9413811, 60.1681296] },
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const kamppiReverse = {
|
|
42
|
+
type: "FeatureCollection",
|
|
43
|
+
features: [
|
|
44
|
+
{
|
|
45
|
+
type: "Feature",
|
|
46
|
+
properties: {
|
|
47
|
+
type: "house",
|
|
48
|
+
name: "P-Simonkenttä",
|
|
49
|
+
street: "Narinkkatori",
|
|
50
|
+
district: "Kamppi",
|
|
51
|
+
city: "Helsinki",
|
|
52
|
+
state: "Uusimaa",
|
|
53
|
+
country: "Suomi",
|
|
54
|
+
},
|
|
55
|
+
geometry: { type: "Point", coordinates: [24.9356429, 60.1694307] },
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function jsonResponse(body: unknown, status = 200): Response {
|
|
61
|
+
return new Response(JSON.stringify(body), {
|
|
62
|
+
status,
|
|
63
|
+
headers: { "Content-Type": "application/json" },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
describe("createPhotonGeocoder", () => {
|
|
68
|
+
it("searches the public instance and maps features to place rows", async () => {
|
|
69
|
+
const fetch = vi.fn().mockResolvedValue(jsonResponse(mannerheimSearch));
|
|
70
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
71
|
+
const results = await geocoder.geocode({ query: " mannerheimintie " });
|
|
72
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(fetch.mock.calls[0][0]).toBe("https://photon.komoot.io/api/?q=mannerheimintie&limit=5");
|
|
74
|
+
expect(results).toEqual([
|
|
75
|
+
{
|
|
76
|
+
lat: 60.1707623,
|
|
77
|
+
lng: 24.9374103,
|
|
78
|
+
label: "Mannerheimintie",
|
|
79
|
+
description: "Kluuvi, Helsinki, Uusimaa, Suomi",
|
|
80
|
+
},
|
|
81
|
+
]);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("reverse geocodes a pair to its nearest place", async () => {
|
|
85
|
+
const fetch = vi.fn().mockResolvedValue(jsonResponse(kamppiReverse));
|
|
86
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
87
|
+
const result = await geocoder.reverseGeocode({ lat: 60.16952, lng: 24.93545 });
|
|
88
|
+
expect(fetch.mock.calls[0][0]).toBe(
|
|
89
|
+
"https://photon.komoot.io/reverse?lat=60.16952&lon=24.93545&limit=1",
|
|
90
|
+
);
|
|
91
|
+
expect(result).toEqual({
|
|
92
|
+
lat: 60.1694307,
|
|
93
|
+
lng: 24.9356429,
|
|
94
|
+
label: "P-Simonkenttä",
|
|
95
|
+
description: "Narinkkatori, Kamppi, Helsinki, Uusimaa, Suomi",
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("answers null when nothing is near the pair", async () => {
|
|
100
|
+
const fetch = vi
|
|
101
|
+
.fn()
|
|
102
|
+
.mockResolvedValue(jsonResponse({ type: "FeatureCollection", features: [] }));
|
|
103
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
104
|
+
await expect(geocoder.reverseGeocode({ lat: 0, lng: -160 })).resolves.toBeNull();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("takes a self-hosted base URL and a language", async () => {
|
|
108
|
+
const fetch = vi.fn().mockResolvedValue(jsonResponse(mannerheimSearch));
|
|
109
|
+
const geocoder = createPhotonGeocoder({
|
|
110
|
+
fetch,
|
|
111
|
+
baseUrl: "https://geo.example.test/photon/",
|
|
112
|
+
lang: "en",
|
|
113
|
+
limit: 3,
|
|
114
|
+
});
|
|
115
|
+
await geocoder.geocode({ query: "Café & Bar" });
|
|
116
|
+
expect(fetch.mock.calls[0][0]).toBe(
|
|
117
|
+
"https://geo.example.test/photon/api/?q=Caf%C3%A9%20%26%20Bar&limit=3&lang=en",
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("never calls out for a blank query", async () => {
|
|
122
|
+
const fetch = vi.fn();
|
|
123
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
124
|
+
await expect(geocoder.geocode({ query: " " })).resolves.toEqual([]);
|
|
125
|
+
expect(fetch).not.toHaveBeenCalled();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("serves a repeated query and a repeated pair from its cache", async () => {
|
|
129
|
+
const fetch = vi
|
|
130
|
+
.fn()
|
|
131
|
+
.mockImplementation(async (url: string) =>
|
|
132
|
+
jsonResponse(url.includes("/reverse") ? kamppiReverse : mannerheimSearch),
|
|
133
|
+
);
|
|
134
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
135
|
+
await geocoder.geocode({ query: "mannerheimintie" });
|
|
136
|
+
await geocoder.geocode({ query: "mannerheimintie" });
|
|
137
|
+
await Promise.all([
|
|
138
|
+
geocoder.reverseGeocode({ lat: 60.16952, lng: 24.93545 }),
|
|
139
|
+
geocoder.reverseGeocode({ lat: 60.16952, lng: 24.93545 }),
|
|
140
|
+
]);
|
|
141
|
+
expect(fetch).toHaveBeenCalledTimes(2);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("rejects on an HTTP error and retries it on the next call", async () => {
|
|
145
|
+
const fetch = vi
|
|
146
|
+
.fn()
|
|
147
|
+
.mockResolvedValueOnce(jsonResponse({ message: "busy" }, 503))
|
|
148
|
+
.mockResolvedValueOnce(jsonResponse(mannerheimSearch));
|
|
149
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
150
|
+
await expect(geocoder.geocode({ query: "mannerheimintie" })).rejects.toThrow(
|
|
151
|
+
"Photon answered 503",
|
|
152
|
+
);
|
|
153
|
+
await expect(geocoder.geocode({ query: "mannerheimintie" })).resolves.toHaveLength(1);
|
|
154
|
+
expect(fetch).toHaveBeenCalledTimes(2);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("rejects a body that is not a feature collection", async () => {
|
|
158
|
+
const fetch = vi.fn().mockResolvedValue(jsonResponse({ error: "bad request" }));
|
|
159
|
+
const geocoder = createPhotonGeocoder({ fetch });
|
|
160
|
+
await expect(geocoder.geocode({ query: "x" })).rejects.toThrow("no feature collection");
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("aborts a request that outlives timeoutMs", async () => {
|
|
164
|
+
const fetch = vi.fn(
|
|
165
|
+
(_url: string, init?: RequestInit) =>
|
|
166
|
+
new Promise<Response>((_resolve, reject) => {
|
|
167
|
+
init?.signal?.addEventListener("abort", () => reject(new Error("aborted")));
|
|
168
|
+
}),
|
|
169
|
+
);
|
|
170
|
+
const geocoder = createPhotonGeocoder({
|
|
171
|
+
fetch: fetch as typeof globalThis.fetch,
|
|
172
|
+
timeoutMs: 20,
|
|
173
|
+
});
|
|
174
|
+
await expect(geocoder.geocode({ query: "slow" })).rejects.toThrow("aborted");
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
describe("photonFeatureToResult", () => {
|
|
179
|
+
it("labels an unnamed house by street and number", () => {
|
|
180
|
+
expect(
|
|
181
|
+
photonFeatureToResult({
|
|
182
|
+
geometry: { type: "Point", coordinates: [24.93545, 60.16952] },
|
|
183
|
+
properties: {
|
|
184
|
+
street: "Mannerheimintie",
|
|
185
|
+
housenumber: "3",
|
|
186
|
+
district: "Kamppi",
|
|
187
|
+
city: "Helsinki",
|
|
188
|
+
country: "Finland",
|
|
189
|
+
},
|
|
190
|
+
}),
|
|
191
|
+
).toEqual({
|
|
192
|
+
lat: 60.16952,
|
|
193
|
+
lng: 24.93545,
|
|
194
|
+
label: "Mannerheimintie 3",
|
|
195
|
+
description: "Kamppi, Helsinki, Finland",
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("drops a feature without a point or a name", () => {
|
|
200
|
+
expect(photonFeatureToResult({ properties: { name: "Nowhere" } })).toBeNull();
|
|
201
|
+
expect(
|
|
202
|
+
photonFeatureToResult({ geometry: { type: "Point", coordinates: [1, 2] }, properties: {} }),
|
|
203
|
+
).toBeNull();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it("gives a country alone no description", () => {
|
|
207
|
+
expect(
|
|
208
|
+
photonFeatureToResult({
|
|
209
|
+
geometry: { type: "Point", coordinates: [25.9, 64.9] },
|
|
210
|
+
properties: { name: "Suomi", country: "Suomi" },
|
|
211
|
+
}),
|
|
212
|
+
).toEqual({ lat: 64.9, lng: 25.9, label: "Suomi" });
|
|
213
|
+
});
|
|
214
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { GeocodeResult, Geocoder } from "./geocoder";
|
|
2
|
+
import { formatPlace } from "./geocoder";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Keyless geocoder over Photon (https://github.com/komoot/photon), the
|
|
6
|
+
* OpenStreetMap geocoder built for search-as-you-type. Opt-in: the field never
|
|
7
|
+
* constructs it. An app passes it to `GeocoderProvider` or the field's
|
|
8
|
+
* `geocoder` prop.
|
|
9
|
+
*
|
|
10
|
+
* `baseUrl` defaults to komoot's public instance, which asks for fair use and
|
|
11
|
+
* promises no availability. Production apps point `baseUrl` at their own
|
|
12
|
+
* Photon or a proxy, read from runtime config so the endpoint can move
|
|
13
|
+
* without a release.
|
|
14
|
+
*/
|
|
15
|
+
export interface PhotonGeocoderOptions {
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
/** Photon result language: `"default"` (local names), `"en"`, `"de"` or `"fr"`. */
|
|
18
|
+
lang?: string;
|
|
19
|
+
/** Forward results per query. */
|
|
20
|
+
limit?: number;
|
|
21
|
+
/** A request slower than this rejects, and the field shows its error state. */
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
/** Cached queries and reverse lookups kept per geocoder. */
|
|
24
|
+
cacheSize?: number;
|
|
25
|
+
fetch?: typeof fetch;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface PhotonProperties {
|
|
29
|
+
name?: string;
|
|
30
|
+
housenumber?: string;
|
|
31
|
+
street?: string;
|
|
32
|
+
district?: string;
|
|
33
|
+
locality?: string;
|
|
34
|
+
city?: string;
|
|
35
|
+
county?: string;
|
|
36
|
+
state?: string;
|
|
37
|
+
country?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface PhotonFeature {
|
|
41
|
+
geometry?: { type?: string; coordinates?: unknown };
|
|
42
|
+
properties?: PhotonProperties;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const photonPublicUrl = "https://photon.komoot.io";
|
|
46
|
+
|
|
47
|
+
function streetLine(props: PhotonProperties): string | undefined {
|
|
48
|
+
if (!props.street) return undefined;
|
|
49
|
+
return props.housenumber ? `${props.street} ${props.housenumber}` : props.street;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function photonFeatureToResult(feature: PhotonFeature): GeocodeResult | null {
|
|
53
|
+
const coordinates = feature.geometry?.coordinates;
|
|
54
|
+
if (!Array.isArray(coordinates)) return null;
|
|
55
|
+
const [lng, lat] = coordinates as [unknown, unknown];
|
|
56
|
+
if (typeof lat !== "number" || typeof lng !== "number") return null;
|
|
57
|
+
if (!Number.isFinite(lat) || !Number.isFinite(lng)) return null;
|
|
58
|
+
const props = feature.properties ?? {};
|
|
59
|
+
const street = streetLine(props);
|
|
60
|
+
const label = props.name ?? street ?? props.city ?? props.county ?? props.state ?? props.country;
|
|
61
|
+
if (!label) return null;
|
|
62
|
+
const seen = new Set([label]);
|
|
63
|
+
const parts: string[] = [];
|
|
64
|
+
for (const part of [
|
|
65
|
+
props.name ? street : undefined,
|
|
66
|
+
props.district ?? props.locality,
|
|
67
|
+
props.city ?? props.county,
|
|
68
|
+
props.state,
|
|
69
|
+
props.country,
|
|
70
|
+
]) {
|
|
71
|
+
if (!part || seen.has(part)) continue;
|
|
72
|
+
seen.add(part);
|
|
73
|
+
parts.push(part);
|
|
74
|
+
}
|
|
75
|
+
return parts.length > 0
|
|
76
|
+
? { lat, lng, label, description: parts.join(", ") }
|
|
77
|
+
: { lat, lng, label };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function toResults(body: unknown): GeocodeResult[] {
|
|
81
|
+
const features = (body as { features?: unknown } | null)?.features;
|
|
82
|
+
if (!Array.isArray(features)) throw new Error("Photon returned no feature collection");
|
|
83
|
+
const seen = new Set<string>();
|
|
84
|
+
const results: GeocodeResult[] = [];
|
|
85
|
+
for (const feature of features) {
|
|
86
|
+
const result = photonFeatureToResult(feature as PhotonFeature);
|
|
87
|
+
if (!result) continue;
|
|
88
|
+
const key = formatPlace(result);
|
|
89
|
+
if (seen.has(key)) continue;
|
|
90
|
+
seen.add(key);
|
|
91
|
+
results.push(result);
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function query(params: Record<string, string | number | undefined>): string {
|
|
97
|
+
return Object.entries(params)
|
|
98
|
+
.filter((entry): entry is [string, string | number] => entry[1] !== undefined)
|
|
99
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
|
|
100
|
+
.join("&");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function createPhotonGeocoder(options: PhotonGeocoderOptions = {}): Geocoder {
|
|
104
|
+
const baseUrl = (options.baseUrl ?? photonPublicUrl).replace(/\/+$/, "");
|
|
105
|
+
const lang = options.lang;
|
|
106
|
+
const limit = options.limit ?? 5;
|
|
107
|
+
const timeoutMs = options.timeoutMs ?? 8000;
|
|
108
|
+
const cacheSize = options.cacheSize ?? 100;
|
|
109
|
+
const doFetch = options.fetch ?? ((input, init) => fetch(input, init));
|
|
110
|
+
const cache = new Map<string, Promise<GeocodeResult[]>>();
|
|
111
|
+
|
|
112
|
+
const load = (url: string): Promise<GeocodeResult[]> => {
|
|
113
|
+
const hit = cache.get(url);
|
|
114
|
+
if (hit) return hit;
|
|
115
|
+
const controller = typeof AbortController === "function" ? new AbortController() : undefined;
|
|
116
|
+
const timer = controller ? setTimeout(() => controller.abort(), timeoutMs) : undefined;
|
|
117
|
+
const pending = doFetch(url, {
|
|
118
|
+
headers: { Accept: "application/json" },
|
|
119
|
+
signal: controller?.signal,
|
|
120
|
+
})
|
|
121
|
+
.then(async (response) => {
|
|
122
|
+
if (!response.ok) throw new Error(`Photon answered ${response.status}`);
|
|
123
|
+
return toResults(await response.json());
|
|
124
|
+
})
|
|
125
|
+
.finally(() => {
|
|
126
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
127
|
+
});
|
|
128
|
+
cache.set(url, pending);
|
|
129
|
+
if (cache.size > cacheSize) {
|
|
130
|
+
const oldest = cache.keys().next().value;
|
|
131
|
+
if (oldest !== undefined) cache.delete(oldest);
|
|
132
|
+
}
|
|
133
|
+
pending.catch(() => cache.delete(url));
|
|
134
|
+
return pending;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
geocode: ({ query: text }) => {
|
|
139
|
+
const trimmed = text.trim();
|
|
140
|
+
if (!trimmed) return Promise.resolve([]);
|
|
141
|
+
return load(`${baseUrl}/api/?${query({ q: trimmed, limit, lang })}`);
|
|
142
|
+
},
|
|
143
|
+
reverseGeocode: async ({ lat, lng }) => {
|
|
144
|
+
const results = await load(
|
|
145
|
+
`${baseUrl}/reverse?${query({ lat: lat.toFixed(5), lon: lng.toFixed(5), limit: 1, lang })}`,
|
|
146
|
+
);
|
|
147
|
+
return results[0] ?? null;
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useTouchSurface } from "@multiplatform.one/theme";
|
|
1
2
|
import type { ComponentProps, ReactElement, ReactNode } from "react";
|
|
2
3
|
import { useCallback, useRef } from "react";
|
|
3
4
|
import { writeToClipboard } from "@multiplatform.one/platform";
|
|
@@ -160,6 +161,7 @@ export function Input({
|
|
|
160
161
|
copy,
|
|
161
162
|
onCopyResult,
|
|
162
163
|
}: InputProps) {
|
|
164
|
+
const hydrationTouch = useTouchSurface();
|
|
163
165
|
const { resolvedForm, knobProps, control, id } = useFormField({
|
|
164
166
|
form: formProp,
|
|
165
167
|
id: idProp,
|
|
@@ -178,7 +180,7 @@ export function Input({
|
|
|
178
180
|
// density ≠ size: compact steps knobProps.sizeToken; an explicit `size`
|
|
179
181
|
// ejects only the painted box height and leaves density alone.
|
|
180
182
|
const resolvedSize = (size ?? knobProps.sizeToken) as SizeTokens;
|
|
181
|
-
const visualHeight = getFieldHeight(resolvedSize);
|
|
183
|
+
const visualHeight = getFieldHeight(resolvedSize, 1, hydrationTouch);
|
|
182
184
|
const belowFloor = visualHeight < MIN_PRESS_TARGET;
|
|
183
185
|
const visibleLabel = labelHidden ? undefined : label;
|
|
184
186
|
const resolvedAriaLabel =
|