@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
@@ -1,7 +1,8 @@
1
1
  import type { ComponentProps, ReactElement, ReactNode } from "react";
2
2
  import { useCallback, useRef } from "react";
3
- import { ClipboardIcon, WarningCircleIcon } from "@phosphor-icons/react";
3
+ import { writeToClipboard } from "@multiplatform.one/platform";
4
4
  import { MIN_PRESS_TARGET, pressTargetHitSlop } from "@multiplatform.one/theme";
5
+ import { ClipboardIcon, WarningCircleIcon } from "@phosphor-icons/react";
5
6
  import type {
6
7
  InputKeyboardType,
7
8
  InputTextContentType,
@@ -119,16 +120,6 @@ export interface InputProps {
119
120
 
120
121
  const COPY_LABEL = "Copy to clipboard";
121
122
 
122
- async function writeClipboard(text: string): Promise<boolean> {
123
- try {
124
- if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) return false;
125
- await navigator.clipboard.writeText(text);
126
- return true;
127
- } catch {
128
- return false;
129
- }
130
- }
131
-
132
123
  export function Input({
133
124
  name,
134
125
  form: formProp,
@@ -247,7 +238,7 @@ export function Input({
247
238
 
248
239
  const handleCopy = useCallback(
249
240
  async (text: string) => {
250
- const ok = await writeClipboard(text);
241
+ const ok = await writeToClipboard(text);
251
242
  onCopyResult?.(ok);
252
243
  },
253
244
  [onCopyResult],
@@ -361,7 +352,9 @@ export function Input({
361
352
  {...(placeholder !== undefined ? { placeholder } : undefined)}
362
353
  disabled={disabled}
363
354
  id={id}
364
- {...(handleChange ? { value: inputValue ?? "" } : { defaultValue: inputValue })}
355
+ {...(handleChange || value !== undefined
356
+ ? { value: inputValue ?? "" }
357
+ : { defaultValue: inputValue })}
365
358
  aria-required={required || undefined}
366
359
  aria-invalid={hasError || undefined}
367
360
  {...areaName}
@@ -381,6 +374,7 @@ export function Input({
381
374
  disabled={disabled}
382
375
  tabIndex={disabled ? -1 : 0}
383
376
  aria-label={COPY_LABEL}
377
+ accessibilityLabel={COPY_LABEL}
384
378
  hitSlop={belowFloor ? pressTargetHitSlop(visualHeight) : undefined}
385
379
  onPress={disabled ? undefined : activateCopy}
386
380
  onKeyDown={
@@ -43,8 +43,6 @@ const phoneInputCss = `/* LC-71: flag+dial are adornments of one control. Ring l
43
43
  .mp-phone-input [data-testid="combobox-trigger"] {
44
44
  outline: none !important;
45
45
  box-shadow: none !important;
46
- width: auto !important;
47
- flex: 0 0 auto;
48
46
  }
49
47
  .mp-phone-input [data-testid="combobox-trigger"]:focus,
50
48
  .mp-phone-input [data-testid="combobox-trigger"]:focus-visible {
@@ -329,9 +327,11 @@ export function PhoneInput<
329
327
  alignItems="stretch"
330
328
  flexGrow={0}
331
329
  flexShrink={0}
330
+ gap="$1.5"
332
331
  {...(readOnly ? { pointerEvents: "none" as const } : undefined)}
333
332
  >
334
333
  <Combobox
334
+ triggerSizing="content"
335
335
  options={countryOptions}
336
336
  value={regionCode}
337
337
  onChange={(val) => handleRegionChange(typeof val === "string" ? val : (val[0] ?? ""))}
@@ -5,6 +5,7 @@ import { fireEvent } from "@testing-library/react";
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
6
  import { SIZE_RECIPE_TOKENS, sizeRecipeForToken } from "@multiplatform.one/theme";
7
7
  import { renderWithProviders } from "@multiplatform.one/test-utils";
8
+ import { useTheme } from "tamagui";
8
9
  import { Form } from "../../Form";
9
10
  import { SearchInput } from "./index";
10
11
 
@@ -31,6 +32,19 @@ describe("SearchInput", () => {
31
32
  expect(result.container.querySelector("svg")).toBeTruthy();
32
33
  });
33
34
 
35
+ it("uses readable glyph ink for search and clear rather than the boundary ramp", () => {
36
+ let expectedInk = "";
37
+ function Sample() {
38
+ const theme = useTheme();
39
+ expectedInk = String(theme.color11?.val);
40
+ return <SearchInput placeholder="Search things" defaultValue="corp" />;
41
+ }
42
+ const { container } = renderWithProviders(<Sample />);
43
+ const glyphs = container.querySelectorAll("svg");
44
+ expect(glyphs).toHaveLength(2);
45
+ for (const glyph of glyphs) expect(glyph.getAttribute("fill")).toBe(expectedInk);
46
+ });
47
+
34
48
  it("bidi-isolates the default placeholder (LC-58) and passes explicit ones through", () => {
35
49
  // Default: FSI…PDI framing so the trailing "..." cannot reorder to
36
50
  // "…Search" under RTL; the visible run stays byte-identical inside.
@@ -28,7 +28,7 @@ import { View, isWeb } from "tamagui";
28
28
  import { Skeleton } from "../../Skeleton";
29
29
  import { Field, FieldLayout } from "../../fieldLayout";
30
30
  import { Input as InputParts } from "../../InputParts";
31
- import { formControlColors } from "../../shared/colorRamps";
31
+ import { formCommonColors } from "../../shared/colorRamps";
32
32
  import { bidiIsolate, t } from "../../shared/t";
33
33
  import type { AnyFormApi } from "../../types";
34
34
  import {
@@ -339,7 +339,7 @@ export function SearchInput({
339
339
  >
340
340
  <InputParts.Icon
341
341
  adornment="leading"
342
- color={formControlColors.boundary}
342
+ color={formCommonColors.muted}
343
343
  className={isWeb ? "mp-search-leading" : undefined}
344
344
  {...leadingWebProps}
345
345
  >
@@ -363,11 +363,8 @@ export function SearchInput({
363
363
  justifyContent="center"
364
364
  cursor="pointer"
365
365
  outlineWidth={0}
366
- hoverStyle={{ opacity: 1 }}
367
- pressStyle={{ opacity: 0.9 }}
368
366
  focusStyle={{ outlineWidth: 0 }}
369
367
  focusVisibleStyle={{ outlineWidth: 0 }}
370
- opacity={0.85}
371
368
  flexShrink={0}
372
369
  hitSlop={belowFloor ? pressTargetHitSlop(visualHeight) : undefined}
373
370
  onPress={() => clearText(fieldChange)}
@@ -385,8 +382,10 @@ export function SearchInput({
385
382
  className={isWeb ? "mp-chip-dismiss-ring" : undefined}
386
383
  alignItems="center"
387
384
  justifyContent="center"
385
+ hoverStyle={{ backgroundColor: "$color4" }}
386
+ pressStyle={{ backgroundColor: "$color5" }}
388
387
  >
389
- <InputParts.Icon aria-hidden color={formControlColors.boundary}>
388
+ <InputParts.Icon aria-hidden color={formCommonColors.muted}>
390
389
  <XIcon size={resolvedIconSize} />
391
390
  </InputParts.Icon>
392
391
  </View>
@@ -334,3 +334,57 @@ describe("Select Components", () => {
334
334
  });
335
335
  });
336
336
  });
337
+
338
+ describe("Select pointer intent", () => {
339
+ it("commits a deliberate cross-row release immediately after keyboard open", async () => {
340
+ const onChange = vi.fn();
341
+ const result = renderWithProviders(<Select options={mockOptions} onChange={onChange} />);
342
+ const trigger = result.getByTestId("select-trigger");
343
+ fireEvent.keyDown(trigger, { key: "Enter" });
344
+ const options = await result.findAllByRole("option");
345
+ fireEvent.pointerDown(options[0], { button: 0, pointerId: 1 });
346
+ fireEvent.mouseDown(options[0]);
347
+ fireEvent.mouseUp(options[1]);
348
+ expect(onChange).toHaveBeenCalledExactlyOnceWith("option2");
349
+ expect(trigger).toHaveAttribute("aria-expanded", "false");
350
+ });
351
+
352
+ it("consumes the opening gesture release over the covered row", async () => {
353
+ const onChange = vi.fn();
354
+ const result = renderWithProviders(<Select options={mockOptions} onChange={onChange} />);
355
+ const trigger = result.getByTestId("select-trigger");
356
+ fireEvent.mouseDown(trigger);
357
+ const options = await result.findAllByRole("option");
358
+ fireEvent.mouseUp(options[0]);
359
+ expect(onChange).not.toHaveBeenCalled();
360
+ expect(trigger).toHaveAttribute("aria-expanded", "true");
361
+ });
362
+
363
+ it("does not select when a background drag releases over an option", async () => {
364
+ const onChange = vi.fn();
365
+ const result = renderWithProviders(<Select options={mockOptions} onChange={onChange} />);
366
+ fireEvent.mouseDown(result.getByTestId("select-trigger"));
367
+ const options = await result.findAllByRole("option");
368
+ fireEvent.mouseUp(options[0]);
369
+ const panel = result.getByTestId("select-dropdown");
370
+ fireEvent.pointerDown(panel, { button: 0, clientY: 10 });
371
+ fireEvent.pointerMove(document, { clientY: 50 });
372
+ fireEvent.pointerUp(document);
373
+ fireEvent.mouseUp(options[1]);
374
+ expect(onChange).not.toHaveBeenCalled();
375
+ });
376
+
377
+ it("toggles a multiple option exactly once on an immediate click", async () => {
378
+ const onChange = vi.fn();
379
+ const result = renderWithProviders(
380
+ <Select options={mockOptions} multiple onChange={onChange} />,
381
+ );
382
+ fireEvent.keyDown(result.getByTestId("select-trigger"), { key: "Enter" });
383
+ const options = await result.findAllByRole("option");
384
+ fireEvent.pointerDown(options[0], { button: 0, pointerId: 1 });
385
+ fireEvent.mouseDown(options[0]);
386
+ fireEvent.mouseUp(options[0]);
387
+ fireEvent.click(options[0]);
388
+ expect(onChange).toHaveBeenCalledExactlyOnceWith(["option1"]);
389
+ });
390
+ });
@@ -12,7 +12,6 @@ import {
12
12
  } from "@floating-ui/react";
13
13
  import type { AnyFormApi } from "../../types";
14
14
  import {
15
- MIN_PRESS_TARGET,
16
15
  ensureKeyboardModalityTracking,
17
16
  keyboardFocusRingProps,
18
17
  menuRowFrame,
@@ -31,6 +30,7 @@ import * as ReactNative from "react-native";
31
30
  import { Platform, Pressable as RNPressable } from "react-native";
32
31
  import { Paragraph, Text, View, YStack, isWeb, styled, useTheme } from "tamagui";
33
32
  import { Chip, type ChipProps } from "../../Chip";
33
+ import { pickerTriggerContract } from "../../shared/pickerTriggerContract";
34
34
  import { Skeleton } from "../../Skeleton";
35
35
  import { Field, FieldLayout, useFieldA11y, useFieldDescribedBy } from "../../fieldLayout";
36
36
  import { Input as InputParts, FocusContext } from "../../InputParts";
@@ -125,10 +125,13 @@ export interface SelectProps {
125
125
  // LC-71: Tamagui maps `focusVisibleStyle` onto mouse/:focus, so the ring is
126
126
  // painted from `wasKeyboardFocus()` (inset — overlay overflow clips it).
127
127
  // LC-72 CONTAINER-CLIP: rows stay square; the panel radius cuts the corners.
128
- const selectRowOutlineRest = {
128
+ const selectOutlineRest = {
129
129
  outlineWidth: 0,
130
130
  outlineStyle: "solid" as const,
131
131
  outlineColor: "transparent",
132
+ };
133
+ const selectRowOutlineRest = {
134
+ ...selectOutlineRest,
132
135
  borderRadius: 0,
133
136
  };
134
137
 
@@ -266,7 +269,8 @@ function selectTriggerRingProps(kbTrigger: boolean, open: boolean) {
266
269
  if (kbTrigger && !open) {
267
270
  return { ...keyboardFocusRingProps, "data-kb-ring": "true" as const };
268
271
  }
269
- return { ...selectRowOutlineRest, "data-kb-ring": undefined };
272
+ // Focus modality owns the outline; the control recipe owns trigger shape.
273
+ return { ...selectOutlineRest, "data-kb-ring": undefined };
270
274
  }
271
275
 
272
276
  function selectItemRingProps(isActive: boolean, kbNav: boolean) {
@@ -398,6 +402,10 @@ const SelectItem = memo(function SelectItem({
398
402
  },
399
403
  onPointerDown() {
400
404
  ctx.setKbNav(false);
405
+ // A press on a mounted row is a new gesture, not the release that
406
+ // opened this covering panel. Arm immediately, regardless of time.
407
+ ctx.allowMouseUpRef.current = true;
408
+ ctx.allowSelectRef.current = true;
401
409
  },
402
410
  onMouseUp() {
403
411
  if (!ctx.allowMouseUpRef.current) {
@@ -421,7 +429,7 @@ const SelectItem = memo(function SelectItem({
421
429
  active={isActive}
422
430
  aria-selected={isSelected}
423
431
  data-state={isSelected ? "active" : "inactive"}
424
- size={ctx.knobProps.sizeToken}
432
+ height={ctx.knobProps.control.height}
425
433
  // LC-18 KNOB-TOTALITY (UX-021): menu rows re-rhythm with the space knob —
426
434
  // horizontal inset from the panelPadding token (SP-EDGE, sidebar-row
427
435
  // precedent) over menuRowFrame's static $3; in-row gap rides the gap
@@ -598,6 +606,16 @@ function FloatingSelectCore({
598
606
 
599
607
  const { scrollRef: dragScrollRef, dragProps } = useDragScroll({
600
608
  direction: "vertical",
609
+ onDragEnd: () => {
610
+ // The following mouseup finishes scrolling; it must not pick a row.
611
+ allowSelectRef.current = false;
612
+ allowMouseUpRef.current = false;
613
+ if (selectTimeoutRef.current) clearTimeout(selectTimeoutRef.current);
614
+ selectTimeoutRef.current = setTimeout(() => {
615
+ allowSelectRef.current = true;
616
+ allowMouseUpRef.current = true;
617
+ });
618
+ },
601
619
  });
602
620
 
603
621
  // Sync drag scroll ref with floating ref
@@ -1005,13 +1023,10 @@ function FloatingSelectCore({
1005
1023
  // must not paint — it would ghost around the panel's corners.
1006
1024
  suppressFocusRing={open}
1007
1025
  size={knobProps.sizeToken}
1008
- // LC-54 PRESS-FLOOR: the size knob may shrink chrome (compact → $3
1009
- // = 36px) but the trigger's press target never drops below 44 —
1010
- // same minHeight floor the house Button holds. Without it a compact
1011
- // Select sat 36px beside 44px Inputs/Buttons in one control row.
1012
- minHeight={MIN_PRESS_TARGET}
1026
+ {...pickerTriggerContract(knobProps.control.height)}
1027
+ paddingHorizontal={knobProps.panelPadding.padding}
1013
1028
  {...(inTableCell
1014
- ? // Chromeless in cells (the floor above still applies).
1029
+ ? // Chromeless in cells.
1015
1030
  {}
1016
1031
  : {
1017
1032
  borderRadius: knobProps.borderRadius.borderRadius,
@@ -1021,9 +1036,8 @@ function FloatingSelectCore({
1021
1036
  <SyncKeyboardFocusToBox active={kbTrigger && !open} />
1022
1037
  <View
1023
1038
  flex={1}
1024
- // LC-18 (UX-021): trigger inset rides the space knob so trigger text
1025
- // stays column-aligned with the menu rows at every density.
1026
- paddingHorizontal={knobProps.panelPadding.padding}
1039
+ // The Box owns the same horizontal inset as the option rows.
1040
+ minWidth={0}
1027
1041
  paddingVertical="$2"
1028
1042
  justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
1029
1043
  alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
@@ -1054,6 +1068,7 @@ function FloatingSelectCore({
1054
1068
  </View>
1055
1069
  ) : (
1056
1070
  <Text
1071
+ {...knobProps.controlType}
1057
1072
  fontFamily={knobProps.body.fontFamily}
1058
1073
  fontWeight={knobProps.body.fontWeight}
1059
1074
  color={selectedOption ? textColor : formCommonColors.muted}
@@ -1064,7 +1079,7 @@ function FloatingSelectCore({
1064
1079
  </Text>
1065
1080
  )}
1066
1081
  </View>
1067
- <View paddingInlineEnd="$2" alignSelf="center">
1082
+ <View flexShrink={0} alignSelf="center">
1068
1083
  <CaretDownIcon size={16} color={glyphColor} />
1069
1084
  </View>
1070
1085
  </InputParts.Box>
@@ -1224,6 +1239,8 @@ function NativeSelectCore({
1224
1239
  const [open, setOpen] = useState(false);
1225
1240
  const [activeIndex, setActiveIndex] = useState<number | null>(0);
1226
1241
  const listRef = useRef<HTMLElement | null>(null);
1242
+ const listboxId = `${id}-listbox`;
1243
+ const optionId = (index: number) => `${listboxId}-option-${index}`;
1227
1244
  const { kbTrigger, kbNav, setKbNav, onTriggerFocus, onTriggerBlur, onTriggerPointerDown } =
1228
1245
  useSelectKeyboardRing();
1229
1246
 
@@ -1335,12 +1352,22 @@ function NativeSelectCore({
1335
1352
  // VoiceOver blob.
1336
1353
  <View
1337
1354
  ref={listRef as any}
1355
+ // React Native's Role type omits listbox; these are DOM-only attributes.
1338
1356
  {...(isWeb
1339
- ? {
1340
- tabIndex: 0,
1357
+ ? ({
1358
+ id: listboxId,
1359
+ role: "listbox" as const,
1360
+ "aria-label": ariaLabel ?? fieldA11y?.label ?? placeholder,
1361
+ "aria-multiselectable": multiple || undefined,
1362
+ "aria-hidden": !open,
1363
+ "aria-activedescendant":
1364
+ activeIndex != null && displayOptions[activeIndex]
1365
+ ? optionId(activeIndex)
1366
+ : undefined,
1367
+ tabIndex: open ? 0 : -1,
1341
1368
  onKeyDown: handleListKeyDown,
1342
1369
  onFocus: () => setKbNav(wasKeyboardFocus()),
1343
- }
1370
+ } as Record<string, unknown>)
1344
1371
  : undefined)}
1345
1372
  outlineStyle="none"
1346
1373
  >
@@ -1363,6 +1390,9 @@ function NativeSelectCore({
1363
1390
  const row = (
1364
1391
  <View
1365
1392
  key={isWeb ? option.value : undefined}
1393
+ {...(isWeb
1394
+ ? { id: optionId(i), role: "option" as const, "aria-selected": selected }
1395
+ : undefined)}
1366
1396
  flexDirection="row"
1367
1397
  alignItems="center"
1368
1398
  borderRadius={0}
@@ -1370,7 +1400,7 @@ function NativeSelectCore({
1370
1400
  // menu rows — panelPadding inset + gap fragment.
1371
1401
  {...knobProps.gap}
1372
1402
  paddingHorizontal={knobProps.panelPadding.padding}
1373
- height={knobProps.sizeToken}
1403
+ height={knobProps.control.height}
1374
1404
  onPress={isWeb ? () => handleSelect(option.value) : undefined}
1375
1405
  onMouseEnter={() => setActiveIndex(i)}
1376
1406
  onPointerDown={isWeb ? () => setKbNav(false) : undefined}
@@ -1467,7 +1497,8 @@ function NativeSelectCore({
1467
1497
  <InputParts.Box
1468
1498
  disabled={disabled}
1469
1499
  size={knobProps.sizeToken}
1470
- minHeight={MIN_PRESS_TARGET}
1500
+ {...pickerTriggerContract(knobProps.control.height)}
1501
+ paddingHorizontal={knobProps.panelPadding.padding}
1471
1502
  pointerEvents="none"
1472
1503
  {...(inTableCell
1473
1504
  ? {}
@@ -1480,12 +1511,13 @@ function NativeSelectCore({
1480
1511
  >
1481
1512
  <View
1482
1513
  flex={1}
1483
- paddingHorizontal={knobProps.panelPadding.padding}
1514
+ minWidth={0}
1484
1515
  paddingVertical="$2"
1485
1516
  justifyContent="flex-start"
1486
1517
  alignItems="flex-start"
1487
1518
  >
1488
1519
  <Text
1520
+ {...knobProps.controlType}
1489
1521
  fontFamily={knobProps.body.fontFamily}
1490
1522
  fontWeight={knobProps.body.fontWeight}
1491
1523
  color={selectedOption ? formCommonColors.text : formCommonColors.muted}
@@ -1494,7 +1526,7 @@ function NativeSelectCore({
1494
1526
  {triggerValueText}
1495
1527
  </Text>
1496
1528
  </View>
1497
- <View paddingInlineEnd="$2" alignSelf="center">
1529
+ <View flexShrink={0} alignSelf="center">
1498
1530
  <CaretDownIcon size={16} />
1499
1531
  </View>
1500
1532
  </InputParts.Box>
@@ -1519,9 +1551,8 @@ function NativeSelectCore({
1519
1551
  <InputParts.Box
1520
1552
  disabled={disabled}
1521
1553
  size={knobProps.sizeToken}
1522
- // LC-54 PRESS-FLOOR: ≥44px trigger target at every size (matches
1523
- // the web trigger branch above).
1524
- minHeight={MIN_PRESS_TARGET}
1554
+ {...pickerTriggerContract(knobProps.control.height)}
1555
+ paddingHorizontal={knobProps.panelPadding.padding}
1525
1556
  {...(inTableCell
1526
1557
  ? {}
1527
1558
  : {
@@ -1541,6 +1572,7 @@ function NativeSelectCore({
1541
1572
  role: "combobox" as const,
1542
1573
  "aria-haspopup": "listbox",
1543
1574
  "aria-expanded": open,
1575
+ "aria-controls": open ? listboxId : undefined,
1544
1576
  "aria-autocomplete": "none",
1545
1577
  // Standalone (no label): fall back to placeholder so the
1546
1578
  // trigger still has a name (axe button-name). Labelled: the
@@ -1551,11 +1583,9 @@ function NativeSelectCore({
1551
1583
  tabIndex: disabled ? -1 : 0,
1552
1584
  }
1553
1585
  : { importantForAccessibility: "no" as const })}
1554
- // Web: trigger owns toggle. Native: FloatingPanel.native owns the
1555
- // open gesture (pointerEvents="none" on the trigger) — a second
1556
- // setOpen(prev => !prev) here double-toggles and the sheet never
1557
- // appears (batched true then !prev → false).
1558
- onPress={isWeb && !disabled ? () => setOpen((prev) => !prev) : undefined}
1586
+ // The web sheet shares this gesture with FloatingPanel's capture
1587
+ // opener. Both must open idempotently. Native owns its own press.
1588
+ onPress={isWeb && !disabled ? () => setOpen(true) : undefined}
1559
1589
  onFocus={isWeb ? onTriggerFocus : undefined}
1560
1590
  onBlur={isWeb ? onTriggerBlur : undefined}
1561
1591
  onPointerDown={isWeb ? onTriggerPointerDown : undefined}
@@ -1573,9 +1603,8 @@ function NativeSelectCore({
1573
1603
  <SyncKeyboardFocusToBox active={kbTrigger && !open} />
1574
1604
  <View
1575
1605
  flex={1}
1576
- // LC-18 (UX-021): trigger inset rides the space knob (matches the
1577
- // floating trigger and sheet rows).
1578
- paddingHorizontal={knobProps.panelPadding.padding}
1606
+ // The Box owns the same horizontal inset as the option rows.
1607
+ minWidth={0}
1579
1608
  paddingVertical="$2"
1580
1609
  justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
1581
1610
  alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
@@ -1606,6 +1635,7 @@ function NativeSelectCore({
1606
1635
  </View>
1607
1636
  ) : (
1608
1637
  <Text
1638
+ {...knobProps.controlType}
1609
1639
  fontFamily={knobProps.body.fontFamily}
1610
1640
  fontWeight={knobProps.body.fontWeight}
1611
1641
  color={selectedOption ? textColor : formCommonColors.muted}
@@ -1615,7 +1645,7 @@ function NativeSelectCore({
1615
1645
  </Text>
1616
1646
  )}
1617
1647
  </View>
1618
- <View paddingInlineEnd="$2" alignSelf="center">
1648
+ <View flexShrink={0} alignSelf="center">
1619
1649
  <CaretDownIcon size={16} color={glyphColor} />
1620
1650
  </View>
1621
1651
  </InputParts.Box>
@@ -122,10 +122,13 @@ describe("Stepper", () => {
122
122
  });
123
123
  const increase = result.container.querySelector('[aria-label="Increase"]') as HTMLElement;
124
124
  await act(async () => {
125
- fireEvent.pointerDown(increase);
125
+ expect(fireEvent.pointerDown(increase)).toBe(false);
126
+ fireEvent.pointerUp(increase);
126
127
  });
127
128
  expect(increase).not.toBe(document.activeElement);
128
129
  expect(document.activeElement).toBe(input);
130
+ expect(input.value).toBe("5");
131
+ expect(increase.getAttribute("tabindex")).toBe("-1");
129
132
  });
130
133
  });
131
134
 
@@ -245,6 +248,36 @@ describe("Stepper", () => {
245
248
  });
246
249
 
247
250
  describe("bound feedback (LC-71)", () => {
251
+ it("steps from empty into a bounded negative range", async () => {
252
+ const result = renderWithProviders(<Stepper min={-10} max={-5} allowEmpty />);
253
+ const increase = result.container.querySelector('[data-stepper-button="increment"]')!;
254
+ await act(async () => {
255
+ fireEvent.pointerDown(increase);
256
+ fireEvent.pointerUp(increase);
257
+ });
258
+ expect((result.getInput() as HTMLInputElement).value).toBe("-5");
259
+ expect(result.container.textContent).not.toContain("Maximum reached");
260
+ const inner = increase.querySelector("button")!;
261
+ expect(inner.getAttribute("tabindex")).toBe("-1");
262
+ });
263
+
264
+ it("clears failed-step feedback after a successful step and blur", async () => {
265
+ const result = renderWithProviders(
266
+ <Stepper label="Quantity" defaultValue={1} min={1} max={10} helperText="Choose quantity" />,
267
+ );
268
+ const input = result.getInput() as HTMLInputElement;
269
+ await act(async () => fireEvent.keyDown(input, { key: "ArrowDown" }));
270
+ expect(result.container.textContent).toContain("Minimum reached");
271
+ await act(async () => fireEvent.keyDown(input, { key: "ArrowUp" }));
272
+ expect(result.container.textContent).not.toContain("Minimum reached");
273
+ await act(async () => fireEvent.keyDown(input, { key: "Home" }));
274
+ await act(async () => fireEvent.keyDown(input, { key: "ArrowDown" }));
275
+ expect(result.container.textContent).toContain("Minimum reached");
276
+ await act(async () => fireEvent.blur(input));
277
+ expect(result.container.textContent).not.toContain("Minimum reached");
278
+ expect(result.container.textContent).toContain("Choose quantity");
279
+ });
280
+
248
281
  it("does not show Minimum reached at rest when the value is already at min", () => {
249
282
  const result = renderWithProviders(
250
283
  <Stepper label="Quantity" defaultValue={1} min={1} max={10} />,