@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
@@ -0,0 +1,59 @@
1
+ interface SubmissionForm {
2
+ handleSubmit(): Promise<void>;
3
+ state: { isSubmitting: boolean; isSubmitSuccessful: boolean };
4
+ }
5
+
6
+ type SubmissionOutcome = "success" | "invalid" | "failed" | "busy";
7
+ type SubmissionSnapshot = Readonly<{ error: string | null; submitting: boolean }>;
8
+
9
+ const controllers = new WeakMap<SubmissionForm, ReturnType<typeof createSubmissionController>>();
10
+
11
+ /** Keep UI submission failures shared without changing the caller's FormApi. */
12
+ export function getFormSubmission(form: SubmissionForm) {
13
+ let controller = controllers.get(form);
14
+ if (!controller) {
15
+ controller = createSubmissionController(form);
16
+ controllers.set(form, controller);
17
+ }
18
+ return controller;
19
+ }
20
+
21
+ function createSubmissionController(form: SubmissionForm) {
22
+ let snapshot: SubmissionSnapshot = { error: null, submitting: false };
23
+ const listeners = new Set<() => void>();
24
+
25
+ const update = (error: string | null, submitting = snapshot.submitting) => {
26
+ if (snapshot.error === error && snapshot.submitting === submitting) return;
27
+ snapshot = { error, submitting };
28
+ listeners.forEach((listener) => listener());
29
+ };
30
+ const reportError = (error: unknown) => {
31
+ const text = error instanceof Error ? error.message : String(error);
32
+ update(text || "network unreachable");
33
+ };
34
+
35
+ return {
36
+ getSnapshot: () => snapshot,
37
+ subscribe(listener: () => void) {
38
+ listeners.add(listener);
39
+ return () => {
40
+ listeners.delete(listener);
41
+ };
42
+ },
43
+ clearError: () => update(null),
44
+ reportError,
45
+ submit(): Promise<SubmissionOutcome> {
46
+ // Set the guard before invoking user code, including synchronous throws.
47
+ if (snapshot.submitting || form.state.isSubmitting) return Promise.resolve("busy");
48
+ update(null, true);
49
+ return Promise.resolve()
50
+ .then(() => form.handleSubmit())
51
+ .then((): SubmissionOutcome => (form.state.isSubmitSuccessful ? "success" : "invalid"))
52
+ .catch((error): SubmissionOutcome => {
53
+ reportError(error);
54
+ return "failed";
55
+ })
56
+ .finally(() => update(snapshot.error, false));
57
+ },
58
+ };
59
+ }
@@ -0,0 +1,41 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { act, fireEvent, waitFor } from "@testing-library/react";
3
+ import { expect, it } from "vitest";
4
+ import { Button } from "../Button";
5
+ import { Input } from "../fields/Input";
6
+ import { Form } from "./index";
7
+
8
+ const refusal = "The record changed. Refresh and retry.";
9
+
10
+ it("keeps a refusal while editing, then clears it on discard or reset", async () => {
11
+ const view = renderWithProviders(
12
+ <Form
13
+ formOptions={{ defaultValues: { name: "Original" } }}
14
+ onSubmit={async () => {
15
+ throw new Error(refusal);
16
+ }}
17
+ saveBar={{ forceVisible: true }}
18
+ >
19
+ <Input name="name" label="Name" />
20
+ <Button action="submit">Submit action</Button>
21
+ <Button action="reset">Reset form</Button>
22
+ </Form>,
23
+ );
24
+ fireEvent.change(view.getByLabelText("Name"), { target: { value: "Edited" } });
25
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Submit action" })));
26
+ await waitFor(() => expect(view.getByText(/Couldn't save/)).toBeTruthy());
27
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Discard" })));
28
+ const keep = await view.findByRole("button", { name: "Keep editing" });
29
+ await act(async () => fireEvent.click(keep));
30
+ expect(view.getByText(/Couldn't save/)).toBeTruthy();
31
+ expect((view.getByLabelText("Name") as HTMLInputElement).value).toBe("Edited");
32
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Discard" })));
33
+ const confirm = await view.findByRole("button", { name: "Discard changes" });
34
+ await act(async () => fireEvent.click(confirm));
35
+ await waitFor(() => expect(view.queryByText(/Couldn't save/)).toBeNull());
36
+ expect((view.getByLabelText("Name") as HTMLInputElement).value).toBe("Original");
37
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Submit action" })));
38
+ await waitFor(() => expect(view.getByText(/Couldn't save/)).toBeTruthy());
39
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Reset form" })));
40
+ await waitFor(() => expect(view.queryByText(/Couldn't save/)).toBeNull());
41
+ });
@@ -0,0 +1,214 @@
1
+ // @vitest-environment jsdom
2
+ /**
3
+ * MPO-275: every way into a form's submission shares one guarded execution and
4
+ * one outcome. The routes are a native submit button, implicit Enter in the
5
+ * only field, Button action=submit, the save bar's Save, and Ctrl-S / Cmd-S.
6
+ */
7
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
8
+ import { act, cleanup, fireEvent, waitFor } from "@testing-library/react";
9
+ import userEvent from "@testing-library/user-event";
10
+ import type { ReactElement } from "react";
11
+ import { afterEach, describe, expect, it, vi } from "vitest";
12
+ import { Button } from "../Button";
13
+ import * as saveBarStories from "../ContextualSaveBar/ContextualSaveBar.stories";
14
+ import { Input } from "../fields/Input";
15
+ import { Form, useFormContext } from "./index";
16
+
17
+ afterEach(cleanup);
18
+
19
+ const routes = ["html", "enter", "action", "save", "ctrl-s", "cmd-s"] as const;
20
+ type Route = (typeof routes)[number];
21
+ const saveBarRoutes: readonly Route[] = ["save", "ctrl-s", "cmd-s"];
22
+
23
+ let formState = () => ({ isDirty: false, submissionAttempts: 0 });
24
+
25
+ function StateProbe() {
26
+ const form = useFormContext();
27
+ formState = () => ({
28
+ isDirty: form.state.isDirty,
29
+ submissionAttempts: form.state.submissionAttempts,
30
+ });
31
+ return null;
32
+ }
33
+
34
+ function PathForm({
35
+ route,
36
+ onSubmit,
37
+ onSaved,
38
+ defaultName = "Original",
39
+ required = false,
40
+ }: {
41
+ route: Route;
42
+ onSubmit: (values: Record<string, unknown>) => unknown;
43
+ onSaved?: (values: Record<string, unknown>) => void;
44
+ defaultName?: string;
45
+ required?: boolean;
46
+ }) {
47
+ return (
48
+ <Form
49
+ formOptions={{ defaultValues: { name: defaultName } }}
50
+ onSubmit={onSubmit as never}
51
+ saveBar={{ forceVisible: true, onSaved }}
52
+ >
53
+ <StateProbe />
54
+ <Input name="name" label="Name" required={required} />
55
+ {route === "html" ? <button type="submit">Submit HTML</button> : null}
56
+ <Button action="submit">Submit action</Button>
57
+ </Form>
58
+ );
59
+ }
60
+
61
+ type View = ReturnType<typeof renderWithProviders>;
62
+
63
+ const nameInput = (view: View) => view.getByLabelText(/^Name/) as HTMLInputElement;
64
+
65
+ async function activate(route: Route, view: View) {
66
+ switch (route) {
67
+ case "html":
68
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Submit HTML" })));
69
+ return;
70
+ case "enter": {
71
+ const user = userEvent.setup();
72
+ await user.type(nameInput(view), "{Enter}");
73
+ return;
74
+ }
75
+ case "action":
76
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Submit action" })));
77
+ return;
78
+ case "save":
79
+ await act(async () => fireEvent.click(view.getByRole("button", { name: "Save" })));
80
+ return;
81
+ case "ctrl-s":
82
+ await act(async () => fireEvent.keyDown(document, { key: "s", ctrlKey: true }));
83
+ return;
84
+ case "cmd-s":
85
+ await act(async () => fireEvent.keyDown(document, { key: "s", metaKey: true }));
86
+ return;
87
+ }
88
+ }
89
+
90
+ describe("every submission path shares one outcome (MPO-275)", () => {
91
+ it.each(routes)(
92
+ "%s: a retry clears the failure while it runs, and a failed retry shows its own",
93
+ async (route) => {
94
+ let rejectRetry!: (error: Error) => void;
95
+ const submit = vi
96
+ .fn()
97
+ .mockRejectedValueOnce(new Error("First refusal."))
98
+ .mockImplementationOnce(
99
+ () =>
100
+ new Promise((_, reject) => {
101
+ rejectRetry = reject;
102
+ }),
103
+ );
104
+ const saved = vi.fn();
105
+ const view = renderWithProviders(
106
+ <PathForm route={route} onSubmit={submit} onSaved={saved} />,
107
+ );
108
+ fireEvent.change(nameInput(view), { target: { value: "Edited" } });
109
+
110
+ await activate(route, view);
111
+ await waitFor(() =>
112
+ expect(view.getByText(/Couldn't save/).textContent).toContain("First refusal."),
113
+ );
114
+ expect(submit).toHaveBeenCalledTimes(1);
115
+
116
+ await activate(route, view);
117
+ await waitFor(() => expect(submit).toHaveBeenCalledTimes(2));
118
+ await waitFor(() => expect(view.queryByText(/First refusal/)).toBeNull());
119
+
120
+ await act(async () => rejectRetry(new Error("Second refusal.")));
121
+ await waitFor(() =>
122
+ expect(view.getByText(/Couldn't save/).textContent).toContain("Second refusal."),
123
+ );
124
+ expect(view.queryByText(/First refusal/)).toBeNull();
125
+ expect(submit).toHaveBeenCalledTimes(2);
126
+ expect(nameInput(view).value).toBe("Edited");
127
+ expect(saved).not.toHaveBeenCalled();
128
+ },
129
+ );
130
+
131
+ it.each(routes)(
132
+ "%s: a validation refusal keeps the field error, the summary and the attempt count",
133
+ async (route) => {
134
+ const submit = vi.fn();
135
+ const saved = vi.fn();
136
+ const view = renderWithProviders(
137
+ <PathForm route={route} onSubmit={submit} onSaved={saved} defaultName="" required />,
138
+ );
139
+
140
+ await activate(route, view);
141
+ await waitFor(() =>
142
+ expect(view.container.querySelector('[data-testid="error-summary"]')?.textContent).toMatch(
143
+ /Name is required/,
144
+ ),
145
+ );
146
+ expect(nameInput(view).getAttribute("aria-invalid")).toBe("true");
147
+ expect(formState().submissionAttempts).toBe(1);
148
+ expect(submit).not.toHaveBeenCalled();
149
+ expect(saved).not.toHaveBeenCalled();
150
+ expect(view.queryByText(/Couldn't save/)).toBeNull();
151
+ },
152
+ );
153
+
154
+ it.each(routes)(
155
+ "%s: a success calls the handler once and keeps its path's success policy",
156
+ async (route) => {
157
+ const submit = vi.fn().mockResolvedValue(undefined);
158
+ const saved = vi.fn();
159
+ const view = renderWithProviders(
160
+ <PathForm route={route} onSubmit={submit} onSaved={saved} />,
161
+ );
162
+ fireEvent.change(nameInput(view), { target: { value: "Edited" } });
163
+
164
+ await activate(route, view);
165
+ await waitFor(() => expect(submit).toHaveBeenCalledTimes(1));
166
+ const viaSaveBar = saveBarRoutes.includes(route);
167
+ await waitFor(() => expect(saved).toHaveBeenCalledTimes(viaSaveBar ? 1 : 0));
168
+ expect(formState().isDirty).toBe(!viaSaveBar);
169
+ expect(nameInput(view).value).toBe("Edited");
170
+ expect(view.queryByText(/Couldn't save/)).toBeNull();
171
+ expect(submit).toHaveBeenCalledTimes(1);
172
+ },
173
+ );
174
+ });
175
+
176
+ describe("the SubmissionPaths story counts onSubmit calls (MPO-275)", () => {
177
+ function mountStory() {
178
+ const story = saveBarStories.SubmissionPaths as { render?: () => ReactElement };
179
+ if (!story.render) throw new Error("SubmissionPaths has no render");
180
+ return renderWithProviders(story.render());
181
+ }
182
+
183
+ const calls = (view: View) => view.getByTestId("submit-calls").textContent;
184
+
185
+ it("adds exactly one call per activation on every path and shows the same refusal", async () => {
186
+ const view = mountStory();
187
+ expect(calls(view)).toBe("onSubmit calls: 0");
188
+ const user = userEvent.setup();
189
+
190
+ const paths: Array<[string, () => Promise<unknown>]> = [
191
+ ["enter", () => user.type(view.getByLabelText("Service name"), "{Enter}")],
192
+ [
193
+ "action",
194
+ () => act(async () => fireEvent.click(view.getByRole("button", { name: "Submit" }))),
195
+ ],
196
+ ["save", () => act(async () => fireEvent.click(view.getByRole("button", { name: "Save" })))],
197
+ ["ctrl-s", () => act(async () => fireEvent.keyDown(document, { key: "s", ctrlKey: true }))],
198
+ ["cmd-s", () => act(async () => fireEvent.keyDown(document, { key: "s", metaKey: true }))],
199
+ ];
200
+
201
+ let expected = 0;
202
+ for (const [, run] of paths) {
203
+ await run();
204
+ expected += 1;
205
+ await waitFor(() => expect(calls(view)).toBe(`onSubmit calls: ${expected}`));
206
+ await waitFor(() =>
207
+ expect(view.getByText(/Couldn't save/).textContent).toContain(
208
+ "The record changed. Refresh and retry.",
209
+ ),
210
+ );
211
+ }
212
+ expect((view.getByLabelText("Service name") as HTMLInputElement).value).toBe("service-example");
213
+ });
214
+ });
@@ -29,6 +29,7 @@ import {
29
29
  ensureFocusVisibleRing,
30
30
  FOCUS_RING_CLIPPED_OFFSET,
31
31
  FOCUS_RING_HALO_OFFSET,
32
+ useTouchSurface,
32
33
  isTouchSurface,
33
34
  recipeFamilies,
34
35
  resolveGlyphPaint,
@@ -70,12 +71,14 @@ function useNativeFieldA11yProps() {
70
71
  const defaultContextValues = {
71
72
  size: "$true" as FontSizeTokens,
72
73
  scaleIcon: 1,
74
+ touch: !isWeb && isTouchSurface(),
73
75
  color: undefined as ColorTokens | string | undefined,
74
76
  };
75
77
 
76
78
  export const InputContext = createStyledContext<{
77
79
  size: FontSizeTokens;
78
80
  scaleIcon: number;
81
+ touch: boolean;
79
82
  color?: ColorTokens | string;
80
83
  }>(defaultContextValues);
81
84
 
@@ -91,8 +94,10 @@ function endCapVariantsFromHeights(heightVariants: Record<string, { height: numb
91
94
 
92
95
  const sizeRecipeEndCapVariants = endCapVariantsFromHeights(recipeFamilies.control.heightVariants);
93
96
 
94
- function sizeRecipeBoxFallback(val: unknown) {
95
- const recipe = sizeRecipeForToken(String(val ?? "$true"), { touch: isTouchSurface() });
97
+ function sizeRecipeBoxFallback(val: unknown, extras: { props: { touch?: boolean } }) {
98
+ const recipe = sizeRecipeForToken(String(val ?? "$true"), {
99
+ touch: extras.props.touch ?? (!isWeb && isTouchSurface()),
100
+ });
96
101
  return {
97
102
  height: recipe.height,
98
103
  paddingHorizontal: recipe.paddingHorizontal,
@@ -100,19 +105,25 @@ function sizeRecipeBoxFallback(val: unknown) {
100
105
  };
101
106
  }
102
107
 
103
- function sizeRecipeTypeFallback(val: unknown) {
108
+ function sizeRecipeTypeFallback(val: unknown, extras: { props: { touch?: boolean } }) {
104
109
  return {
105
- fontSize: sizeRecipeForToken(String(val ?? "$true"), { touch: isTouchSurface() }).fontSize,
110
+ fontSize: sizeRecipeForToken(String(val ?? "$true"), {
111
+ touch: extras.props.touch ?? (!isWeb && isTouchSurface()),
112
+ }).fontSize,
106
113
  };
107
114
  }
108
115
 
109
- function sizeRecipeIconFallback(val: unknown) {
110
- const { iconSize } = sizeRecipeForToken(String(val ?? "$true"), { touch: isTouchSurface() });
116
+ function sizeRecipeIconFallback(val: unknown, extras: { props: { touch?: boolean } }) {
117
+ const { iconSize } = sizeRecipeForToken(String(val ?? "$true"), {
118
+ touch: extras.props.touch ?? (!isWeb && isTouchSurface()),
119
+ });
111
120
  return { width: iconSize, height: iconSize };
112
121
  }
113
122
 
114
- function sizeRecipeEndCapFallback(val: unknown) {
115
- const { height } = sizeRecipeForToken(String(val ?? "$true"), { touch: isTouchSurface() });
123
+ function sizeRecipeEndCapFallback(val: unknown, extras: { props: { touch?: boolean } }) {
124
+ const { height } = sizeRecipeForToken(String(val ?? "$true"), {
125
+ touch: extras.props.touch ?? (!isWeb && isTouchSurface()),
126
+ });
116
127
  return { height, width: height, paddingHorizontal: 0 };
117
128
  }
118
129
 
@@ -350,6 +361,7 @@ const InputGroupFrame = styled(XGroup, {
350
361
  ...(isWeb ? { className: "mp-composite-ring" } : {}),
351
362
 
352
363
  variants: {
364
+ touch: { true: {}, false: {} },
353
365
  unstyled: {
354
366
  false: defaultInputGroupStyles,
355
367
  },
@@ -431,6 +443,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
431
443
  paddingHorizontal?: unknown;
432
444
  };
433
445
  const [focused, setFocused] = useState(false);
446
+ const hydrationTouch = useTouchSurface();
434
447
  const { knobProps, control, disabledState } = useResolvedKnobs();
435
448
  const grouped = useControlGrouped();
436
449
  const inTableCell = useIsInTableCell();
@@ -476,7 +489,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
476
489
  });
477
490
  const sizeToken = String((props as { size?: unknown }).size ?? knobProps.sizeToken);
478
491
  const familyRecipe = sizeRecipeForToken(sizeToken, {
479
- touch: isTouchSurface(),
492
+ touch: hydrationTouch,
480
493
  family: recipeFamily,
481
494
  });
482
495
  const controlFragment =
@@ -520,6 +533,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
520
533
  onPress,
521
534
  disabled,
522
535
  <InputGroupFrame
536
+ touch={hydrationTouch}
523
537
  ref={forwardedRef}
524
538
  borderWidth={0}
525
539
  borderRadius={0}
@@ -559,6 +573,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
559
573
  onPress,
560
574
  disabled,
561
575
  <InputGroupFrame
576
+ touch={hydrationTouch}
562
577
  ref={forwardedRef}
563
578
  borderWidth={0}
564
579
  borderRadius={0}
@@ -600,6 +615,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
600
615
  onPress,
601
616
  disabled,
602
617
  <InputGroupFrame
618
+ touch={hydrationTouch}
603
619
  ref={forwardedRef}
604
620
  {...knobProps.body}
605
621
  size={knobProps.sizeToken}
@@ -721,8 +737,10 @@ export function mapInputModeToKeyboardType(inputMode?: string): MappedKeyboardTy
721
737
  return INPUT_MODE_TO_KEYBOARD[inputMode as keyof typeof INPUT_MODE_TO_KEYBOARD];
722
738
  }
723
739
 
724
- export const inputSizeVariant: SizeVariantSpreadFunction<any> = (val = "$true") => {
725
- const recipe = sizeRecipeForToken(String(val || "$true"), { touch: isTouchSurface() });
740
+ export const inputSizeVariant: SizeVariantSpreadFunction<any> = (val = "$true", extras) => {
741
+ const recipe = sizeRecipeForToken(String(val || "$true"), {
742
+ touch: extras?.props.touch ?? (!isWeb && isTouchSurface()),
743
+ });
726
744
  return {
727
745
  fontSize: recipe.fontSize,
728
746
  // LC-84: Area is chromeless — inset lives on Input.Box / ThemedTextArea.
@@ -759,6 +777,7 @@ const InputFrame = styled(TInput, {
759
777
  outlineColor: "transparent",
760
778
  },
761
779
  variants: {
780
+ touch: { true: {}, false: {} },
762
781
  size: {
763
782
  ...(recipeFamilies.control.typeVariants ?? sizeRecipeTypeVariants),
764
783
  "...size": sizeRecipeTypeFallback,
@@ -776,6 +795,7 @@ const InputAreaImpl = InputFrame.styleable<{
776
795
  onChangeText?: (text: string) => void;
777
796
  }>((areaProps, ref) => {
778
797
  const { setFocused } = FocusContext.useStyledContext();
798
+ const hydrationTouch = useTouchSurface();
779
799
  const { size } = InputContext.useStyledContext();
780
800
  const {
781
801
  secureTextEntry,
@@ -848,6 +868,7 @@ const InputAreaImpl = InputFrame.styleable<{
848
868
  {...(inTableCell ? { minWidth: 0 } : undefined)}
849
869
  >
850
870
  <InputFrame
871
+ touch={hydrationTouch}
851
872
  aria-describedby={fieldDescribedBy}
852
873
  {...nativeA11yProps}
853
874
  ref={ref}
@@ -930,6 +951,7 @@ const InputSection = styled(XGroup.Item, {
930
951
  alignItems: "center",
931
952
  context: InputContext,
932
953
  variants: {
954
+ touch: { true: {}, false: {} },
933
955
  scaleIcon: {
934
956
  ":number": {} as any,
935
957
  },
@@ -956,6 +978,7 @@ const InputButton = styled(TButton, {
956
978
  },
957
979
 
958
980
  variants: {
981
+ touch: { true: {}, false: {} },
959
982
  scaleIcon: {
960
983
  ":number": {} as any,
961
984
  },
@@ -1000,6 +1023,7 @@ const InputGlyphButton = styled(View, {
1000
1023
  focusVisibleStyle: { outlineWidth: 0 },
1001
1024
 
1002
1025
  variants: {
1026
+ touch: { true: {}, false: {} },
1003
1027
  scaleIcon: {
1004
1028
  ":number": {} as any,
1005
1029
  },
@@ -1027,6 +1051,7 @@ const InputButtonImpl = InputButton.styleable<{ glyphRing?: boolean }>((buttonPr
1027
1051
  className?: string;
1028
1052
  };
1029
1053
  const { size: contextSize, color: contextColor } = InputContext.useStyledContext();
1054
+ const hydrationTouch = useTouchSurface();
1030
1055
  const { knobProps } = useResolvedKnobs();
1031
1056
  const theme = useTheme();
1032
1057
  const size = (sizeProp ?? contextSize) as FontSizeTokens;
@@ -1068,11 +1093,12 @@ const InputButtonImpl = InputButton.styleable<{ glyphRing?: boolean }>((buttonPr
1068
1093
  // knob's: a $2 field inside a $4 knob would otherwise ship a 44px stop
1069
1094
  // on a 32px frame. LC-77 keeps the sub-floor case pressable via the
1070
1095
  // caller's hitSlop, never by inflating the cap.
1071
- const square = sizeRecipeForToken(String(size ?? "$true"), { touch: isTouchSurface() }).height;
1096
+ const square = sizeRecipeForToken(String(size ?? "$true"), { touch: hydrationTouch }).height;
1072
1097
  const disabled = (props as { disabled?: boolean }).disabled === true;
1073
1098
  if (isWeb) ensureCompositeFocusRing();
1074
1099
  return (
1075
1100
  <InputGlyphButton
1101
+ touch={hydrationTouch}
1076
1102
  ref={ref as never}
1077
1103
  role="button"
1078
1104
  size={size}
@@ -1104,6 +1130,7 @@ const InputButtonImpl = InputButton.styleable<{ glyphRing?: boolean }>((buttonPr
1104
1130
  const square = knobProps.control.height;
1105
1131
  return (
1106
1132
  <InputButton
1133
+ touch={hydrationTouch}
1107
1134
  ref={decorativeRef}
1108
1135
  size={size}
1109
1136
  height={square}
@@ -1134,6 +1161,7 @@ export const InputIconFrame = styled(View, {
1134
1161
  context: InputContext,
1135
1162
 
1136
1163
  variants: {
1164
+ touch: { true: {}, false: {} },
1137
1165
  scaleIcon: {
1138
1166
  ":number": {} as any,
1139
1167
  },
@@ -1154,6 +1182,7 @@ const InputIcon = InputIconFrame.styleable<{
1154
1182
  adornment?: "leading" | "trailing";
1155
1183
  }>((iconProps, ref) => {
1156
1184
  const { children, color: colorProp, scaleIcon: scaleIconProp, ...props } = iconProps;
1185
+ const hydrationTouch = useTouchSurface();
1157
1186
  const { size = "$true", color: contextColor, scaleIcon = 1 } = InputContext.useStyledContext();
1158
1187
  const { knobProps } = useResolvedKnobs();
1159
1188
  const resolvedScaleIcon = scaleIconProp ?? scaleIcon;
@@ -1170,6 +1199,7 @@ const InputIcon = InputIconFrame.styleable<{
1170
1199
  const getThemedIcon = useGetThemedIcon({ size: iconSize, color: color as any });
1171
1200
  return (
1172
1201
  <InputIconFrame
1202
+ touch={hydrationTouch}
1173
1203
  ref={ref}
1174
1204
  size={size}
1175
1205
  {...knobProps.controlIcon}
@@ -1192,6 +1222,7 @@ export const InputContainerFrame = styled(View, {
1192
1222
  flexDirection: "column",
1193
1223
 
1194
1224
  variants: {
1225
+ touch: { true: {}, false: {} },
1195
1226
  size: {
1196
1227
  // Size is shared with the child parts; layout spacing belongs to space.
1197
1228
  "...size": () => ({}),
@@ -1213,10 +1244,12 @@ export const InputContainerFrame = styled(View, {
1213
1244
  });
1214
1245
 
1215
1246
  const InputContainerImpl = InputContainerFrame.styleable((props, forwardedRef) => {
1247
+ const hydrationTouch = useTouchSurface();
1216
1248
  const { knobProps } = useResolvedKnobs();
1217
1249
  const inTableCell = useIsInTableCell();
1218
1250
  return (
1219
1251
  <InputContainerFrame
1252
+ touch={hydrationTouch}
1220
1253
  ref={forwardedRef}
1221
1254
  size={knobProps.sizeToken}
1222
1255
  {...knobProps.body}
@@ -1238,6 +1271,7 @@ const InputContainerImpl = InputContainerFrame.styleable((props, forwardedRef) =
1238
1271
  const InputLabelFrame = styled(Label, {
1239
1272
  context: InputContext,
1240
1273
  variants: {
1274
+ touch: { true: {}, false: {} },
1241
1275
  scaleIcon: {
1242
1276
  ":number": {} as any,
1243
1277
  },
@@ -1263,6 +1297,7 @@ const InputInfoFrame = styled(Text, {
1263
1297
  color: formCommonColors.text,
1264
1298
 
1265
1299
  variants: {
1300
+ touch: { true: {}, false: {} },
1266
1301
  scaleIcon: {
1267
1302
  ":number": {} as any,
1268
1303
  },
@@ -1328,6 +1363,7 @@ const InputXGroup = styled(XGroup, {
1328
1363
  context: InputContext,
1329
1364
 
1330
1365
  variants: {
1366
+ touch: { true: {}, false: {} },
1331
1367
  scaleIcon: {
1332
1368
  ":number": {} as any,
1333
1369
  },
@@ -1,7 +1,23 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
- import { Input as TamaguiInput, YStack } from "tamagui";
2
+ import { YStack } from "tamagui";
3
+ import { Input as InputParts } from "../InputParts";
3
4
  import { Label } from "./index";
4
5
 
6
+ /**
7
+ * The house Input chrome without the field's own label: the Label under test
8
+ * is the one above it. The `Input` field brings its own label, so it cannot
9
+ * stand here.
10
+ */
11
+ function Control({ disabled, ...area }: { id: string; placeholder?: string; disabled?: boolean }) {
12
+ return (
13
+ <InputParts>
14
+ <InputParts.Box disabled={disabled}>
15
+ <InputParts.Area disabled={disabled} {...area} />
16
+ </InputParts.Box>
17
+ </InputParts>
18
+ );
19
+ }
20
+
5
21
  const meta: Meta<typeof Label> = {
6
22
  title: "Forms/Label",
7
23
  component: Label,
@@ -34,7 +50,7 @@ export const WithControl: Story = {
34
50
  <Label htmlFor="label-story-input" required>
35
51
  Email address
36
52
  </Label>
37
- <TamaguiInput id="label-story-input" placeholder="you@example.com" />
53
+ <Control id="label-story-input" placeholder="you@example.com" />
38
54
  </YStack>
39
55
  ),
40
56
  };
@@ -46,13 +62,13 @@ export const RequiredAndOptional: Story = {
46
62
  <Label htmlFor="label-required" required>
47
63
  Email address
48
64
  </Label>
49
- <TamaguiInput id="label-required" />
65
+ <Control id="label-required" />
50
66
  </YStack>
51
67
  <YStack gap="$1.5">
52
68
  <Label htmlFor="label-optional" required={false} requiredMarking="optional">
53
69
  Nickname
54
70
  </Label>
55
- <TamaguiInput id="label-optional" />
71
+ <Control id="label-optional" />
56
72
  </YStack>
57
73
  </YStack>
58
74
  ),
@@ -64,7 +80,7 @@ export const ErrorState: Story = {
64
80
  <Label htmlFor="label-error" required error>
65
81
  Email address
66
82
  </Label>
67
- <TamaguiInput id="label-error" />
83
+ <Control id="label-error" />
68
84
  </YStack>
69
85
  ),
70
86
  };
@@ -75,7 +91,7 @@ export const Disabled: Story = {
75
91
  <Label htmlFor="label-disabled" disabled>
76
92
  Email address
77
93
  </Label>
78
- <TamaguiInput id="label-disabled" disabled />
94
+ <Control id="label-disabled" disabled />
79
95
  </YStack>
80
96
  ),
81
97
  };
@@ -86,7 +102,7 @@ export const AsPageHeading: Story = {
86
102
  <Label htmlFor="label-heading" asPageHeading>
87
103
  Event name
88
104
  </Label>
89
- <TamaguiInput id="label-heading" />
105
+ <Control id="label-heading" />
90
106
  </YStack>
91
107
  ),
92
108
  };
@@ -97,7 +113,7 @@ export const Hidden: Story = {
97
113
  <Label htmlFor="label-hidden" hidden>
98
114
  Search
99
115
  </Label>
100
- <TamaguiInput id="label-hidden" placeholder="Search" />
116
+ <Control id="label-hidden" placeholder="Search" />
101
117
  </YStack>
102
118
  ),
103
119
  };
@@ -107,18 +123,18 @@ export const EdgeCases: Story = {
107
123
  <YStack gap="$4" maxWidth={360}>
108
124
  <YStack gap="$1.5">
109
125
  <Label htmlFor="label-empty">{""}</Label>
110
- <TamaguiInput id="label-empty" placeholder="empty label above" />
126
+ <Control id="label-empty" placeholder="empty label above" />
111
127
  </YStack>
112
128
  <YStack gap="$1.5">
113
129
  <Label htmlFor="label-long">
114
130
  This is an extremely long label that keeps going and going to check wrapping behaviour of
115
131
  label text over multiple lines without breaking the layout of the associated control
116
132
  </Label>
117
- <TamaguiInput id="label-long" placeholder="long label above" />
133
+ <Control id="label-long" placeholder="long label above" />
118
134
  </YStack>
119
135
  <YStack gap="$1.5">
120
136
  <Label htmlFor="label-rtl">تسمية باللغة العربية</Label>
121
- <TamaguiInput id="label-rtl" placeholder="rtl label above" />
137
+ <Control id="label-rtl" placeholder="rtl label above" />
122
138
  </YStack>
123
139
  </YStack>
124
140
  ),