@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.
Files changed (579) hide show
  1. package/dist/cjs/Button/index.cjs +3 -36
  2. package/dist/cjs/Button/index.native.js +3 -36
  3. package/dist/cjs/Button/index.native.js.map +1 -1
  4. package/dist/cjs/Chip/index.cjs +1 -1
  5. package/dist/cjs/Chip/index.native.js +1 -1
  6. package/dist/cjs/Chip/index.native.js.map +1 -1
  7. package/dist/cjs/ContextualSaveBar/index.cjs +17 -10
  8. package/dist/cjs/ContextualSaveBar/index.native.js +18 -10
  9. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  10. package/dist/cjs/FloatingPanel/index.cjs +59 -14
  11. package/dist/cjs/FloatingPanel/index.native.js +16 -7
  12. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  13. package/dist/cjs/FloatingPanel/nestedAction.cjs +37 -0
  14. package/dist/cjs/FloatingPanel/nestedAction.native.js +42 -0
  15. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -0
  16. package/dist/cjs/InputParts/index.cjs +11 -7
  17. package/dist/cjs/InputParts/index.native.js +12 -10
  18. package/dist/cjs/InputParts/index.native.js.map +1 -1
  19. package/dist/cjs/Wheel/index.cjs +3 -3
  20. package/dist/cjs/Wheel/index.native.js +3 -3
  21. package/dist/cjs/Wheel/index.native.js.map +1 -1
  22. package/dist/cjs/fieldLayout.cjs +3 -3
  23. package/dist/cjs/fieldLayout.native.js +3 -3
  24. package/dist/cjs/fieldLayout.native.js.map +1 -1
  25. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.cjs +9 -2
  26. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  27. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  28. package/dist/cjs/fields/Combobox/index.cjs +74 -76
  29. package/dist/cjs/fields/Combobox/index.native.js +78 -86
  30. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  31. package/dist/cjs/fields/DatePicker/Calendar.cjs +6 -1
  32. package/dist/cjs/fields/DatePicker/Calendar.native.js +6 -1
  33. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  34. package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +2 -2
  35. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  36. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  37. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +15 -12
  38. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  39. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  40. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +39 -14
  41. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  42. package/dist/cjs/fields/DatePicker/MonthPicker.cjs +10 -3
  43. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +10 -3
  44. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  45. package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +2 -2
  46. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  47. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  48. package/dist/cjs/fields/DatePicker/index.native.js +3 -0
  49. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  50. package/dist/cjs/fields/DatePicker/parts.cjs +26 -14
  51. package/dist/cjs/fields/DatePicker/parts.native.js +28 -14
  52. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  53. package/dist/cjs/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  54. package/dist/cjs/fields/Geolocation/geocoder.cjs +63 -0
  55. package/dist/cjs/fields/Geolocation/geocoder.native.js +68 -0
  56. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -0
  57. package/dist/cjs/fields/Geolocation/index.cjs +801 -152
  58. package/dist/cjs/fields/Geolocation/index.native.js +856 -167
  59. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  60. package/dist/cjs/fields/Geolocation/nativeSearchFocus.cjs +44 -0
  61. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js +47 -0
  62. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  63. package/dist/cjs/fields/Icon/drawnSet.cjs +14 -3
  64. package/dist/cjs/fields/Icon/drawnSet.native.js +18 -3
  65. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  66. package/dist/cjs/fields/Icon/index.cjs +102 -27
  67. package/dist/cjs/fields/Icon/index.native.js +115 -31
  68. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  69. package/dist/cjs/fields/Input/index.cjs +5 -12
  70. package/dist/cjs/fields/Input/index.native.js +5 -13
  71. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  72. package/dist/cjs/fields/PhoneInput/index.cjs +2 -2
  73. package/dist/cjs/fields/PhoneInput/index.native.js +2 -2
  74. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  75. package/dist/cjs/fields/SearchInput/index.cjs +8 -9
  76. package/dist/cjs/fields/SearchInput/index.native.js +8 -9
  77. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  78. package/dist/cjs/fields/Select/index.cjs +53 -18
  79. package/dist/cjs/fields/Select/index.native.js +63 -37
  80. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  81. package/dist/cjs/fields/Stepper/index.cjs +144 -31
  82. package/dist/cjs/fields/Stepper/index.native.js +151 -31
  83. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  84. package/dist/cjs/index.cjs +2 -0
  85. package/dist/cjs/index.native.js +2 -0
  86. package/dist/cjs/index.native.js.map +1 -1
  87. package/dist/cjs/shared/focusManagement.cjs +24 -11
  88. package/dist/cjs/shared/focusManagement.native.js +24 -11
  89. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  90. package/dist/cjs/shared/pickerTriggerContract.cjs +38 -0
  91. package/dist/cjs/shared/pickerTriggerContract.native.js +41 -0
  92. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -0
  93. package/dist/cjs/shared/pressSlopProps.cjs +68 -0
  94. package/dist/cjs/shared/pressSlopProps.native.js +72 -0
  95. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -0
  96. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  97. package/dist/esm/Button/index.mjs +1 -34
  98. package/dist/esm/Button/index.mjs.map +1 -1
  99. package/dist/esm/Button/index.native.js +1 -34
  100. package/dist/esm/Button/index.native.js.map +1 -1
  101. package/dist/esm/Chip/index.mjs +1 -1
  102. package/dist/esm/Chip/index.mjs.map +1 -1
  103. package/dist/esm/Chip/index.native.js +1 -1
  104. package/dist/esm/Chip/index.native.js.map +1 -1
  105. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  106. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  107. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  108. package/dist/esm/ContextualSaveBar/index.mjs +17 -10
  109. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  110. package/dist/esm/ContextualSaveBar/index.native.js +18 -10
  111. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  112. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  113. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  114. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  115. package/dist/esm/ErrorSummary.native.js.map +1 -1
  116. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  117. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  118. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  119. package/dist/esm/FieldGroup.native.js.map +1 -1
  120. package/dist/esm/FloatingPanel/index.mjs +58 -15
  121. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  122. package/dist/esm/FloatingPanel/index.native.js +15 -8
  123. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  124. package/dist/esm/FloatingPanel/nestedAction.mjs +11 -0
  125. package/dist/esm/FloatingPanel/nestedAction.mjs.map +1 -0
  126. package/dist/esm/FloatingPanel/nestedAction.native.js +13 -0
  127. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -0
  128. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  129. package/dist/esm/Form/index.native.js.map +1 -1
  130. package/dist/esm/Form/validateOn.native.js.map +1 -1
  131. package/dist/esm/FormGrid.native.js.map +1 -1
  132. package/dist/esm/FormSection.native.js.map +1 -1
  133. package/dist/esm/InputParts/index.mjs +12 -8
  134. package/dist/esm/InputParts/index.mjs.map +1 -1
  135. package/dist/esm/InputParts/index.native.js +13 -11
  136. package/dist/esm/InputParts/index.native.js.map +1 -1
  137. package/dist/esm/Label/index.native.js.map +1 -1
  138. package/dist/esm/Skeleton/index.native.js.map +1 -1
  139. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  140. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  141. package/dist/esm/Table/index.native.js.map +1 -1
  142. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  143. package/dist/esm/Wheel/index.mjs +3 -3
  144. package/dist/esm/Wheel/index.mjs.map +1 -1
  145. package/dist/esm/Wheel/index.native.js +3 -3
  146. package/dist/esm/Wheel/index.native.js.map +1 -1
  147. package/dist/esm/actionLabel.native.js.map +1 -1
  148. package/dist/esm/fieldDefaults.native.js.map +1 -1
  149. package/dist/esm/fieldLayout.mjs +3 -3
  150. package/dist/esm/fieldLayout.mjs.map +1 -1
  151. package/dist/esm/fieldLayout.native.js +3 -3
  152. package/dist/esm/fieldLayout.native.js.map +1 -1
  153. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  154. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  155. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  156. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  157. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  158. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  159. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  160. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  161. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
  162. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
  163. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  164. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  165. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  166. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  167. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  168. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  169. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  170. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  171. package/dist/esm/fields/Combobox/index.mjs +74 -76
  172. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  173. package/dist/esm/fields/Combobox/index.native.js +78 -86
  174. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  175. package/dist/esm/fields/DatePicker/Calendar.mjs +6 -1
  176. package/dist/esm/fields/DatePicker/Calendar.mjs.map +1 -1
  177. package/dist/esm/fields/DatePicker/Calendar.native.js +6 -1
  178. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  179. package/dist/esm/fields/DatePicker/DateRangePicker.mjs +2 -2
  180. package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  181. package/dist/esm/fields/DatePicker/DateRangePicker.native.js +2 -2
  182. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  183. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
  184. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  185. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  186. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  187. package/dist/esm/fields/DatePicker/DatetimePicker.native.js +39 -14
  188. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  189. package/dist/esm/fields/DatePicker/MonthPicker.mjs +10 -3
  190. package/dist/esm/fields/DatePicker/MonthPicker.mjs.map +1 -1
  191. package/dist/esm/fields/DatePicker/MonthPicker.native.js +10 -3
  192. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  193. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +2 -2
  194. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  195. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +2 -2
  196. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  197. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  198. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  199. package/dist/esm/fields/DatePicker/index.native.js +3 -0
  200. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  201. package/dist/esm/fields/DatePicker/parts.mjs +28 -16
  202. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  203. package/dist/esm/fields/DatePicker/parts.native.js +30 -16
  204. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  205. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  206. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  207. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  208. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  209. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  210. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  211. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  212. package/dist/esm/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  213. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  214. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  215. package/dist/esm/fields/Geolocation/geocoder.mjs +33 -0
  216. package/dist/esm/fields/Geolocation/geocoder.mjs.map +1 -0
  217. package/dist/esm/fields/Geolocation/geocoder.native.js +35 -0
  218. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -0
  219. package/dist/esm/fields/Geolocation/index.mjs +792 -149
  220. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  221. package/dist/esm/fields/Geolocation/index.native.js +847 -164
  222. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  223. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  224. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  225. package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs +19 -0
  226. package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
  227. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js +19 -0
  228. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  229. package/dist/esm/fields/Icon/drawnSet.mjs +14 -3
  230. package/dist/esm/fields/Icon/drawnSet.mjs.map +1 -1
  231. package/dist/esm/fields/Icon/drawnSet.native.js +18 -3
  232. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  233. package/dist/esm/fields/Icon/index.mjs +93 -18
  234. package/dist/esm/fields/Icon/index.mjs.map +1 -1
  235. package/dist/esm/fields/Icon/index.native.js +106 -22
  236. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  237. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  238. package/dist/esm/fields/Input/index.mjs +5 -12
  239. package/dist/esm/fields/Input/index.mjs.map +1 -1
  240. package/dist/esm/fields/Input/index.native.js +5 -13
  241. package/dist/esm/fields/Input/index.native.js.map +1 -1
  242. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  243. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  244. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  245. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  246. package/dist/esm/fields/PhoneInput/index.mjs +2 -2
  247. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  248. package/dist/esm/fields/PhoneInput/index.native.js +2 -2
  249. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  250. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  251. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  252. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  253. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  254. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  255. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  256. package/dist/esm/fields/SearchInput/index.mjs +9 -10
  257. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  258. package/dist/esm/fields/SearchInput/index.native.js +9 -10
  259. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  260. package/dist/esm/fields/Select/index.mjs +54 -19
  261. package/dist/esm/fields/Select/index.mjs.map +1 -1
  262. package/dist/esm/fields/Select/index.native.js +64 -38
  263. package/dist/esm/fields/Select/index.native.js.map +1 -1
  264. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  265. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  266. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  267. package/dist/esm/fields/Stepper/index.mjs +145 -32
  268. package/dist/esm/fields/Stepper/index.mjs.map +1 -1
  269. package/dist/esm/fields/Stepper/index.native.js +152 -32
  270. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  271. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  272. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  273. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  274. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  275. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  276. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  277. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  278. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  279. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  280. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  281. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  282. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  283. package/dist/esm/formSpacing.native.js.map +1 -1
  284. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  285. package/dist/esm/index.mjs +2 -1
  286. package/dist/esm/index.mjs.map +1 -1
  287. package/dist/esm/index.native.js +2 -1
  288. package/dist/esm/index.native.js.map +1 -1
  289. package/dist/esm/requiredMarking.native.js.map +1 -1
  290. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  291. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  292. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  293. package/dist/esm/shared/devWarn.native.js.map +1 -1
  294. package/dist/esm/shared/floatingList.native.js.map +1 -1
  295. package/dist/esm/shared/focusManagement.mjs +24 -11
  296. package/dist/esm/shared/focusManagement.mjs.map +1 -1
  297. package/dist/esm/shared/focusManagement.native.js +24 -11
  298. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  299. package/dist/esm/shared/groupContext.native.js.map +1 -1
  300. package/dist/esm/shared/i18n.native.js.map +1 -1
  301. package/dist/esm/shared/pickerTriggerContract.mjs +13 -0
  302. package/dist/esm/shared/pickerTriggerContract.mjs.map +1 -0
  303. package/dist/esm/shared/pickerTriggerContract.native.js +13 -0
  304. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -0
  305. package/dist/esm/shared/pressSlopProps.mjs +43 -0
  306. package/dist/esm/shared/pressSlopProps.mjs.map +1 -0
  307. package/dist/esm/shared/pressSlopProps.native.js +44 -0
  308. package/dist/esm/shared/pressSlopProps.native.js.map +1 -0
  309. package/dist/esm/shared/t.native.js.map +1 -1
  310. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  311. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  312. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  313. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  314. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  315. package/dist/esm/shared/utils.native.js.map +1 -1
  316. package/dist/esm/shared/zIndex.native.js.map +1 -1
  317. package/dist/esm/themedPrimitives.native.js.map +1 -1
  318. package/dist/esm/types.native.js.map +1 -1
  319. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  320. package/dist/jsx/Button/index.mjs +1 -34
  321. package/dist/jsx/Button/index.mjs.map +1 -1
  322. package/dist/jsx/Button/index.native.js +3 -36
  323. package/dist/jsx/Button/index.native.js.map +1 -1
  324. package/dist/jsx/Chip/index.mjs +1 -1
  325. package/dist/jsx/Chip/index.mjs.map +1 -1
  326. package/dist/jsx/Chip/index.native.js +1 -1
  327. package/dist/jsx/Chip/index.native.js.map +1 -1
  328. package/dist/jsx/ContextualSaveBar/index.mjs +17 -10
  329. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  330. package/dist/jsx/ContextualSaveBar/index.native.js +18 -10
  331. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  332. package/dist/jsx/FloatingPanel/index.mjs +58 -15
  333. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  334. package/dist/jsx/FloatingPanel/index.native.js +16 -7
  335. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  336. package/dist/jsx/FloatingPanel/nestedAction.mjs +11 -0
  337. package/dist/jsx/FloatingPanel/nestedAction.mjs.map +1 -0
  338. package/dist/jsx/FloatingPanel/nestedAction.native.js +42 -0
  339. package/dist/jsx/FloatingPanel/nestedAction.native.js.map +1 -0
  340. package/dist/jsx/InputParts/index.mjs +12 -8
  341. package/dist/jsx/InputParts/index.mjs.map +1 -1
  342. package/dist/jsx/InputParts/index.native.js +12 -10
  343. package/dist/jsx/InputParts/index.native.js.map +1 -1
  344. package/dist/jsx/Wheel/index.mjs +3 -3
  345. package/dist/jsx/Wheel/index.mjs.map +1 -1
  346. package/dist/jsx/Wheel/index.native.js +3 -3
  347. package/dist/jsx/Wheel/index.native.js.map +1 -1
  348. package/dist/jsx/fieldLayout.mjs +3 -3
  349. package/dist/jsx/fieldLayout.mjs.map +1 -1
  350. package/dist/jsx/fieldLayout.native.js +3 -3
  351. package/dist/jsx/fieldLayout.native.js.map +1 -1
  352. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
  353. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
  354. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  355. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  356. package/dist/jsx/fields/Combobox/index.mjs +74 -76
  357. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  358. package/dist/jsx/fields/Combobox/index.native.js +78 -86
  359. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  360. package/dist/jsx/fields/DatePicker/Calendar.mjs +6 -1
  361. package/dist/jsx/fields/DatePicker/Calendar.mjs.map +1 -1
  362. package/dist/jsx/fields/DatePicker/Calendar.native.js +6 -1
  363. package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
  364. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +2 -2
  365. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  366. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +2 -2
  367. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  368. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
  369. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  370. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  371. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  372. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +39 -14
  373. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  374. package/dist/jsx/fields/DatePicker/MonthPicker.mjs +10 -3
  375. package/dist/jsx/fields/DatePicker/MonthPicker.mjs.map +1 -1
  376. package/dist/jsx/fields/DatePicker/MonthPicker.native.js +10 -3
  377. package/dist/jsx/fields/DatePicker/MonthPicker.native.js.map +1 -1
  378. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +2 -2
  379. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  380. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +2 -2
  381. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  382. package/dist/jsx/fields/DatePicker/index.native.js +3 -0
  383. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  384. package/dist/jsx/fields/DatePicker/parts.mjs +28 -16
  385. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  386. package/dist/jsx/fields/DatePicker/parts.native.js +28 -14
  387. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  388. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  389. package/dist/jsx/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  390. package/dist/jsx/fields/Geolocation/geocoder.mjs +33 -0
  391. package/dist/jsx/fields/Geolocation/geocoder.mjs.map +1 -0
  392. package/dist/jsx/fields/Geolocation/geocoder.native.js +68 -0
  393. package/dist/jsx/fields/Geolocation/geocoder.native.js.map +1 -0
  394. package/dist/jsx/fields/Geolocation/index.mjs +792 -149
  395. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  396. package/dist/jsx/fields/Geolocation/index.native.js +856 -167
  397. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  398. package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs +19 -0
  399. package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
  400. package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js +47 -0
  401. package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  402. package/dist/jsx/fields/Icon/drawnSet.mjs +14 -3
  403. package/dist/jsx/fields/Icon/drawnSet.mjs.map +1 -1
  404. package/dist/jsx/fields/Icon/drawnSet.native.js +18 -3
  405. package/dist/jsx/fields/Icon/drawnSet.native.js.map +1 -1
  406. package/dist/jsx/fields/Icon/index.mjs +93 -18
  407. package/dist/jsx/fields/Icon/index.mjs.map +1 -1
  408. package/dist/jsx/fields/Icon/index.native.js +115 -31
  409. package/dist/jsx/fields/Icon/index.native.js.map +1 -1
  410. package/dist/jsx/fields/Input/index.mjs +5 -12
  411. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  412. package/dist/jsx/fields/Input/index.native.js +5 -13
  413. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  414. package/dist/jsx/fields/PhoneInput/index.mjs +2 -2
  415. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  416. package/dist/jsx/fields/PhoneInput/index.native.js +2 -2
  417. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  418. package/dist/jsx/fields/SearchInput/index.mjs +9 -10
  419. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  420. package/dist/jsx/fields/SearchInput/index.native.js +8 -9
  421. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  422. package/dist/jsx/fields/Select/index.mjs +54 -19
  423. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  424. package/dist/jsx/fields/Select/index.native.js +63 -37
  425. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  426. package/dist/jsx/fields/Stepper/index.mjs +145 -32
  427. package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
  428. package/dist/jsx/fields/Stepper/index.native.js +151 -31
  429. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  430. package/dist/jsx/index.js +2 -1
  431. package/dist/jsx/index.js.map +1 -1
  432. package/dist/jsx/index.mjs +2 -1
  433. package/dist/jsx/index.mjs.map +1 -1
  434. package/dist/jsx/index.native.js +2 -0
  435. package/dist/jsx/index.native.js.map +1 -1
  436. package/dist/jsx/shared/focusManagement.mjs +24 -11
  437. package/dist/jsx/shared/focusManagement.mjs.map +1 -1
  438. package/dist/jsx/shared/focusManagement.native.js +24 -11
  439. package/dist/jsx/shared/focusManagement.native.js.map +1 -1
  440. package/dist/jsx/shared/pickerTriggerContract.mjs +13 -0
  441. package/dist/jsx/shared/pickerTriggerContract.mjs.map +1 -0
  442. package/dist/jsx/shared/pickerTriggerContract.native.js +41 -0
  443. package/dist/jsx/shared/pickerTriggerContract.native.js.map +1 -0
  444. package/dist/jsx/shared/pressSlopProps.mjs +43 -0
  445. package/dist/jsx/shared/pressSlopProps.mjs.map +1 -0
  446. package/dist/jsx/shared/pressSlopProps.native.js +72 -0
  447. package/dist/jsx/shared/pressSlopProps.native.js.map +1 -0
  448. package/package.json +8 -7
  449. package/src/Button/Button.labelInk.spec.tsx +21 -18
  450. package/src/Button/Button.outlinedChannel.spec.tsx +46 -0
  451. package/src/Button/Button.sizeLadder.spec.tsx +4 -3
  452. package/src/Button/Button.stories.tsx +20 -0
  453. package/src/Button/index.tsx +26 -39
  454. package/src/Chip/Chip.spec.tsx +3 -1
  455. package/src/Chip/index.tsx +1 -5
  456. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +33 -0
  457. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +19 -0
  458. package/src/ContextualSaveBar/index.tsx +12 -8
  459. package/src/ContextualSaveBar/nativeFlow.spec.tsx +20 -0
  460. package/src/FieldLayout.stories.tsx +41 -0
  461. package/src/FloatingPanel/FloatingPanel.native.spec.tsx +54 -0
  462. package/src/FloatingPanel/FloatingPanel.spec.tsx +109 -0
  463. package/src/FloatingPanel/index.native.tsx +24 -7
  464. package/src/FloatingPanel/index.tsx +80 -13
  465. package/src/FloatingPanel/nestedAction.spec.ts +36 -0
  466. package/src/FloatingPanel/nestedAction.ts +15 -0
  467. package/src/FloatingPanel/panelWidthContract.spec.ts +12 -15
  468. package/src/FormsIntegration.stories.tsx +2 -6
  469. package/src/InputParts/index.tsx +20 -6
  470. package/src/InputParts/layoutGap.spec.tsx +43 -0
  471. package/src/Wheel/Wheel.spec.tsx +16 -0
  472. package/src/Wheel/index.tsx +3 -3
  473. package/src/fieldLayout.spec.tsx +42 -1
  474. package/src/fieldLayout.tsx +9 -9
  475. package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +18 -0
  476. package/src/fields/Checkbox/CheckboxFieldFrame.tsx +6 -1
  477. package/src/fields/Combobox/Combobox.spec.tsx +48 -1
  478. package/src/fields/Combobox/index.tsx +90 -80
  479. package/src/fields/DatePicker/Calendar.tsx +4 -1
  480. package/src/fields/DatePicker/DatePicker.stories.tsx +22 -1
  481. package/src/fields/DatePicker/DateRangePicker.tsx +4 -2
  482. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +21 -19
  483. package/src/fields/DatePicker/DatetimePicker.native.spec.tsx +144 -0
  484. package/src/fields/DatePicker/DatetimePicker.native.tsx +57 -32
  485. package/src/fields/DatePicker/DatetimePicker.stories.tsx +22 -0
  486. package/src/fields/DatePicker/MonthPicker.tsx +8 -3
  487. package/src/fields/DatePicker/MultiDatePicker.tsx +4 -2
  488. package/src/fields/DatePicker/index.native.tsx +1 -0
  489. package/src/fields/DatePicker/parts.spec.tsx +56 -0
  490. package/src/fields/DatePicker/parts.tsx +33 -12
  491. package/src/fields/Geolocation/Geolocation.spec.tsx +287 -35
  492. package/src/fields/Geolocation/Geolocation.stories.tsx +141 -7
  493. package/src/fields/Geolocation/GeolocationMap.native.tsx +3 -0
  494. package/src/fields/Geolocation/GeolocationMap.tsx +4 -0
  495. package/src/fields/Geolocation/geocoder.spec.ts +59 -0
  496. package/src/fields/Geolocation/geocoder.ts +84 -0
  497. package/src/fields/Geolocation/geocoderSeam.spec.tsx +203 -0
  498. package/src/fields/Geolocation/index.tsx +912 -180
  499. package/src/fields/Geolocation/nativeSearchFocus.spec.ts +34 -0
  500. package/src/fields/Geolocation/nativeSearchFocus.ts +19 -0
  501. package/src/fields/Geolocation/salvage.spec.tsx +398 -0
  502. package/src/fields/Geolocation/storyProviders.spec.tsx +44 -0
  503. package/src/fields/Icon/Icon.spec.tsx +215 -1
  504. package/src/fields/Icon/Icon.stories.tsx +9 -1
  505. package/src/fields/Icon/drawnSet.tsx +39 -4
  506. package/src/fields/Icon/index.tsx +118 -18
  507. package/src/fields/Input/Input.copy.spec.tsx +1 -0
  508. package/src/fields/Input/Input.spec.tsx +50 -0
  509. package/src/fields/Input/Input.stories.tsx +1 -1
  510. package/src/fields/Input/index.tsx +7 -13
  511. package/src/fields/PhoneInput/index.tsx +2 -2
  512. package/src/fields/SearchInput/SearchInput.spec.tsx +14 -0
  513. package/src/fields/SearchInput/index.tsx +5 -6
  514. package/src/fields/Select/Select.spec.tsx +54 -0
  515. package/src/fields/Select/index.tsx +63 -33
  516. package/src/fields/Stepper/Stepper.spec.tsx +34 -1
  517. package/src/fields/Stepper/index.tsx +193 -33
  518. package/src/fields/pickerActivation.spec.tsx +105 -0
  519. package/src/fields/pickerDensity.spec.tsx +86 -0
  520. package/src/fields/pickerRows.spec.tsx +66 -0
  521. package/src/index.ts +9 -0
  522. package/src/shared/focusManagement.spec.tsx +68 -0
  523. package/src/shared/focusManagement.ts +20 -10
  524. package/src/shared/pickerTriggerContract.ts +13 -0
  525. package/src/shared/pressSlopProps.spec.ts +39 -0
  526. package/src/shared/pressSlopProps.ts +52 -0
  527. package/types/Button/index.d.ts +22 -3
  528. package/types/Button/index.d.ts.map +1 -1
  529. package/types/Chip/index.d.ts.map +1 -1
  530. package/types/ContextualSaveBar/index.d.ts +1 -1
  531. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  532. package/types/FloatingPanel/index.d.ts +11 -1
  533. package/types/FloatingPanel/index.d.ts.map +1 -1
  534. package/types/FloatingPanel/index.native.d.ts +2 -1
  535. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  536. package/types/FloatingPanel/nestedAction.d.ts +13 -0
  537. package/types/FloatingPanel/nestedAction.d.ts.map +1 -0
  538. package/types/InputParts/index.d.ts.map +1 -1
  539. package/types/fields/Checkbox/CheckboxFieldFrame.d.ts +46 -2
  540. package/types/fields/Checkbox/CheckboxFieldFrame.d.ts.map +1 -1
  541. package/types/fields/Checkbox/index.d.ts +3 -3
  542. package/types/fields/Combobox/index.d.ts +3 -1
  543. package/types/fields/Combobox/index.d.ts.map +1 -1
  544. package/types/fields/DatePicker/Calendar.d.ts.map +1 -1
  545. package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
  546. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
  547. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
  548. package/types/fields/DatePicker/MonthPicker.d.ts.map +1 -1
  549. package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
  550. package/types/fields/DatePicker/index.native.d.ts.map +1 -1
  551. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  552. package/types/fields/Geolocation/GeolocationMap.d.ts +4 -0
  553. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  554. package/types/fields/Geolocation/GeolocationMap.native.d.ts +3 -0
  555. package/types/fields/Geolocation/GeolocationMap.native.d.ts.map +1 -1
  556. package/types/fields/Geolocation/geocoder.d.ts +53 -0
  557. package/types/fields/Geolocation/geocoder.d.ts.map +1 -0
  558. package/types/fields/Geolocation/index.d.ts +18 -2
  559. package/types/fields/Geolocation/index.d.ts.map +1 -1
  560. package/types/fields/Geolocation/nativeSearchFocus.d.ts +8 -0
  561. package/types/fields/Geolocation/nativeSearchFocus.d.ts.map +1 -0
  562. package/types/fields/Icon/drawnSet.d.ts.map +1 -1
  563. package/types/fields/Icon/index.d.ts.map +1 -1
  564. package/types/fields/Input/index.d.ts.map +1 -1
  565. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  566. package/types/fields/RadioGroup/index.d.ts +2 -2
  567. package/types/fields/SearchInput/index.d.ts.map +1 -1
  568. package/types/fields/Select/index.d.ts.map +1 -1
  569. package/types/fields/Stepper/index.d.ts.map +1 -1
  570. package/types/fields/ToggleGroup/index.d.ts +1 -1
  571. package/types/index.d.ts +2 -0
  572. package/types/index.d.ts.map +1 -1
  573. package/types/shared/focusManagement.d.ts +2 -2
  574. package/types/shared/focusManagement.d.ts.map +1 -1
  575. package/types/shared/pickerTriggerContract.d.ts +18 -0
  576. package/types/shared/pickerTriggerContract.d.ts.map +1 -0
  577. package/types/shared/pressSlopProps.d.ts +8 -0
  578. package/types/shared/pressSlopProps.d.ts.map +1 -0
  579. package/src/router.d.ts +0 -16
