@multiplatform.one/forms 7.11.0 → 7.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (724) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/AdaptivePopup/index.cjs +0 -10
  3. package/dist/cjs/AdaptivePopup/index.native.js +0 -10
  4. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  5. package/dist/cjs/Button/index.cjs +6 -3
  6. package/dist/cjs/Button/index.native.js +6 -3
  7. package/dist/cjs/Button/index.native.js.map +1 -1
  8. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.cjs +2 -11
  9. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
  10. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/index.cjs +12 -10
  12. package/dist/cjs/ContextualSaveBar/index.native.js +12 -19
  13. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  14. package/dist/cjs/FieldDisplay/index.cjs +24 -12
  15. package/dist/cjs/FieldDisplay/index.native.js +25 -13
  16. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  17. package/dist/cjs/FloatingPanel/PanelPortal.cjs +145 -0
  18. package/dist/cjs/FloatingPanel/PanelPortal.native.js +43 -0
  19. package/dist/cjs/FloatingPanel/PanelPortal.native.js.map +1 -0
  20. package/dist/cjs/FloatingPanel/index.cjs +115 -67
  21. package/dist/cjs/FloatingPanel/index.native.js +67 -12
  22. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  23. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +4 -2
  24. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +4 -2
  25. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  26. package/dist/cjs/Form/index.cjs +2 -1
  27. package/dist/cjs/Form/index.native.js +2 -1
  28. package/dist/cjs/Form/index.native.js.map +1 -1
  29. package/dist/cjs/Form/submissionController.cjs +74 -0
  30. package/dist/cjs/Form/submissionController.native.js +99 -0
  31. package/dist/cjs/Form/submissionController.native.js.map +1 -0
  32. package/dist/cjs/InputParts/index.cjs +66 -12
  33. package/dist/cjs/InputParts/index.native.js +72 -12
  34. package/dist/cjs/InputParts/index.native.js.map +1 -1
  35. package/dist/cjs/Wheel/index.cjs +0 -2
  36. package/dist/cjs/Wheel/index.native.js +0 -2
  37. package/dist/cjs/Wheel/index.native.js.map +1 -1
  38. package/dist/cjs/fields/Barcode/BarcodePreview.cjs +18 -15
  39. package/dist/cjs/fields/Barcode/BarcodePreview.native.js +21 -18
  40. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  41. package/dist/cjs/fields/Barcode/qr.native.js +34 -34
  42. package/dist/cjs/fields/Checkbox/Checkbox.cjs +1 -3
  43. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -3
  44. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  45. package/dist/cjs/fields/Checkbox/CheckboxBox.cjs +2 -3
  46. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js +2 -3
  47. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  48. package/dist/cjs/fields/ColorPicker/index.cjs +2 -0
  49. package/dist/cjs/fields/ColorPicker/index.native.js +2 -0
  50. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  51. package/dist/cjs/fields/ColorPicker/parts.cjs +1 -0
  52. package/dist/cjs/fields/ColorPicker/parts.native.js +1 -0
  53. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  54. package/dist/cjs/fields/Combobox/index.cjs +206 -200
  55. package/dist/cjs/fields/Combobox/index.native.js +214 -208
  56. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  57. package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +7 -7
  58. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +7 -7
  59. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  60. package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +6 -4
  61. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +6 -4
  62. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  63. package/dist/cjs/fields/Duration/index.cjs +5 -3
  64. package/dist/cjs/fields/Duration/index.native.js +5 -3
  65. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  66. package/dist/cjs/fields/FileUpload/index.cjs +10 -8
  67. package/dist/cjs/fields/FileUpload/index.native.js +10 -8
  68. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  69. package/dist/cjs/fields/FileUpload/nativePickerLoader.cjs +7 -2
  70. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js +7 -2
  71. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  72. package/dist/cjs/fields/Geolocation/GeolocationMap.cjs +3 -0
  73. package/dist/cjs/fields/Geolocation/geocoderContext.cjs +71 -0
  74. package/dist/cjs/fields/Geolocation/geocoderContext.native.js +75 -0
  75. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -0
  76. package/dist/cjs/fields/Geolocation/index.cjs +72 -82
  77. package/dist/cjs/fields/Geolocation/index.native.js +72 -82
  78. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  79. package/dist/cjs/fields/Geolocation/photonGeocoder.cjs +138 -0
  80. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js +179 -0
  81. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  82. package/dist/cjs/fields/Input/index.cjs +7 -5
  83. package/dist/cjs/fields/Input/index.native.js +7 -5
  84. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  85. package/dist/cjs/fields/MentionInput/index.cjs +118 -112
  86. package/dist/cjs/fields/MentionInput/index.native.js +130 -124
  87. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  88. package/dist/cjs/fields/OTPInput/index.cjs +11 -8
  89. package/dist/cjs/fields/OTPInput/index.native.js +11 -8
  90. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  91. package/dist/cjs/fields/PhoneInput/index.cjs +9 -6
  92. package/dist/cjs/fields/PhoneInput/index.native.js +9 -6
  93. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  94. package/dist/cjs/fields/PhoneInput/phone.cjs +6 -5
  95. package/dist/cjs/fields/PhoneInput/phone.native.js +7 -6
  96. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  97. package/dist/cjs/fields/PhoneInput/regionNames.cjs +274 -0
  98. package/dist/cjs/fields/PhoneInput/regionNames.native.js +277 -0
  99. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -0
  100. package/dist/cjs/fields/RadioGroup/index.cjs +2 -6
  101. package/dist/cjs/fields/RadioGroup/index.native.js +2 -6
  102. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  103. package/dist/cjs/fields/SearchInput/index.cjs +10 -8
  104. package/dist/cjs/fields/SearchInput/index.native.js +10 -8
  105. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  106. package/dist/cjs/fields/Select/index.cjs +20 -17
  107. package/dist/cjs/fields/Select/index.native.js +20 -17
  108. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  109. package/dist/cjs/fields/Signature/index.cjs +10 -9
  110. package/dist/cjs/fields/Signature/index.native.js +10 -9
  111. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  112. package/dist/cjs/fields/Slider/index.cjs +21 -15
  113. package/dist/cjs/fields/Slider/index.native.js +21 -17
  114. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  115. package/dist/cjs/fields/Slider/jumpMotion.cjs +2 -2
  116. package/dist/cjs/fields/Slider/jumpMotion.native.js +2 -1
  117. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  118. package/dist/cjs/fields/Stepper/index.cjs +25 -6
  119. package/dist/cjs/fields/Stepper/index.native.js +25 -6
  120. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  121. package/dist/cjs/fields/Switch/footprint.cjs +54 -0
  122. package/dist/cjs/fields/Switch/footprint.native.js +57 -0
  123. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -0
  124. package/dist/cjs/fields/Switch/index.cjs +60 -43
  125. package/dist/cjs/fields/Switch/index.native.js +60 -50
  126. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  127. package/dist/cjs/fields/TextArea/index.cjs +6 -3
  128. package/dist/cjs/fields/TextArea/index.native.js +6 -3
  129. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  130. package/dist/cjs/fields/TimePicker/catalog.cjs +1 -0
  131. package/dist/cjs/fields/TimePicker/catalog.native.js +1 -0
  132. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  133. package/dist/cjs/fields/TimePicker/parts.cjs +5 -0
  134. package/dist/cjs/fields/TimePicker/parts.native.js +7 -0
  135. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  136. package/dist/cjs/index.cjs +12 -0
  137. package/dist/cjs/index.native.js +12 -0
  138. package/dist/cjs/index.native.js.map +1 -1
  139. package/dist/cjs/shared/panelPortal.cjs +52 -0
  140. package/dist/cjs/shared/panelPortal.native.js +65 -0
  141. package/dist/cjs/shared/panelPortal.native.js.map +1 -0
  142. package/dist/cjs/shared/pressSlopProps.cjs +16 -11
  143. package/dist/cjs/shared/pressSlopProps.native.js +18 -12
  144. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  145. package/dist/cjs/shared/utils.cjs +2 -2
  146. package/dist/cjs/shared/utils.native.js +3 -2
  147. package/dist/cjs/shared/utils.native.js.map +1 -1
  148. package/dist/cjs/themedPrimitives.cjs +15 -2
  149. package/dist/cjs/themedPrimitives.native.js +16 -3
  150. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  151. package/dist/esm/AdaptivePopup/index.mjs +0 -10
  152. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  153. package/dist/esm/AdaptivePopup/index.native.js +0 -10
  154. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  155. package/dist/esm/Button/index.mjs +6 -3
  156. package/dist/esm/Button/index.mjs.map +1 -1
  157. package/dist/esm/Button/index.native.js +6 -3
  158. package/dist/esm/Button/index.native.js.map +1 -1
  159. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
  160. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  161. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js +3 -12
  162. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  163. package/dist/esm/ContextualSaveBar/index.mjs +13 -11
  164. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  165. package/dist/esm/ContextualSaveBar/index.native.js +13 -20
  166. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  167. package/dist/esm/FieldDisplay/index.mjs +24 -12
  168. package/dist/esm/FieldDisplay/index.mjs.map +1 -1
  169. package/dist/esm/FieldDisplay/index.native.js +25 -13
  170. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  171. package/dist/esm/FloatingPanel/PanelPortal.mjs +119 -0
  172. package/dist/esm/FloatingPanel/PanelPortal.mjs.map +1 -0
  173. package/dist/esm/FloatingPanel/PanelPortal.native.js +14 -0
  174. package/dist/esm/FloatingPanel/PanelPortal.native.js.map +1 -0
  175. package/dist/esm/FloatingPanel/index.mjs +117 -69
  176. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  177. package/dist/esm/FloatingPanel/index.native.js +68 -13
  178. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  179. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +4 -2
  180. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  181. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +4 -2
  182. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  183. package/dist/esm/Form/index.mjs +2 -1
  184. package/dist/esm/Form/index.mjs.map +1 -1
  185. package/dist/esm/Form/index.native.js +2 -1
  186. package/dist/esm/Form/index.native.js.map +1 -1
  187. package/dist/esm/Form/submissionController.mjs +49 -0
  188. package/dist/esm/Form/submissionController.mjs.map +1 -0
  189. package/dist/esm/Form/submissionController.native.js +71 -0
  190. package/dist/esm/Form/submissionController.native.js.map +1 -0
  191. package/dist/esm/InputParts/index.mjs +67 -13
  192. package/dist/esm/InputParts/index.mjs.map +1 -1
  193. package/dist/esm/InputParts/index.native.js +73 -13
  194. package/dist/esm/InputParts/index.native.js.map +1 -1
  195. package/dist/esm/Wheel/index.mjs +0 -2
  196. package/dist/esm/Wheel/index.mjs.map +1 -1
  197. package/dist/esm/Wheel/index.native.js +0 -2
  198. package/dist/esm/Wheel/index.native.js.map +1 -1
  199. package/dist/esm/fields/Barcode/BarcodePreview.mjs +19 -16
  200. package/dist/esm/fields/Barcode/BarcodePreview.mjs.map +1 -1
  201. package/dist/esm/fields/Barcode/BarcodePreview.native.js +22 -19
  202. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  203. package/dist/esm/fields/Barcode/qr.native.js +34 -34
  204. package/dist/esm/fields/Checkbox/Checkbox.mjs +2 -4
  205. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  206. package/dist/esm/fields/Checkbox/Checkbox.native.js +2 -4
  207. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  208. package/dist/esm/fields/Checkbox/CheckboxBox.mjs +3 -4
  209. package/dist/esm/fields/Checkbox/CheckboxBox.mjs.map +1 -1
  210. package/dist/esm/fields/Checkbox/CheckboxBox.native.js +3 -4
  211. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  212. package/dist/esm/fields/ColorPicker/index.mjs +2 -0
  213. package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
  214. package/dist/esm/fields/ColorPicker/index.native.js +2 -0
  215. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  216. package/dist/esm/fields/ColorPicker/parts.mjs +1 -0
  217. package/dist/esm/fields/ColorPicker/parts.mjs.map +1 -1
  218. package/dist/esm/fields/ColorPicker/parts.native.js +1 -0
  219. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  220. package/dist/esm/fields/Combobox/index.mjs +197 -191
  221. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  222. package/dist/esm/fields/Combobox/index.native.js +205 -199
  223. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  224. package/dist/esm/fields/DatePicker/DateRangePicker.mjs +5 -5
  225. package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  226. package/dist/esm/fields/DatePicker/DateRangePicker.native.js +5 -5
  227. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  228. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +3 -1
  229. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  230. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +3 -1
  231. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  232. package/dist/esm/fields/Duration/index.mjs +3 -1
  233. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  234. package/dist/esm/fields/Duration/index.native.js +3 -1
  235. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  236. package/dist/esm/fields/FileUpload/index.mjs +5 -3
  237. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  238. package/dist/esm/fields/FileUpload/index.native.js +5 -3
  239. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  240. package/dist/esm/fields/FileUpload/nativePickerLoader.mjs +7 -3
  241. package/dist/esm/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
  242. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js +7 -3
  243. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  244. package/dist/esm/fields/Geolocation/GeolocationMap.mjs +3 -0
  245. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  246. package/dist/esm/fields/Geolocation/geocoderContext.mjs +44 -0
  247. package/dist/esm/fields/Geolocation/geocoderContext.mjs.map +1 -0
  248. package/dist/esm/fields/Geolocation/geocoderContext.native.js +45 -0
  249. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -0
  250. package/dist/esm/fields/Geolocation/index.mjs +73 -83
  251. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  252. package/dist/esm/fields/Geolocation/index.native.js +73 -83
  253. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  254. package/dist/esm/fields/Geolocation/photonGeocoder.mjs +112 -0
  255. package/dist/esm/fields/Geolocation/photonGeocoder.mjs.map +1 -0
  256. package/dist/esm/fields/Geolocation/photonGeocoder.native.js +150 -0
  257. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  258. package/dist/esm/fields/Input/index.mjs +3 -1
  259. package/dist/esm/fields/Input/index.mjs.map +1 -1
  260. package/dist/esm/fields/Input/index.native.js +3 -1
  261. package/dist/esm/fields/Input/index.native.js.map +1 -1
  262. package/dist/esm/fields/MentionInput/index.mjs +115 -109
  263. package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
  264. package/dist/esm/fields/MentionInput/index.native.js +127 -121
  265. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  266. package/dist/esm/fields/OTPInput/index.mjs +7 -4
  267. package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
  268. package/dist/esm/fields/OTPInput/index.native.js +7 -4
  269. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  270. package/dist/esm/fields/PhoneInput/index.mjs +6 -3
  271. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  272. package/dist/esm/fields/PhoneInput/index.native.js +6 -3
  273. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  274. package/dist/esm/fields/PhoneInput/phone.mjs +6 -5
  275. package/dist/esm/fields/PhoneInput/phone.mjs.map +1 -1
  276. package/dist/esm/fields/PhoneInput/phone.native.js +7 -6
  277. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  278. package/dist/esm/fields/PhoneInput/regionNames.mjs +249 -0
  279. package/dist/esm/fields/PhoneInput/regionNames.mjs.map +1 -0
  280. package/dist/esm/fields/PhoneInput/regionNames.native.js +249 -0
  281. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -0
  282. package/dist/esm/fields/RadioGroup/index.mjs +3 -7
  283. package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
  284. package/dist/esm/fields/RadioGroup/index.native.js +3 -7
  285. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  286. package/dist/esm/fields/SearchInput/index.mjs +5 -3
  287. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  288. package/dist/esm/fields/SearchInput/index.native.js +5 -3
  289. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  290. package/dist/esm/fields/Select/index.mjs +10 -7
  291. package/dist/esm/fields/Select/index.mjs.map +1 -1
  292. package/dist/esm/fields/Select/index.native.js +10 -7
  293. package/dist/esm/fields/Select/index.native.js.map +1 -1
  294. package/dist/esm/fields/Signature/index.mjs +7 -6
  295. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  296. package/dist/esm/fields/Signature/index.native.js +7 -6
  297. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  298. package/dist/esm/fields/Slider/index.mjs +10 -4
  299. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  300. package/dist/esm/fields/Slider/index.native.js +10 -6
  301. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  302. package/dist/esm/fields/Slider/jumpMotion.mjs +2 -2
  303. package/dist/esm/fields/Slider/jumpMotion.mjs.map +1 -1
  304. package/dist/esm/fields/Slider/jumpMotion.native.js +2 -1
  305. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  306. package/dist/esm/fields/Stepper/index.mjs +24 -5
  307. package/dist/esm/fields/Stepper/index.mjs.map +1 -1
  308. package/dist/esm/fields/Stepper/index.native.js +24 -5
  309. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  310. package/dist/esm/fields/Switch/footprint.mjs +29 -0
  311. package/dist/esm/fields/Switch/footprint.mjs.map +1 -0
  312. package/dist/esm/fields/Switch/footprint.native.js +29 -0
  313. package/dist/esm/fields/Switch/footprint.native.js.map +1 -0
  314. package/dist/esm/fields/Switch/index.mjs +44 -27
  315. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  316. package/dist/esm/fields/Switch/index.native.js +44 -34
  317. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  318. package/dist/esm/fields/TextArea/index.mjs +6 -3
  319. package/dist/esm/fields/TextArea/index.mjs.map +1 -1
  320. package/dist/esm/fields/TextArea/index.native.js +6 -3
  321. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  322. package/dist/esm/fields/TimePicker/catalog.mjs +1 -0
  323. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
  324. package/dist/esm/fields/TimePicker/catalog.native.js +1 -0
  325. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  326. package/dist/esm/fields/TimePicker/parts.mjs +5 -0
  327. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  328. package/dist/esm/fields/TimePicker/parts.native.js +7 -0
  329. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  330. package/dist/esm/index.mjs +6 -1
  331. package/dist/esm/index.mjs.map +1 -1
  332. package/dist/esm/index.native.js +6 -1
  333. package/dist/esm/index.native.js.map +1 -1
  334. package/dist/esm/shared/panelPortal.mjs +24 -0
  335. package/dist/esm/shared/panelPortal.mjs.map +1 -0
  336. package/dist/esm/shared/panelPortal.native.js +34 -0
  337. package/dist/esm/shared/panelPortal.native.js.map +1 -0
  338. package/dist/esm/shared/pressSlopProps.mjs +16 -12
  339. package/dist/esm/shared/pressSlopProps.mjs.map +1 -1
  340. package/dist/esm/shared/pressSlopProps.native.js +18 -13
  341. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  342. package/dist/esm/shared/utils.mjs +2 -2
  343. package/dist/esm/shared/utils.mjs.map +1 -1
  344. package/dist/esm/shared/utils.native.js +3 -2
  345. package/dist/esm/shared/utils.native.js.map +1 -1
  346. package/dist/esm/themedPrimitives.mjs +16 -3
  347. package/dist/esm/themedPrimitives.mjs.map +1 -1
  348. package/dist/esm/themedPrimitives.native.js +17 -4
  349. package/dist/esm/themedPrimitives.native.js.map +1 -1
  350. package/dist/jsx/AdaptivePopup/index.mjs +0 -10
  351. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  352. package/dist/jsx/AdaptivePopup/index.native.js +0 -10
  353. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  354. package/dist/jsx/Button/index.mjs +6 -3
  355. package/dist/jsx/Button/index.mjs.map +1 -1
  356. package/dist/jsx/Button/index.native.js +6 -3
  357. package/dist/jsx/Button/index.native.js.map +1 -1
  358. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
  359. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  360. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
  361. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  362. package/dist/jsx/ContextualSaveBar/index.mjs +13 -11
  363. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  364. package/dist/jsx/ContextualSaveBar/index.native.js +12 -19
  365. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  366. package/dist/jsx/FieldDisplay/index.mjs +24 -12
  367. package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
  368. package/dist/jsx/FieldDisplay/index.native.js +25 -13
  369. package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
  370. package/dist/jsx/FloatingPanel/PanelPortal.mjs +119 -0
  371. package/dist/jsx/FloatingPanel/PanelPortal.mjs.map +1 -0
  372. package/dist/jsx/FloatingPanel/PanelPortal.native.js +43 -0
  373. package/dist/jsx/FloatingPanel/PanelPortal.native.js.map +1 -0
  374. package/dist/jsx/FloatingPanel/index.mjs +117 -69
  375. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  376. package/dist/jsx/FloatingPanel/index.native.js +67 -12
  377. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  378. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +4 -2
  379. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  380. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +4 -2
  381. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  382. package/dist/jsx/Form/index.mjs +2 -1
  383. package/dist/jsx/Form/index.mjs.map +1 -1
  384. package/dist/jsx/Form/index.native.js +2 -1
  385. package/dist/jsx/Form/index.native.js.map +1 -1
  386. package/dist/jsx/Form/submissionController.mjs +49 -0
  387. package/dist/jsx/Form/submissionController.mjs.map +1 -0
  388. package/dist/jsx/Form/submissionController.native.js +99 -0
  389. package/dist/jsx/Form/submissionController.native.js.map +1 -0
  390. package/dist/jsx/InputParts/index.mjs +67 -13
  391. package/dist/jsx/InputParts/index.mjs.map +1 -1
  392. package/dist/jsx/InputParts/index.native.js +72 -12
  393. package/dist/jsx/InputParts/index.native.js.map +1 -1
  394. package/dist/jsx/Wheel/index.mjs +0 -2
  395. package/dist/jsx/Wheel/index.mjs.map +1 -1
  396. package/dist/jsx/Wheel/index.native.js +0 -2
  397. package/dist/jsx/Wheel/index.native.js.map +1 -1
  398. package/dist/jsx/fields/Barcode/BarcodePreview.mjs +19 -16
  399. package/dist/jsx/fields/Barcode/BarcodePreview.mjs.map +1 -1
  400. package/dist/jsx/fields/Barcode/BarcodePreview.native.js +21 -18
  401. package/dist/jsx/fields/Barcode/BarcodePreview.native.js.map +1 -1
  402. package/dist/jsx/fields/Barcode/qr.native.js +34 -34
  403. package/dist/jsx/fields/Checkbox/Checkbox.mjs +2 -4
  404. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  405. package/dist/jsx/fields/Checkbox/Checkbox.native.js +1 -3
  406. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  407. package/dist/jsx/fields/Checkbox/CheckboxBox.mjs +3 -4
  408. package/dist/jsx/fields/Checkbox/CheckboxBox.mjs.map +1 -1
  409. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js +2 -3
  410. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  411. package/dist/jsx/fields/ColorPicker/index.mjs +2 -0
  412. package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
  413. package/dist/jsx/fields/ColorPicker/index.native.js +2 -0
  414. package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
  415. package/dist/jsx/fields/ColorPicker/parts.mjs +1 -0
  416. package/dist/jsx/fields/ColorPicker/parts.mjs.map +1 -1
  417. package/dist/jsx/fields/ColorPicker/parts.native.js +1 -0
  418. package/dist/jsx/fields/ColorPicker/parts.native.js.map +1 -1
  419. package/dist/jsx/fields/Combobox/index.mjs +197 -191
  420. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  421. package/dist/jsx/fields/Combobox/index.native.js +214 -208
  422. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  423. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +5 -5
  424. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  425. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +7 -7
  426. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  427. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +3 -1
  428. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  429. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +6 -4
  430. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  431. package/dist/jsx/fields/Duration/index.mjs +3 -1
  432. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  433. package/dist/jsx/fields/Duration/index.native.js +5 -3
  434. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  435. package/dist/jsx/fields/FileUpload/index.mjs +5 -3
  436. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  437. package/dist/jsx/fields/FileUpload/index.native.js +10 -8
  438. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  439. package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs +7 -3
  440. package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
  441. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js +7 -2
  442. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  443. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs +3 -0
  444. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  445. package/dist/jsx/fields/Geolocation/geocoderContext.mjs +44 -0
  446. package/dist/jsx/fields/Geolocation/geocoderContext.mjs.map +1 -0
  447. package/dist/jsx/fields/Geolocation/geocoderContext.native.js +75 -0
  448. package/dist/jsx/fields/Geolocation/geocoderContext.native.js.map +1 -0
  449. package/dist/jsx/fields/Geolocation/index.mjs +73 -83
  450. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  451. package/dist/jsx/fields/Geolocation/index.native.js +72 -82
  452. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  453. package/dist/jsx/fields/Geolocation/photonGeocoder.mjs +112 -0
  454. package/dist/jsx/fields/Geolocation/photonGeocoder.mjs.map +1 -0
  455. package/dist/jsx/fields/Geolocation/photonGeocoder.native.js +179 -0
  456. package/dist/jsx/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  457. package/dist/jsx/fields/Input/index.mjs +3 -1
  458. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  459. package/dist/jsx/fields/Input/index.native.js +7 -5
  460. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  461. package/dist/jsx/fields/MentionInput/index.mjs +115 -109
  462. package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
  463. package/dist/jsx/fields/MentionInput/index.native.js +130 -124
  464. package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
  465. package/dist/jsx/fields/OTPInput/index.mjs +7 -4
  466. package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
  467. package/dist/jsx/fields/OTPInput/index.native.js +11 -8
  468. package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
  469. package/dist/jsx/fields/PhoneInput/index.mjs +6 -3
  470. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  471. package/dist/jsx/fields/PhoneInput/index.native.js +9 -6
  472. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  473. package/dist/jsx/fields/PhoneInput/phone.mjs +6 -5
  474. package/dist/jsx/fields/PhoneInput/phone.mjs.map +1 -1
  475. package/dist/jsx/fields/PhoneInput/phone.native.js +7 -6
  476. package/dist/jsx/fields/PhoneInput/phone.native.js.map +1 -1
  477. package/dist/jsx/fields/PhoneInput/regionNames.mjs +249 -0
  478. package/dist/jsx/fields/PhoneInput/regionNames.mjs.map +1 -0
  479. package/dist/jsx/fields/PhoneInput/regionNames.native.js +277 -0
  480. package/dist/jsx/fields/PhoneInput/regionNames.native.js.map +1 -0
  481. package/dist/jsx/fields/RadioGroup/index.mjs +3 -7
  482. package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
  483. package/dist/jsx/fields/RadioGroup/index.native.js +2 -6
  484. package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
  485. package/dist/jsx/fields/SearchInput/index.mjs +5 -3
  486. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  487. package/dist/jsx/fields/SearchInput/index.native.js +10 -8
  488. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  489. package/dist/jsx/fields/Select/index.mjs +10 -7
  490. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  491. package/dist/jsx/fields/Select/index.native.js +20 -17
  492. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  493. package/dist/jsx/fields/Signature/index.mjs +7 -6
  494. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  495. package/dist/jsx/fields/Signature/index.native.js +10 -9
  496. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  497. package/dist/jsx/fields/Slider/index.mjs +10 -4
  498. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  499. package/dist/jsx/fields/Slider/index.native.js +21 -17
  500. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  501. package/dist/jsx/fields/Slider/jumpMotion.mjs +2 -2
  502. package/dist/jsx/fields/Slider/jumpMotion.mjs.map +1 -1
  503. package/dist/jsx/fields/Slider/jumpMotion.native.js +2 -1
  504. package/dist/jsx/fields/Slider/jumpMotion.native.js.map +1 -1
  505. package/dist/jsx/fields/Stepper/index.mjs +24 -5
  506. package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
  507. package/dist/jsx/fields/Stepper/index.native.js +25 -6
  508. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  509. package/dist/jsx/fields/Switch/footprint.mjs +29 -0
  510. package/dist/jsx/fields/Switch/footprint.mjs.map +1 -0
  511. package/dist/jsx/fields/Switch/footprint.native.js +57 -0
  512. package/dist/jsx/fields/Switch/footprint.native.js.map +1 -0
  513. package/dist/jsx/fields/Switch/index.mjs +44 -27
  514. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  515. package/dist/jsx/fields/Switch/index.native.js +60 -50
  516. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  517. package/dist/jsx/fields/TextArea/index.mjs +6 -3
  518. package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
  519. package/dist/jsx/fields/TextArea/index.native.js +6 -3
  520. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  521. package/dist/jsx/fields/TimePicker/catalog.mjs +1 -0
  522. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
  523. package/dist/jsx/fields/TimePicker/catalog.native.js +1 -0
  524. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
  525. package/dist/jsx/fields/TimePicker/parts.mjs +5 -0
  526. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  527. package/dist/jsx/fields/TimePicker/parts.native.js +7 -0
  528. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  529. package/dist/jsx/index.js +6 -1
  530. package/dist/jsx/index.js.map +1 -1
  531. package/dist/jsx/index.mjs +6 -1
  532. package/dist/jsx/index.mjs.map +1 -1
  533. package/dist/jsx/index.native.js +12 -0
  534. package/dist/jsx/index.native.js.map +1 -1
  535. package/dist/jsx/shared/panelPortal.mjs +24 -0
  536. package/dist/jsx/shared/panelPortal.mjs.map +1 -0
  537. package/dist/jsx/shared/panelPortal.native.js +65 -0
  538. package/dist/jsx/shared/panelPortal.native.js.map +1 -0
  539. package/dist/jsx/shared/pressSlopProps.mjs +16 -12
  540. package/dist/jsx/shared/pressSlopProps.mjs.map +1 -1
  541. package/dist/jsx/shared/pressSlopProps.native.js +18 -12
  542. package/dist/jsx/shared/pressSlopProps.native.js.map +1 -1
  543. package/dist/jsx/shared/utils.mjs +2 -2
  544. package/dist/jsx/shared/utils.mjs.map +1 -1
  545. package/dist/jsx/shared/utils.native.js +3 -2
  546. package/dist/jsx/shared/utils.native.js.map +1 -1
  547. package/dist/jsx/themedPrimitives.mjs +16 -3
  548. package/dist/jsx/themedPrimitives.mjs.map +1 -1
  549. package/dist/jsx/themedPrimitives.native.js +16 -3
  550. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  551. package/package.json +15 -11
  552. package/src/AdaptivePopup/AdaptivePopup.spec.tsx +2 -3
  553. package/src/AdaptivePopup/index.tsx +11 -10
  554. package/src/Button/Button.borderLadder.spec.tsx +82 -0
  555. package/src/Button/Button.labelInk.spec.tsx +4 -1
  556. package/src/Button/Button.radiusLaw.spec.tsx +153 -0
  557. package/src/Button/index.tsx +6 -3
  558. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +24 -0
  559. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +37 -1
  560. package/src/ContextualSaveBar/UnsavedChangesDialog.tsx +3 -11
  561. package/src/ContextualSaveBar/index.tsx +17 -11
  562. package/src/ErrorSummary.stories.tsx +20 -11
  563. package/src/FieldDisplay/FieldDisplay.spec.tsx +47 -2
  564. package/src/FieldDisplay/index.tsx +21 -13
  565. package/src/FloatingPanel/FloatingPanel.detentLayout.spec.tsx +148 -0
  566. package/src/FloatingPanel/FloatingPanel.spec.tsx +140 -1
  567. package/src/FloatingPanel/FloatingPanel.stories.tsx +86 -1
  568. package/src/FloatingPanel/PanelPortal.native.tsx +15 -0
  569. package/src/FloatingPanel/PanelPortal.tsx +149 -0
  570. package/src/FloatingPanel/index.native.tsx +96 -19
  571. package/src/FloatingPanel/index.tsx +172 -86
  572. package/src/FloatingPanel/panelPortal.spec.tsx +142 -0
  573. package/src/FloatingPanel/panelWidthContract.spec.ts +17 -5
  574. package/src/FloatingPanel/touchRecipeHydration.spec.tsx +82 -0
  575. package/src/FloatingPanel/useFloatingPanel.ts +5 -2
  576. package/src/FloatingPanel/viewportHydration.spec.tsx +118 -0
  577. package/src/Form/index.tsx +2 -1
  578. package/src/Form/submission.spec.tsx +148 -0
  579. package/src/Form/submissionController.spec.ts +73 -0
  580. package/src/Form/submissionController.ts +59 -0
  581. package/src/Form/submissionDiscard.spec.tsx +41 -0
  582. package/src/Form/submissionPaths.spec.tsx +214 -0
  583. package/src/InputParts/index.tsx +48 -12
  584. package/src/Label/Label.stories.tsx +27 -11
  585. package/src/Wheel/Wheel.spec.tsx +9 -2
  586. package/src/Wheel/index.tsx +0 -2
  587. package/src/fieldFamilyStories.radius.spec.tsx +48 -0
  588. package/src/fields/Barcode/BarcodePreview.spec.tsx +32 -12
  589. package/src/fields/Barcode/BarcodePreview.stories.tsx +5 -4
  590. package/src/fields/Barcode/BarcodePreview.tsx +31 -25
  591. package/src/fields/Checkbox/Checkbox.native.spec.tsx +92 -0
  592. package/src/fields/Checkbox/Checkbox.stories.tsx +1 -0
  593. package/src/fields/Checkbox/Checkbox.tsx +2 -2
  594. package/src/fields/Checkbox/CheckboxBox.spec.tsx +13 -13
  595. package/src/fields/Checkbox/CheckboxBox.tsx +7 -1
  596. package/src/fields/ColorPicker/index.tsx +6 -1
  597. package/src/fields/ColorPicker/parts.tsx +1 -0
  598. package/src/fields/Combobox/Combobox.spec.tsx +85 -55
  599. package/src/fields/Combobox/index.tsx +259 -240
  600. package/src/fields/DatePicker/DateRangePicker.tsx +5 -3
  601. package/src/fields/DatePicker/MultiDatePicker.tsx +3 -1
  602. package/src/fields/Duration/index.tsx +3 -1
  603. package/src/fields/FileUpload/index.tsx +13 -3
  604. package/src/fields/FileUpload/nativePickerLoader.spec.ts +34 -0
  605. package/src/fields/FileUpload/nativePickerLoader.ts +11 -2
  606. package/src/fields/Geolocation/Geolocation.spec.tsx +165 -4
  607. package/src/fields/Geolocation/Geolocation.stories.tsx +110 -26
  608. package/src/fields/Geolocation/GeolocationMap.tsx +3 -0
  609. package/src/fields/Geolocation/geocoderContext.tsx +56 -0
  610. package/src/fields/Geolocation/index.tsx +75 -80
  611. package/src/fields/Geolocation/photonGeocoder.spec.ts +214 -0
  612. package/src/fields/Geolocation/photonGeocoder.ts +150 -0
  613. package/src/fields/Input/index.tsx +3 -1
  614. package/src/fields/MentionInput/MentionInput.spec.tsx +41 -30
  615. package/src/fields/MentionInput/index.tsx +128 -119
  616. package/src/fields/OTPInput/index.tsx +7 -4
  617. package/src/fields/PhoneInput/PhoneInput.spec.tsx +63 -0
  618. package/src/fields/PhoneInput/index.tsx +13 -8
  619. package/src/fields/PhoneInput/phone.native.spec.ts +32 -0
  620. package/src/fields/PhoneInput/phone.ts +5 -2
  621. package/src/fields/PhoneInput/regionNames.ts +250 -0
  622. package/src/fields/RadioGroup/RadioGroup.stories.tsx +4 -3
  623. package/src/fields/RadioGroup/index.tsx +3 -2
  624. package/src/fields/Rating/StarInk.native.spec.tsx +1 -1
  625. package/src/fields/SearchInput/index.tsx +4 -3
  626. package/src/fields/Select/Select.spec.tsx +36 -29
  627. package/src/fields/Select/index.tsx +14 -5
  628. package/src/fields/Signature/index.tsx +7 -3
  629. package/src/fields/Slider/index.tsx +14 -4
  630. package/src/fields/Slider/jumpMotion.ts +6 -2
  631. package/src/fields/Stepper/Stepper.spec.tsx +30 -0
  632. package/src/fields/Stepper/index.tsx +34 -4
  633. package/src/fields/Switch/Switch.footprint.native.spec.tsx +58 -0
  634. package/src/fields/Switch/Switch.footprint.spec.tsx +79 -0
  635. package/src/fields/Switch/Switch.radius.spec.tsx +37 -6
  636. package/src/fields/Switch/footprint.ts +45 -0
  637. package/src/fields/Switch/index.tsx +46 -49
  638. package/src/fields/TextArea/TextArea.spec.tsx +30 -1
  639. package/src/fields/TextArea/index.tsx +6 -3
  640. package/src/fields/TimePicker/TimePicker.native.spec.tsx +48 -0
  641. package/src/fields/TimePicker/catalog.tsx +1 -0
  642. package/src/fields/TimePicker/parts.tsx +4 -0
  643. package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +17 -8
  644. package/src/fields/pickerShellPadding.spec.tsx +54 -0
  645. package/src/index.ts +8 -0
  646. package/src/shared/panelPortal.ts +36 -0
  647. package/src/shared/pressSlopProps.spec.ts +27 -1
  648. package/src/shared/pressSlopProps.ts +26 -17
  649. package/src/shared/utils.ts +2 -2
  650. package/src/themedPrimitives.tsx +16 -3
  651. package/types/AdaptivePopup/index.d.ts.map +1 -1
  652. package/types/Button/index.d.ts.map +1 -1
  653. package/types/ContextualSaveBar/UnsavedChangesDialog.d.ts.map +1 -1
  654. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  655. package/types/FieldDisplay/index.d.ts.map +1 -1
  656. package/types/FloatingPanel/PanelPortal.d.ts +24 -0
  657. package/types/FloatingPanel/PanelPortal.d.ts.map +1 -0
  658. package/types/FloatingPanel/PanelPortal.native.d.ts +9 -0
  659. package/types/FloatingPanel/PanelPortal.native.d.ts.map +1 -0
  660. package/types/FloatingPanel/index.d.ts +0 -5
  661. package/types/FloatingPanel/index.d.ts.map +1 -1
  662. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  663. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  664. package/types/Form/index.d.ts.map +1 -1
  665. package/types/Form/submissionController.d.ts +21 -0
  666. package/types/Form/submissionController.d.ts.map +1 -0
  667. package/types/InputParts/index.d.ts +34 -2
  668. package/types/InputParts/index.d.ts.map +1 -1
  669. package/types/Wheel/index.d.ts.map +1 -1
  670. package/types/fields/Barcode/BarcodePreview.d.ts +7 -3
  671. package/types/fields/Barcode/BarcodePreview.d.ts.map +1 -1
  672. package/types/fields/Checkbox/CheckboxBox.d.ts +5 -0
  673. package/types/fields/Checkbox/CheckboxBox.d.ts.map +1 -1
  674. package/types/fields/ColorPicker/index.d.ts.map +1 -1
  675. package/types/fields/ColorPicker/parts.d.ts +2 -0
  676. package/types/fields/ColorPicker/parts.d.ts.map +1 -1
  677. package/types/fields/Combobox/index.d.ts.map +1 -1
  678. package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
  679. package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
  680. package/types/fields/Duration/index.d.ts.map +1 -1
  681. package/types/fields/FileUpload/index.d.ts.map +1 -1
  682. package/types/fields/FileUpload/nativePickerLoader.d.ts +8 -0
  683. package/types/fields/FileUpload/nativePickerLoader.d.ts.map +1 -1
  684. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  685. package/types/fields/Geolocation/geocoderContext.d.ts +24 -0
  686. package/types/fields/Geolocation/geocoderContext.d.ts.map +1 -0
  687. package/types/fields/Geolocation/index.d.ts +2 -1
  688. package/types/fields/Geolocation/index.d.ts.map +1 -1
  689. package/types/fields/Geolocation/photonGeocoder.d.ts +46 -0
  690. package/types/fields/Geolocation/photonGeocoder.d.ts.map +1 -0
  691. package/types/fields/Input/index.d.ts +19 -1
  692. package/types/fields/Input/index.d.ts.map +1 -1
  693. package/types/fields/MentionInput/index.d.ts.map +1 -1
  694. package/types/fields/OTPInput/index.d.ts +1 -1
  695. package/types/fields/OTPInput/index.d.ts.map +1 -1
  696. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  697. package/types/fields/PhoneInput/phone.d.ts.map +1 -1
  698. package/types/fields/PhoneInput/regionNames.d.ts +2 -0
  699. package/types/fields/PhoneInput/regionNames.d.ts.map +1 -0
  700. package/types/fields/RadioGroup/index.d.ts.map +1 -1
  701. package/types/fields/SearchInput/index.d.ts.map +1 -1
  702. package/types/fields/Select/index.d.ts.map +1 -1
  703. package/types/fields/Signature/index.d.ts.map +1 -1
  704. package/types/fields/Slider/index.d.ts.map +1 -1
  705. package/types/fields/Slider/jumpMotion.d.ts +1 -1
  706. package/types/fields/Slider/jumpMotion.d.ts.map +1 -1
  707. package/types/fields/Stepper/index.d.ts +6 -0
  708. package/types/fields/Stepper/index.d.ts.map +1 -1
  709. package/types/fields/Switch/footprint.d.ts +12 -0
  710. package/types/fields/Switch/footprint.d.ts.map +1 -0
  711. package/types/fields/Switch/index.d.ts.map +1 -1
  712. package/types/fields/TextArea/index.d.ts.map +1 -1
  713. package/types/fields/TimePicker/catalog.d.ts.map +1 -1
  714. package/types/fields/TimePicker/parts.d.ts.map +1 -1
  715. package/types/index.d.ts +8 -0
  716. package/types/index.d.ts.map +1 -1
  717. package/types/shared/panelPortal.d.ts +13 -0
  718. package/types/shared/panelPortal.d.ts.map +1 -0
  719. package/types/shared/pressSlopProps.d.ts +9 -2
  720. package/types/shared/pressSlopProps.d.ts.map +1 -1
  721. package/types/shared/utils.d.ts +1 -1
  722. package/types/shared/utils.d.ts.map +1 -1
  723. package/types/themedPrimitives.d.ts +48 -1
  724. package/types/themedPrimitives.d.ts.map +1 -1
