@multiplatform.one/forms 7.10.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 (721) 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/Checkbox/Checkbox.cjs +1 -3
  42. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -3
  43. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  44. package/dist/cjs/fields/Checkbox/CheckboxBox.cjs +2 -3
  45. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js +2 -3
  46. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  47. package/dist/cjs/fields/ColorPicker/index.cjs +2 -0
  48. package/dist/cjs/fields/ColorPicker/index.native.js +2 -0
  49. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  50. package/dist/cjs/fields/ColorPicker/parts.cjs +1 -0
  51. package/dist/cjs/fields/ColorPicker/parts.native.js +1 -0
  52. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  53. package/dist/cjs/fields/Combobox/index.cjs +206 -200
  54. package/dist/cjs/fields/Combobox/index.native.js +214 -208
  55. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  56. package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +7 -7
  57. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +7 -7
  58. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  59. package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +6 -4
  60. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +6 -4
  61. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  62. package/dist/cjs/fields/Duration/index.cjs +5 -3
  63. package/dist/cjs/fields/Duration/index.native.js +5 -3
  64. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  65. package/dist/cjs/fields/FileUpload/index.cjs +10 -8
  66. package/dist/cjs/fields/FileUpload/index.native.js +10 -8
  67. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  68. package/dist/cjs/fields/FileUpload/nativePickerLoader.cjs +7 -2
  69. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js +7 -2
  70. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  71. package/dist/cjs/fields/Geolocation/GeolocationMap.cjs +3 -0
  72. package/dist/cjs/fields/Geolocation/geocoderContext.cjs +71 -0
  73. package/dist/cjs/fields/Geolocation/geocoderContext.native.js +75 -0
  74. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -0
  75. package/dist/cjs/fields/Geolocation/index.cjs +72 -82
  76. package/dist/cjs/fields/Geolocation/index.native.js +72 -82
  77. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  78. package/dist/cjs/fields/Geolocation/photonGeocoder.cjs +138 -0
  79. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js +179 -0
  80. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  81. package/dist/cjs/fields/Input/index.cjs +7 -5
  82. package/dist/cjs/fields/Input/index.native.js +7 -5
  83. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  84. package/dist/cjs/fields/MentionInput/index.cjs +118 -112
  85. package/dist/cjs/fields/MentionInput/index.native.js +130 -124
  86. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  87. package/dist/cjs/fields/OTPInput/index.cjs +11 -8
  88. package/dist/cjs/fields/OTPInput/index.native.js +11 -8
  89. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  90. package/dist/cjs/fields/PhoneInput/index.cjs +9 -6
  91. package/dist/cjs/fields/PhoneInput/index.native.js +9 -6
  92. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  93. package/dist/cjs/fields/PhoneInput/phone.cjs +6 -5
  94. package/dist/cjs/fields/PhoneInput/phone.native.js +7 -6
  95. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  96. package/dist/cjs/fields/PhoneInput/regionNames.cjs +274 -0
  97. package/dist/cjs/fields/PhoneInput/regionNames.native.js +277 -0
  98. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -0
  99. package/dist/cjs/fields/RadioGroup/index.cjs +2 -6
  100. package/dist/cjs/fields/RadioGroup/index.native.js +2 -6
  101. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  102. package/dist/cjs/fields/SearchInput/index.cjs +10 -8
  103. package/dist/cjs/fields/SearchInput/index.native.js +10 -8
  104. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  105. package/dist/cjs/fields/Select/index.cjs +20 -17
  106. package/dist/cjs/fields/Select/index.native.js +20 -17
  107. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  108. package/dist/cjs/fields/Signature/index.cjs +10 -9
  109. package/dist/cjs/fields/Signature/index.native.js +10 -9
  110. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  111. package/dist/cjs/fields/Slider/index.cjs +21 -15
  112. package/dist/cjs/fields/Slider/index.native.js +21 -17
  113. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  114. package/dist/cjs/fields/Slider/jumpMotion.cjs +2 -2
  115. package/dist/cjs/fields/Slider/jumpMotion.native.js +2 -1
  116. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  117. package/dist/cjs/fields/Stepper/index.cjs +25 -6
  118. package/dist/cjs/fields/Stepper/index.native.js +25 -6
  119. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  120. package/dist/cjs/fields/Switch/footprint.cjs +54 -0
  121. package/dist/cjs/fields/Switch/footprint.native.js +57 -0
  122. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -0
  123. package/dist/cjs/fields/Switch/index.cjs +60 -43
  124. package/dist/cjs/fields/Switch/index.native.js +60 -50
  125. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  126. package/dist/cjs/fields/TextArea/index.cjs +6 -3
  127. package/dist/cjs/fields/TextArea/index.native.js +6 -3
  128. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  129. package/dist/cjs/fields/TimePicker/catalog.cjs +1 -0
  130. package/dist/cjs/fields/TimePicker/catalog.native.js +1 -0
  131. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  132. package/dist/cjs/fields/TimePicker/parts.cjs +5 -0
  133. package/dist/cjs/fields/TimePicker/parts.native.js +7 -0
  134. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  135. package/dist/cjs/index.cjs +12 -0
  136. package/dist/cjs/index.native.js +12 -0
  137. package/dist/cjs/index.native.js.map +1 -1
  138. package/dist/cjs/shared/panelPortal.cjs +52 -0
  139. package/dist/cjs/shared/panelPortal.native.js +65 -0
  140. package/dist/cjs/shared/panelPortal.native.js.map +1 -0
  141. package/dist/cjs/shared/pressSlopProps.cjs +16 -11
  142. package/dist/cjs/shared/pressSlopProps.native.js +18 -12
  143. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  144. package/dist/cjs/shared/utils.cjs +2 -2
  145. package/dist/cjs/shared/utils.native.js +3 -2
  146. package/dist/cjs/shared/utils.native.js.map +1 -1
  147. package/dist/cjs/themedPrimitives.cjs +15 -2
  148. package/dist/cjs/themedPrimitives.native.js +16 -3
  149. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  150. package/dist/esm/AdaptivePopup/index.mjs +0 -10
  151. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  152. package/dist/esm/AdaptivePopup/index.native.js +0 -10
  153. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  154. package/dist/esm/Button/index.mjs +6 -3
  155. package/dist/esm/Button/index.mjs.map +1 -1
  156. package/dist/esm/Button/index.native.js +6 -3
  157. package/dist/esm/Button/index.native.js.map +1 -1
  158. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
  159. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  160. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js +3 -12
  161. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  162. package/dist/esm/ContextualSaveBar/index.mjs +13 -11
  163. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  164. package/dist/esm/ContextualSaveBar/index.native.js +13 -20
  165. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  166. package/dist/esm/FieldDisplay/index.mjs +24 -12
  167. package/dist/esm/FieldDisplay/index.mjs.map +1 -1
  168. package/dist/esm/FieldDisplay/index.native.js +25 -13
  169. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  170. package/dist/esm/FloatingPanel/PanelPortal.mjs +119 -0
  171. package/dist/esm/FloatingPanel/PanelPortal.mjs.map +1 -0
  172. package/dist/esm/FloatingPanel/PanelPortal.native.js +14 -0
  173. package/dist/esm/FloatingPanel/PanelPortal.native.js.map +1 -0
  174. package/dist/esm/FloatingPanel/index.mjs +117 -69
  175. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  176. package/dist/esm/FloatingPanel/index.native.js +68 -13
  177. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  178. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +4 -2
  179. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  180. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +4 -2
  181. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  182. package/dist/esm/Form/index.mjs +2 -1
  183. package/dist/esm/Form/index.mjs.map +1 -1
  184. package/dist/esm/Form/index.native.js +2 -1
  185. package/dist/esm/Form/index.native.js.map +1 -1
  186. package/dist/esm/Form/submissionController.mjs +49 -0
  187. package/dist/esm/Form/submissionController.mjs.map +1 -0
  188. package/dist/esm/Form/submissionController.native.js +71 -0
  189. package/dist/esm/Form/submissionController.native.js.map +1 -0
  190. package/dist/esm/InputParts/index.mjs +67 -13
  191. package/dist/esm/InputParts/index.mjs.map +1 -1
  192. package/dist/esm/InputParts/index.native.js +73 -13
  193. package/dist/esm/InputParts/index.native.js.map +1 -1
  194. package/dist/esm/Wheel/index.mjs +0 -2
  195. package/dist/esm/Wheel/index.mjs.map +1 -1
  196. package/dist/esm/Wheel/index.native.js +0 -2
  197. package/dist/esm/Wheel/index.native.js.map +1 -1
  198. package/dist/esm/fields/Barcode/BarcodePreview.mjs +19 -16
  199. package/dist/esm/fields/Barcode/BarcodePreview.mjs.map +1 -1
  200. package/dist/esm/fields/Barcode/BarcodePreview.native.js +22 -19
  201. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  202. package/dist/esm/fields/Checkbox/Checkbox.mjs +2 -4
  203. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  204. package/dist/esm/fields/Checkbox/Checkbox.native.js +2 -4
  205. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  206. package/dist/esm/fields/Checkbox/CheckboxBox.mjs +3 -4
  207. package/dist/esm/fields/Checkbox/CheckboxBox.mjs.map +1 -1
  208. package/dist/esm/fields/Checkbox/CheckboxBox.native.js +3 -4
  209. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  210. package/dist/esm/fields/ColorPicker/index.mjs +2 -0
  211. package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
  212. package/dist/esm/fields/ColorPicker/index.native.js +2 -0
  213. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  214. package/dist/esm/fields/ColorPicker/parts.mjs +1 -0
  215. package/dist/esm/fields/ColorPicker/parts.mjs.map +1 -1
  216. package/dist/esm/fields/ColorPicker/parts.native.js +1 -0
  217. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  218. package/dist/esm/fields/Combobox/index.mjs +197 -191
  219. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  220. package/dist/esm/fields/Combobox/index.native.js +205 -199
  221. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  222. package/dist/esm/fields/DatePicker/DateRangePicker.mjs +5 -5
  223. package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  224. package/dist/esm/fields/DatePicker/DateRangePicker.native.js +5 -5
  225. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  226. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +3 -1
  227. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  228. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +3 -1
  229. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  230. package/dist/esm/fields/Duration/index.mjs +3 -1
  231. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  232. package/dist/esm/fields/Duration/index.native.js +3 -1
  233. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  234. package/dist/esm/fields/FileUpload/index.mjs +5 -3
  235. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  236. package/dist/esm/fields/FileUpload/index.native.js +5 -3
  237. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  238. package/dist/esm/fields/FileUpload/nativePickerLoader.mjs +7 -3
  239. package/dist/esm/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
  240. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js +7 -3
  241. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  242. package/dist/esm/fields/Geolocation/GeolocationMap.mjs +3 -0
  243. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  244. package/dist/esm/fields/Geolocation/geocoderContext.mjs +44 -0
  245. package/dist/esm/fields/Geolocation/geocoderContext.mjs.map +1 -0
  246. package/dist/esm/fields/Geolocation/geocoderContext.native.js +45 -0
  247. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -0
  248. package/dist/esm/fields/Geolocation/index.mjs +73 -83
  249. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  250. package/dist/esm/fields/Geolocation/index.native.js +73 -83
  251. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  252. package/dist/esm/fields/Geolocation/photonGeocoder.mjs +112 -0
  253. package/dist/esm/fields/Geolocation/photonGeocoder.mjs.map +1 -0
  254. package/dist/esm/fields/Geolocation/photonGeocoder.native.js +150 -0
  255. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  256. package/dist/esm/fields/Input/index.mjs +3 -1
  257. package/dist/esm/fields/Input/index.mjs.map +1 -1
  258. package/dist/esm/fields/Input/index.native.js +3 -1
  259. package/dist/esm/fields/Input/index.native.js.map +1 -1
  260. package/dist/esm/fields/MentionInput/index.mjs +115 -109
  261. package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
  262. package/dist/esm/fields/MentionInput/index.native.js +127 -121
  263. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  264. package/dist/esm/fields/OTPInput/index.mjs +7 -4
  265. package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
  266. package/dist/esm/fields/OTPInput/index.native.js +7 -4
  267. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  268. package/dist/esm/fields/PhoneInput/index.mjs +6 -3
  269. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  270. package/dist/esm/fields/PhoneInput/index.native.js +6 -3
  271. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  272. package/dist/esm/fields/PhoneInput/phone.mjs +6 -5
  273. package/dist/esm/fields/PhoneInput/phone.mjs.map +1 -1
  274. package/dist/esm/fields/PhoneInput/phone.native.js +7 -6
  275. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  276. package/dist/esm/fields/PhoneInput/regionNames.mjs +249 -0
  277. package/dist/esm/fields/PhoneInput/regionNames.mjs.map +1 -0
  278. package/dist/esm/fields/PhoneInput/regionNames.native.js +249 -0
  279. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -0
  280. package/dist/esm/fields/RadioGroup/index.mjs +3 -7
  281. package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
  282. package/dist/esm/fields/RadioGroup/index.native.js +3 -7
  283. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  284. package/dist/esm/fields/SearchInput/index.mjs +5 -3
  285. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  286. package/dist/esm/fields/SearchInput/index.native.js +5 -3
  287. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  288. package/dist/esm/fields/Select/index.mjs +10 -7
  289. package/dist/esm/fields/Select/index.mjs.map +1 -1
  290. package/dist/esm/fields/Select/index.native.js +10 -7
  291. package/dist/esm/fields/Select/index.native.js.map +1 -1
  292. package/dist/esm/fields/Signature/index.mjs +7 -6
  293. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  294. package/dist/esm/fields/Signature/index.native.js +7 -6
  295. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  296. package/dist/esm/fields/Slider/index.mjs +10 -4
  297. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  298. package/dist/esm/fields/Slider/index.native.js +10 -6
  299. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  300. package/dist/esm/fields/Slider/jumpMotion.mjs +2 -2
  301. package/dist/esm/fields/Slider/jumpMotion.mjs.map +1 -1
  302. package/dist/esm/fields/Slider/jumpMotion.native.js +2 -1
  303. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  304. package/dist/esm/fields/Stepper/index.mjs +24 -5
  305. package/dist/esm/fields/Stepper/index.mjs.map +1 -1
  306. package/dist/esm/fields/Stepper/index.native.js +24 -5
  307. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  308. package/dist/esm/fields/Switch/footprint.mjs +29 -0
  309. package/dist/esm/fields/Switch/footprint.mjs.map +1 -0
  310. package/dist/esm/fields/Switch/footprint.native.js +29 -0
  311. package/dist/esm/fields/Switch/footprint.native.js.map +1 -0
  312. package/dist/esm/fields/Switch/index.mjs +44 -27
  313. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  314. package/dist/esm/fields/Switch/index.native.js +44 -34
  315. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  316. package/dist/esm/fields/TextArea/index.mjs +6 -3
  317. package/dist/esm/fields/TextArea/index.mjs.map +1 -1
  318. package/dist/esm/fields/TextArea/index.native.js +6 -3
  319. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  320. package/dist/esm/fields/TimePicker/catalog.mjs +1 -0
  321. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
  322. package/dist/esm/fields/TimePicker/catalog.native.js +1 -0
  323. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  324. package/dist/esm/fields/TimePicker/parts.mjs +5 -0
  325. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  326. package/dist/esm/fields/TimePicker/parts.native.js +7 -0
  327. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  328. package/dist/esm/index.mjs +6 -1
  329. package/dist/esm/index.mjs.map +1 -1
  330. package/dist/esm/index.native.js +6 -1
  331. package/dist/esm/index.native.js.map +1 -1
  332. package/dist/esm/shared/panelPortal.mjs +24 -0
  333. package/dist/esm/shared/panelPortal.mjs.map +1 -0
  334. package/dist/esm/shared/panelPortal.native.js +34 -0
  335. package/dist/esm/shared/panelPortal.native.js.map +1 -0
  336. package/dist/esm/shared/pressSlopProps.mjs +16 -12
  337. package/dist/esm/shared/pressSlopProps.mjs.map +1 -1
  338. package/dist/esm/shared/pressSlopProps.native.js +18 -13
  339. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  340. package/dist/esm/shared/utils.mjs +2 -2
  341. package/dist/esm/shared/utils.mjs.map +1 -1
  342. package/dist/esm/shared/utils.native.js +3 -2
  343. package/dist/esm/shared/utils.native.js.map +1 -1
  344. package/dist/esm/themedPrimitives.mjs +16 -3
  345. package/dist/esm/themedPrimitives.mjs.map +1 -1
  346. package/dist/esm/themedPrimitives.native.js +17 -4
  347. package/dist/esm/themedPrimitives.native.js.map +1 -1
  348. package/dist/jsx/AdaptivePopup/index.mjs +0 -10
  349. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  350. package/dist/jsx/AdaptivePopup/index.native.js +0 -10
  351. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  352. package/dist/jsx/Button/index.mjs +6 -3
  353. package/dist/jsx/Button/index.mjs.map +1 -1
  354. package/dist/jsx/Button/index.native.js +6 -3
  355. package/dist/jsx/Button/index.native.js.map +1 -1
  356. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
  357. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  358. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
  359. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  360. package/dist/jsx/ContextualSaveBar/index.mjs +13 -11
  361. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  362. package/dist/jsx/ContextualSaveBar/index.native.js +12 -19
  363. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  364. package/dist/jsx/FieldDisplay/index.mjs +24 -12
  365. package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
  366. package/dist/jsx/FieldDisplay/index.native.js +25 -13
  367. package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
  368. package/dist/jsx/FloatingPanel/PanelPortal.mjs +119 -0
  369. package/dist/jsx/FloatingPanel/PanelPortal.mjs.map +1 -0
  370. package/dist/jsx/FloatingPanel/PanelPortal.native.js +43 -0
  371. package/dist/jsx/FloatingPanel/PanelPortal.native.js.map +1 -0
  372. package/dist/jsx/FloatingPanel/index.mjs +117 -69
  373. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  374. package/dist/jsx/FloatingPanel/index.native.js +67 -12
  375. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  376. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +4 -2
  377. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  378. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +4 -2
  379. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  380. package/dist/jsx/Form/index.mjs +2 -1
  381. package/dist/jsx/Form/index.mjs.map +1 -1
  382. package/dist/jsx/Form/index.native.js +2 -1
  383. package/dist/jsx/Form/index.native.js.map +1 -1
  384. package/dist/jsx/Form/submissionController.mjs +49 -0
  385. package/dist/jsx/Form/submissionController.mjs.map +1 -0
  386. package/dist/jsx/Form/submissionController.native.js +99 -0
  387. package/dist/jsx/Form/submissionController.native.js.map +1 -0
  388. package/dist/jsx/InputParts/index.mjs +67 -13
  389. package/dist/jsx/InputParts/index.mjs.map +1 -1
  390. package/dist/jsx/InputParts/index.native.js +72 -12
  391. package/dist/jsx/InputParts/index.native.js.map +1 -1
  392. package/dist/jsx/Wheel/index.mjs +0 -2
  393. package/dist/jsx/Wheel/index.mjs.map +1 -1
  394. package/dist/jsx/Wheel/index.native.js +0 -2
  395. package/dist/jsx/Wheel/index.native.js.map +1 -1
  396. package/dist/jsx/fields/Barcode/BarcodePreview.mjs +19 -16
  397. package/dist/jsx/fields/Barcode/BarcodePreview.mjs.map +1 -1
  398. package/dist/jsx/fields/Barcode/BarcodePreview.native.js +21 -18
  399. package/dist/jsx/fields/Barcode/BarcodePreview.native.js.map +1 -1
  400. package/dist/jsx/fields/Checkbox/Checkbox.mjs +2 -4
  401. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  402. package/dist/jsx/fields/Checkbox/Checkbox.native.js +1 -3
  403. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  404. package/dist/jsx/fields/Checkbox/CheckboxBox.mjs +3 -4
  405. package/dist/jsx/fields/Checkbox/CheckboxBox.mjs.map +1 -1
  406. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js +2 -3
  407. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  408. package/dist/jsx/fields/ColorPicker/index.mjs +2 -0
  409. package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
  410. package/dist/jsx/fields/ColorPicker/index.native.js +2 -0
  411. package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
  412. package/dist/jsx/fields/ColorPicker/parts.mjs +1 -0
  413. package/dist/jsx/fields/ColorPicker/parts.mjs.map +1 -1
  414. package/dist/jsx/fields/ColorPicker/parts.native.js +1 -0
  415. package/dist/jsx/fields/ColorPicker/parts.native.js.map +1 -1
  416. package/dist/jsx/fields/Combobox/index.mjs +197 -191
  417. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  418. package/dist/jsx/fields/Combobox/index.native.js +214 -208
  419. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  420. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +5 -5
  421. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  422. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +7 -7
  423. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  424. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +3 -1
  425. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  426. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +6 -4
  427. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  428. package/dist/jsx/fields/Duration/index.mjs +3 -1
  429. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  430. package/dist/jsx/fields/Duration/index.native.js +5 -3
  431. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  432. package/dist/jsx/fields/FileUpload/index.mjs +5 -3
  433. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  434. package/dist/jsx/fields/FileUpload/index.native.js +10 -8
  435. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  436. package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs +7 -3
  437. package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
  438. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js +7 -2
  439. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  440. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs +3 -0
  441. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  442. package/dist/jsx/fields/Geolocation/geocoderContext.mjs +44 -0
  443. package/dist/jsx/fields/Geolocation/geocoderContext.mjs.map +1 -0
  444. package/dist/jsx/fields/Geolocation/geocoderContext.native.js +75 -0
  445. package/dist/jsx/fields/Geolocation/geocoderContext.native.js.map +1 -0
  446. package/dist/jsx/fields/Geolocation/index.mjs +73 -83
  447. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  448. package/dist/jsx/fields/Geolocation/index.native.js +72 -82
  449. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  450. package/dist/jsx/fields/Geolocation/photonGeocoder.mjs +112 -0
  451. package/dist/jsx/fields/Geolocation/photonGeocoder.mjs.map +1 -0
  452. package/dist/jsx/fields/Geolocation/photonGeocoder.native.js +179 -0
  453. package/dist/jsx/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  454. package/dist/jsx/fields/Input/index.mjs +3 -1
  455. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  456. package/dist/jsx/fields/Input/index.native.js +7 -5
  457. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  458. package/dist/jsx/fields/MentionInput/index.mjs +115 -109
  459. package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
  460. package/dist/jsx/fields/MentionInput/index.native.js +130 -124
  461. package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
  462. package/dist/jsx/fields/OTPInput/index.mjs +7 -4
  463. package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
  464. package/dist/jsx/fields/OTPInput/index.native.js +11 -8
  465. package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
  466. package/dist/jsx/fields/PhoneInput/index.mjs +6 -3
  467. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  468. package/dist/jsx/fields/PhoneInput/index.native.js +9 -6
  469. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  470. package/dist/jsx/fields/PhoneInput/phone.mjs +6 -5
  471. package/dist/jsx/fields/PhoneInput/phone.mjs.map +1 -1
  472. package/dist/jsx/fields/PhoneInput/phone.native.js +7 -6
  473. package/dist/jsx/fields/PhoneInput/phone.native.js.map +1 -1
  474. package/dist/jsx/fields/PhoneInput/regionNames.mjs +249 -0
  475. package/dist/jsx/fields/PhoneInput/regionNames.mjs.map +1 -0
  476. package/dist/jsx/fields/PhoneInput/regionNames.native.js +277 -0
  477. package/dist/jsx/fields/PhoneInput/regionNames.native.js.map +1 -0
  478. package/dist/jsx/fields/RadioGroup/index.mjs +3 -7
  479. package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
  480. package/dist/jsx/fields/RadioGroup/index.native.js +2 -6
  481. package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
  482. package/dist/jsx/fields/SearchInput/index.mjs +5 -3
  483. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  484. package/dist/jsx/fields/SearchInput/index.native.js +10 -8
  485. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  486. package/dist/jsx/fields/Select/index.mjs +10 -7
  487. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  488. package/dist/jsx/fields/Select/index.native.js +20 -17
  489. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  490. package/dist/jsx/fields/Signature/index.mjs +7 -6
  491. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  492. package/dist/jsx/fields/Signature/index.native.js +10 -9
  493. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  494. package/dist/jsx/fields/Slider/index.mjs +10 -4
  495. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  496. package/dist/jsx/fields/Slider/index.native.js +21 -17
  497. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  498. package/dist/jsx/fields/Slider/jumpMotion.mjs +2 -2
  499. package/dist/jsx/fields/Slider/jumpMotion.mjs.map +1 -1
  500. package/dist/jsx/fields/Slider/jumpMotion.native.js +2 -1
  501. package/dist/jsx/fields/Slider/jumpMotion.native.js.map +1 -1
  502. package/dist/jsx/fields/Stepper/index.mjs +24 -5
  503. package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
  504. package/dist/jsx/fields/Stepper/index.native.js +25 -6
  505. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  506. package/dist/jsx/fields/Switch/footprint.mjs +29 -0
  507. package/dist/jsx/fields/Switch/footprint.mjs.map +1 -0
  508. package/dist/jsx/fields/Switch/footprint.native.js +57 -0
  509. package/dist/jsx/fields/Switch/footprint.native.js.map +1 -0
  510. package/dist/jsx/fields/Switch/index.mjs +44 -27
  511. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  512. package/dist/jsx/fields/Switch/index.native.js +60 -50
  513. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  514. package/dist/jsx/fields/TextArea/index.mjs +6 -3
  515. package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
  516. package/dist/jsx/fields/TextArea/index.native.js +6 -3
  517. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  518. package/dist/jsx/fields/TimePicker/catalog.mjs +1 -0
  519. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
  520. package/dist/jsx/fields/TimePicker/catalog.native.js +1 -0
  521. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
  522. package/dist/jsx/fields/TimePicker/parts.mjs +5 -0
  523. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  524. package/dist/jsx/fields/TimePicker/parts.native.js +7 -0
  525. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  526. package/dist/jsx/index.js +6 -1
  527. package/dist/jsx/index.js.map +1 -1
  528. package/dist/jsx/index.mjs +6 -1
  529. package/dist/jsx/index.mjs.map +1 -1
  530. package/dist/jsx/index.native.js +12 -0
  531. package/dist/jsx/index.native.js.map +1 -1
  532. package/dist/jsx/shared/panelPortal.mjs +24 -0
  533. package/dist/jsx/shared/panelPortal.mjs.map +1 -0
  534. package/dist/jsx/shared/panelPortal.native.js +65 -0
  535. package/dist/jsx/shared/panelPortal.native.js.map +1 -0
  536. package/dist/jsx/shared/pressSlopProps.mjs +16 -12
  537. package/dist/jsx/shared/pressSlopProps.mjs.map +1 -1
  538. package/dist/jsx/shared/pressSlopProps.native.js +18 -12
  539. package/dist/jsx/shared/pressSlopProps.native.js.map +1 -1
  540. package/dist/jsx/shared/utils.mjs +2 -2
  541. package/dist/jsx/shared/utils.mjs.map +1 -1
  542. package/dist/jsx/shared/utils.native.js +3 -2
  543. package/dist/jsx/shared/utils.native.js.map +1 -1
  544. package/dist/jsx/themedPrimitives.mjs +16 -3
  545. package/dist/jsx/themedPrimitives.mjs.map +1 -1
  546. package/dist/jsx/themedPrimitives.native.js +16 -3
  547. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  548. package/package.json +17 -13
  549. package/src/AdaptivePopup/AdaptivePopup.spec.tsx +2 -3
  550. package/src/AdaptivePopup/index.tsx +11 -10
  551. package/src/Button/Button.borderLadder.spec.tsx +82 -0
  552. package/src/Button/Button.labelInk.spec.tsx +4 -1
  553. package/src/Button/Button.radiusLaw.spec.tsx +153 -0
  554. package/src/Button/index.tsx +6 -3
  555. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +24 -0
  556. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +37 -1
  557. package/src/ContextualSaveBar/UnsavedChangesDialog.tsx +3 -11
  558. package/src/ContextualSaveBar/index.tsx +17 -11
  559. package/src/ErrorSummary.stories.tsx +20 -11
  560. package/src/FieldDisplay/FieldDisplay.spec.tsx +47 -2
  561. package/src/FieldDisplay/index.tsx +21 -13
  562. package/src/FloatingPanel/FloatingPanel.detentLayout.spec.tsx +148 -0
  563. package/src/FloatingPanel/FloatingPanel.spec.tsx +140 -1
  564. package/src/FloatingPanel/FloatingPanel.stories.tsx +86 -1
  565. package/src/FloatingPanel/PanelPortal.native.tsx +15 -0
  566. package/src/FloatingPanel/PanelPortal.tsx +149 -0
  567. package/src/FloatingPanel/index.native.tsx +96 -19
  568. package/src/FloatingPanel/index.tsx +172 -86
  569. package/src/FloatingPanel/panelPortal.spec.tsx +142 -0
  570. package/src/FloatingPanel/panelWidthContract.spec.ts +17 -5
  571. package/src/FloatingPanel/touchRecipeHydration.spec.tsx +82 -0
  572. package/src/FloatingPanel/useFloatingPanel.ts +5 -2
  573. package/src/FloatingPanel/viewportHydration.spec.tsx +118 -0
  574. package/src/Form/index.tsx +2 -1
  575. package/src/Form/submission.spec.tsx +148 -0
  576. package/src/Form/submissionController.spec.ts +73 -0
  577. package/src/Form/submissionController.ts +59 -0
  578. package/src/Form/submissionDiscard.spec.tsx +41 -0
  579. package/src/Form/submissionPaths.spec.tsx +214 -0
  580. package/src/InputParts/index.tsx +48 -12
  581. package/src/Label/Label.stories.tsx +27 -11
  582. package/src/Wheel/Wheel.spec.tsx +9 -2
  583. package/src/Wheel/index.tsx +0 -2
  584. package/src/fieldFamilyStories.radius.spec.tsx +48 -0
  585. package/src/fields/Barcode/BarcodePreview.spec.tsx +32 -12
  586. package/src/fields/Barcode/BarcodePreview.stories.tsx +5 -4
  587. package/src/fields/Barcode/BarcodePreview.tsx +31 -25
  588. package/src/fields/Checkbox/Checkbox.native.spec.tsx +92 -0
  589. package/src/fields/Checkbox/Checkbox.stories.tsx +1 -0
  590. package/src/fields/Checkbox/Checkbox.tsx +2 -2
  591. package/src/fields/Checkbox/CheckboxBox.spec.tsx +13 -13
  592. package/src/fields/Checkbox/CheckboxBox.tsx +7 -1
  593. package/src/fields/ColorPicker/index.tsx +6 -1
  594. package/src/fields/ColorPicker/parts.tsx +1 -0
  595. package/src/fields/Combobox/Combobox.spec.tsx +85 -55
  596. package/src/fields/Combobox/index.tsx +259 -240
  597. package/src/fields/DatePicker/DateRangePicker.tsx +5 -3
  598. package/src/fields/DatePicker/MultiDatePicker.tsx +3 -1
  599. package/src/fields/Duration/index.tsx +3 -1
  600. package/src/fields/FileUpload/index.tsx +13 -3
  601. package/src/fields/FileUpload/nativePickerLoader.spec.ts +34 -0
  602. package/src/fields/FileUpload/nativePickerLoader.ts +11 -2
  603. package/src/fields/Geolocation/Geolocation.spec.tsx +165 -4
  604. package/src/fields/Geolocation/Geolocation.stories.tsx +110 -26
  605. package/src/fields/Geolocation/GeolocationMap.tsx +3 -0
  606. package/src/fields/Geolocation/geocoderContext.tsx +56 -0
  607. package/src/fields/Geolocation/index.tsx +75 -80
  608. package/src/fields/Geolocation/photonGeocoder.spec.ts +214 -0
  609. package/src/fields/Geolocation/photonGeocoder.ts +150 -0
  610. package/src/fields/Input/index.tsx +3 -1
  611. package/src/fields/MentionInput/MentionInput.spec.tsx +41 -30
  612. package/src/fields/MentionInput/index.tsx +128 -119
  613. package/src/fields/OTPInput/index.tsx +7 -4
  614. package/src/fields/PhoneInput/PhoneInput.spec.tsx +63 -0
  615. package/src/fields/PhoneInput/index.tsx +13 -8
  616. package/src/fields/PhoneInput/phone.native.spec.ts +32 -0
  617. package/src/fields/PhoneInput/phone.ts +5 -2
  618. package/src/fields/PhoneInput/regionNames.ts +250 -0
  619. package/src/fields/RadioGroup/RadioGroup.stories.tsx +4 -3
  620. package/src/fields/RadioGroup/index.tsx +3 -2
  621. package/src/fields/Rating/StarInk.native.spec.tsx +1 -1
  622. package/src/fields/SearchInput/index.tsx +4 -3
  623. package/src/fields/Select/Select.spec.tsx +36 -29
  624. package/src/fields/Select/index.tsx +14 -5
  625. package/src/fields/Signature/index.tsx +7 -3
  626. package/src/fields/Slider/index.tsx +14 -4
  627. package/src/fields/Slider/jumpMotion.ts +6 -2
  628. package/src/fields/Stepper/Stepper.spec.tsx +30 -0
  629. package/src/fields/Stepper/index.tsx +34 -4
  630. package/src/fields/Switch/Switch.footprint.native.spec.tsx +58 -0
  631. package/src/fields/Switch/Switch.footprint.spec.tsx +79 -0
  632. package/src/fields/Switch/Switch.radius.spec.tsx +37 -6
  633. package/src/fields/Switch/footprint.ts +45 -0
  634. package/src/fields/Switch/index.tsx +46 -49
  635. package/src/fields/TextArea/TextArea.spec.tsx +30 -1
  636. package/src/fields/TextArea/index.tsx +6 -3
  637. package/src/fields/TimePicker/TimePicker.native.spec.tsx +48 -0
  638. package/src/fields/TimePicker/catalog.tsx +1 -0
  639. package/src/fields/TimePicker/parts.tsx +4 -0
  640. package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +17 -8
  641. package/src/fields/pickerShellPadding.spec.tsx +54 -0
  642. package/src/index.ts +8 -0
  643. package/src/shared/panelPortal.ts +36 -0
  644. package/src/shared/pressSlopProps.spec.ts +27 -1
  645. package/src/shared/pressSlopProps.ts +26 -17
  646. package/src/shared/utils.ts +2 -2
  647. package/src/themedPrimitives.tsx +16 -3
  648. package/types/AdaptivePopup/index.d.ts.map +1 -1
  649. package/types/Button/index.d.ts.map +1 -1
  650. package/types/ContextualSaveBar/UnsavedChangesDialog.d.ts.map +1 -1
  651. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  652. package/types/FieldDisplay/index.d.ts.map +1 -1
  653. package/types/FloatingPanel/PanelPortal.d.ts +24 -0
  654. package/types/FloatingPanel/PanelPortal.d.ts.map +1 -0
  655. package/types/FloatingPanel/PanelPortal.native.d.ts +9 -0
  656. package/types/FloatingPanel/PanelPortal.native.d.ts.map +1 -0
  657. package/types/FloatingPanel/index.d.ts +0 -5
  658. package/types/FloatingPanel/index.d.ts.map +1 -1
  659. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  660. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  661. package/types/Form/index.d.ts.map +1 -1
  662. package/types/Form/submissionController.d.ts +21 -0
  663. package/types/Form/submissionController.d.ts.map +1 -0
  664. package/types/InputParts/index.d.ts +34 -2
  665. package/types/InputParts/index.d.ts.map +1 -1
  666. package/types/Wheel/index.d.ts.map +1 -1
  667. package/types/fields/Barcode/BarcodePreview.d.ts +7 -3
  668. package/types/fields/Barcode/BarcodePreview.d.ts.map +1 -1
  669. package/types/fields/Checkbox/CheckboxBox.d.ts +5 -0
  670. package/types/fields/Checkbox/CheckboxBox.d.ts.map +1 -1
  671. package/types/fields/ColorPicker/index.d.ts.map +1 -1
  672. package/types/fields/ColorPicker/parts.d.ts +2 -0
  673. package/types/fields/ColorPicker/parts.d.ts.map +1 -1
  674. package/types/fields/Combobox/index.d.ts.map +1 -1
  675. package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
  676. package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
  677. package/types/fields/Duration/index.d.ts.map +1 -1
  678. package/types/fields/FileUpload/index.d.ts.map +1 -1
  679. package/types/fields/FileUpload/nativePickerLoader.d.ts +8 -0
  680. package/types/fields/FileUpload/nativePickerLoader.d.ts.map +1 -1
  681. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  682. package/types/fields/Geolocation/geocoderContext.d.ts +24 -0
  683. package/types/fields/Geolocation/geocoderContext.d.ts.map +1 -0
  684. package/types/fields/Geolocation/index.d.ts +2 -1
  685. package/types/fields/Geolocation/index.d.ts.map +1 -1
  686. package/types/fields/Geolocation/photonGeocoder.d.ts +46 -0
  687. package/types/fields/Geolocation/photonGeocoder.d.ts.map +1 -0
  688. package/types/fields/Input/index.d.ts +19 -1
  689. package/types/fields/Input/index.d.ts.map +1 -1
  690. package/types/fields/MentionInput/index.d.ts.map +1 -1
  691. package/types/fields/OTPInput/index.d.ts +1 -1
  692. package/types/fields/OTPInput/index.d.ts.map +1 -1
  693. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  694. package/types/fields/PhoneInput/phone.d.ts.map +1 -1
  695. package/types/fields/PhoneInput/regionNames.d.ts +2 -0
  696. package/types/fields/PhoneInput/regionNames.d.ts.map +1 -0
  697. package/types/fields/RadioGroup/index.d.ts.map +1 -1
  698. package/types/fields/SearchInput/index.d.ts.map +1 -1
  699. package/types/fields/Select/index.d.ts.map +1 -1
  700. package/types/fields/Signature/index.d.ts.map +1 -1
  701. package/types/fields/Slider/index.d.ts.map +1 -1
  702. package/types/fields/Slider/jumpMotion.d.ts +1 -1
  703. package/types/fields/Slider/jumpMotion.d.ts.map +1 -1
  704. package/types/fields/Stepper/index.d.ts +6 -0
  705. package/types/fields/Stepper/index.d.ts.map +1 -1
  706. package/types/fields/Switch/footprint.d.ts +12 -0
  707. package/types/fields/Switch/footprint.d.ts.map +1 -0
  708. package/types/fields/Switch/index.d.ts.map +1 -1
  709. package/types/fields/TextArea/index.d.ts.map +1 -1
  710. package/types/fields/TimePicker/catalog.d.ts.map +1 -1
  711. package/types/fields/TimePicker/parts.d.ts.map +1 -1
  712. package/types/index.d.ts +8 -0
  713. package/types/index.d.ts.map +1 -1
  714. package/types/shared/panelPortal.d.ts +13 -0
  715. package/types/shared/panelPortal.d.ts.map +1 -0
  716. package/types/shared/pressSlopProps.d.ts +9 -2
  717. package/types/shared/pressSlopProps.d.ts.map +1 -1
  718. package/types/shared/utils.d.ts +1 -1
  719. package/types/shared/utils.d.ts.map +1 -1
  720. package/types/themedPrimitives.d.ts +48 -1
  721. package/types/themedPrimitives.d.ts.map +1 -1