@@ -9,6 +9,7 @@ import {
9
9
  useRef,
10
10
  useState,
11
11
  } from "react";
12
+ import { Pressable } from "react-native";
12
13
  import { isWeb, useProps, View } from "tamagui";
13
14
  import { Input as TamaguiInput } from "tamagui";
14
15
  import { isTouchSurface, sizeRecipeForToken, useGlyphColor } from "@multiplatform.one/theme";
@@ -28,12 +29,13 @@ import {
28
29
  import { useWheelIncrement } from "../../shared/useWheelIncrement";
29
30
  import type { FormFieldProps } from "../../fieldLayout";
30
31
  import { Input as InputParts } from "../../InputParts";
31
- import { formInputColors } from "../../shared/colorRamps";
32
+ import { formButtonColors, formInputColors } from "../../shared/colorRamps";
32
33
  import { t } from "../../shared/t";
33
34
  import type { FieldComponentProps, Validator } from "../../types";
34
35
 
35
36
  const repeatDelay = 400;
36
37
  const repeatInterval = 80;
38
+ const boundCaptionDuration = 2000;
37
39
  const LARGE_STEP_FACTOR = 10;
38
40
 
39
41
  /** CSS timings for discrete value motion (mirrors theme animationConfig). */
@@ -90,7 +92,7 @@ function useRepeatAction(action: () => void, repeatingRef: MutableRefObject<bool
90
92
 
91
93
  useEffect(() => stop, [stop]);
92
94
 
93
- return { onPressIn: start, onPressOut: stop };
95
+ return { onPressIn: start, onPressOut: stop, stop };
94
96
  }
95
97
 
96
98
  export type StepperProps<
@@ -139,56 +141,125 @@ export type StepperProps<
139
141
  function StepperSpinButton({
140
142
  kind,
141
143
  disabled,
144
+ atBound,
145
+ seamWidth,
142
146
  stacked,
143
147
  seam,
144
148
  onPressIn,
145
149
  onPressOut,
146
150
  onActivate,
151
+ onBoundPress,
147
152
  children,
148
153
  }: {
149
154
  kind: "increment" | "decrement";
150
155
  disabled: boolean;
156
+ atBound: boolean;
157
+ seamWidth: number;
151
158
  stacked?: boolean;
152
159
  seam?: "bottom" | "end" | "start";
153
160
  onPressIn: () => void;
154
161
  onPressOut: () => void;
155
162
  onActivate: () => void;
163
+ onBoundPress: () => void;
156
164
  children: ReactNode;
157
165
  }) {
158
166
  const label = kind === "increment" ? t("Increase") : t("Decrease");
159
- return (
167
+ const [pressed, setPressed] = useState(false);
168
+ const button = (
160
169
  <InputParts.Button
161
170
  tabIndex={-1}
162
171
  disabled={disabled}
163
- aria-disabled={disabled || undefined}
164
- aria-label={label}
165
- data-stepper-button={kind}
166
- cursor={disabled ? "not-allowed" : "pointer"}
167
- opacity={disabled ? 0.4 : 1}
168
- height={stacked ? "50%" : "100%"}
169
- flex={stacked ? 1 : undefined}
172
+ aria-hidden
173
+ importantForAccessibility="no-hide-descendants"
174
+ pointerEvents="none"
175
+ cursor={disabled || atBound ? "not-allowed" : "pointer"}
176
+ opacity={disabled || atBound ? 0.4 : 1}
177
+ backgroundColor={
178
+ pressed && !disabled && !atBound ? formButtonColors.background.active : "transparent"
179
+ }
180
+ height="100%"
170
181
  alignSelf="stretch"
171
- borderBottomWidth={seam === "bottom" ? 1 : 0}
172
- borderInlineEndWidth={seam === "end" ? 1 : 0}
173
- borderInlineStartWidth={seam === "start" ? 1 : 0}
182
+ borderBottomWidth={seam === "bottom" ? seamWidth : 0}
183
+ {...(isWeb
184
+ ? {
185
+ style: {
186
+ borderInlineEndWidth: seam === "end" ? seamWidth : 0,
187
+ borderInlineStartWidth: seam === "start" ? seamWidth : 0,
188
+ borderInlineEndStyle: "solid",
189
+ borderInlineStartStyle: "solid",
190
+ },
191
+ }
192
+ : {
193
+ borderEndWidth: seam === "end" ? seamWidth : 0,
194
+ borderStartWidth: seam === "start" ? seamWidth : 0,
195
+ })}
174
196
  borderColor={formInputColors.border.base}
175
197
  focusStyle={noButtonRing}
176
198
  focusVisibleStyle={noButtonRing}
177
199
  hoverStyle={disabled ? { backgroundColor: "transparent" } : undefined}
178
- onMouseDown={(e: any) => {
179
- preventFocusSteal(e);
180
- onActivate();
181
- }}
182
- onPointerDown={(e: any) => {
183
- preventFocusSteal(e);
184
- onActivate();
185
- }}
186
- onPressIn={disabled ? undefined : onPressIn}
187
- onPressOut={onPressOut}
188
200
  >
189
201
  {children}
190
202
  </InputParts.Button>
191
203
  );
204
+ const start = () => {
205
+ if (disabled) return;
206
+ setPressed(true);
207
+ onActivate();
208
+ if (atBound) onBoundPress();
209
+ else onPressIn();
210
+ };
211
+ const stop = () => {
212
+ setPressed(false);
213
+ onPressOut();
214
+ };
215
+ const hitStyle = {
216
+ display: "flex" as const,
217
+ height: stacked ? ("50%" as const) : ("100%" as const),
218
+ flex: stacked ? 1 : undefined,
219
+ };
220
+ // Keep the press target mounted when a step reaches its bound. Tamagui
221
+ // suppresses aria-disabled presses; the wrapper owns attempted-step feedback.
222
+ return isWeb ? (
223
+ <div
224
+ role="button"
225
+ aria-label={label}
226
+ aria-disabled={disabled || atBound || undefined}
227
+ tabIndex={-1}
228
+ data-stepper-button={kind}
229
+ style={hitStyle}
230
+ onPointerDown={(event) => {
231
+ // This raw wrapper owns the pointer lifecycle. Cancel compatibility
232
+ // mouse events so touch and pen cannot commit the same step twice.
233
+ preventFocusSteal(event);
234
+ start();
235
+ }}
236
+ onMouseDown={preventFocusSteal}
237
+ onPointerUp={stop}
238
+ onPointerCancel={stop}
239
+ onPointerLeave={stop}
240
+ onClick={(event) => {
241
+ if (event.detail !== 0) return;
242
+ start();
243
+ stop();
244
+ }}
245
+ >
246
+ {button}
247
+ </div>
248
+ ) : (
249
+ <Pressable
250
+ accessibilityRole="button"
251
+ accessibilityLabel={label}
252
+ accessibilityState={{ disabled: disabled || atBound }}
253
+ // An explicit false overrides accessibilityState in React Native.
254
+ disabled={disabled || undefined}
255
+ onPressIn={start}
256
+ onPressOut={stop}
257
+ hitSlop={{ top: seamWidth, bottom: seamWidth }}
258
+ style={hitStyle}
259
+ >
260
+ {button}
261
+ </Pressable>
262
+ );
192
263
  }
193
264
 
194
265
  export function Stepper<
@@ -253,6 +324,27 @@ export function Stepper<
253
324
  // LC-25: discrete +/- taps tween the value chrome; hold-repeat / typing stay live.
254
325
  // Opacity (not transform) — Tamagui Input owns transform internally on web.
255
326
  const [valueFlash, setValueFlash] = useState(false);
327
+ const [boundCaption, setBoundCaption] = useState<string | null>(null);
328
+ const boundTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
329
+ const clearBoundCaption = useCallback(() => {
330
+ if (boundTimerRef.current) clearTimeout(boundTimerRef.current);
331
+ boundTimerRef.current = null;
332
+ setBoundCaption(null);
333
+ }, []);
334
+ const showBoundCaption = useCallback((kind: "min" | "max") => {
335
+ if (boundTimerRef.current) clearTimeout(boundTimerRef.current);
336
+ setBoundCaption(kind === "min" ? t("Minimum reached") : t("Maximum reached"));
337
+ boundTimerRef.current = setTimeout(() => {
338
+ boundTimerRef.current = null;
339
+ setBoundCaption(null);
340
+ }, boundCaptionDuration);
341
+ }, []);
342
+ useEffect(
343
+ () => () => {
344
+ if (boundTimerRef.current) clearTimeout(boundTimerRef.current);
345
+ },
346
+ [],
347
+ );
256
348
  const repeatingRef = useRef(false);
257
349
  const typingRef = useRef(false);
258
350
  const incrementRef = useRef<() => void>(() => {});
@@ -316,11 +408,12 @@ export function Stepper<
316
408
  const clamped = clampValue(next);
317
409
  const formatted = formatValue(clamped);
318
410
  if (formatted === inputValue) return;
411
+ clearBoundCaption();
319
412
  if (pulse) pulseDiscreteStep();
320
413
  setInputValue(formatted);
321
414
  if (!name) onChange?.(clamped);
322
415
  },
323
- [clampValue, formatValue, inputValue, name, onChange, pulseDiscreteStep],
416
+ [clampValue, formatValue, inputValue, name, onChange, pulseDiscreteStep, clearBoundCaption],
324
417
  );