@@ -1,3 +1,4 @@
1
+ import { useTouchSurface } from "@multiplatform.one/theme";
1
2
  import type { ReactNode } from "react";
2
3
  import { useEffect, useLayoutEffect, useRef, useState } from "react";
3
4
  import type { AnyFormApi } from "../../types";
@@ -24,8 +25,8 @@ import {
24
25
  borderRadiusMap,
25
26
  contrastRatio,
26
27
  ensureFocusVisibleRing,
27
- isTouchSurface,
28
28
  normalizeToHex,
29
+ radiusResolutionProps,
29
30
  relativeLuminance,
30
31
  resolveRadiusClass,
31
32
  sizeRecipeForToken,
@@ -33,6 +34,7 @@ import {
33
34
  wasKeyboardFocus,
34
35
  ensureKeyboardModalityTracking,
35
36
  type BorderRadius,
37
+ type RadiusResolutionDeclaration,
36
38
  } from "@multiplatform.one/theme";
37
39
  import { commitImmediateField } from "../../ContextualSaveBar/commitImmediateField";
38
40
  import { useFormSaveMode } from "../../Form";
@@ -48,7 +50,9 @@ import {
48
50
  useFormField,
49
51
  useResolvedValidators,
50
52
  } from "../../shared/utils";
53
+ import { pressSlopProps } from "../../shared/pressSlopProps";
51
54
  import { useIsInTableCell } from "../../shared/tableCellContext";
55
+ import { switchFootprint, type SwitchFootprint } from "./footprint";
52
56
 
53
57
  /** Pointer travel (px) before a gesture counts as thumb-drag instead of click. */
54
58
  const SWITCH_DRAG_INTENT_PX = 10;
@@ -56,14 +60,6 @@ const SWITCH_DRAG_INTENT_PX = 10;
56
60
  /** Minimum pressable height for the switch inside table cells (SP-FIXED). */
57
61
  const SWITCH_CELL_TARGET_HEIGHT = 44;
58
62
 
59
- /**
60
- * Apple / Material 3 / Polaris: the thumb floats inside the track (≈2px
61
- * gutter), never flush to the rim. Shrinks on tiny sizes so the handle
62
- * stays ≥10px.
63
- */
64
- const switchThumbInset = (trackInner: number) =>
65
- Math.min(2, Math.max(0, Math.floor((trackInner - 10) / 2)));
66
-
67
63
  /** `animation=none` resolves to undefined — do not fall back to `quick`. */
68
64
  const resolveSwitchMotion = (token: string | undefined) =>
69
65
  token && token !== "none" ? token : "none";
@@ -94,25 +90,14 @@ const stripOutlineFromState = (props?: Record<string, any>) => {
94
90
  // ─── Switch internals ─────────────────────────────────────────────────────────
95
91
 
96
92
  /**
97
- * Switch geometry rides the GENERATED size recipe (LC-75 / LC-80): the
98
- * painted TRACK equals the family height for the token (track = thumb slot +
99
- * 2×border), so a `$4` switch is exactly as tall as a `$4` input (32).
100
- * Previously thumb/track indexed the flat Tamagui size ramp (getSize × 0.65)
101
- * — the independent-position drift LC-75 bans. The styled fallbacks assume
102
- * the 1px hairline track border; the component passes exact frameProps with
103
- * the live knob borderWidth. Touch keeps the DESKTOP recipe for the painted
104
- * track (a 44px-tall painted switch is not a control anyone ships) and
105
- * restores the 44 floor on the PRESSABLE frame via grown-target mode below.
93
+ * The painted track is `switchFootprint` of the recipe height (LC-91), never
94
+ * the recipe height itself. The styled fallbacks assume the 1px hairline
95
+ * track border; the component passes exact frameProps with the live knob
96
+ * borderWidth. The 44 press floor lands on the PRESSABLE frame (grown-target
97
+ * mode on touch and in cells, press slop on a fine pointer), never on paint.
106
98
  */
107
99
  const SWITCH_TRACK_BORDER_FALLBACK = 1;
108
100
 
109
- const getSwitchTrackHeight = (val: SizeTokens) => sizeRecipeForToken(String(val)).height;
110
-
111
- const getSwitchThumbHeight = (
112
- val: SizeTokens,
113
- borderWidth: number = SWITCH_TRACK_BORDER_FALLBACK,
114
- ) => getSwitchTrackHeight(val) - borderWidth * 2;
115
-
116
101
  const resolveRadiusValue = (radius: unknown) => {
117
102
  if (typeof radius === "number") return radius;
118
103
  if (typeof radius !== "string") return undefined;
@@ -200,8 +185,8 @@ const SwitchThumbStyled = styled(View, {
200
185
 
201
186
  size: {
202
187
  "...size": (val) => {
203
- const size = getSwitchThumbHeight(val);
204
- return { height: size, width: size };
188
+ const { thumbSize } = switchFootprint(String(val), SWITCH_TRACK_BORDER_FALLBACK);
189
+ return { height: thumbSize, width: thumbSize };
205
190
  },
206
191
  },
207
192
  } as const,
@@ -246,9 +231,11 @@ const SwitchFrameStyled = styled(View, {
246
231
 
247
232
  size: {
248
233
  "...size": (val) => {
249
- const height = getSwitchTrackHeight(val);
250
- const width = getSwitchThumbHeight(val) * 2 + SWITCH_TRACK_BORDER_FALLBACK * 2;
251
- return { height, minHeight: height, width };
234
+ const { trackHeight, trackWidth } = switchFootprint(
235
+ String(val),
236
+ SWITCH_TRACK_BORDER_FALLBACK,
237
+ );
238
+ return { height: trackHeight, minHeight: trackHeight, width: trackWidth };
252
239
  },
253
240
  },
254
241
  } as const,
@@ -369,7 +356,7 @@ type SwitchControlProps = {
369
356
  hasError?: boolean;
370
357
  id: string;
371
358
  sizeToken: SizeTokens;
372
- thumbHeight: number;
359
+ footprint: SwitchFootprint;
373
360
  thumbRadius: number;
374
361
  transition?: string;
375
362
  frameProps: Record<string, any>;
@@ -410,6 +397,8 @@ type SwitchControlProps = {
410
397
  pressStyle?: Record<string, any>;
411
398
  focusStyle?: Record<string, any>;
412
399
  };
400
+ /** BINARY declaration for the thumb and the cell track; absent under a radius override. */
401
+ radiusResolution?: RadiusResolutionDeclaration;
413
402
  };
414
403
 
415
404
  function SwitchControl({
@@ -422,7 +411,7 @@ function SwitchControl({
422
411
  hasError,
423
412
  id,
424
413
  sizeToken,
425
- thumbHeight,
414
+ footprint,
426
415
  thumbRadius,
427
416
  transition,
428
417
  frameProps,
@@ -442,6 +431,7 @@ function SwitchControl({
442
431
  ariaLabel,
443
432
  ariaLabelledBy,
444
433
  cellTrack,
434
+ radiusResolution,
445
435
  }: SwitchControlProps) {
446
436
  if (isWeb) {
447
437
  ensureKeyboardModalityTracking();
@@ -451,11 +441,8 @@ function SwitchControl({
451
441
  const outlined = knobProps.outlined;
452
442
  const trackOffFill = outlined ? "transparent" : formSwitchColors.track.off;
453
443
  const trackOffBorder = formControlColors.boundary;
454
- const thumbInset = switchThumbInset(thumbHeight);
455
- const thumbSize = thumbHeight - thumbInset * 2;
444
+ const { thumbInset, thumbSize, travel: dragDistance } = footprint;
456
445
  const motion = resolveSwitchMotion(transition);
457
- // Travel distance for a 2:1 track (inner width − thumb − gutters = thumb height).
458
- const dragDistance = thumbHeight;
459
446
  const [dragX, setDragX] = useState<number | null>(null);
460
447
  // Hold snapped thumb until the controlled `checked` prop catches up (avoids flash).
461
448
  const [snapChecked, setSnapChecked] = useState<boolean | null>(null);
@@ -677,6 +664,7 @@ function SwitchControl({
677
664
  y={-cellTrack.height / 2}
678
665
  height={cellTrack.height}
679
666
  borderRadius={cellTrack.borderRadius}
667
+ {...radiusResolution}
680
668
  borderWidth={cellTrack.borderWidth}
681
669
  borderColor={displayChecked ? formSwitchColors.track.on : trackOffBorder}
682
670
  backgroundColor={displayChecked ? formSwitchColors.track.on : trackOffFill}
@@ -693,6 +681,7 @@ function SwitchControl({
693
681
  {rightIcon && <StyledSwitch.Icon placement="right">{rightIcon}</StyledSwitch.Icon>}
694
682
  <StyledSwitch.Thumb
695
683
  borderRadius={thumbRadius}
684
+ {...radiusResolution}
696
685
  width={thumbSize}
697
686
  height={thumbSize}
698
687
  // Own position so drag can override Tamagui's initialChecked alignSelf/x math.
@@ -791,6 +780,7 @@ export function Switch({
791
780
  compact,
792
781
  minTargetHeight,
793
782
  }: SwitchProps) {
783
+ const hydrationTouch = useTouchSurface();
794
784
  // Canonical `onChange` and the alias `onCheckedChange` both fire; standalone
795
785
  // (formless) callers get real toggling from either name.
796
786
  const handleValueChange = (val: boolean) => {
@@ -817,12 +807,12 @@ export function Switch({
817
807
 
818
808
  // Coordinated geometry (LC-10): ONE size token drives the control (track,
819
809
  // thumb) AND the row slot, so an explicit `size` prop can never make the
820
- // control outgrow its own row. Track = recipe height (LC-75); the thumb
821
- // rides inside it.
810
+ // control outgrow its own row. The row is the recipe height (LC-75); the
811
+ // track is the platform switch's fraction of it (LC-91).
822
812
  const sizeToken = (size ?? knobProps.sizeToken) as SizeTokens;
823
813
  const borderWidth = knobProps.borderRadius.borderWidth ?? 1;
824
- const thumbHeight = getSwitchThumbHeight(sizeToken, borderWidth);
825
- const trackHeight = thumbHeight + borderWidth * 2;
814
+ const footprint = switchFootprint(String(sizeToken), borderWidth);
815
+ const { trackHeight, trackWidth } = footprint;
826
816
  // Grown-target mode (SP-FIXED): table cells always grow the pressable
827
817
  // frame to 44px; standalone consumers opt in via `minTargetHeight`; touch
828
818
  // surfaces get the LC-77 44px floor on the PRESSABLE frame while the
@@ -833,7 +823,7 @@ export function Switch({
833
823
  ? SWITCH_CELL_TARGET_HEIGHT
834
824
  : minTargetHeight !== undefined
835
825
  ? Math.max(minTargetHeight, trackHeight)
836
- : isTouchSurface() && trackHeight < TOUCH_HEIGHT_FLOOR
826
+ : hydrationTouch && trackHeight < TOUCH_HEIGHT_FLOOR
837
827
  ? TOUCH_HEIGHT_FLOOR
838
828
  : undefined;
839
829
  const grownTarget = targetHeight !== undefined;
@@ -848,8 +838,7 @@ export function Switch({
848
838
  ) => {
849
839
  const overrideRadius = (switchProps as any)?.borderRadius;
850
840
  const radiusStop = resolveSwitchRadiusStop(pointy, knobProps.borderRadius.borderRadius);
851
- const thumbInset = switchThumbInset(thumbHeight);
852
- const thumbPaintedHeight = thumbHeight - thumbInset * 2;
841
+ const thumbPaintedHeight = footprint.thumbSize;
853
842
  const trackRadius =
854
843
  overrideRadius != null
855
844
  ? (resolveRadiusValue(overrideRadius) ?? 1000)
@@ -859,11 +848,17 @@ export function Switch({
859
848
  ? (resolveRadiusValue(overrideRadius) ?? 1000)
860
849
  : resolveRadiusClass("BINARY", radiusStop, { heightPx: thumbPaintedHeight });
861
850
 
851
+ const radiusResolution = overrideRadius == null ? radiusResolutionProps("BINARY") : undefined;
862
852
  let frameProps: Record<string, any> = {
863
853
  borderRadius: overrideRadius ?? trackRadius,
864
- height: thumbHeight + borderWidth * 2,
865
- minHeight: thumbHeight + borderWidth * 2,
866
- width: thumbHeight * 2 + borderWidth * 2,
854
+ height: trackHeight,
855
+ minHeight: trackHeight,
856
+ width: trackWidth,
857
+ ...pressSlopProps(
858
+ trackHeight,
859
+ !grownTarget,
860
+ trackWidth >= TOUCH_HEIGHT_FLOOR ? "vertical" : "both",
861
+ ),
867
862
  };
868
863
 
869
864
  // Grown-target mode (SP-FIXED): grow the pressable frame (44px in cells,
@@ -944,12 +939,14 @@ export function Switch({
944
939
  } else if (switchChecked) {
945
940
  frameProps = {
946
941
  ...frameProps,
942
+ ...radiusResolution,
947
943
  backgroundColor: formSwitchColors.track.on,
948
944
  borderColor: formSwitchColors.track.on,
949
945
  };
950
946
  } else {
951
947
  frameProps = {
952
948
  ...frameProps,
949
+ ...radiusResolution,
953
950
  backgroundColor: knobProps.outlined ? "transparent" : formSwitchColors.track.off,
954
951
  borderColor: formControlColors.boundary,
955
952
  };
@@ -980,7 +977,7 @@ export function Switch({
980
977
  hasError={hasError}
981
978
  id={id}
982
979
  sizeToken={sizeToken}
983
- thumbHeight={thumbHeight}
980
+ footprint={footprint}
984
981
  thumbRadius={thumbRadius}
985
982
  transition={resolveSwitchMotion(knobProps.transition as string | undefined)}
986
983
  frameProps={frameProps}
@@ -989,6 +986,7 @@ export function Switch({
989
986
  rightIcon={rightIcon}
990
987
  inputSurface={grownTarget ? {} : knobProps.inputSurface}
991
988
  cellTrack={cellTrack}
989
+ radiusResolution={radiusResolution}
992
990
  accessibilityLabel={
993
991
  typeof label === "string" ? `${label}${required ? " *" : ""}` : ariaLabel
994
992
  }
@@ -1017,7 +1015,7 @@ export function Switch({
1017
1015
 
1018
1016
  if (elevationWrapperProps.elevation && !grownTarget) {
1019
1017
  return (
1020
- <View {...elevationWrapperProps} borderRadius={trackRadius}>
1018
+ <View {...elevationWrapperProps} borderRadius={trackRadius} {...radiusResolution}>
1021
1019
  {switchElement}
1022
1020
  </View>
1023
1021
  );
@@ -1033,7 +1031,6 @@ export function Switch({
1033
1031
  // deterministic px label width — never % inside this auto-width row
1034
1032
  // (%-width collapses and overflows the next sibling).
1035
1033
  const skeletonStop = resolveSwitchRadiusStop(pointy, knobProps.borderRadius.borderRadius);
1036
- const trackWidth = thumbHeight * 2 + borderWidth * 2;
1037
1034
  return (
1038
1035
  <FieldLayout id={id} size={size} knobProps={knobProps} compactSpacing>
1039
1036
  <XStack {...knobProps.gap} alignItems="center" height={sizeToken}>
@@ -1,7 +1,7 @@
1
1
  import { useForm } from "@tanstack/react-form";
2
2
  import { act, fireEvent, waitFor } from "@testing-library/react";
3
3
  import { Preset } from "@multiplatform.one/theme";
4
- import { YStack } from "tamagui";
4
+ import { Theme, YStack } from "tamagui";
5
5
  import { describe, expect, it, vi } from "vitest";
6
6
  import { renderWithProviders } from "@multiplatform.one/test-utils";
7
7
  import { Form } from "../../Form";
@@ -406,6 +406,18 @@ describe("TextArea", () => {
406
406
  expect(fullClasses.join(" ")).not.toMatch(/t-radius-12/);
407
407
  });
408
408
 
409
+ it("declares the cap on the painted box with the knob stops it resolved", () => {
410
+ const result = renderWithProviders(
411
+ <Preset overrides={{ borderRadius: "full", space: "small" }}>
412
+ <TextArea label="Notes" defaultValue="x" />
413
+ </Preset>,
414
+ );
415
+ const box = result.container.querySelector("textarea")?.closest(".mp-composite-ring");
416
+ expect(box?.getAttribute("data-constraint-container")).toBe("TextArea");
417
+ expect(box?.getAttribute("data-radius-knob")).toBe("full");
418
+ expect(box?.getAttribute("data-space-knob")).toBe("small");
419
+ });
420
+
409
421
  it("caps large under space=small at the padding px", () => {
410
422
  const result = renderWithProviders(
411
423
  <Preset overrides={{ borderRadius: "large", space: "small" }}>
@@ -414,6 +426,23 @@ describe("TextArea", () => {
414
426
  );
415
427
  expect(boxRadiusClasses(result.container as HTMLElement)).toEqual(["_btlr-13px"]);
416
428
  });
429
+
430
+ it("caps full at the padding px in both schemes, never at the $4 clamp", () => {
431
+ for (const scheme of ["light", "dark"] as const) {
432
+ const ui = (
433
+ <Preset overrides={{ borderRadius: "full", space: "medium" }}>
434
+ <TextArea label="Notes" defaultValue="x" />
435
+ </Preset>
436
+ );
437
+ const result = renderWithProviders(
438
+ scheme === "dark" ? <Theme name="dark">{ui}</Theme> : ui,
439
+ );
440
+ const classes = boxRadiusClasses(result.container as HTMLElement);
441
+ expect(classes, scheme).toEqual(["_btlr-18px"]);
442
+ expect(classes.join(" "), scheme).not.toMatch(/t-radius-(4|12)/);
443
+ result.unmount();
444
+ }
445
+ });
417
446
  });
418
447
 
419
448
  describe("LC-20 skeleton mirrors anatomy", () => {
@@ -1,3 +1,4 @@
1
+ import { containerCapProps, useTouchSurface } from "@multiplatform.one/theme";
1
2
  import type { ComponentProps, Ref, RefObject, ReactNode } from "react";
2
3
  import { useCallback, useEffect, useRef, useState } from "react";
3
4
  import type { AnyFormApi } from "../../types";
@@ -89,6 +90,7 @@ export function TextArea({
89
90
  skeleton,
90
91
  compact,
91
92
  }: TextAreaProps) {
93
+ const hydrationTouch = useTouchSurface();
92
94
  const { resolvedForm, knobProps, id } = useFormField({ form: formProp, id: idProp, compact });
93
95
  const resolvedValidators = useResolvedValidators(required, validators, label, name);
94
96
  const theme = useTheme();
@@ -100,8 +102,8 @@ export function TextArea({
100
102
  const [autoHeight, setAutoHeight] = useState<number | undefined>(undefined);
101
103
 
102
104
  const resolvedSize = (size ?? knobProps.sizeToken) as SizeTokens;
103
- const minHeightPx = getFieldHeight(resolvedSize, minRows || 3);
104
- const maxHeightPx = getFieldHeight(resolvedSize, maxRows);
105
+ const minHeightPx = getFieldHeight(resolvedSize, minRows || 3, hydrationTouch);
106
+ const maxHeightPx = getFieldHeight(resolvedSize, maxRows, hydrationTouch);
105
107
  // Polaris/GOV.UK: a declared limit always surfaces a live count. Explicit
106
108
  // `showCount={false}` ejects.
107
109
  const showCharacterCount = showCount ?? maxLength != null;
@@ -215,7 +217,7 @@ export function TextArea({
215
217
  | "hidden",
216
218
  }
217
219
  : numberOfLines
218
- ? { numberOfLines, minHeight: getFieldHeight(resolvedSize, numberOfLines) }
220
+ ? { numberOfLines, minHeight: getFieldHeight(resolvedSize, numberOfLines, hydrationTouch) }
219
221
  : { numberOfLines: minRows, minHeight: minHeightPx };
220
222
 
221
223
  const isControlled = value !== undefined;
@@ -242,6 +244,7 @@ export function TextArea({
242
244
  width="100%"
243
245
  alignItems="stretch"
244
246
  {...knobProps.containerRadius}
247
+ {...containerCapProps("TextArea", knobProps.borderRadius.borderRadius, knobProps.space)}
245
248
  cursor={disabled ? "not-allowed" : "text"}
246
249
  theme={hasError ? "red" : undefined}
247
250
  // LC-40: Box owns the disabled chrome wash (value text stays >= AA);
@@ -0,0 +1,48 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { fireEvent } from "@testing-library/react";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { TimePicker } from "./index.native";
5
+
6
+ vi.mock("tamagui", async (importOriginal) => ({
7
+ ...(await importOriginal<typeof import("tamagui")>()),
8
+ isWeb: false,
9
+ }));
10
+
11
+ vi.mock("../nativeDateTime/OsDateTimeSheet", () => ({
12
+ OsDateTimeSheet: ({ open, onConfirm }: { open: boolean; onConfirm: (date: Date) => void }) =>
13
+ open ? (
14
+ <div role="dialog" aria-label="OS time">
15
+ <button onClick={() => onConfirm(new Date(2026, 2, 5, 14, 30))}>Confirm OS time</button>
16
+ </div>
17
+ ) : null,
18
+ }));
19
+
20
+ const paintedBox = (result: ReturnType<typeof renderWithProviders>) =>
21
+ result.getByTestId("time-picker-glyph").parentElement as HTMLElement;
22
+
23
+ describe("native TimePicker trigger (MPO-363)", () => {
24
+ it("paints the empty trigger across the row with its placeholder", () => {
25
+ const result = renderWithProviders(<TimePicker />);
26
+ expect(getComputedStyle(result.getByRole("button", { name: "Time" })).width).toBe("100%");
27
+ const box = paintedBox(result);
28
+ expect(getComputedStyle(box).flexGrow).toBe("1");
29
+ expect(getComputedStyle(box).minWidth).toBe("0px");
30
+ expect(box.querySelector("input")?.placeholder).toBe("Select time");
31
+ });
32
+
33
+ it("leaves the tap to the native press owner", () => {
34
+ const result = renderWithProviders(<TimePicker />);
35
+ expect(getComputedStyle(result.getByTestId("time-picker-trigger")).pointerEvents).toBe("none");
36
+ });
37
+
38
+ it("renders a picked time inside the same full-row box", () => {
39
+ const onChange = vi.fn();
40
+ const result = renderWithProviders(<TimePicker onChange={onChange} />);
41
+ fireEvent.click(result.getByRole("button", { name: "Time" }));
42
+ fireEvent.click(result.getByRole("button", { name: "Confirm OS time" }));
43
+ expect(onChange).toHaveBeenCalledExactlyOnceWith("14:30");
44
+ const box = paintedBox(result);
45
+ expect(getComputedStyle(box).flexGrow).toBe("1");
46
+ expect(box.querySelector("input")?.value).toBe("2:30 PM");
47
+ });
48
+ });
@@ -182,6 +182,7 @@ export function TimePicker({
182
182
  disabled={disabled}
183
183
  sizing="grow"
184
184
  widthMode="at-least-trigger"
185
+ contentPadding="none"
185
186
  triggerA11y={{
186
187
  label: (typeof label === "string" && label) || t("Time"),
187
188
  value: triggerValue || placeholder,
@@ -150,9 +150,13 @@ export function TimePickerInputTrigger({
150
150
  width="100%"
151
151
  cursor={disabled ? "not-allowed" : "pointer"}
152
152
  data-testid="time-picker-trigger"
153
+ pointerEvents={isWeb ? undefined : "none"}
153
154
  >
154
155
  <InputParts.Box
155
156
  theme={error ? "red" : undefined}
157
+ // Yoga has no intrinsic TextInput width: without this the empty
158
+ // trigger collapses to its clock glyph on native (MPO-363).
159
+ {...(isWeb ? undefined : { flex: 1, minWidth: 0 })}
156
160
  elevation={undefined}
157
161
  onPress={isWeb && !disabled ? onOpen : undefined}
158
162
  {...(disabled ? { opacity: 0.5, pointerEvents: "none" as const } : undefined)}
@@ -3,6 +3,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
3
  import { renderWithProviders } from "@multiplatform.one/test-utils";
4
4
  import {
5
5
  MIN_PRESS_TARGET,
6
+ Preset,
6
7
  createThemesBuilder,
7
8
  defaultAccentTheme,
8
9
  defaultBaseTheme,
@@ -301,9 +302,13 @@ describe("ToggleGroup", () => {
301
302
  return wrapper;
302
303
  }
303
304
 
305
+ // The wrapper only exists to carry a shadow, and the default stop paints
306
+ // none on a control since MPO-96, so these render at elevation medium.
304
307
  it("lays the wrapper out as a row so the segment's zero flex-basis sizes width, not height", () => {
305
308
  const { container } = renderWithHouseThemes(
306
- <ToggleGroup label="Alignment" options={options} defaultValue="left" />,
309
+ <Preset overrides={{ elevation: "medium" }}>
310
+ <ToggleGroup label="Alignment" options={options} defaultValue="left" />
311
+ </Preset>,
307
312
  );
308
313
  const segments = [...container.querySelectorAll("[data-state]")] as HTMLElement[];
309
314
  expect(segments).toHaveLength(3);
@@ -317,12 +322,14 @@ describe("ToggleGroup", () => {
317
322
 
318
323
  it("keeps the row wrapper in the vertical orientation", () => {
319
324
  const { container } = renderWithHouseThemes(
320
- <ToggleGroup
321
- label="Alignment"
322
- options={options}
323
- defaultValue="left"
324
- orientation="vertical"
325
- />,
325
+ <Preset overrides={{ elevation: "medium" }}>
326
+ <ToggleGroup
327
+ label="Alignment"
328
+ options={options}
329
+ defaultValue="left"
330
+ orientation="vertical"
331
+ />
332
+ </Preset>,
326
333
  );
327
334
  const segments = [...container.querySelectorAll("[data-state]")] as HTMLElement[];
328
335
  expect(segments).toHaveLength(3);
@@ -334,7 +341,9 @@ describe("ToggleGroup", () => {
334
341
 
335
342
  it("leaves the group frame flat while the segments carry the shadow (E-FLAT)", () => {
336
343
  const { container } = renderWithHouseThemes(
337
- <ToggleGroup label="Alignment" options={options} defaultValue="left" />,
344
+ <Preset overrides={{ elevation: "medium" }}>
345
+ <ToggleGroup label="Alignment" options={options} defaultValue="left" />
346
+ </Preset>,
338
347
  );
339
348
  const group = container.querySelector('[role="group"]') as HTMLElement;
340
349
  expect(group).toBeTruthy();
@@ -0,0 +1,54 @@
1
+ /**
2
+ * MPO-221: the picker shells hand FloatingPanel `contentPadding="none"`.
3
+ * Each picker owns one compact inset (MPO-262), so the panel adding its own
4
+ * `panelPadding` stacked a second pad around the widget.
5
+ */
6
+
7
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
8
+ import React from "react";
9
+ import { beforeEach, describe, expect, it, vi } from "vitest";
10
+
11
+ const shellProps: Array<Record<string, unknown>> = [];
12
+
13
+ vi.mock("../FloatingPanel", async (importOriginal) => {
14
+ const actual = await importOriginal<typeof import("../FloatingPanel")>();
15
+ return {
16
+ ...actual,
17
+ FloatingPanel: (props: Record<string, unknown>) => {
18
+ shellProps.push(props);
19
+ return React.createElement(
20
+ "div",
21
+ { "data-testid": "shell" },
22
+ props.trigger as React.ReactNode,
23
+ props.children as React.ReactNode,
24
+ );
25
+ },
26
+ };
27
+ });
28
+
29
+ import { ColorPicker } from "./ColorPicker";
30
+ import { DatePicker } from "./DatePicker";
31
+ import { TimePicker } from "./TimePicker";
32
+
33
+ describe("picker shells do not pad around the widget (MPO-221)", () => {
34
+ beforeEach(() => {
35
+ shellProps.length = 0;
36
+ });
37
+
38
+ it("ColorPicker passes contentPadding none and pads its own body", () => {
39
+ const { container } = renderWithProviders(<ColorPicker name="c" label="Color" />);
40
+ expect(shellProps.at(-1)?.contentPadding).toBe("none");
41
+ expect(container.querySelector('[data-testid="color-picker-panel"]')).not.toBeNull();
42
+ });
43
+
44
+ it("TimePicker passes contentPadding none and pads its own panel", () => {
45
+ const { container } = renderWithProviders(<TimePicker name="t" label="Time" />);
46
+ expect(shellProps.at(-1)?.contentPadding).toBe("none");
47
+ expect(container.querySelector('[data-testid="time-picker-panel"]')).not.toBeNull();
48
+ });
49
+
50
+ it("DatePicker passes contentPadding none", () => {
51
+ renderWithProviders(<DatePicker name="d" label="Date" />);
52
+ expect(shellProps.at(-1)?.contentPadding).toBe("none");
53
+ });
54
+ });
package/src/index.ts CHANGED
@@ -227,6 +227,9 @@ export type {
227
227
  ReverseGeocodeQuery,
228
228
  } from "./fields/Geolocation/geocoder";
229
229
  export { resolveGeocoder } from "./fields/Geolocation/geocoder";
230
+ export { GeocoderProvider, useGeocoder } from "./fields/Geolocation/geocoderContext";
231
+ export { createPhotonGeocoder } from "./fields/Geolocation/photonGeocoder";
232
+ export type { PhotonGeocoderOptions } from "./fields/Geolocation/photonGeocoder";
230
233
 
231
234
  export { ImageField } from "./fields/ImageField";
232
235
  export type { ImageFieldProps } from "./fields/ImageField";
@@ -273,6 +276,9 @@ export {
273
276
  panelTransition,
274
277
  panelViewportPadding,
275
278
  } from "./FloatingPanel";
279
+ export { PanelPortal } from "./FloatingPanel/PanelPortal";
280
+ export type { PanelPortalProps } from "./FloatingPanel/PanelPortal";
281
+ export { containsAcrossPanels } from "./shared/panelPortal";
276
282
  export type {
277
283
  FloatingPanelProps,
278
284
  PanelWidthMode,
@@ -347,6 +353,8 @@ export {
347
353
  clampRadiusInStateProps,
348
354
  } from "./shared/utils";
349
355
  export type { ClampRadiusInStatePropsOptions, StatePropsRadiusClass } from "./shared/utils";
356
+ export { pressSlopOutsetProps, pressSlopProps } from "./shared/pressSlopProps";
357
+ export type { PressSlopProps } from "./shared/pressSlopProps";
350
358
 
351
359
  // ── Table Cell Context (for chromeless field rendering) ───────
352
360
  export { TableCellContext, useTableCellContext, useIsInTableCell } from "./shared/tableCellContext";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Web floating panels render through a portal (MPO-335), so a panel's DOM is
3
+ * no longer inside the control that opened it. A `Node.contains` check that
4
+ * decides "inside or outside" follows the portal back to that control here,
5
+ * or a press in a cell editor's dropdown reads as a press outside the cell.
6
+ */
7
+
8
+ export const panelPortalAttribute = "data-fp-portal";
9
+
10
+ const anchors = new WeakMap<Element, Element>();
11
+
12
+ export function registerPanelPortal(portal: Element, anchor: Element): () => void {
13
+ anchors.set(portal, anchor);
14
+ return () => {
15
+ if (anchors.get(portal) === anchor) anchors.delete(portal);
16
+ };
17
+ }
18
+
19
+ /** The element that opened the portaled panel `node` sits in, or null. */
20
+ export function panelPortalAnchor(node: Node): Element | null {
21
+ const element = node instanceof Element ? node : node.parentElement;
22
+ const portal = element?.closest(`[${panelPortalAttribute}]`);
23
+ return portal ? (anchors.get(portal) ?? null) : null;
24
+ }
25
+
26
+ /** `root.contains(target)`, where a portaled panel counts as part of its anchor. */
27
+ export function containsAcrossPanels(root: Node | null | undefined, target: unknown): boolean {
28
+ if (!root || typeof Node === "undefined" || !(target instanceof Node)) return false;
29
+ let node: Node | null = target;
30
+ // Each hop climbs out of one portal; nesting is shallow, the cap stops a cycle.
31
+ for (let hop = 0; node && hop < 32; hop++) {
32
+ if (root.contains(node)) return true;
33
+ node = panelPortalAnchor(node);
34
+ }
35
+ return false;
36
+ }
@@ -1,5 +1,5 @@
1
1
  import { afterEach, describe, expect, it, vi } from "vitest";
2
- import { pressSlopProps } from "./pressSlopProps";
2
+ import { pressSlopOutsetProps, pressSlopProps } from "./pressSlopProps";
3
3
  import { pickerTriggerContract } from "./pickerTriggerContract";
4
4
 
5
5
  const platform = vi.hoisted(() => ({ web: true }));
@@ -37,3 +37,29 @@ describe("press-target deficient dimensions", () => {
37
37
  expect(pressSlopProps(28, true)).toEqual({ hitSlop: { top: 8, bottom: 8, left: 8, right: 8 } });
38
38
  });
39
39
  });
40
+
41
+ describe("pitch-limited outset (LC-54, K12)", () => {
42
+ it("writes the given outset on the vertical axis on web, whatever the painted size", () => {
43
+ expect(pressSlopOutsetProps(4, "vertical")).toEqual({
44
+ "data-mp-press-slop": "4",
45
+ "data-mp-press-axis": "vertical",
46
+ });
47
+ });
48
+ it("floors a fractional outset so the target stays inside its pitch", () => {
49
+ expect(pressSlopOutsetProps(3.5, "vertical")).toEqual({
50
+ "data-mp-press-slop": "3",
51
+ "data-mp-press-axis": "vertical",
52
+ });
53
+ });
54
+ it("writes nothing for an outset under one pixel", () => {
55
+ expect(pressSlopOutsetProps(0, "vertical")).toBeUndefined();
56
+ expect(pressSlopOutsetProps(0.5)).toBeUndefined();
57
+ });
58
+ it("gives native a vertical-only hitSlop", () => {
59
+ platform.web = false;
60
+ expect(pressSlopOutsetProps(3, "vertical")).toEqual({
61
+ hitSlop: { top: 3, bottom: 3, left: 0, right: 0 },
62
+ });
63
+ expect(pressSlopOutsetProps(3)).toEqual({ hitSlop: { top: 3, bottom: 3, left: 3, right: 3 } });
64
+ });
65
+ });