@multiplatform.one/forms 7.7.6 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/dist/cjs/Button/index.cjs +0 -3
  2. package/dist/cjs/Button/index.native.js +0 -3
  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/FloatingPanel/index.cjs +59 -14
  8. package/dist/cjs/FloatingPanel/index.native.js +16 -7
  9. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  10. package/dist/cjs/FloatingPanel/nestedAction.cjs +37 -0
  11. package/dist/cjs/FloatingPanel/nestedAction.native.js +42 -0
  12. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -0
  13. package/dist/cjs/InputParts/index.cjs +8 -6
  14. package/dist/cjs/InputParts/index.native.js +9 -9
  15. package/dist/cjs/InputParts/index.native.js.map +1 -1
  16. package/dist/cjs/Wheel/index.cjs +3 -3
  17. package/dist/cjs/Wheel/index.native.js +3 -3
  18. package/dist/cjs/Wheel/index.native.js.map +1 -1
  19. package/dist/cjs/fieldLayout.cjs +3 -3
  20. package/dist/cjs/fieldLayout.native.js +3 -3
  21. package/dist/cjs/fieldLayout.native.js.map +1 -1
  22. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.cjs +9 -2
  23. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  24. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  25. package/dist/cjs/fields/Combobox/index.cjs +36 -29
  26. package/dist/cjs/fields/Combobox/index.native.js +38 -38
  27. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  28. package/dist/cjs/fields/DatePicker/Calendar.cjs +6 -1
  29. package/dist/cjs/fields/DatePicker/Calendar.native.js +6 -1
  30. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  31. package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +2 -2
  32. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  33. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  34. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +15 -12
  35. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  36. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  37. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +39 -14
  38. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  39. package/dist/cjs/fields/DatePicker/MonthPicker.cjs +10 -3
  40. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +10 -3
  41. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  42. package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +2 -2
  43. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  44. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  45. package/dist/cjs/fields/DatePicker/index.native.js +3 -0
  46. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  47. package/dist/cjs/fields/DatePicker/parts.cjs +26 -14
  48. package/dist/cjs/fields/DatePicker/parts.native.js +28 -14
  49. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  50. package/dist/cjs/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  51. package/dist/cjs/fields/Geolocation/geocoder.cjs +63 -0
  52. package/dist/cjs/fields/Geolocation/geocoder.native.js +68 -0
  53. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -0
  54. package/dist/cjs/fields/Geolocation/index.cjs +801 -152
  55. package/dist/cjs/fields/Geolocation/index.native.js +856 -167
  56. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  57. package/dist/cjs/fields/Geolocation/nativeSearchFocus.cjs +44 -0
  58. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js +47 -0
  59. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  60. package/dist/cjs/fields/Icon/drawnSet.cjs +14 -3
  61. package/dist/cjs/fields/Icon/drawnSet.native.js +18 -3
  62. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  63. package/dist/cjs/fields/Icon/index.cjs +102 -27
  64. package/dist/cjs/fields/Icon/index.native.js +115 -31
  65. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  66. package/dist/cjs/fields/Input/index.cjs +5 -12
  67. package/dist/cjs/fields/Input/index.native.js +5 -13
  68. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  69. package/dist/cjs/fields/PhoneInput/index.cjs +2 -2
  70. package/dist/cjs/fields/PhoneInput/index.native.js +2 -2
  71. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  72. package/dist/cjs/fields/SearchInput/index.cjs +8 -9
  73. package/dist/cjs/fields/SearchInput/index.native.js +8 -9
  74. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  75. package/dist/cjs/fields/Select/index.cjs +42 -11
  76. package/dist/cjs/fields/Select/index.native.js +52 -20
  77. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  78. package/dist/cjs/fields/Stepper/index.cjs +144 -31
  79. package/dist/cjs/fields/Stepper/index.native.js +151 -31
  80. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  81. package/dist/cjs/index.cjs +2 -0
  82. package/dist/cjs/index.native.js +2 -0
  83. package/dist/cjs/index.native.js.map +1 -1
  84. package/dist/cjs/shared/focusManagement.cjs +24 -11
  85. package/dist/cjs/shared/focusManagement.native.js +24 -11
  86. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  87. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  88. package/dist/esm/Button/index.mjs +0 -3
  89. package/dist/esm/Button/index.mjs.map +1 -1
  90. package/dist/esm/Button/index.native.js +0 -3
  91. package/dist/esm/Button/index.native.js.map +1 -1
  92. package/dist/esm/Chip/index.mjs +1 -1
  93. package/dist/esm/Chip/index.mjs.map +1 -1
  94. package/dist/esm/Chip/index.native.js +1 -1
  95. package/dist/esm/Chip/index.native.js.map +1 -1
  96. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  97. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  98. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  99. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  100. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  101. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  102. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  103. package/dist/esm/ErrorSummary.native.js.map +1 -1
  104. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  105. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  106. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  107. package/dist/esm/FieldGroup.native.js.map +1 -1
  108. package/dist/esm/FloatingPanel/index.mjs +58 -15
  109. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  110. package/dist/esm/FloatingPanel/index.native.js +15 -8
  111. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  112. package/dist/esm/FloatingPanel/nestedAction.mjs +11 -0
  113. package/dist/esm/FloatingPanel/nestedAction.mjs.map +1 -0
  114. package/dist/esm/FloatingPanel/nestedAction.native.js +13 -0
  115. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -0
  116. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  117. package/dist/esm/Form/index.native.js.map +1 -1
  118. package/dist/esm/Form/validateOn.native.js.map +1 -1
  119. package/dist/esm/FormGrid.native.js.map +1 -1
  120. package/dist/esm/FormSection.native.js.map +1 -1
  121. package/dist/esm/InputParts/index.mjs +9 -7
  122. package/dist/esm/InputParts/index.mjs.map +1 -1
  123. package/dist/esm/InputParts/index.native.js +10 -10
  124. package/dist/esm/InputParts/index.native.js.map +1 -1
  125. package/dist/esm/Label/index.native.js.map +1 -1
  126. package/dist/esm/Skeleton/index.native.js.map +1 -1
  127. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  128. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  129. package/dist/esm/Table/index.native.js.map +1 -1
  130. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  131. package/dist/esm/Wheel/index.mjs +3 -3
  132. package/dist/esm/Wheel/index.mjs.map +1 -1
  133. package/dist/esm/Wheel/index.native.js +3 -3
  134. package/dist/esm/Wheel/index.native.js.map +1 -1
  135. package/dist/esm/actionLabel.native.js.map +1 -1
  136. package/dist/esm/fieldDefaults.native.js.map +1 -1
  137. package/dist/esm/fieldLayout.mjs +3 -3
  138. package/dist/esm/fieldLayout.mjs.map +1 -1
  139. package/dist/esm/fieldLayout.native.js +3 -3
  140. package/dist/esm/fieldLayout.native.js.map +1 -1
  141. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  142. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  143. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  144. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  145. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  146. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  147. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  148. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  149. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
  150. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
  151. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  152. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  153. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  154. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  155. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  156. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  157. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  158. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  159. package/dist/esm/fields/Combobox/index.mjs +36 -29
  160. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  161. package/dist/esm/fields/Combobox/index.native.js +38 -38
  162. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  163. package/dist/esm/fields/DatePicker/Calendar.mjs +6 -1
  164. package/dist/esm/fields/DatePicker/Calendar.mjs.map +1 -1
  165. package/dist/esm/fields/DatePicker/Calendar.native.js +6 -1
  166. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  167. package/dist/esm/fields/DatePicker/DateRangePicker.mjs +2 -2
  168. package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  169. package/dist/esm/fields/DatePicker/DateRangePicker.native.js +2 -2
  170. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  171. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
  172. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  173. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  174. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  175. package/dist/esm/fields/DatePicker/DatetimePicker.native.js +39 -14
  176. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  177. package/dist/esm/fields/DatePicker/MonthPicker.mjs +10 -3
  178. package/dist/esm/fields/DatePicker/MonthPicker.mjs.map +1 -1
  179. package/dist/esm/fields/DatePicker/MonthPicker.native.js +10 -3
  180. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  181. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +2 -2
  182. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  183. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +2 -2
  184. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  185. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  186. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  187. package/dist/esm/fields/DatePicker/index.native.js +3 -0
  188. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  189. package/dist/esm/fields/DatePicker/parts.mjs +28 -16
  190. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  191. package/dist/esm/fields/DatePicker/parts.native.js +30 -16
  192. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  193. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  194. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  195. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  196. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  197. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  198. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  199. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  200. package/dist/esm/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  201. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  202. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  203. package/dist/esm/fields/Geolocation/geocoder.mjs +33 -0
  204. package/dist/esm/fields/Geolocation/geocoder.mjs.map +1 -0
  205. package/dist/esm/fields/Geolocation/geocoder.native.js +35 -0
  206. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -0
  207. package/dist/esm/fields/Geolocation/index.mjs +792 -149
  208. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  209. package/dist/esm/fields/Geolocation/index.native.js +847 -164
  210. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  211. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  212. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  213. package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs +19 -0
  214. package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
  215. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js +19 -0
  216. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  217. package/dist/esm/fields/Icon/drawnSet.mjs +14 -3
  218. package/dist/esm/fields/Icon/drawnSet.mjs.map +1 -1
  219. package/dist/esm/fields/Icon/drawnSet.native.js +18 -3
  220. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  221. package/dist/esm/fields/Icon/index.mjs +93 -18
  222. package/dist/esm/fields/Icon/index.mjs.map +1 -1
  223. package/dist/esm/fields/Icon/index.native.js +106 -22
  224. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  225. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  226. package/dist/esm/fields/Input/index.mjs +5 -12
  227. package/dist/esm/fields/Input/index.mjs.map +1 -1
  228. package/dist/esm/fields/Input/index.native.js +5 -13
  229. package/dist/esm/fields/Input/index.native.js.map +1 -1
  230. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  231. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  232. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  233. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  234. package/dist/esm/fields/PhoneInput/index.mjs +2 -2
  235. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  236. package/dist/esm/fields/PhoneInput/index.native.js +2 -2
  237. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  238. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  239. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  240. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  241. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  242. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  243. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  244. package/dist/esm/fields/SearchInput/index.mjs +9 -10
  245. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  246. package/dist/esm/fields/SearchInput/index.native.js +9 -10
  247. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  248. package/dist/esm/fields/Select/index.mjs +42 -11
  249. package/dist/esm/fields/Select/index.mjs.map +1 -1
  250. package/dist/esm/fields/Select/index.native.js +52 -20
  251. package/dist/esm/fields/Select/index.native.js.map +1 -1
  252. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  253. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  254. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  255. package/dist/esm/fields/Stepper/index.mjs +145 -32
  256. package/dist/esm/fields/Stepper/index.mjs.map +1 -1
  257. package/dist/esm/fields/Stepper/index.native.js +152 -32
  258. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  259. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  260. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  261. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  262. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  263. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  264. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  265. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  266. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  267. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  268. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  269. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  270. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  271. package/dist/esm/formSpacing.native.js.map +1 -1
  272. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  273. package/dist/esm/index.mjs +2 -1
  274. package/dist/esm/index.mjs.map +1 -1
  275. package/dist/esm/index.native.js +2 -1
  276. package/dist/esm/index.native.js.map +1 -1
  277. package/dist/esm/requiredMarking.native.js.map +1 -1
  278. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  279. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  280. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  281. package/dist/esm/shared/devWarn.native.js.map +1 -1
  282. package/dist/esm/shared/floatingList.native.js.map +1 -1
  283. package/dist/esm/shared/focusManagement.mjs +24 -11
  284. package/dist/esm/shared/focusManagement.mjs.map +1 -1
  285. package/dist/esm/shared/focusManagement.native.js +24 -11
  286. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  287. package/dist/esm/shared/groupContext.native.js.map +1 -1
  288. package/dist/esm/shared/i18n.native.js.map +1 -1
  289. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
  290. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  291. package/dist/esm/shared/t.native.js.map +1 -1
  292. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  293. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  294. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  295. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  296. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  297. package/dist/esm/shared/utils.native.js.map +1 -1
  298. package/dist/esm/shared/zIndex.native.js.map +1 -1
  299. package/dist/esm/themedPrimitives.native.js.map +1 -1
  300. package/dist/esm/types.native.js.map +1 -1
  301. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  302. package/dist/jsx/Button/index.mjs +0 -3
  303. package/dist/jsx/Button/index.mjs.map +1 -1
  304. package/dist/jsx/Button/index.native.js +0 -3
  305. package/dist/jsx/Button/index.native.js.map +1 -1
  306. package/dist/jsx/Chip/index.mjs +1 -1
  307. package/dist/jsx/Chip/index.mjs.map +1 -1
  308. package/dist/jsx/Chip/index.native.js +1 -1
  309. package/dist/jsx/Chip/index.native.js.map +1 -1
  310. package/dist/jsx/FloatingPanel/index.mjs +58 -15
  311. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  312. package/dist/jsx/FloatingPanel/index.native.js +16 -7
  313. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  314. package/dist/jsx/FloatingPanel/nestedAction.mjs +11 -0
  315. package/dist/jsx/FloatingPanel/nestedAction.mjs.map +1 -0
  316. package/dist/jsx/FloatingPanel/nestedAction.native.js +42 -0
  317. package/dist/jsx/FloatingPanel/nestedAction.native.js.map +1 -0
  318. package/dist/jsx/InputParts/index.mjs +9 -7
  319. package/dist/jsx/InputParts/index.mjs.map +1 -1
  320. package/dist/jsx/InputParts/index.native.js +9 -9
  321. package/dist/jsx/InputParts/index.native.js.map +1 -1
  322. package/dist/jsx/Wheel/index.mjs +3 -3
  323. package/dist/jsx/Wheel/index.mjs.map +1 -1
  324. package/dist/jsx/Wheel/index.native.js +3 -3
  325. package/dist/jsx/Wheel/index.native.js.map +1 -1
  326. package/dist/jsx/fieldLayout.mjs +3 -3
  327. package/dist/jsx/fieldLayout.mjs.map +1 -1
  328. package/dist/jsx/fieldLayout.native.js +3 -3
  329. package/dist/jsx/fieldLayout.native.js.map +1 -1
  330. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
  331. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
  332. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  333. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  334. package/dist/jsx/fields/Combobox/index.mjs +36 -29
  335. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  336. package/dist/jsx/fields/Combobox/index.native.js +38 -38
  337. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  338. package/dist/jsx/fields/DatePicker/Calendar.mjs +6 -1
  339. package/dist/jsx/fields/DatePicker/Calendar.mjs.map +1 -1
  340. package/dist/jsx/fields/DatePicker/Calendar.native.js +6 -1
  341. package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
  342. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +2 -2
  343. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  344. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +2 -2
  345. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  346. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
  347. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  348. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  349. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  350. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +39 -14
  351. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  352. package/dist/jsx/fields/DatePicker/MonthPicker.mjs +10 -3
  353. package/dist/jsx/fields/DatePicker/MonthPicker.mjs.map +1 -1
  354. package/dist/jsx/fields/DatePicker/MonthPicker.native.js +10 -3
  355. package/dist/jsx/fields/DatePicker/MonthPicker.native.js.map +1 -1
  356. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +2 -2
  357. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  358. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +2 -2
  359. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  360. package/dist/jsx/fields/DatePicker/index.native.js +3 -0
  361. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  362. package/dist/jsx/fields/DatePicker/parts.mjs +28 -16
  363. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  364. package/dist/jsx/fields/DatePicker/parts.native.js +28 -14
  365. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  366. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  367. package/dist/jsx/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  368. package/dist/jsx/fields/Geolocation/geocoder.mjs +33 -0
  369. package/dist/jsx/fields/Geolocation/geocoder.mjs.map +1 -0
  370. package/dist/jsx/fields/Geolocation/geocoder.native.js +68 -0
  371. package/dist/jsx/fields/Geolocation/geocoder.native.js.map +1 -0
  372. package/dist/jsx/fields/Geolocation/index.mjs +792 -149
  373. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  374. package/dist/jsx/fields/Geolocation/index.native.js +856 -167
  375. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  376. package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs +19 -0
  377. package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
  378. package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js +47 -0
  379. package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  380. package/dist/jsx/fields/Icon/drawnSet.mjs +14 -3
  381. package/dist/jsx/fields/Icon/drawnSet.mjs.map +1 -1
  382. package/dist/jsx/fields/Icon/drawnSet.native.js +18 -3
  383. package/dist/jsx/fields/Icon/drawnSet.native.js.map +1 -1
  384. package/dist/jsx/fields/Icon/index.mjs +93 -18
  385. package/dist/jsx/fields/Icon/index.mjs.map +1 -1
  386. package/dist/jsx/fields/Icon/index.native.js +115 -31
  387. package/dist/jsx/fields/Icon/index.native.js.map +1 -1
  388. package/dist/jsx/fields/Input/index.mjs +5 -12
  389. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  390. package/dist/jsx/fields/Input/index.native.js +5 -13
  391. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  392. package/dist/jsx/fields/PhoneInput/index.mjs +2 -2
  393. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  394. package/dist/jsx/fields/PhoneInput/index.native.js +2 -2
  395. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  396. package/dist/jsx/fields/SearchInput/index.mjs +9 -10
  397. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  398. package/dist/jsx/fields/SearchInput/index.native.js +8 -9
  399. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  400. package/dist/jsx/fields/Select/index.mjs +42 -11
  401. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  402. package/dist/jsx/fields/Select/index.native.js +52 -20
  403. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  404. package/dist/jsx/fields/Stepper/index.mjs +145 -32
  405. package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
  406. package/dist/jsx/fields/Stepper/index.native.js +151 -31
  407. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  408. package/dist/jsx/index.js +2 -1
  409. package/dist/jsx/index.js.map +1 -1
  410. package/dist/jsx/index.mjs +2 -1
  411. package/dist/jsx/index.mjs.map +1 -1
  412. package/dist/jsx/index.native.js +2 -0
  413. package/dist/jsx/index.native.js.map +1 -1
  414. package/dist/jsx/shared/focusManagement.mjs +24 -11
  415. package/dist/jsx/shared/focusManagement.mjs.map +1 -1
  416. package/dist/jsx/shared/focusManagement.native.js +24 -11
  417. package/dist/jsx/shared/focusManagement.native.js.map +1 -1
  418. package/package.json +8 -7
  419. package/src/Button/Button.labelInk.spec.tsx +21 -18
  420. package/src/Button/Button.outlinedChannel.spec.tsx +46 -0
  421. package/src/Button/Button.sizeLadder.spec.tsx +4 -3
  422. package/src/Button/Button.stories.tsx +20 -0
  423. package/src/Button/index.tsx +25 -4
  424. package/src/Chip/Chip.spec.tsx +3 -1
  425. package/src/Chip/index.tsx +1 -5
  426. package/src/FieldLayout.stories.tsx +41 -0
  427. package/src/FloatingPanel/FloatingPanel.native.spec.tsx +54 -0
  428. package/src/FloatingPanel/FloatingPanel.spec.tsx +109 -0
  429. package/src/FloatingPanel/index.native.tsx +24 -7
  430. package/src/FloatingPanel/index.tsx +80 -13
  431. package/src/FloatingPanel/nestedAction.spec.ts +36 -0
  432. package/src/FloatingPanel/nestedAction.ts +15 -0
  433. package/src/FloatingPanel/panelWidthContract.spec.ts +12 -15
  434. package/src/FormsIntegration.stories.tsx +2 -6
  435. package/src/InputParts/index.tsx +15 -5
  436. package/src/InputParts/layoutGap.spec.tsx +43 -0
  437. package/src/Wheel/Wheel.spec.tsx +16 -0
  438. package/src/Wheel/index.tsx +3 -3
  439. package/src/fieldLayout.spec.tsx +42 -1
  440. package/src/fieldLayout.tsx +9 -9
  441. package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +18 -0
  442. package/src/fields/Checkbox/CheckboxFieldFrame.tsx +6 -1
  443. package/src/fields/Combobox/Combobox.spec.tsx +48 -1
  444. package/src/fields/Combobox/index.tsx +53 -39
  445. package/src/fields/DatePicker/Calendar.tsx +4 -1
  446. package/src/fields/DatePicker/DatePicker.stories.tsx +22 -1
  447. package/src/fields/DatePicker/DateRangePicker.tsx +4 -2
  448. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +21 -19
  449. package/src/fields/DatePicker/DatetimePicker.native.spec.tsx +144 -0
  450. package/src/fields/DatePicker/DatetimePicker.native.tsx +57 -32
  451. package/src/fields/DatePicker/DatetimePicker.stories.tsx +22 -0
  452. package/src/fields/DatePicker/MonthPicker.tsx +8 -3
  453. package/src/fields/DatePicker/MultiDatePicker.tsx +4 -2
  454. package/src/fields/DatePicker/index.native.tsx +1 -0
  455. package/src/fields/DatePicker/parts.spec.tsx +56 -0
  456. package/src/fields/DatePicker/parts.tsx +33 -12
  457. package/src/fields/Geolocation/Geolocation.spec.tsx +287 -35
  458. package/src/fields/Geolocation/Geolocation.stories.tsx +141 -7
  459. package/src/fields/Geolocation/GeolocationMap.native.tsx +3 -0
  460. package/src/fields/Geolocation/GeolocationMap.tsx +4 -0
  461. package/src/fields/Geolocation/geocoder.spec.ts +59 -0
  462. package/src/fields/Geolocation/geocoder.ts +84 -0
  463. package/src/fields/Geolocation/geocoderSeam.spec.tsx +203 -0
  464. package/src/fields/Geolocation/index.tsx +912 -180
  465. package/src/fields/Geolocation/nativeSearchFocus.spec.ts +34 -0
  466. package/src/fields/Geolocation/nativeSearchFocus.ts +19 -0
  467. package/src/fields/Geolocation/salvage.spec.tsx +398 -0
  468. package/src/fields/Geolocation/storyProviders.spec.tsx +44 -0
  469. package/src/fields/Icon/Icon.spec.tsx +215 -1
  470. package/src/fields/Icon/Icon.stories.tsx +9 -1
  471. package/src/fields/Icon/drawnSet.tsx +39 -4
  472. package/src/fields/Icon/index.tsx +118 -18
  473. package/src/fields/Input/Input.copy.spec.tsx +1 -0
  474. package/src/fields/Input/Input.spec.tsx +50 -0
  475. package/src/fields/Input/Input.stories.tsx +1 -1
  476. package/src/fields/Input/index.tsx +7 -13
  477. package/src/fields/PhoneInput/index.tsx +2 -2
  478. package/src/fields/SearchInput/SearchInput.spec.tsx +14 -0
  479. package/src/fields/SearchInput/index.tsx +5 -6
  480. package/src/fields/Select/Select.spec.tsx +54 -0
  481. package/src/fields/Select/index.tsx +52 -17
  482. package/src/fields/Stepper/Stepper.spec.tsx +34 -1
  483. package/src/fields/Stepper/index.tsx +193 -33
  484. package/src/index.ts +9 -0
  485. package/src/shared/focusManagement.spec.tsx +68 -0
  486. package/src/shared/focusManagement.ts +20 -10
  487. package/types/Button/index.d.ts +22 -3
  488. package/types/Button/index.d.ts.map +1 -1
  489. package/types/Chip/index.d.ts.map +1 -1
  490. package/types/FloatingPanel/index.d.ts +11 -1
  491. package/types/FloatingPanel/index.d.ts.map +1 -1
  492. package/types/FloatingPanel/index.native.d.ts +2 -1
  493. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  494. package/types/FloatingPanel/nestedAction.d.ts +13 -0
  495. package/types/FloatingPanel/nestedAction.d.ts.map +1 -0
  496. package/types/InputParts/index.d.ts.map +1 -1
  497. package/types/fields/Checkbox/CheckboxFieldFrame.d.ts +46 -2
  498. package/types/fields/Checkbox/CheckboxFieldFrame.d.ts.map +1 -1
  499. package/types/fields/Checkbox/index.d.ts +3 -3
  500. package/types/fields/Combobox/index.d.ts +3 -1
  501. package/types/fields/Combobox/index.d.ts.map +1 -1
  502. package/types/fields/DatePicker/Calendar.d.ts.map +1 -1
  503. package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
  504. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
  505. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
  506. package/types/fields/DatePicker/MonthPicker.d.ts.map +1 -1
  507. package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
  508. package/types/fields/DatePicker/index.native.d.ts.map +1 -1
  509. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  510. package/types/fields/Geolocation/GeolocationMap.d.ts +4 -0
  511. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  512. package/types/fields/Geolocation/GeolocationMap.native.d.ts +3 -0
  513. package/types/fields/Geolocation/GeolocationMap.native.d.ts.map +1 -1
  514. package/types/fields/Geolocation/geocoder.d.ts +53 -0
  515. package/types/fields/Geolocation/geocoder.d.ts.map +1 -0
  516. package/types/fields/Geolocation/index.d.ts +18 -2
  517. package/types/fields/Geolocation/index.d.ts.map +1 -1
  518. package/types/fields/Geolocation/nativeSearchFocus.d.ts +8 -0
  519. package/types/fields/Geolocation/nativeSearchFocus.d.ts.map +1 -0
  520. package/types/fields/Icon/drawnSet.d.ts.map +1 -1
  521. package/types/fields/Icon/index.d.ts.map +1 -1
  522. package/types/fields/Input/index.d.ts.map +1 -1
  523. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  524. package/types/fields/RadioGroup/index.d.ts +2 -2
  525. package/types/fields/SearchInput/index.d.ts.map +1 -1
  526. package/types/fields/Select/index.d.ts.map +1 -1
  527. package/types/fields/Stepper/index.d.ts.map +1 -1
  528. package/types/fields/ToggleGroup/index.d.ts +1 -1
  529. package/types/index.d.ts +2 -0
  530. package/types/index.d.ts.map +1 -1
  531. package/types/shared/focusManagement.d.ts +2 -2
  532. package/types/shared/focusManagement.d.ts.map +1 -1
  533. 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