@@ -1,3 +1,4 @@
1
+ import { useTouchSurface } from "@multiplatform.one/theme";
1
2
  import type { KeyboardEvent, MouseEvent, ReactNode, RefObject, UIEvent } from "react";
2
3
  import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, memo } from "react";
3
4
  import { CaretDownIcon, CheckIcon } from "@phosphor-icons/react";
@@ -19,6 +20,7 @@ import {
19
20
  useGlyphColor,
20
21
  useResolvedKnobs,
21
22
  wasKeyboardFocus,
23
+ transitionProps,
22
24
  } from "@multiplatform.one/theme";
23
25
  import type { LabelProps, SizeTokens } from "tamagui";
24
26
  // `react-native` aliases to react-native-web on the web, and RNW 0.21 exports
@@ -51,6 +53,7 @@ import {
51
53
  panelViewportPadding,
52
54
  useViewportGtSm,
53
55
  } from "../../FloatingPanel";
56
+ import { PanelPortal } from "../../FloatingPanel/PanelPortal";
54
57
  import { zIndex } from "../../shared/zIndex";
55
58
  import { useDragScroll } from "../../shared/useDragScroll";
56
59
  import { useIsInTableCell } from "../../shared/tableCellContext";
@@ -454,7 +457,7 @@ const SelectItem = memo(function SelectItem({
454
457
  : formInputColors.background.focus,
455
458
  },
456
459
  })}