325
418
 
326
419
  const applyDelta = useCallback(
@@ -328,11 +421,55 @@ export function Stepper<
328
421
  if (disabled || readOnly) return;
329
422
  const current = parseValue(inputValue);
330
423
  const from = current ?? 0;
424
+ if (current !== null && delta < 0 && boundsLo !== undefined && from <= boundsLo) {
425
+ showBoundCaption("min");
426
+ return;
427
+ }
428
+ if (current !== null && delta > 0 && boundsHi !== undefined && from >= boundsHi) {
429
+ showBoundCaption("max");
430
+ return;
431
+ }
331
432
  commitNumber(from + delta, true);
332
433
  },
333
- [disabled, readOnly, parseValue, inputValue, commitNumber],
434
+ [
435
+ disabled,
436
+ readOnly,
437
+ parseValue,
438
+ inputValue,
439
+ commitNumber,
440
+ boundsLo,
441
+ boundsHi,
442
+ showBoundCaption,
443
+ ],
334
444
  );
335
445
 
446
+ useEffect(() => {
447
+ const current = parseValue(inputValue);
448
+ if (
449
+ disabled ||
450
+ readOnly ||
451
+ (current !== null && boundsHi !== undefined && current >= boundsHi)
452
+ ) {
453
+ repeatIncrement.stop();
454
+ }
455
+ if (
456
+ disabled ||
457
+ readOnly ||
458
+ (current !== null && boundsLo !== undefined && current <= boundsLo)
459
+ ) {
460
+ repeatDecrement.stop();
461
+ }
462
+ }, [
463
+ inputValue,
464
+ parseValue,
465
+ boundsLo,
466
+ boundsHi,
467
+ disabled,
468
+ readOnly,
469
+ repeatIncrement.stop,
470
+ repeatDecrement.stop,
471
+ ]);
472
+
336
473
  const increment = useCallback(() => applyDelta(step), [applyDelta, step]);