+ });
@@ -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) {
@@ -598,6 +606,16 @@ function FloatingSelectCore({
598
606
 
599
607
  const { scrollRef: dragScrollRef, dragProps } = useDragScroll({
600
608
  direction: "vertical",
609
+ onDragEnd: () => {
610
+ // The following mouseup finishes scrolling; it must not pick a row.
611
+ allowSelectRef.current = false;
612
+ allowMouseUpRef.current = false;
613
+ if (selectTimeoutRef.current) clearTimeout(selectTimeoutRef.current);
614
+ selectTimeoutRef.current = setTimeout(() => {
615
+ allowSelectRef.current = true;
616
+ allowMouseUpRef.current = true;
617
+ });
618
+ },
601
619
  });
602
620
 
603
621
  // Sync drag scroll ref with floating ref
@@ -1006,6 +1024,7 @@ function FloatingSelectCore({
1006
1024
  suppressFocusRing={open}
1007
1025
  size={knobProps.sizeToken}
1008
1026
  {...pickerTriggerContract(knobProps.control.height)}
1027
+ paddingHorizontal={knobProps.panelPadding.padding}
1009
1028
  {...(inTableCell
1010
1029
  ? // Chromeless in cells.
1011
1030
  {}
@@ -1017,9 +1036,8 @@ function FloatingSelectCore({
1017
1036
  <SyncKeyboardFocusToBox active={kbTrigger && !open} />
1018
1037
  <View
1019
1038
  flex={1}
1020
- // LC-18 (UX-021): trigger inset rides the space knob so trigger text
1021
- // stays column-aligned with the menu rows at every density.
1022
- paddingHorizontal={knobProps.panelPadding.padding}
1039
+ // The Box owns the same horizontal inset as the option rows.
1040
+ minWidth={0}
1023
1041
  paddingVertical="$2"
1024
1042
  justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
1025
1043
  alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
@@ -1061,7 +1079,7 @@ function FloatingSelectCore({
1061
1079
  </Text>
1062
1080
  )}
1063
1081
  </View>
1064
- <View paddingInlineEnd="$2" alignSelf="center">
1082
+ <View flexShrink={0} alignSelf="center">
1065
1083
  <CaretDownIcon size={16} color={glyphColor} />
1066
1084
  </View>
1067
1085
  </InputParts.Box>
@@ -1221,6 +1239,8 @@ function NativeSelectCore({
1221
1239
  const [open, setOpen] = useState(false);
1222
1240
  const [activeIndex, setActiveIndex] = useState<number | null>(0);
1223
1241
  const listRef = useRef<HTMLElement | null>(null);
1242
+ const listboxId = `${id}-listbox`;
1243
+ const optionId = (index: number) => `${listboxId}-option-${index}`;
1224
1244
  const { kbTrigger, kbNav, setKbNav, onTriggerFocus, onTriggerBlur, onTriggerPointerDown } =
1225
1245
  useSelectKeyboardRing();
1226
1246
 
@@ -1332,12 +1352,22 @@ function NativeSelectCore({
1332
1352
  // VoiceOver blob.
1333
1353
  <View
1334
1354
  ref={listRef as any}
1355
+ // React Native's Role type omits listbox; these are DOM-only attributes.
1335
1356
  {...(isWeb
1336
- ? {
1337
- 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,
1338
1368
  onKeyDown: handleListKeyDown,
1339
1369
  onFocus: () => setKbNav(wasKeyboardFocus()),
1340
- }
1370
+ } as Record<string, unknown>)
1341
1371
  : undefined)}
1342
1372
  outlineStyle="none"
1343
1373
  >
@@ -1360,6 +1390,9 @@ function NativeSelectCore({
1360
1390
  const row = (
1361
1391
  <View
1362
1392
  key={isWeb ? option.value : undefined}
1393
+ {...(isWeb
1394
+ ? { id: optionId(i), role: "option" as const, "aria-selected": selected }
1395
+ : undefined)}
1363
1396
  flexDirection="row"
1364
1397
  alignItems="center"
1365
1398
  borderRadius={0}
@@ -1465,6 +1498,7 @@ function NativeSelectCore({
1465
1498
  disabled={disabled}
1466
1499
  size={knobProps.sizeToken}
1467
1500
  {...pickerTriggerContract(knobProps.control.height)}
1501
+ paddingHorizontal={knobProps.panelPadding.padding}
1468
1502
  pointerEvents="none"
1469
1503
  {...(inTableCell
1470
1504
  ? {}
@@ -1477,7 +1511,7 @@ function NativeSelectCore({
1477
1511
  >
1478
1512
  <View
1479
1513
  flex={1}
1480
- paddingHorizontal={knobProps.panelPadding.padding}
1514
+ minWidth={0}
1481
1515
  paddingVertical="$2"
1482
1516
  justifyContent="flex-start"
1483
1517
  alignItems="flex-start"
@@ -1492,7 +1526,7 @@ function NativeSelectCore({
1492
1526
  {triggerValueText}
1493
1527
  </Text>
1494
1528
  </View>
1495
- <View paddingInlineEnd="$2" alignSelf="center">
1529
+ <View flexShrink={0} alignSelf="center">
1496
1530
  <CaretDownIcon size={16} />
1497
1531
  </View>
1498
1532
  </InputParts.Box>
@@ -1518,6 +1552,7 @@ function NativeSelectCore({
1518
1552
  disabled={disabled}
1519
1553
  size={knobProps.sizeToken}
1520
1554
  {...pickerTriggerContract(knobProps.control.height)}
1555
+ paddingHorizontal={knobProps.panelPadding.padding}
1521
1556
  {...(inTableCell
1522
1557
  ? {}
1523
1558
  : {
@@ -1537,6 +1572,7 @@ function NativeSelectCore({
1537
1572
  role: "combobox" as const,
1538
1573
  "aria-haspopup": "listbox",
1539
1574
  "aria-expanded": open,
1575
+ "aria-controls": open ? listboxId : undefined,
1540
1576
  "aria-autocomplete": "none",
1541
1577
  // Standalone (no label): fall back to placeholder so the
1542
1578
  // trigger still has a name (axe button-name). Labelled: the
@@ -1547,8 +1583,8 @@ function NativeSelectCore({
1547
1583
  tabIndex: disabled ? -1 : 0,
1548
1584
  }
1549
1585
  : { importantForAccessibility: "no" as const })}
1550
- // Sheet capture opens first on web. Keep this opener idempotent;
1551
- // native delegates the gesture to FloatingPanel's Pressable.
1586
+ // The web sheet shares this gesture with FloatingPanel's capture
1587
+ // opener. Both must open idempotently. Native owns its own press.
1552
1588
  onPress={isWeb && !disabled ? () => setOpen(true) : undefined}
1553
1589
  onFocus={isWeb ? onTriggerFocus : undefined}
1554
1590
  onBlur={isWeb ? onTriggerBlur : undefined}
@@ -1567,9 +1603,8 @@ function NativeSelectCore({
1567
1603
  <SyncKeyboardFocusToBox active={kbTrigger && !open} />
1568
1604
  <View
1569
1605
  flex={1}
1570
- // LC-18 (UX-021): trigger inset rides the space knob (matches the
1571
- // floating trigger and sheet rows).
1572
- paddingHorizontal={knobProps.panelPadding.padding}
1606
+ // The Box owns the same horizontal inset as the option rows.
1607
+ minWidth={0}
1573
1608
  paddingVertical="$2"
1574
1609
  justifyContent={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
1575
1610
  alignItems={multiple && selectedValues.length > 0 ? "center" : "flex-start"}
@@ -1610,7 +1645,7 @@ function NativeSelectCore({
1610
1645
  </Text>
1611
1646
  )}
1612
1647
  </View>
1613
- <View paddingInlineEnd="$2" alignSelf="center">
1648
+ <View flexShrink={0} alignSelf="center">
1614
1649
  <CaretDownIcon size={16} color={glyphColor} />
1615
1650
  </View>
1616
1651
  </InputParts.Box>
@@ -122,10 +122,13 @@ describe("Stepper", () => {
122
122
  });
123
123
  const increase = result.container.querySelector('[aria-label="Increase"]') as HTMLElement;
124
124
  await act(async () => {
125
- fireEvent.pointerDown(increase);
125
+ expect(fireEvent.pointerDown(increase)).toBe(false);
126
+ fireEvent.pointerUp(increase);
126
127
  });
127
128
  expect(increase).not.toBe(document.activeElement);
128
129
  expect(document.activeElement).toBe(input);
130
+ expect(input.value).toBe("5");
131
+ expect(increase.getAttribute("tabindex")).toBe("-1");
129
132
  });
130
133
  });
131
134
 
@@ -245,6 +248,36 @@ describe("Stepper", () => {
245
248
  });
246
249
 
247
250
  describe("bound feedback (LC-71)", () => {
251
+ it("steps from empty into a bounded negative range", async () => {
252
+ const result = renderWithProviders(<Stepper min={-10} max={-5} allowEmpty />);
253
+ const increase = result.container.querySelector('[data-stepper-button="increment"]')!;
254
+ await act(async () => {
255
+ fireEvent.pointerDown(increase);
256
+ fireEvent.pointerUp(increase);
257
+ });
258
+ expect((result.getInput() as HTMLInputElement).value).toBe("-5");
259
+ expect(result.container.textContent).not.toContain("Maximum reached");
260
+ const inner = increase.querySelector("button")!;
261
+ expect(inner.getAttribute("tabindex")).toBe("-1");
262
+ });
263
+
264
+ it("clears failed-step feedback after a successful step and blur", async () => {
265
+ const result = renderWithProviders(
266
+ <Stepper label="Quantity" defaultValue={1} min={1} max={10} helperText="Choose quantity" />,
267
+ );
268
+ const input = result.getInput() as HTMLInputElement;
269
+ await act(async () => fireEvent.keyDown(input, { key: "ArrowDown" }));
270
+ expect(result.container.textContent).toContain("Minimum reached");
271
+ await act(async () => fireEvent.keyDown(input, { key: "ArrowUp" }));
272
+ expect(result.container.textContent).not.toContain("Minimum reached");
273
+ await act(async () => fireEvent.keyDown(input, { key: "Home" }));
274
+ await act(async () => fireEvent.keyDown(input, { key: "ArrowDown" }));
275
+ expect(result.container.textContent).toContain("Minimum reached");
276
+ await act(async () => fireEvent.blur(input));
277
+ expect(result.container.textContent).not.toContain("Minimum reached");
278
+ expect(result.container.textContent).toContain("Choose quantity");
279
+ });
280
+
248
281
  it("does not show Minimum reached at rest when the value is already at min", () => {
249
282
  const result = renderWithProviders(
250
283
  <Stepper label="Quantity" defaultValue={1} min={1} max={10} />,