457
- {...(ctx.knobProps.transition ? { transition: ctx.knobProps.transition } : undefined)}
460
+ {...transitionProps(ctx.knobProps.transition)}
458
461
  >
459
462
  <Text
460
463
  fontFamily={ctx.knobProps.body.fontFamily}
@@ -506,6 +509,7 @@ function FloatingSelectCore({
506
509
  selectedOrder,
507
510
  dismissible,
508
511
  }: FloatingSelectCoreProps) {
512
+ const hydrationTouch = useTouchSurface();
509
513
  const inTableCell = useIsInTableCell();
510
514
  const describedBy = useFieldDescribedBy();
511
515
  const glyphColor = useGlyphColor();
@@ -1048,7 +1052,9 @@ function FloatingSelectCore({
1048
1052
  flexWrap="nowrap"
1049
1053
  gap="$1.5"
1050
1054
  alignItems="center"
1051
- maxHeight={getFieldHeight(knobProps.sizeToken as SizeTokens) * 0.75}
1055
+ maxHeight={
1056
+ getFieldHeight(knobProps.sizeToken as SizeTokens, 1, hydrationTouch) * 0.75
1057
+ }
1052
1058
  overflow="hidden"
1053
1059
  overflowX="auto"
1054
1060
  >
@@ -1085,7 +1091,7 @@ function FloatingSelectCore({
1085
1091
  </InputParts.Box>
1086
1092
 
1087
1093
  {panel.mounted && (
1088
- <>
1094
+ <PanelPortal anchor={panel.triggerRef.current}>
1089
1095
  <FloatingFocusManager context={panel.context} modal={false} initialFocus={-1}>
1090
1096
  <YStack
1091
1097
  outlineWidth={0}
@@ -1207,7 +1213,7 @@ function FloatingSelectCore({
1207
1213
  />
1208
1214
  </YStack>
1209
1215
  </FloatingFocusManager>
1210
- </>
1216
+ </PanelPortal>
1211
1217
  )}
1212
1218
  </>
1213
1219
  );
@@ -1232,6 +1238,7 @@ function NativeSelectCore({
1232
1238
  dismissible,
1233
1239
  native,
1234
1240
  }: FloatingSelectCoreProps) {
1241
+ const hydrationTouch = useTouchSurface();
1235
1242
  const describedBy = useFieldDescribedBy();
1236
1243
  const fieldA11y = useFieldA11y();
1237
1244
  const inTableCell = useIsInTableCell();
@@ -1615,7 +1622,9 @@ function NativeSelectCore({
1615
1622
  flexWrap="nowrap"
1616
1623
  gap="$1.5"
1617
1624
  alignItems="center"
1618
- maxHeight={getFieldHeight(knobProps.sizeToken as SizeTokens) * 0.75}
1625
+ maxHeight={
1626
+ getFieldHeight(knobProps.sizeToken as SizeTokens, 1, hydrationTouch) * 0.75
1627
+ }
1619
1628
  overflow="hidden"
1620
1629
  overflowX="auto"
1621
1630
  >
@@ -1,8 +1,10 @@
1
+ import { useTouchSurface } from "@multiplatform.one/theme";
1
2
  import type { KnobProps } from "@multiplatform.one/theme";
2
3
  import {
3
4
  ensureFocusVisibleRing,
4
5
  ensureKeyboardModalityTracking,
5
6
  wasKeyboardFocus,
7
+ transitionProps,
6
8
  } from "@multiplatform.one/theme";
7
9
  import type { PointerEvent, ReactNode } from "react";
8
10
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -304,6 +306,7 @@ function SignatureCanvasImpl({
304
306
  required,
305
307
  hasError,
306
308
  }: SignatureCanvasProps) {
309
+ const hydrationTouch = useTouchSurface();
307
310
  const [strokes, setStrokes] = useState<Stroke[]>([]);
308
311
  const [currentStroke, setCurrentStroke] = useState<Stroke | null>(null);
309
312
  const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
@@ -315,7 +318,7 @@ function SignatureCanvasImpl({
315
318
  const describedBy = useFieldDescribedBy();
316
319
  const aspectRatio = width / height;
317
320
  const resolvedSizeToken = (size ?? knobProps.sizeToken) as SizeTokens;
318
- const minHeightPx = getFieldHeight(resolvedSizeToken, signatureHeightRows);
321
+ const minHeightPx = getFieldHeight(resolvedSizeToken, signatureHeightRows, hydrationTouch);
319
322
  const cappedRadius = clampRadiusForLargeComponent(knobProps.borderRadius.borderRadius);
320
323
  const canDraw = !disabled && !readOnly;
321
324
  const canFocus = !disabled;
@@ -537,7 +540,7 @@ function SignatureCanvasImpl({
537
540
  borderColor: error ? formCommonColors.error : formInputColors.border.focus,
538
541
  })}
539
542
  {...frameRing}
540
- {...(knobProps.transition ? { transition: knobProps.transition } : undefined)}
543
+ {...transitionProps(knobProps.transition)}
541
544
  focusable={canFocus}
542
545
  tabIndex={isWeb ? (canFocus ? 0 : -1) : undefined}
543
546
  onFocus={() => {
@@ -672,6 +675,7 @@ export function Signature({
672
675
  skeleton,
673
676
  compact,
674
677
  }: SignatureProps) {
678
+ const hydrationTouch = useTouchSurface();
675
679
  const { resolvedForm, knobProps, disabledState, id } = useFormField({
676
680
  form: formProp,
677
681
  id: idProp,
@@ -680,7 +684,7 @@ export function Signature({
680
684
  const resolvedValidators = useResolvedValidators(required, validators, label, name);
681
685
  const tamaguiTheme = useTamaguiTheme();
682
686
  const resolvedSizeToken = (size ?? knobProps.sizeToken) as SizeTokens;
683
- const minHeightPx = getFieldHeight(resolvedSizeToken, signatureHeightRows);
687
+ const minHeightPx = getFieldHeight(resolvedSizeToken, signatureHeightRows, hydrationTouch);
684
688
  const padHeight = height ?? minHeightPx;
685
689
  const padWidth = width ?? Math.round(padHeight * signatureAspect);
686
690
 
@@ -1,4 +1,5 @@
1
- import { useEffect, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from "react";
1
+ import { useTouchSurface, isTouchSurface } from "@multiplatform.one/theme";
2
+ import { useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from "react";
2
3
  import type { AnyFormApi } from "../../types";
3
4
  import type { LabelProps, SizeTokens } from "tamagui";
4
5
  import {
@@ -75,7 +76,11 @@ const getTrackProps = (outlined: boolean | undefined, borderRadius: number) => (
75
76
 
76
77
  /** Single source for the thumb size: styled default + native jump-delta math. */
77
78
  const THUMB_SIZE_TOKEN = "$1.5";
78
- const THUMB_RENDER_SIZE = getSliderThumbRenderSize(THUMB_SIZE_TOKEN);
79
+ const THUMB_RENDER_SIZE = getSliderThumbRenderSize(
80
+ THUMB_SIZE_TOKEN,
81
+ undefined,
82
+ !isWeb && isTouchSurface(),
83
+ );
79
84
 
80
85
  const SliderThumbFrame = styled(TamaguiSlider.Thumb, {
81
86
  size: THUMB_SIZE_TOKEN,
@@ -280,7 +285,8 @@ function SliderControl({
280
285
  // UNSHIFTED size token and wins over the size variant's shift -1; see
281
286
  // getSliderThumbRenderSize). Using the shifted token here put the base-x
282
287
  // replica 1-4pt off the true rendered position.
283
- const thumbSize = useMemo(() => getSliderThumbRenderSize(THUMB_SIZE_TOKEN), []);
288
+ const hydrationTouch = useTouchSurface();
289
+ const thumbSize = getSliderThumbRenderSize(THUMB_SIZE_TOKEN, undefined, hydrationTouch);
284
290
  const jumpMotionEnabled =
285
291
  !isWeb && sliderProps?.orientation !== "vertical" && sliderProps?.dir !== "rtl";
286
292
  const jumpMotion = useSliderJumpMotion({
@@ -381,7 +387,7 @@ function SliderControl({
381
387
 
382
388
  const motionTransition = animateJump ? transitionToken : undefined;
383
389
  const thumbRadius = resolveRadiusClass("BINARY", radiusStop, {
384
- heightPx: THUMB_RENDER_SIZE,
390
+ heightPx: thumbSize,
385
391
  });
386
392
 
387
393
  // `"none"` (not omitted): Tamagui styled defaults / animateOnly can leave a
@@ -613,6 +619,8 @@ function SliderControl({
613
619
  return elevationWrapperProps.elevation && isWeb ? (
614
620
  <View key={thumbIndex} {...elevationWrapperProps} borderRadius={thumbRadius}>
615
621
  <SliderThumbFrame
622
+ width={thumbSize}
623
+ height={thumbSize}
616
624
  index={thumbIndex}
617
625
  circular={false}
618
626
  borderRadius={thumbRadius}
@@ -626,6 +634,8 @@ function SliderControl({
626
634
  </View>
627
635
  ) : (
628
636
  <SliderThumbFrame
637
+ width={thumbSize}
638
+ height={thumbSize}
629
639
  key={thumbIndex}
630
640
  index={thumbIndex}
631
641
  circular={false}
@@ -127,8 +127,12 @@ export function hasMinStepsBetween(values: number[], minStepsBetweenValues: numb
127
127
  * (`$4` is 32, not 44). Radius is not on the recipe; circular vs square
128
128
  * does not change diameter.
129
129
  */
130
- export function getSliderThumbRenderSize(sizeToken: string, _circular?: boolean): number {
131
- return sizeRecipeForToken(sizeToken, { touch: isTouchSurface() }).height;
130
+ export function getSliderThumbRenderSize(
131
+ sizeToken: string,
132
+ _circular?: boolean,
133
+ touch = isTouchSurface(),
134
+ ): number {
135
+ return sizeRecipeForToken(sizeToken, { touch }).height;
132
136
  }
133
137
 
134
138
  /**
@@ -320,3 +320,33 @@ describe("Stepper", () => {
320
320
  });
321
321
  });
322
322
  });
323
+
324
+ describe("Stepper currency (MPO-221)", () => {
325
+ const glyph = (container: HTMLElement) =>
326
+ container.querySelector("[data-testid='stepper-currency']") as HTMLElement | null;
327
+ const input = (container: HTMLElement) =>
328
+ container.querySelector("input[data-stepper-value]") as HTMLInputElement;
329
+
330
+ it("writes the currency glyph beside the value and aligns the value to the end", () => {
331
+ const { container } = renderWithProviders(
332
+ <Stepper aria-label="Price" currency="USD" defaultValue={12} showButtons={false} />,
333
+ );
334
+ expect(glyph(container)?.textContent).toBe("$");
335
+ expect(input(container).className).toMatch(/_ta-right/);
336
+ });
337
+
338
+ it("resolves a Frappe-style symbol to its glyph", () => {
339
+ const { container } = renderWithProviders(
340
+ <Stepper aria-label="Price" currency="₹" defaultValue={12} showButtons={false} />,
341
+ );
342
+ expect(glyph(container)?.textContent).toBe("₹");
343
+ });
344
+
345
+ it("without a currency the value stays centred and no glyph renders", () => {
346
+ const { container } = renderWithProviders(
347
+ <Stepper aria-label="Qty" defaultValue={12} showButtons={false} />,
348
+ );
349
+ expect(glyph(container)).toBeNull();
350
+ expect(input(container).className).toMatch(/_ta-center/);
351
+ });
352
+ });
@@ -1,3 +1,4 @@
1
+ import { useTouchSurface } from "@multiplatform.one/theme";
1
2
  import type { DeepKeys, DeepValue } from "@tanstack/form-core";
2
3
  import { CaretDownIcon, CaretUpIcon, MinusIcon, PlusIcon } from "@phosphor-icons/react";
3
4
  import {
@@ -10,9 +11,9 @@ import {
10
11
  useState,
11
12
  } from "react";
12
13
  import { Pressable } from "react-native";
13
- import { isWeb, useProps, View } from "tamagui";
14
+ import { isWeb, Text, useProps, View } from "tamagui";
14
15
  import { Input as TamaguiInput } from "tamagui";
15
- import { isTouchSurface, sizeRecipeForToken, useGlyphColor } from "@multiplatform.one/theme";
16
+ import { currencyAffix, sizeRecipeForToken, useGlyphColor } from "@multiplatform.one/theme";
16
17
  import { resolveStepperPlacement } from "./resolveStepperPlacement";
17
18
 
18
19
  export { resolveStepperPlacement, type StepperButtonPosition } from "./resolveStepperPlacement";
@@ -125,6 +126,12 @@ export type StepperProps<
125
126
  * coerced to `both` on touch — LC-84).
126
127
  */
127
128
  buttonPosition?: "left" | "right" | "both";
129
+ /**
130
+ * ISO 4217 code or Frappe-style symbol. Writes the currency glyph beside
131
+ * the value on the locale's side and puts the value on the numeric
132
+ * (end) alignment.
133
+ */
134
+ currency?: string;
128
135
  allowEmpty?: boolean;
129
136
  placeholder?: string;
130
137
  inputProps?: Omit<InputProps, "value" | "onChangeText" | "ref">;
@@ -269,6 +276,7 @@ export function Stepper<
269
276
  TFormValidator = any,
270
277
  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
271
278
  >(props: StepperProps<TParentData, TName, TFieldValidator, TFormValidator, TData>) {
279
+ const hydrationTouch = useTouchSurface();
272
280
  const {
273
281
  defaultValue,
274
282
  form,
@@ -300,17 +308,19 @@ export function Stepper<
300
308
  skeleton,
301
309
  compact,
302
310
  id: idProp,
311
+ currency,
303
312
  ...restProps
304
313
  } = useProps(props);
305
314
 
306
315
  const { resolvedForm, knobProps, id } = useFormField({ form, id: idProp, compact });
316
+ const affix = currencyAffix(currency);
307
317
  const resolvedValidators = useResolvedValidators(required, validators, label, name);
308
318
  const motionTransition = knobProps.transition as string | undefined;
309
319
  const controlSize = size || knobProps.sizeToken;
310
320
  // +/- glyphs are control-internal icons: the recipe's icon channel (LC-79).
311
321
  const iconPx = sizeRecipeForToken(String(controlSize)).iconSize;
312
322
  const glyphColor = useGlyphColor();
313
- const placement = resolveStepperPlacement(buttonPosition, isTouchSurface());
323
+ const placement = resolveStepperPlacement(buttonPosition, hydrationTouch);
314
324
  const isControlled = valueProp !== undefined && !name;
315
325
 
316
326
  // Initialize inputValue from defaultValue for standalone mode
@@ -668,7 +678,7 @@ export function Stepper<
668
678
  data-stepper-live={live ? "true" : undefined}
669
679
  data-stepper-flash={valueFlash ? "true" : undefined}
670
680
  onChangeText={readOnly ? undefined : handleInputChange}
671
- textAlign="center"
681
+ textAlign={affix ? "right" : "center"}
672
682
  opacity={valueMotionStyle.opacity}
673
683
  // LC-25 native value tween intentionally disabled: Tamagui's RN
674
684
  // animation driver crashes Hermes ("Cannot add new property
@@ -706,6 +716,24 @@ export function Stepper<
706
716
  />
707
717
  );
708
718
 
719
+ // T-VALUE: the glyph is part of the amount, never dimmed by textAccent.
720
+ const affixGlyph = affix ? (
721
+ <Text
722
+ data-testid="stepper-currency"
723
+ data-text-class="T-VALUE"
724
+ aria-hidden
725
+ alignSelf="center"
726
+ flexShrink={0}
727
+ paddingHorizontal="$1.5"
728
+ {...knobProps.body}
729
+ fontSize={sizeRecipeForToken(String(controlSize), { touch: hydrationTouch }).fontSize}
730
+ color="$color"
731
+ userSelect="none"
732
+ >
733
+ {affix.glyph}
734
+ </Text>
735
+ ) : null;
736
+
709
737
  // LC-71: ring rides Input.Box so +/− sit inside the perceived boundary.
710
738
  const box = (
711
739
  <InputParts.Box
@@ -723,7 +751,9 @@ export function Stepper<
723
751
  >
724
752
  {showSpin && placement === "both" ? decrementButton : null}
725
753
  {showSpin && placement === "left" ? spinColumn("start") : null}
754
+ {affix?.position === "leading" ? affixGlyph : null}
726
755
  {area}
756
+ {affix?.position === "trailing" ? affixGlyph : null}
727
757
  {showSpin && placement === "right" ? spinColumn("end") : null}
728
758
  {showSpin && placement === "both" ? incrementButton : null}
729
759
  </InputParts.Box>
@@ -0,0 +1,58 @@
1
+ /**
2
+ * MPO-356 / LC-91 SWITCH-FOOTPRINT, native half. Clay's iPhone measured the
3
+ * default track at about 85 × 43 pt; a UISwitch is 51 × 31 with a 27 pt
4
+ * thumb. Mock tamagui's isWeb so the native branch runs on the test host
5
+ * renderer (RadioGroup.native.spec pattern) and read the painted track back.
6
+ */
7
+
8
+ import { cleanup } from "@testing-library/react";
9
+ import { afterEach, describe, expect, it, vi } from "vitest";
10
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
11
+ import { Preset } from "@multiplatform.one/theme";
12
+ import { Switch } from "./index";
13
+ import { paintedBox, thumbOf, trackBox } from "../../../tests/switchFootprintProbe";
14
+
15
+ vi.mock("tamagui", async (importOriginal) => ({
16
+ ...(await importOriginal<typeof import("tamagui")>()),
17
+ isWeb: false,
18
+ }));
19
+
20
+ afterEach(cleanup);
21
+
22
+ function mount(overrides: Record<string, unknown> = {}, minTargetHeight?: number) {
23
+ const result = renderWithProviders(
24
+ <Preset overrides={{ elevation: "none", ...overrides }}>
25
+ <Switch
26
+ name="sw"
27
+ defaultValue={false}
28
+ aria-label="Notifications"
29
+ {...(minTargetHeight !== undefined && { minTargetHeight })}
30
+ />
31
+ </Preset>,
32
+ );
33
+ const frame = result.getSwitch() as HTMLElement;
34
+ expect(frame).toBeTruthy();
35
+ return { frame, track: trackBox(frame), thumb: paintedBox(thumbOf(frame)) };
36
+ }
37
+
38
+ describe("Switch footprint on native (MPO-356)", () => {
39
+ it("paints a UISwitch-sized 51 × 31 track with a 27 pt thumb at default knobs", () => {
40
+ const { track, thumb } = mount();
41
+ expect(track).toEqual({ width: 51, height: 31 });
42
+ expect(thumb).toEqual({ width: 27, height: 27 });
43
+ });
44
+
45
+ it("keeps the 51 × 31 paint inside a 44 pt press target on touch", () => {
46
+ const { frame, track } = mount({}, 44);
47
+ expect(paintedBox(frame)).toEqual({ width: 51, height: 44 });
48
+ expect(track).toEqual({ width: 51, height: 31 });
49
+ });
50
+
51
+ it("steps with the size knob at the UISwitch aspect", () => {
52
+ const small = mount({ size: "small" }).track;
53
+ cleanup();
54
+ const large = mount({ size: "large" }).track;
55
+ expect(small).toEqual({ width: 41, height: 25 });
56
+ expect(large).toEqual({ width: 61, height: 37 });
57
+ });
58
+ });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MPO-356 / LC-91 SWITCH-FOOTPRINT, web half. At default knobs the painted
3
+ * track is Tamagui's own Switch: `getSwitchHeight` = size × 0.65, width 2×,
4
+ * so `$4` paints 58 × 29, not the 86 × 44 control row it used to fill.
5
+ * The size knob keeps stepping it along Tamagui's ladder.
6
+ */
7
+
8
+ import { cleanup } from "@testing-library/react";
9
+ import { Switch as TamaguiSwitch } from "tamagui";
10
+ import { afterEach, describe, expect, it } from "vitest";
11
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
12
+ import { Preset } from "@multiplatform.one/theme";
13
+ import { Switch } from "./index";
14
+ import { paintedBox, thumbOf, trackBox } from "../../../tests/switchFootprintProbe";
15
+
16
+ afterEach(cleanup);
17
+
18
+ const LADDER = [
19
+ { knob: "small", token: "$3" },
20
+ { knob: "medium", token: "$4" },
21
+ { knob: "large", token: "$5" },
22
+ ] as const;
23
+
24
+ function ours(size?: (typeof LADDER)[number]["knob"]) {
25
+ const result = renderWithProviders(
26
+ <Preset overrides={{ elevation: "none", ...(size && { size }) }}>
27
+ <Switch name="sw" defaultValue={false} aria-label="Notifications" />
28
+ </Preset>,
29
+ );
30
+ const frame = result.getSwitch() as HTMLElement;
31
+ expect(frame).toBeTruthy();
32
+ return { track: trackBox(frame), thumb: paintedBox(thumbOf(frame)) };
33
+ }
34
+
35
+ function stock(token: string) {
36
+ const result = renderWithProviders(
37
+ <TamaguiSwitch size={token as never} aria-label="Stock">
38
+ <TamaguiSwitch.Thumb />
39
+ </TamaguiSwitch>,
40
+ );
41
+ const frame = result.getSwitch() as HTMLElement;
42
+ expect(frame).toBeTruthy();
43
+ return { track: paintedBox(frame), thumb: paintedBox(thumbOf(frame)) };
44
+ }
45
+
46
+ describe("Switch footprint on web (MPO-356)", () => {
47
+ it("paints Tamagui's 58 × 29 track at default knobs, not the 44 px control row", () => {
48
+ const { track } = ours();
49
+ expect(track).toEqual({ width: 58, height: 29 });
50
+ });
51
+
52
+ it("the default track is the stock Tamagui $true Switch", () => {
53
+ expect(ours().track).toEqual(stock("$true").track);
54
+ });
55
+
56
+ it("restores the 44 px press target on a fine pointer through the house slop channel (LC-54)", () => {
57
+ const result = renderWithProviders(
58
+ <Switch name="sw" defaultValue={false} aria-label="Notifications" />,
59
+ );
60
+ const frame = result.getSwitch() as HTMLElement;
61
+ const outset = Number(frame.getAttribute("data-mp-press-slop"));
62
+ expect(trackBox(frame).height + outset * 2).toBeGreaterThanOrEqual(44);
63
+ expect(frame.getAttribute("data-mp-press-axis")).toBe("vertical");
64
+ });
65
+
66
+ for (const { knob, token } of LADDER) {
67
+ it(`size ${knob} steps with Tamagui's ${token} Switch and keeps its 2:1 track`, () => {
68
+ const { track, thumb } = ours(knob);
69
+ const reference = stock(token);
70
+ expect(track).toEqual(reference.track);
71
+ expect(track.width).toBe(track.height * 2);
72
+ // Tamagui's thumb fills the track; ours fills it inside the 1 px hairline.
73
+ expect(thumb).toEqual({
74
+ width: reference.thumb.width - 2,
75
+ height: reference.thumb.height - 2,
76
+ });
77
+ });
78
+ }
79
+ });
@@ -16,12 +16,14 @@ const SCHEMES = ["light", "dark"] as const;
16
16
 
17
17
  afterEach(cleanup);
18
18
 
19
+ const atomPx = (value: string) => Number(value.replace("--", "."));
20
+
19
21
  function paintedHeight(el: HTMLElement): number {
20
22
  const rect = el.getBoundingClientRect().height;
21
23
  if (rect > 0) return rect;
22
24
  for (const cls of String(el.className || "").split(/\s+/)) {
23
- const m = /^_h-(\d+(?:\.\d+)?)px$/.exec(cls);
24
- if (m) return Number(m[1]);
25
+ const m = /^_h-(\d+(?:--\d+)?)px$/.exec(cls);
26
+ if (m) return atomPx(m[1]);
25
27
  }
26
28
  if (el.style.height) {
27
29
  const n = parseFloat(el.style.height);
@@ -31,14 +33,17 @@ function paintedHeight(el: HTMLElement): number {
31
33
  return cs > 0 ? cs : 0;
32
34
  }
33
35
 
34
- /** Rest atom is `_btlr-22px`; hover/press/focus are `_btlr-0hover-22px` / `_btlr-0active-22px` / `_btlr-0focus-22px`. */
36
+ /**
37
+ * Rest atom is `_btlr-22px`; hover/press/focus are `_btlr-0hover-22px` / `_btlr-0active-22px` / `_btlr-0focus-22px`.
38
+ * An odd-height part rounds to a half pixel, which tamagui writes with `--` for the dot (`_btlr-14--5px`).
39
+ */
35
40
  function paintedRadius(el: HTMLElement, state?: "hover" | "active" | "focus"): number {
36
41
  const className = String(el.className || "");
37
42
  const re = state
38
- ? new RegExp(`_btlr-0${state}-(\\d+(?:\\.\\d+)?)px`)
39
- : /(?:^|\s)_btlr-(\d+(?:\.\d+)?)px(?:\s|$)/;
43
+ ? new RegExp(`_btlr-0${state}-(\\d+(?:--\\d+)?)px`)
44
+ : /(?:^|\s)_btlr-(\d+(?:--\d+)?)px(?:\s|$)/;
40
45
  const m = re.exec(className);
41
- if (m) return Number(m[1]);
46
+ if (m) return atomPx(m[1]);
42
47
  if (!state && el.style.borderRadius) {
43
48
  const n = parseFloat(el.style.borderRadius);
44
49
  if (Number.isFinite(n)) return n;
@@ -112,3 +117,29 @@ describe("Switch BINARY radius (thumb and track are one member)", () => {
112
117
  });
113
118
  }
114
119
  });
120
+
121
+ describe("Switch declares its BINARY class for the constraint audit", () => {
122
+ it("thumb and track carry data-radius-resolution at every stop", () => {
123
+ for (const stop of STOPS) {
124
+ const result = mountSwitch(stop, "light");
125
+ const { track, thumb } = parts(result);
126
+ expect(track.getAttribute("data-radius-resolution")).toBe("BINARY");
127
+ expect(thumb.getAttribute("data-radius-resolution")).toBe("BINARY");
128
+ result.unmount();
129
+ }
130
+ });
131
+
132
+ it("a consumer radius override drops the declaration", () => {
133
+ const result = renderWithProviders(
134
+ <Switch
135
+ name="sw-override"
136
+ defaultValue={false}
137
+ aria-label="Notifications"
138
+ switchProps={{ borderRadius: 9 } as never}
139
+ />,
140
+ );
141
+ const { track, thumb } = parts(result);
142
+ expect(track.hasAttribute("data-radius-resolution")).toBe(false);
143
+ expect(thumb.hasAttribute("data-radius-resolution")).toBe(false);
144
+ });
145
+ });
@@ -0,0 +1,45 @@
1
+ import { sizeRecipeForToken } from "@multiplatform.one/theme";
2
+ import { isWeb } from "tamagui";
3
+
4
+ /**
5
+ * LC-91 SWITCH-FOOTPRINT (MPO-356). The recipe height is the control ROW and
6
+ * the press target (44 at `$4`); the painted switch is a glyph inside it, so
7
+ * it takes the platform switch's own fraction of that height:
8
+ *
9
+ * - web: Tamagui's Switch, `getSwitchHeight` = size × 0.65 at a 2:1 aspect,
10
+ * thumb filling the track (tamagui.dev `$4` = 58 × 29, thumb 29).
11
+ * - native: UISwitch, 51 × 31 pt with a 27 pt thumb (2 pt rim gutter) at the
12
+ * 44 medium stop. Material 3's 52 × 32 sits inside the same 10 percent.
13
+ *
14
+ * Painting the whole recipe height is what made `$4` an 86 × 44 slab once
15
+ * MPO-13 lifted the recipe from 32 to Tamagui's 44.
16
+ */
17
+ const webSwitch = { heightRatio: 0.65, aspect: 2, rimGutter: 0 };
18
+ const nativeSwitch = { heightRatio: 31 / 44, aspect: 51 / 31, rimGutter: 2 };
19
+
20
+ export type SwitchFootprint = {
21
+ trackHeight: number;
22
+ trackWidth: number;
23
+ /** Track height inside its border: the lane the thumb rides in. */
24
+ thumbSlot: number;
25
+ thumbInset: number;
26
+ thumbSize: number;
27
+ /** Thumb travel from off to on. */
28
+ travel: number;
29
+ };
30
+
31
+ export function switchFootprint(sizeToken: string, borderWidth: number): SwitchFootprint {
32
+ const platform = isWeb ? webSwitch : nativeSwitch;
33
+ const trackHeight = Math.round(sizeRecipeForToken(sizeToken).height * platform.heightRatio);
34
+ const trackWidth = Math.round(trackHeight * platform.aspect);
35
+ const thumbSlot = trackHeight - borderWidth * 2;
36
+ const thumbInset = Math.max(0, platform.rimGutter - borderWidth);
37
+ return {
38
+ trackHeight,
39
+ trackWidth,
40
+ thumbSlot,
41
+ thumbInset,
42
+ thumbSize: thumbSlot - thumbInset * 2,
43
+ travel: trackWidth - borderWidth * 2 - thumbSlot,
44
+ };
45
+ }