337
474
  const decrement = useCallback(() => applyDelta(-step), [applyDelta, step]);
338
475
 
@@ -439,18 +576,20 @@ export function Stepper<
439
576
 
440
577
  const stacked = placement === "left" || placement === "right";
441
578
  const showSpin = showButtons && !readOnly;
442
- const decDisabled = !!(disabled || atMin);
443
- const incDisabled = !!(disabled || atMax);
579
+ const seamWidth = knobProps.borderRadius.borderWidth;
444
580
 
445
581
  const decrementButton = (
446
582
  <StepperSpinButton
447
583
  kind="decrement"
448
- disabled={decDisabled}
584
+ disabled={!!disabled}
585
+ atBound={atMin}
586
+ seamWidth={seamWidth}
449
587
  stacked={stacked}
450
588
  seam={placement === "both" ? "end" : undefined}
451
589
  onPressIn={repeatDecrement.onPressIn}
452
590
  onPressOut={repeatDecrement.onPressOut}
453
591
  onActivate={focusArea}
592
+ onBoundPress={() => showBoundCaption("min")}
454
593
  >
455
594
  {stacked ? (
456
595
  <CaretDownIcon size={iconPx} weight="bold" color={glyphColor} aria-hidden />
@@ -462,12 +601,15 @@ export function Stepper<
462
601
  const incrementButton = (
463
602
  <StepperSpinButton
464
603
  kind="increment"
465
- disabled={incDisabled}
604
+ disabled={!!disabled}
605
+ atBound={atMax}
606
+ seamWidth={seamWidth}
466
607
  stacked={stacked}
467
608
  seam={stacked ? "bottom" : placement === "both" ? "start" : undefined}
468
609
  onPressIn={repeatIncrement.onPressIn}
469
610
  onPressOut={repeatIncrement.onPressOut}
470
611
  onActivate={focusArea}
612
+ onBoundPress={() => showBoundCaption("max")}
471
613
  >
472
614
  {stacked ? (
473
615
  <CaretUpIcon size={iconPx} weight="bold" color={glyphColor} aria-hidden />
@@ -483,8 +625,17 @@ export function Stepper<
483
625
  alignSelf="stretch"
484
626
  flexShrink={0}
485
627
  width={controlSize}
486
- borderInlineStartWidth={edge === "end" ? 1 : 0}
487
- borderInlineEndWidth={edge === "start" ? 1 : 0}
628
+ {...(isWeb
629
+ ? {
630
+ borderInlineStartWidth: edge === "end" ? seamWidth : 0,
631
+ borderInlineEndWidth: edge === "start" ? seamWidth : 0,
632
+ borderInlineStartStyle: "solid",
633
+ borderInlineEndStyle: "solid",
634
+ }
635
+ : {
636
+ borderStartWidth: edge === "end" ? seamWidth : 0,
637
+ borderEndWidth: edge === "start" ? seamWidth : 0,
638
+ })}
488
639
  borderColor={formInputColors.border.base}
489
640
  >
490
641
  {incrementButton}
@@ -541,12 +692,14 @@ export function Stepper<
541
692
  ? {
542
693
  onBlur: () => {
543
694
  typingRef.current = false;
695
+ clearBoundCaption();
544
696
  onBlurHandler();
545
697
  },
546
698
  }
547
699
  : {
548
700
  onBlur: () => {
549
701
  typingRef.current = false;
702
+ clearBoundCaption();
550
703
  },
551
704
  })}
552
705
  {...(onFocusHandler ? { onFocus: onFocusHandler } : undefined)}
@@ -559,7 +712,14 @@ export function Stepper<
559
712
  size={controlSize}
560
713
  disabled={disabled}
561
714
  data-stepper="true"
715
+ data-stepper-control="true"
562
716
  data-stepper-placement={placement}
717
+ {...(showSpin
718
+ ? {
719
+ paddingHorizontal: 0,
720
+ sizeRecipeEscape: "LC-81 stepper segments reach the compound frame edges",
721
+ }
722
+ : undefined)}
563
723
  >
564
724
  {showSpin && placement === "both" ? decrementButton : null}
565
725
  {showSpin && placement === "left" ? spinColumn("start") : null}
@@ -602,7 +762,7 @@ export function Stepper<
602
762
  label={label}
603
763
  labelProps={labelProps}
604
764
  error={errorProp}
605
- helperText={helperText}
765
+ helperText={boundCaption ?? helperText}
606
766
  required={required}
607
767
  size={size}
608
768
  knobProps={knobProps}
@@ -635,7 +795,7 @@ export function Stepper<
635
795
  label,
636
796
  labelProps,
637
797
  error: errorProp,
638
- helperText,
798
+ helperText: boundCaption ?? helperText,
639
799
  required,
640
800
  size,
641
801
  readOnly,
@@ -0,0 +1,105 @@
1
+ import { useState } from "react";
2
+ import { fireEvent, waitFor } from "@testing-library/react";
3
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { Select } from "./Select";
6
+ import { Combobox } from "./Combobox";
7
+
8
+ vi.mock("@multiplatform.one/theme", async (importOriginal) => {
9
+ const actual = await importOriginal<typeof import("@multiplatform.one/theme")>();
10
+ return {
11
+ ...actual,
12
+ useResolvedKnobs: (...args: Parameters<typeof actual.useResolvedKnobs>) => {
13
+ const resolved = actual.useResolvedKnobs(...args);
14
+ return {
15
+ ...resolved,
16
+ knobProps: {
17
+ ...resolved.knobProps,
18
+ control: { ...resolved.knobProps.control, height: 37 },
19
+ },
20
+ };
21
+ },
22
+ };
23
+ });
24
+
25
+ const options = [
26
+ { value: "alpha", label: "Alpha" },
27
+ { value: "beta", label: "Beta" },
28
+ ];
29
+ const originalWidth = window.innerWidth;
30
+ beforeEach(() => Object.defineProperty(window, "innerWidth", { configurable: true, value: 390 }));
31
+ afterEach(() =>
32
+ Object.defineProperty(window, "innerWidth", { configurable: true, value: originalWidth }),
33
+ );
34
+
35
+ function ClearHarness() {
36
+ const [value, setValue] = useState("alpha");
37
+ return (
38
+ <>
39
+ <Combobox
40
+ aria-label="Choice"
41
+ options={options}
42
+ value={value}
43
+ onValueChange={(next) => {
44
+ if (typeof next === "string") setValue(next);
45
+ }}
46
+ clearable
47
+ />
48
+ <span>Selected:{value || "none"}</span>
49
+ </>
50
+ );
51
+ }
52
+
53
+ describe("sheet picker pointer activation", () => {
54
+ for (const [name, Picker] of [
55
+ ["Select", Select],
56
+ ["Combobox", Combobox],
57
+ ] as const) {
58
+ it(`${name} opens once when the real trigger is clicked`, async () => {
59
+ const result = renderWithProviders(<Picker aria-label="Choice" options={options} />);
60
+ const trigger = result.getByRole("combobox", { name: "Choice" });
61
+ fireEvent.click(trigger, { detail: 1 });
62
+ await waitFor(() => expect(trigger.getAttribute("aria-expanded")).toBe("true"));
63
+ });
64
+ it(`${name} keeps keyboard opening and ignores disabled clicks`, () => {
65
+ const result = renderWithProviders(<Picker aria-label="Choice" options={options} />);
66
+ fireEvent.keyDown(result.getByRole("combobox"), { key: " " });
67
+ expect(result.getByRole("combobox").getAttribute("aria-expanded")).toBe("true");
68
+ result.unmount();
69
+ const disabled = renderWithProviders(
70
+ <Picker aria-label="Choice" options={options} disabled />,
71
+ );
72
+ fireEvent.click(disabled.getByRole("combobox"), { detail: 1 });
73
+ expect(disabled.getByRole("combobox").getAttribute("aria-expanded")).toBe("false");
74
+ });
75
+ }
76
+ it("clear changes the value without opening the sheet", async () => {
77
+ const result = renderWithProviders(<ClearHarness />);
78
+ const clear = result.getByRole("button", { name: "Clear" });
79
+ expect(clear.className).toContain("_miw-44px");
80
+ expect(clear.className).toContain("_mih-44px");
81
+ fireEvent.click(clear, { detail: 1 });
82
+ await waitFor(() => expect(result.getByText("Selected:none")).toBeTruthy());
83
+ expect(result.getByRole("combobox", { name: "Choice" }).getAttribute("aria-expanded")).toBe(
84
+ "false",
85
+ );
86
+ });
87
+ });
88
+
89
+ it("desktop clear retains compact geometry and never opens on pointer down or click", async () => {
90
+ Object.defineProperty(window, "innerWidth", { configurable: true, value: 1200 });
91
+ const result = renderWithProviders(<ClearHarness />);
92
+ const trigger = result.getByRole("combobox", { name: "Choice" });
93
+ const clear = result.getByRole("button", { name: "Clear" });
94
+ expect(trigger.className).toContain("_h-37px");
95
+ expect(clear.className).toContain("_h-37px");
96
+ expect(clear.className).toContain("_miw-44px");
97
+ expect(clear.getAttribute("data-mp-press-slop")).toBe("4");
98
+ expect(clear.getAttribute("data-mp-press-axis")).toBe("vertical");
99
+ fireEvent.mouseDown(clear, { detail: 1 });
100
+ expect(trigger.getAttribute("aria-expanded")).toBe("false");
101
+ fireEvent.mouseUp(clear, { detail: 1 });
102
+ fireEvent.click(clear, { detail: 1 });
103
+ await waitFor(() => expect(result.getByText("Selected:none")).toBeTruthy());
104
+ expect(trigger.getAttribute("aria-expanded")).toBe("false");
105
+ });
@@ -0,0 +1,86 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { sizeRecipeForToken } from "@multiplatform.one/theme";
4
+ import { Select } from "./Select";
5
+ import { Combobox } from "./Combobox";
6
+
7
+ const mode = vi.hoisted(() => ({ height: 37, fontSize: 14, table: false }));
8
+ vi.mock("../shared/tableCellContext", async (importOriginal) => ({
9
+ ...(await importOriginal<typeof import("../shared/tableCellContext")>()),
10
+ useIsInTableCell: () => mode.table,
11
+ }));
12
+
13
+ vi.mock("@multiplatform.one/theme", async (importOriginal) => {
14
+ const actual = await importOriginal<typeof import("@multiplatform.one/theme")>();
15
+ return {
16
+ ...actual,
17
+ useResolvedKnobs: (...args: Parameters<typeof actual.useResolvedKnobs>) => {
18
+ const resolved = actual.useResolvedKnobs(...args);
19
+ return {
20
+ ...resolved,
21
+ knobProps: {
22
+ ...resolved.knobProps,
23
+ control: { ...resolved.knobProps.control, height: mode.height },
24
+ controlType: { ...resolved.knobProps.controlType, fontSize: mode.fontSize },
25
+ },
26
+ };
27
+ },
28
+ };
29
+ });
30
+
31
+ describe("picker desktop recipe sizing", () => {
32
+ for (const [name, Picker] of [
33
+ ["Select", Select],
34
+ ["Combobox", Combobox],
35
+ ] as const) {
36
+ for (const table of [false, true]) {
37
+ it(`${name} table=${table} honors the resolved height and label font without a desktop floor`, () => {
38
+ mode.table = table;
39
+ mode.height = 37;
40
+ mode.fontSize = 14;
41
+ const result = renderWithProviders(
42
+ <Picker
43
+ options={[
44
+ { value: "one", label: "First choice" },
45
+ { value: "two", label: "Second choice" },
46
+ ]}
47
+ value="one"
48
+ />,
49
+ );
50
+ const trigger = result.container.querySelector('[data-testid$="-trigger"]')!;
51
+ expect(trigger).toBeTruthy();
52
+ expect(trigger.className).not.toContain("_mih-44px");
53
+ expect(trigger.className).toContain("_h-37px");
54
+ expect(trigger.getAttribute("data-visual-height")).toBe("37");
55
+ expect(trigger.getAttribute("data-mp-press-slop")).toBe("4");
56
+ expect(trigger.getAttribute("data-mp-press-axis")).toBe("vertical");
57
+ expect(trigger.className).toContain("_miw-44px");
58
+ expect(trigger.className).toContain("_oy-visible");
59
+ const targetCss = document.getElementById("mp-button-press-slop")?.textContent;
60
+ expect(targetCss).toContain("isolation:isolate");
61
+ expect(targetCss).toContain("z-index:-1");
62
+ const label = result.getByText("First choice");
63
+ expect(label.className).toContain("_fos-14px");
64
+ });
65
+ it(`${name} table=${table} retains the shared touch recipe floor`, () => {
66
+ const recipe = sizeRecipeForToken("$3", { touch: true });
67
+ mode.height = recipe.height;
68
+ mode.fontSize = recipe.fontSize;
69
+ mode.table = table;
70
+ expect(recipe.height).toBeGreaterThanOrEqual(44);
71
+ const result = renderWithProviders(
72
+ <Picker
73
+ options={[
74
+ { value: "one", label: "First choice" },
75
+ { value: "two", label: "Second choice" },
76
+ ]}
77
+ value="one"
78
+ />,
79
+ );
80
+ const trigger = result.container.querySelector('[data-testid$="-trigger"]')!;
81
+ expect(trigger.className).toContain(`_h-${recipe.height}px`);
82
+ expect(trigger.getAttribute("data-press-floor")).toBe("box");
83
+ });
84
+ }
85
+ }
86
+ });
@@ -0,0 +1,66 @@
1
+ import type { ReactNode } from "react";
2
+ import { fireEvent } from "@testing-library/react";
3
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { Select } from "./Select";
6
+ import { Combobox } from "./Combobox";
7
+
8
+ const recipe = vi.hoisted(() => ({ height: 37 }));
9
+ vi.mock("@multiplatform.one/theme", async (importOriginal) => {
10
+ const actual = await importOriginal<typeof import("@multiplatform.one/theme")>();
11
+ return {
12
+ ...actual,
13
+ useResolvedKnobs: (...args: Parameters<typeof actual.useResolvedKnobs>) => {
14
+ const result = actual.useResolvedKnobs(...args);
15
+ return {
16
+ ...result,
17
+ knobProps: {
18
+ ...result.knobProps,
19
+ control: { ...result.knobProps.control, height: recipe.height },
20
+ },
21
+ };
22
+ },
23
+ };
24
+ });
25
+ vi.mock("../FloatingPanel", async (importOriginal) => ({
26
+ ...(await importOriginal<typeof import("../FloatingPanel")>()),
27
+ useViewportGtSm: () => false,
28
+ FloatingPanel: ({ trigger, children }: { trigger?: ReactNode; children?: ReactNode }) => (
29
+ <>
30
+ {trigger}
31
+ {children}
32
+ </>
33
+ ),
34
+ }));
35
+
36
+ describe("picker sheet rows consume resolved control height", () => {
37
+ for (const [name, Picker] of [
38
+ ["Select", Select],
39
+ ["Combobox", Combobox],
40
+ ] as const) {
41
+ for (const height of [37, 48]) {
42
+ it(`${name} retains labels and selection at resolved height ${height}`, () => {
43
+ recipe.height = height;
44
+ const onValueChange = vi.fn();
45
+ const result = renderWithProviders(
46
+ <Picker
47
+ value="one"
48
+ onValueChange={onValueChange}
49
+ options={[
50
+ { value: "one", label: "First choice" },
51
+ { value: "two", label: "Second choice" },
52
+ ]}
53
+ />,
54
+ );
55
+ const row =
56
+ name === "Select"
57
+ ? result.getByText("Second choice").parentElement!
58
+ : result.getByRole("option", { name: "Second choice" });
59
+ expect(row.className).toContain(`_h-${height}px`);
60
+ fireEvent.click(row);
61
+ expect(onValueChange).toHaveBeenCalledWith("two");
62
+ expect(onValueChange).toHaveBeenCalledTimes(1);
63
+ });
64
+ }
65
+ }
66
+ });
package/src/index.ts CHANGED
@@ -218,6 +218,15 @@ export type { BarcodePreviewProps } from "./fields/Barcode/BarcodePreview";
218
218
 
219
219
  export { Geolocation } from "./fields/Geolocation";
220
220
  export type { GeolocationProps, GeolocationMapProps } from "./fields/Geolocation";
221
+ export type {
222
+ GeocodeFn,
223
+ GeocodeQuery,
224
+ GeocodeResult,
225
+ Geocoder,
226
+ ReverseGeocodeFn,
227
+ ReverseGeocodeQuery,
228
+ } from "./fields/Geolocation/geocoder";
229
+ export { resolveGeocoder } from "./fields/Geolocation/geocoder";
221
230
 
222
231
  export { ImageField } from "./fields/ImageField";
223
232
  export type { ImageFieldProps } from "./fields/ImageField";