@multiplatform.one/forms 7.11.0 → 7.16.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 (803) 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 +11 -4
  6. package/dist/cjs/Button/index.native.js +11 -4
  7. package/dist/cjs/Button/index.native.js.map +1 -1
  8. package/dist/cjs/Chip/index.cjs +5 -2
  9. package/dist/cjs/Chip/index.native.js +6 -7
  10. package/dist/cjs/Chip/index.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.cjs +2 -11
  12. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
  13. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/index.cjs +12 -10
  15. package/dist/cjs/ContextualSaveBar/index.native.js +12 -19
  16. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  17. package/dist/cjs/FieldDisplay/index.cjs +24 -12
  18. package/dist/cjs/FieldDisplay/index.native.js +25 -13
  19. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  20. package/dist/cjs/FloatingPanel/PanelPortal.cjs +145 -0
  21. package/dist/cjs/FloatingPanel/PanelPortal.native.js +43 -0
  22. package/dist/cjs/FloatingPanel/PanelPortal.native.js.map +1 -0
  23. package/dist/cjs/FloatingPanel/index.cjs +117 -67
  24. package/dist/cjs/FloatingPanel/index.native.js +67 -12
  25. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  26. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +16 -5
  27. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +16 -5
  28. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  29. package/dist/cjs/Form/index.cjs +2 -1
  30. package/dist/cjs/Form/index.native.js +2 -1
  31. package/dist/cjs/Form/index.native.js.map +1 -1
  32. package/dist/cjs/Form/submissionController.cjs +74 -0
  33. package/dist/cjs/Form/submissionController.native.js +99 -0
  34. package/dist/cjs/Form/submissionController.native.js.map +1 -0
  35. package/dist/cjs/InputParts/index.cjs +66 -12
  36. package/dist/cjs/InputParts/index.native.js +72 -12
  37. package/dist/cjs/InputParts/index.native.js.map +1 -1
  38. package/dist/cjs/Skeleton/index.cjs +1 -3
  39. package/dist/cjs/Skeleton/index.native.js +3 -6
  40. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  41. package/dist/cjs/Wheel/index.cjs +0 -2
  42. package/dist/cjs/Wheel/index.native.js +0 -2
  43. package/dist/cjs/Wheel/index.native.js.map +1 -1
  44. package/dist/cjs/fieldLayout.cjs +1 -1
  45. package/dist/cjs/fieldLayout.native.js +1 -1
  46. package/dist/cjs/fields/Barcode/BarcodePreview.cjs +18 -15
  47. package/dist/cjs/fields/Barcode/BarcodePreview.native.js +21 -18
  48. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  49. package/dist/cjs/fields/Barcode/index.cjs +1 -1
  50. package/dist/cjs/fields/Barcode/index.native.js +1 -1
  51. package/dist/cjs/fields/Barcode/qr.native.js +34 -34
  52. package/dist/cjs/fields/Checkbox/Checkbox.cjs +1 -3
  53. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -3
  54. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  55. package/dist/cjs/fields/Checkbox/CheckboxBox.cjs +2 -3
  56. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js +2 -3
  57. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  58. package/dist/cjs/fields/ColorPicker/index.cjs +3 -1
  59. package/dist/cjs/fields/ColorPicker/index.native.js +3 -1
  60. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  61. package/dist/cjs/fields/ColorPicker/parts.cjs +2 -1
  62. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -1
  63. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  64. package/dist/cjs/fields/Combobox/index.cjs +206 -200
  65. package/dist/cjs/fields/Combobox/index.native.js +214 -208
  66. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  67. package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +7 -7
  68. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +7 -7
  69. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  70. package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +6 -4
  71. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +6 -4
  72. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  73. package/dist/cjs/fields/DatePicker/parts.cjs +2 -1
  74. package/dist/cjs/fields/DatePicker/parts.native.js +2 -1
  75. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  76. package/dist/cjs/fields/Duration/index.cjs +6 -4
  77. package/dist/cjs/fields/Duration/index.native.js +6 -4
  78. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  79. package/dist/cjs/fields/FileUpload/index.cjs +10 -8
  80. package/dist/cjs/fields/FileUpload/index.native.js +10 -8
  81. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  82. package/dist/cjs/fields/FileUpload/nativePickerLoader.cjs +7 -2
  83. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js +7 -2
  84. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  85. package/dist/cjs/fields/Geolocation/GeolocationMap.cjs +3 -0
  86. package/dist/cjs/fields/Geolocation/geocoderContext.cjs +71 -0
  87. package/dist/cjs/fields/Geolocation/geocoderContext.native.js +75 -0
  88. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -0
  89. package/dist/cjs/fields/Geolocation/index.cjs +72 -82
  90. package/dist/cjs/fields/Geolocation/index.native.js +72 -82
  91. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  92. package/dist/cjs/fields/Geolocation/photonGeocoder.cjs +138 -0
  93. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js +179 -0
  94. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  95. package/dist/cjs/fields/Icon/index.cjs +1 -1
  96. package/dist/cjs/fields/Icon/index.native.js +1 -1
  97. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  98. package/dist/cjs/fields/Input/index.cjs +8 -6
  99. package/dist/cjs/fields/Input/index.native.js +8 -6
  100. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  101. package/dist/cjs/fields/MentionInput/index.cjs +118 -112
  102. package/dist/cjs/fields/MentionInput/index.native.js +130 -124
  103. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  104. package/dist/cjs/fields/OTPInput/index.cjs +11 -8
  105. package/dist/cjs/fields/OTPInput/index.native.js +11 -8
  106. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  107. package/dist/cjs/fields/PhoneInput/index.cjs +9 -6
  108. package/dist/cjs/fields/PhoneInput/index.native.js +9 -6
  109. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  110. package/dist/cjs/fields/PhoneInput/phone.cjs +6 -5
  111. package/dist/cjs/fields/PhoneInput/phone.native.js +7 -6
  112. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  113. package/dist/cjs/fields/PhoneInput/regionNames.cjs +274 -0
  114. package/dist/cjs/fields/PhoneInput/regionNames.native.js +277 -0
  115. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -0
  116. package/dist/cjs/fields/RadioGroup/index.cjs +2 -6
  117. package/dist/cjs/fields/RadioGroup/index.native.js +2 -6
  118. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  119. package/dist/cjs/fields/SearchInput/index.cjs +12 -10
  120. package/dist/cjs/fields/SearchInput/index.native.js +12 -10
  121. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  122. package/dist/cjs/fields/Select/index.cjs +20 -17
  123. package/dist/cjs/fields/Select/index.native.js +20 -17
  124. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  125. package/dist/cjs/fields/Signature/index.cjs +10 -9
  126. package/dist/cjs/fields/Signature/index.native.js +10 -9
  127. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  128. package/dist/cjs/fields/Slider/index.cjs +21 -15
  129. package/dist/cjs/fields/Slider/index.native.js +21 -17
  130. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  131. package/dist/cjs/fields/Slider/jumpMotion.cjs +2 -2
  132. package/dist/cjs/fields/Slider/jumpMotion.native.js +2 -1
  133. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  134. package/dist/cjs/fields/Stepper/index.cjs +25 -6
  135. package/dist/cjs/fields/Stepper/index.native.js +25 -6
  136. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  137. package/dist/cjs/fields/Switch/footprint.cjs +54 -0
  138. package/dist/cjs/fields/Switch/footprint.native.js +57 -0
  139. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -0
  140. package/dist/cjs/fields/Switch/index.cjs +60 -43
  141. package/dist/cjs/fields/Switch/index.native.js +60 -50
  142. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  143. package/dist/cjs/fields/TextArea/index.cjs +9 -6
  144. package/dist/cjs/fields/TextArea/index.native.js +9 -6
  145. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  146. package/dist/cjs/fields/TimePicker/catalog.cjs +1 -0
  147. package/dist/cjs/fields/TimePicker/catalog.native.js +1 -0
  148. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  149. package/dist/cjs/fields/TimePicker/parts.cjs +6 -1
  150. package/dist/cjs/fields/TimePicker/parts.native.js +8 -1
  151. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  152. package/dist/cjs/index.cjs +12 -0
  153. package/dist/cjs/index.native.js +12 -0
  154. package/dist/cjs/index.native.js.map +1 -1
  155. package/dist/cjs/shared/panelPortal.cjs +52 -0
  156. package/dist/cjs/shared/panelPortal.native.js +65 -0
  157. package/dist/cjs/shared/panelPortal.native.js.map +1 -0
  158. package/dist/cjs/shared/pressSlopProps.cjs +16 -11
  159. package/dist/cjs/shared/pressSlopProps.native.js +18 -12
  160. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  161. package/dist/cjs/shared/utils.cjs +2 -2
  162. package/dist/cjs/shared/utils.native.js +3 -2
  163. package/dist/cjs/shared/utils.native.js.map +1 -1
  164. package/dist/cjs/themedPrimitives.cjs +15 -2
  165. package/dist/cjs/themedPrimitives.native.js +16 -3
  166. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  167. package/dist/esm/AdaptivePopup/index.mjs +0 -10
  168. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  169. package/dist/esm/AdaptivePopup/index.native.js +0 -10
  170. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  171. package/dist/esm/Button/index.mjs +11 -4
  172. package/dist/esm/Button/index.mjs.map +1 -1
  173. package/dist/esm/Button/index.native.js +11 -4
  174. package/dist/esm/Button/index.native.js.map +1 -1
  175. package/dist/esm/Chip/index.mjs +6 -3
  176. package/dist/esm/Chip/index.mjs.map +1 -1
  177. package/dist/esm/Chip/index.native.js +7 -8
  178. package/dist/esm/Chip/index.native.js.map +1 -1
  179. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
  180. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  181. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js +3 -12
  182. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  183. package/dist/esm/ContextualSaveBar/index.mjs +13 -11
  184. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  185. package/dist/esm/ContextualSaveBar/index.native.js +13 -20
  186. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  187. package/dist/esm/FieldDisplay/index.mjs +24 -12
  188. package/dist/esm/FieldDisplay/index.mjs.map +1 -1
  189. package/dist/esm/FieldDisplay/index.native.js +25 -13
  190. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  191. package/dist/esm/FloatingPanel/PanelPortal.mjs +119 -0
  192. package/dist/esm/FloatingPanel/PanelPortal.mjs.map +1 -0
  193. package/dist/esm/FloatingPanel/PanelPortal.native.js +14 -0
  194. package/dist/esm/FloatingPanel/PanelPortal.native.js.map +1 -0
  195. package/dist/esm/FloatingPanel/index.mjs +119 -69
  196. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  197. package/dist/esm/FloatingPanel/index.native.js +68 -13
  198. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  199. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +17 -6
  200. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  201. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +17 -6
  202. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  203. package/dist/esm/Form/index.mjs +2 -1
  204. package/dist/esm/Form/index.mjs.map +1 -1
  205. package/dist/esm/Form/index.native.js +2 -1
  206. package/dist/esm/Form/index.native.js.map +1 -1
  207. package/dist/esm/Form/submissionController.mjs +49 -0
  208. package/dist/esm/Form/submissionController.mjs.map +1 -0
  209. package/dist/esm/Form/submissionController.native.js +71 -0
  210. package/dist/esm/Form/submissionController.native.js.map +1 -0
  211. package/dist/esm/InputParts/index.mjs +67 -13
  212. package/dist/esm/InputParts/index.mjs.map +1 -1
  213. package/dist/esm/InputParts/index.native.js +73 -13
  214. package/dist/esm/InputParts/index.native.js.map +1 -1
  215. package/dist/esm/Skeleton/index.mjs +1 -3
  216. package/dist/esm/Skeleton/index.mjs.map +1 -1
  217. package/dist/esm/Skeleton/index.native.js +3 -6
  218. package/dist/esm/Skeleton/index.native.js.map +1 -1
  219. package/dist/esm/Wheel/index.mjs +0 -2
  220. package/dist/esm/Wheel/index.mjs.map +1 -1
  221. package/dist/esm/Wheel/index.native.js +0 -2
  222. package/dist/esm/Wheel/index.native.js.map +1 -1
  223. package/dist/esm/fieldLayout.mjs +1 -1
  224. package/dist/esm/fieldLayout.mjs.map +1 -1
  225. package/dist/esm/fieldLayout.native.js +1 -1
  226. package/dist/esm/fieldLayout.native.js.map +1 -1
  227. package/dist/esm/fields/Barcode/BarcodePreview.mjs +19 -16
  228. package/dist/esm/fields/Barcode/BarcodePreview.mjs.map +1 -1
  229. package/dist/esm/fields/Barcode/BarcodePreview.native.js +22 -19
  230. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  231. package/dist/esm/fields/Barcode/index.mjs +1 -1
  232. package/dist/esm/fields/Barcode/index.mjs.map +1 -1
  233. package/dist/esm/fields/Barcode/index.native.js +1 -1
  234. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  235. package/dist/esm/fields/Barcode/qr.native.js +34 -34
  236. package/dist/esm/fields/Checkbox/Checkbox.mjs +2 -4
  237. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  238. package/dist/esm/fields/Checkbox/Checkbox.native.js +2 -4
  239. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  240. package/dist/esm/fields/Checkbox/CheckboxBox.mjs +3 -4
  241. package/dist/esm/fields/Checkbox/CheckboxBox.mjs.map +1 -1
  242. package/dist/esm/fields/Checkbox/CheckboxBox.native.js +3 -4
  243. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  244. package/dist/esm/fields/ColorPicker/index.mjs +3 -1
  245. package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
  246. package/dist/esm/fields/ColorPicker/index.native.js +3 -1
  247. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  248. package/dist/esm/fields/ColorPicker/parts.mjs +2 -1
  249. package/dist/esm/fields/ColorPicker/parts.mjs.map +1 -1
  250. package/dist/esm/fields/ColorPicker/parts.native.js +2 -1
  251. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  252. package/dist/esm/fields/Combobox/index.mjs +197 -191
  253. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  254. package/dist/esm/fields/Combobox/index.native.js +205 -199
  255. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  256. package/dist/esm/fields/DatePicker/DateRangePicker.mjs +5 -5
  257. package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  258. package/dist/esm/fields/DatePicker/DateRangePicker.native.js +5 -5
  259. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  260. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +3 -1
  261. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  262. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +3 -1
  263. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  264. package/dist/esm/fields/DatePicker/parts.mjs +2 -1
  265. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  266. package/dist/esm/fields/DatePicker/parts.native.js +2 -1
  267. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  268. package/dist/esm/fields/Duration/index.mjs +4 -2
  269. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  270. package/dist/esm/fields/Duration/index.native.js +4 -2
  271. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  272. package/dist/esm/fields/FileUpload/index.mjs +5 -3
  273. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  274. package/dist/esm/fields/FileUpload/index.native.js +5 -3
  275. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  276. package/dist/esm/fields/FileUpload/nativePickerLoader.mjs +7 -3
  277. package/dist/esm/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
  278. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js +7 -3
  279. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  280. package/dist/esm/fields/Geolocation/GeolocationMap.mjs +3 -0
  281. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  282. package/dist/esm/fields/Geolocation/geocoderContext.mjs +44 -0
  283. package/dist/esm/fields/Geolocation/geocoderContext.mjs.map +1 -0
  284. package/dist/esm/fields/Geolocation/geocoderContext.native.js +45 -0
  285. package/dist/esm/fields/Geolocation/geocoderContext.native.js.map +1 -0
  286. package/dist/esm/fields/Geolocation/index.mjs +73 -83
  287. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  288. package/dist/esm/fields/Geolocation/index.native.js +73 -83
  289. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  290. package/dist/esm/fields/Geolocation/photonGeocoder.mjs +112 -0
  291. package/dist/esm/fields/Geolocation/photonGeocoder.mjs.map +1 -0
  292. package/dist/esm/fields/Geolocation/photonGeocoder.native.js +150 -0
  293. package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  294. package/dist/esm/fields/Icon/index.mjs +1 -1
  295. package/dist/esm/fields/Icon/index.mjs.map +1 -1
  296. package/dist/esm/fields/Icon/index.native.js +1 -1
  297. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  298. package/dist/esm/fields/Input/index.mjs +4 -2
  299. package/dist/esm/fields/Input/index.mjs.map +1 -1
  300. package/dist/esm/fields/Input/index.native.js +4 -2
  301. package/dist/esm/fields/Input/index.native.js.map +1 -1
  302. package/dist/esm/fields/MentionInput/index.mjs +115 -109
  303. package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
  304. package/dist/esm/fields/MentionInput/index.native.js +127 -121
  305. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  306. package/dist/esm/fields/OTPInput/index.mjs +7 -4
  307. package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
  308. package/dist/esm/fields/OTPInput/index.native.js +7 -4
  309. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  310. package/dist/esm/fields/PhoneInput/index.mjs +6 -3
  311. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  312. package/dist/esm/fields/PhoneInput/index.native.js +6 -3
  313. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  314. package/dist/esm/fields/PhoneInput/phone.mjs +6 -5
  315. package/dist/esm/fields/PhoneInput/phone.mjs.map +1 -1
  316. package/dist/esm/fields/PhoneInput/phone.native.js +7 -6
  317. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  318. package/dist/esm/fields/PhoneInput/regionNames.mjs +249 -0
  319. package/dist/esm/fields/PhoneInput/regionNames.mjs.map +1 -0
  320. package/dist/esm/fields/PhoneInput/regionNames.native.js +249 -0
  321. package/dist/esm/fields/PhoneInput/regionNames.native.js.map +1 -0
  322. package/dist/esm/fields/RadioGroup/index.mjs +3 -7
  323. package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
  324. package/dist/esm/fields/RadioGroup/index.native.js +3 -7
  325. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  326. package/dist/esm/fields/SearchInput/index.mjs +7 -5
  327. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  328. package/dist/esm/fields/SearchInput/index.native.js +7 -5
  329. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  330. package/dist/esm/fields/Select/index.mjs +10 -7
  331. package/dist/esm/fields/Select/index.mjs.map +1 -1
  332. package/dist/esm/fields/Select/index.native.js +10 -7
  333. package/dist/esm/fields/Select/index.native.js.map +1 -1
  334. package/dist/esm/fields/Signature/index.mjs +7 -6
  335. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  336. package/dist/esm/fields/Signature/index.native.js +7 -6
  337. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  338. package/dist/esm/fields/Slider/index.mjs +10 -4
  339. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  340. package/dist/esm/fields/Slider/index.native.js +10 -6
  341. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  342. package/dist/esm/fields/Slider/jumpMotion.mjs +2 -2
  343. package/dist/esm/fields/Slider/jumpMotion.mjs.map +1 -1
  344. package/dist/esm/fields/Slider/jumpMotion.native.js +2 -1
  345. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  346. package/dist/esm/fields/Stepper/index.mjs +24 -5
  347. package/dist/esm/fields/Stepper/index.mjs.map +1 -1
  348. package/dist/esm/fields/Stepper/index.native.js +24 -5
  349. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  350. package/dist/esm/fields/Switch/footprint.mjs +29 -0
  351. package/dist/esm/fields/Switch/footprint.mjs.map +1 -0
  352. package/dist/esm/fields/Switch/footprint.native.js +29 -0
  353. package/dist/esm/fields/Switch/footprint.native.js.map +1 -0
  354. package/dist/esm/fields/Switch/index.mjs +44 -27
  355. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  356. package/dist/esm/fields/Switch/index.native.js +44 -34
  357. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  358. package/dist/esm/fields/TextArea/index.mjs +9 -6
  359. package/dist/esm/fields/TextArea/index.mjs.map +1 -1
  360. package/dist/esm/fields/TextArea/index.native.js +9 -6
  361. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  362. package/dist/esm/fields/TimePicker/catalog.mjs +1 -0
  363. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -1
  364. package/dist/esm/fields/TimePicker/catalog.native.js +1 -0
  365. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  366. package/dist/esm/fields/TimePicker/parts.mjs +6 -1
  367. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  368. package/dist/esm/fields/TimePicker/parts.native.js +8 -1
  369. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  370. package/dist/esm/index.mjs +6 -1
  371. package/dist/esm/index.mjs.map +1 -1
  372. package/dist/esm/index.native.js +6 -1
  373. package/dist/esm/index.native.js.map +1 -1
  374. package/dist/esm/shared/panelPortal.mjs +24 -0
  375. package/dist/esm/shared/panelPortal.mjs.map +1 -0
  376. package/dist/esm/shared/panelPortal.native.js +34 -0
  377. package/dist/esm/shared/panelPortal.native.js.map +1 -0
  378. package/dist/esm/shared/pressSlopProps.mjs +16 -12
  379. package/dist/esm/shared/pressSlopProps.mjs.map +1 -1
  380. package/dist/esm/shared/pressSlopProps.native.js +18 -13
  381. package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
  382. package/dist/esm/shared/utils.mjs +2 -2
  383. package/dist/esm/shared/utils.mjs.map +1 -1
  384. package/dist/esm/shared/utils.native.js +3 -2
  385. package/dist/esm/shared/utils.native.js.map +1 -1
  386. package/dist/esm/themedPrimitives.mjs +16 -3
  387. package/dist/esm/themedPrimitives.mjs.map +1 -1
  388. package/dist/esm/themedPrimitives.native.js +17 -4
  389. package/dist/esm/themedPrimitives.native.js.map +1 -1
  390. package/dist/jsx/AdaptivePopup/index.mjs +0 -10
  391. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  392. package/dist/jsx/AdaptivePopup/index.native.js +0 -10
  393. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  394. package/dist/jsx/Button/index.mjs +11 -4
  395. package/dist/jsx/Button/index.mjs.map +1 -1
  396. package/dist/jsx/Button/index.native.js +11 -4
  397. package/dist/jsx/Button/index.native.js.map +1 -1
  398. package/dist/jsx/Chip/index.mjs +6 -3
  399. package/dist/jsx/Chip/index.mjs.map +1 -1
  400. package/dist/jsx/Chip/index.native.js +6 -7
  401. package/dist/jsx/Chip/index.native.js.map +1 -1
  402. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs +3 -12
  403. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
  404. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +2 -11
  405. package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  406. package/dist/jsx/ContextualSaveBar/index.mjs +13 -11
  407. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  408. package/dist/jsx/ContextualSaveBar/index.native.js +12 -19
  409. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  410. package/dist/jsx/FieldDisplay/index.mjs +24 -12
  411. package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
  412. package/dist/jsx/FieldDisplay/index.native.js +25 -13
  413. package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
  414. package/dist/jsx/FloatingPanel/PanelPortal.mjs +119 -0
  415. package/dist/jsx/FloatingPanel/PanelPortal.mjs.map +1 -0
  416. package/dist/jsx/FloatingPanel/PanelPortal.native.js +43 -0
  417. package/dist/jsx/FloatingPanel/PanelPortal.native.js.map +1 -0
  418. package/dist/jsx/FloatingPanel/index.mjs +119 -69
  419. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  420. package/dist/jsx/FloatingPanel/index.native.js +67 -12
  421. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  422. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +17 -6
  423. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  424. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +16 -5
  425. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  426. package/dist/jsx/Form/index.mjs +2 -1
  427. package/dist/jsx/Form/index.mjs.map +1 -1
  428. package/dist/jsx/Form/index.native.js +2 -1
  429. package/dist/jsx/Form/index.native.js.map +1 -1
  430. package/dist/jsx/Form/submissionController.mjs +49 -0
  431. package/dist/jsx/Form/submissionController.mjs.map +1 -0
  432. package/dist/jsx/Form/submissionController.native.js +99 -0
  433. package/dist/jsx/Form/submissionController.native.js.map +1 -0
  434. package/dist/jsx/InputParts/index.mjs +67 -13
  435. package/dist/jsx/InputParts/index.mjs.map +1 -1
  436. package/dist/jsx/InputParts/index.native.js +72 -12
  437. package/dist/jsx/InputParts/index.native.js.map +1 -1
  438. package/dist/jsx/Skeleton/index.mjs +1 -3
  439. package/dist/jsx/Skeleton/index.mjs.map +1 -1
  440. package/dist/jsx/Skeleton/index.native.js +3 -6
  441. package/dist/jsx/Skeleton/index.native.js.map +1 -1
  442. package/dist/jsx/Wheel/index.mjs +0 -2
  443. package/dist/jsx/Wheel/index.mjs.map +1 -1
  444. package/dist/jsx/Wheel/index.native.js +0 -2
  445. package/dist/jsx/Wheel/index.native.js.map +1 -1
  446. package/dist/jsx/fieldLayout.mjs +1 -1
  447. package/dist/jsx/fieldLayout.mjs.map +1 -1
  448. package/dist/jsx/fieldLayout.native.js +1 -1
  449. package/dist/jsx/fieldLayout.native.js.map +1 -1
  450. package/dist/jsx/fields/Barcode/BarcodePreview.mjs +19 -16
  451. package/dist/jsx/fields/Barcode/BarcodePreview.mjs.map +1 -1
  452. package/dist/jsx/fields/Barcode/BarcodePreview.native.js +21 -18
  453. package/dist/jsx/fields/Barcode/BarcodePreview.native.js.map +1 -1
  454. package/dist/jsx/fields/Barcode/index.mjs +1 -1
  455. package/dist/jsx/fields/Barcode/index.mjs.map +1 -1
  456. package/dist/jsx/fields/Barcode/index.native.js +1 -1
  457. package/dist/jsx/fields/Barcode/index.native.js.map +1 -1
  458. package/dist/jsx/fields/Barcode/qr.native.js +34 -34
  459. package/dist/jsx/fields/Checkbox/Checkbox.mjs +2 -4
  460. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  461. package/dist/jsx/fields/Checkbox/Checkbox.native.js +1 -3
  462. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  463. package/dist/jsx/fields/Checkbox/CheckboxBox.mjs +3 -4
  464. package/dist/jsx/fields/Checkbox/CheckboxBox.mjs.map +1 -1
  465. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js +2 -3
  466. package/dist/jsx/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  467. package/dist/jsx/fields/ColorPicker/index.mjs +3 -1
  468. package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
  469. package/dist/jsx/fields/ColorPicker/index.native.js +3 -1
  470. package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
  471. package/dist/jsx/fields/ColorPicker/parts.mjs +2 -1
  472. package/dist/jsx/fields/ColorPicker/parts.mjs.map +1 -1
  473. package/dist/jsx/fields/ColorPicker/parts.native.js +2 -1
  474. package/dist/jsx/fields/ColorPicker/parts.native.js.map +1 -1
  475. package/dist/jsx/fields/Combobox/index.mjs +197 -191
  476. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  477. package/dist/jsx/fields/Combobox/index.native.js +214 -208
  478. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  479. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +5 -5
  480. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  481. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +7 -7
  482. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  483. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +3 -1
  484. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  485. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +6 -4
  486. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  487. package/dist/jsx/fields/DatePicker/parts.mjs +2 -1
  488. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  489. package/dist/jsx/fields/DatePicker/parts.native.js +2 -1
  490. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  491. package/dist/jsx/fields/Duration/index.mjs +4 -2
  492. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  493. package/dist/jsx/fields/Duration/index.native.js +6 -4
  494. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  495. package/dist/jsx/fields/FileUpload/index.mjs +5 -3
  496. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  497. package/dist/jsx/fields/FileUpload/index.native.js +10 -8
  498. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  499. package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs +7 -3
  500. package/dist/jsx/fields/FileUpload/nativePickerLoader.mjs.map +1 -1
  501. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js +7 -2
  502. package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  503. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs +3 -0
  504. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  505. package/dist/jsx/fields/Geolocation/geocoderContext.mjs +44 -0
  506. package/dist/jsx/fields/Geolocation/geocoderContext.mjs.map +1 -0
  507. package/dist/jsx/fields/Geolocation/geocoderContext.native.js +75 -0
  508. package/dist/jsx/fields/Geolocation/geocoderContext.native.js.map +1 -0
  509. package/dist/jsx/fields/Geolocation/index.mjs +73 -83
  510. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  511. package/dist/jsx/fields/Geolocation/index.native.js +72 -82
  512. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  513. package/dist/jsx/fields/Geolocation/photonGeocoder.mjs +112 -0
  514. package/dist/jsx/fields/Geolocation/photonGeocoder.mjs.map +1 -0
  515. package/dist/jsx/fields/Geolocation/photonGeocoder.native.js +179 -0
  516. package/dist/jsx/fields/Geolocation/photonGeocoder.native.js.map +1 -0
  517. package/dist/jsx/fields/Icon/index.mjs +1 -1
  518. package/dist/jsx/fields/Icon/index.mjs.map +1 -1
  519. package/dist/jsx/fields/Icon/index.native.js +1 -1
  520. package/dist/jsx/fields/Icon/index.native.js.map +1 -1
  521. package/dist/jsx/fields/Input/index.mjs +4 -2
  522. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  523. package/dist/jsx/fields/Input/index.native.js +8 -6
  524. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  525. package/dist/jsx/fields/MentionInput/index.mjs +115 -109
  526. package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
  527. package/dist/jsx/fields/MentionInput/index.native.js +130 -124
  528. package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
  529. package/dist/jsx/fields/OTPInput/index.mjs +7 -4
  530. package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
  531. package/dist/jsx/fields/OTPInput/index.native.js +11 -8
  532. package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
  533. package/dist/jsx/fields/PhoneInput/index.mjs +6 -3
  534. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  535. package/dist/jsx/fields/PhoneInput/index.native.js +9 -6
  536. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  537. package/dist/jsx/fields/PhoneInput/phone.mjs +6 -5
  538. package/dist/jsx/fields/PhoneInput/phone.mjs.map +1 -1
  539. package/dist/jsx/fields/PhoneInput/phone.native.js +7 -6
  540. package/dist/jsx/fields/PhoneInput/phone.native.js.map +1 -1
  541. package/dist/jsx/fields/PhoneInput/regionNames.mjs +249 -0
  542. package/dist/jsx/fields/PhoneInput/regionNames.mjs.map +1 -0
  543. package/dist/jsx/fields/PhoneInput/regionNames.native.js +277 -0
  544. package/dist/jsx/fields/PhoneInput/regionNames.native.js.map +1 -0
  545. package/dist/jsx/fields/RadioGroup/index.mjs +3 -7
  546. package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
  547. package/dist/jsx/fields/RadioGroup/index.native.js +2 -6
  548. package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
  549. package/dist/jsx/fields/SearchInput/index.mjs +7 -5
  550. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  551. package/dist/jsx/fields/SearchInput/index.native.js +12 -10
  552. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  553. package/dist/jsx/fields/Select/index.mjs +10 -7
  554. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  555. package/dist/jsx/fields/Select/index.native.js +20 -17
  556. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  557. package/dist/jsx/fields/Signature/index.mjs +7 -6
  558. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  559. package/dist/jsx/fields/Signature/index.native.js +10 -9
  560. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  561. package/dist/jsx/fields/Slider/index.mjs +10 -4
  562. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  563. package/dist/jsx/fields/Slider/index.native.js +21 -17
  564. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  565. package/dist/jsx/fields/Slider/jumpMotion.mjs +2 -2
  566. package/dist/jsx/fields/Slider/jumpMotion.mjs.map +1 -1
  567. package/dist/jsx/fields/Slider/jumpMotion.native.js +2 -1
  568. package/dist/jsx/fields/Slider/jumpMotion.native.js.map +1 -1
  569. package/dist/jsx/fields/Stepper/index.mjs +24 -5
  570. package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
  571. package/dist/jsx/fields/Stepper/index.native.js +25 -6
  572. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  573. package/dist/jsx/fields/Switch/footprint.mjs +29 -0
  574. package/dist/jsx/fields/Switch/footprint.mjs.map +1 -0
  575. package/dist/jsx/fields/Switch/footprint.native.js +57 -0
  576. package/dist/jsx/fields/Switch/footprint.native.js.map +1 -0
  577. package/dist/jsx/fields/Switch/index.mjs +44 -27
  578. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  579. package/dist/jsx/fields/Switch/index.native.js +60 -50
  580. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  581. package/dist/jsx/fields/TextArea/index.mjs +9 -6
  582. package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
  583. package/dist/jsx/fields/TextArea/index.native.js +9 -6
  584. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  585. package/dist/jsx/fields/TimePicker/catalog.mjs +1 -0
  586. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -1
  587. package/dist/jsx/fields/TimePicker/catalog.native.js +1 -0
  588. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -1
  589. package/dist/jsx/fields/TimePicker/parts.mjs +6 -1
  590. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  591. package/dist/jsx/fields/TimePicker/parts.native.js +8 -1
  592. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  593. package/dist/jsx/index.js +6 -1
  594. package/dist/jsx/index.js.map +1 -1
  595. package/dist/jsx/index.mjs +6 -1
  596. package/dist/jsx/index.mjs.map +1 -1
  597. package/dist/jsx/index.native.js +12 -0
  598. package/dist/jsx/index.native.js.map +1 -1
  599. package/dist/jsx/shared/panelPortal.mjs +24 -0
  600. package/dist/jsx/shared/panelPortal.mjs.map +1 -0
  601. package/dist/jsx/shared/panelPortal.native.js +65 -0
  602. package/dist/jsx/shared/panelPortal.native.js.map +1 -0
  603. package/dist/jsx/shared/pressSlopProps.mjs +16 -12
  604. package/dist/jsx/shared/pressSlopProps.mjs.map +1 -1
  605. package/dist/jsx/shared/pressSlopProps.native.js +18 -12
  606. package/dist/jsx/shared/pressSlopProps.native.js.map +1 -1
  607. package/dist/jsx/shared/utils.mjs +2 -2
  608. package/dist/jsx/shared/utils.mjs.map +1 -1
  609. package/dist/jsx/shared/utils.native.js +3 -2
  610. package/dist/jsx/shared/utils.native.js.map +1 -1
  611. package/dist/jsx/themedPrimitives.mjs +16 -3
  612. package/dist/jsx/themedPrimitives.mjs.map +1 -1
  613. package/dist/jsx/themedPrimitives.native.js +16 -3
  614. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  615. package/package.json +15 -11
  616. package/src/AdaptivePopup/AdaptivePopup.spec.tsx +2 -3
  617. package/src/AdaptivePopup/index.tsx +11 -10
  618. package/src/Button/Button.borderLadder.spec.tsx +82 -0
  619. package/src/Button/Button.labelInk.spec.tsx +4 -1
  620. package/src/Button/Button.lc71.spec.tsx +17 -0
  621. package/src/Button/Button.radiusLaw.spec.tsx +153 -0
  622. package/src/Button/index.tsx +11 -4
  623. package/src/Chip/Chip.spec.tsx +23 -0
  624. package/src/Chip/index.tsx +10 -6
  625. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +24 -0
  626. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +37 -1
  627. package/src/ContextualSaveBar/UnsavedChangesDialog.tsx +3 -11
  628. package/src/ContextualSaveBar/index.tsx +17 -11
  629. package/src/ErrorSummary.stories.tsx +20 -11
  630. package/src/FieldDisplay/FieldDisplay.spec.tsx +47 -2
  631. package/src/FieldDisplay/index.tsx +21 -13
  632. package/src/FloatingPanel/FloatingPanel.detentLayout.spec.tsx +148 -0
  633. package/src/FloatingPanel/FloatingPanel.spec.tsx +140 -1
  634. package/src/FloatingPanel/FloatingPanel.stories.tsx +86 -1
  635. package/src/FloatingPanel/PanelPortal.native.tsx +15 -0
  636. package/src/FloatingPanel/PanelPortal.tsx +149 -0
  637. package/src/FloatingPanel/index.native.tsx +96 -19
  638. package/src/FloatingPanel/index.tsx +180 -86
  639. package/src/FloatingPanel/panelPortal.spec.tsx +142 -0
  640. package/src/FloatingPanel/panelWidthContract.spec.ts +17 -5
  641. package/src/FloatingPanel/touchRecipeHydration.spec.tsx +82 -0
  642. package/src/FloatingPanel/useFloatingPanel.spec.tsx +81 -0
  643. package/src/FloatingPanel/useFloatingPanel.ts +39 -12
  644. package/src/FloatingPanel/viewportHydration.spec.tsx +118 -0
  645. package/src/Form/index.tsx +2 -1
  646. package/src/Form/submission.spec.tsx +148 -0
  647. package/src/Form/submissionController.spec.ts +73 -0
  648. package/src/Form/submissionController.ts +59 -0
  649. package/src/Form/submissionDiscard.spec.tsx +41 -0
  650. package/src/Form/submissionPaths.spec.tsx +214 -0
  651. package/src/InputParts/index.tsx +48 -12
  652. package/src/Label/Label.stories.tsx +27 -11
  653. package/src/Skeleton/Skeleton.radius.spec.tsx +30 -0
  654. package/src/Skeleton/index.tsx +4 -7
  655. package/src/Wheel/Wheel.spec.tsx +9 -2
  656. package/src/Wheel/index.tsx +0 -2
  657. package/src/errorTint.spec.tsx +70 -0
  658. package/src/fieldFamilyStories.radius.spec.tsx +48 -0
  659. package/src/fieldLayout.tsx +1 -1
  660. package/src/fields/Barcode/BarcodePreview.spec.tsx +32 -12
  661. package/src/fields/Barcode/BarcodePreview.stories.tsx +5 -4
  662. package/src/fields/Barcode/BarcodePreview.tsx +31 -25
  663. package/src/fields/Barcode/index.tsx +3 -3
  664. package/src/fields/Checkbox/Checkbox.native.spec.tsx +92 -0
  665. package/src/fields/Checkbox/Checkbox.stories.tsx +1 -0
  666. package/src/fields/Checkbox/Checkbox.tsx +2 -2
  667. package/src/fields/Checkbox/CheckboxBox.spec.tsx +13 -13
  668. package/src/fields/Checkbox/CheckboxBox.tsx +7 -1
  669. package/src/fields/ColorPicker/index.tsx +7 -2
  670. package/src/fields/ColorPicker/parts.tsx +2 -1
  671. package/src/fields/Combobox/Combobox.spec.tsx +85 -55
  672. package/src/fields/Combobox/index.tsx +259 -240
  673. package/src/fields/DatePicker/DateRangePicker.tsx +5 -3
  674. package/src/fields/DatePicker/MultiDatePicker.tsx +3 -1
  675. package/src/fields/DatePicker/parts.tsx +2 -1
  676. package/src/fields/Duration/index.tsx +4 -2
  677. package/src/fields/FileUpload/index.tsx +13 -3
  678. package/src/fields/FileUpload/nativePickerLoader.spec.ts +34 -0
  679. package/src/fields/FileUpload/nativePickerLoader.ts +11 -2
  680. package/src/fields/Geolocation/Geolocation.spec.tsx +165 -4
  681. package/src/fields/Geolocation/Geolocation.stories.tsx +110 -26
  682. package/src/fields/Geolocation/GeolocationMap.tsx +3 -0
  683. package/src/fields/Geolocation/geocoderContext.tsx +56 -0
  684. package/src/fields/Geolocation/index.tsx +75 -80
  685. package/src/fields/Geolocation/photonGeocoder.spec.ts +214 -0
  686. package/src/fields/Geolocation/photonGeocoder.ts +150 -0
  687. package/src/fields/Icon/index.tsx +1 -1
  688. package/src/fields/Input/index.tsx +4 -2
  689. package/src/fields/MentionInput/MentionInput.spec.tsx +41 -30
  690. package/src/fields/MentionInput/index.tsx +128 -119
  691. package/src/fields/OTPInput/index.tsx +7 -4
  692. package/src/fields/PhoneInput/PhoneInput.spec.tsx +63 -0
  693. package/src/fields/PhoneInput/index.tsx +13 -8
  694. package/src/fields/PhoneInput/phone.native.spec.ts +32 -0
  695. package/src/fields/PhoneInput/phone.ts +5 -2
  696. package/src/fields/PhoneInput/regionNames.ts +250 -0
  697. package/src/fields/RadioGroup/RadioGroup.stories.tsx +4 -3
  698. package/src/fields/RadioGroup/index.tsx +3 -2
  699. package/src/fields/Rating/StarInk.native.spec.tsx +1 -1
  700. package/src/fields/SearchInput/index.tsx +6 -5
  701. package/src/fields/Select/Select.spec.tsx +36 -29
  702. package/src/fields/Select/index.tsx +14 -5
  703. package/src/fields/Signature/index.tsx +7 -3
  704. package/src/fields/Slider/index.tsx +14 -4
  705. package/src/fields/Slider/jumpMotion.ts +6 -2
  706. package/src/fields/Stepper/Stepper.spec.tsx +30 -0
  707. package/src/fields/Stepper/index.tsx +34 -4
  708. package/src/fields/Switch/Switch.footprint.native.spec.tsx +58 -0
  709. package/src/fields/Switch/Switch.footprint.spec.tsx +79 -0
  710. package/src/fields/Switch/Switch.radius.spec.tsx +37 -6
  711. package/src/fields/Switch/footprint.ts +45 -0
  712. package/src/fields/Switch/index.tsx +46 -49
  713. package/src/fields/TextArea/TextArea.spec.tsx +30 -1
  714. package/src/fields/TextArea/index.tsx +9 -6
  715. package/src/fields/TimePicker/TimePicker.native.spec.tsx +48 -0
  716. package/src/fields/TimePicker/catalog.tsx +1 -0
  717. package/src/fields/TimePicker/parts.tsx +5 -1
  718. package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +17 -8
  719. package/src/fields/pickerShellPadding.spec.tsx +54 -0
  720. package/src/index.ts +8 -0
  721. package/src/shared/panelPortal.ts +36 -0
  722. package/src/shared/pressSlopProps.spec.ts +27 -1
  723. package/src/shared/pressSlopProps.ts +26 -17
  724. package/src/shared/utils.ts +2 -2
  725. package/src/themedPrimitives.tsx +16 -3
  726. package/types/AdaptivePopup/index.d.ts.map +1 -1
  727. package/types/Button/index.d.ts.map +1 -1
  728. package/types/Chip/index.d.ts.map +1 -1
  729. package/types/ContextualSaveBar/UnsavedChangesDialog.d.ts.map +1 -1
  730. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  731. package/types/FieldDisplay/index.d.ts.map +1 -1
  732. package/types/FloatingPanel/PanelPortal.d.ts +24 -0
  733. package/types/FloatingPanel/PanelPortal.d.ts.map +1 -0
  734. package/types/FloatingPanel/PanelPortal.native.d.ts +9 -0
  735. package/types/FloatingPanel/PanelPortal.native.d.ts.map +1 -0
  736. package/types/FloatingPanel/index.d.ts +6 -5
  737. package/types/FloatingPanel/index.d.ts.map +1 -1
  738. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  739. package/types/FloatingPanel/useFloatingPanel.d.ts +10 -4
  740. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  741. package/types/Form/index.d.ts.map +1 -1
  742. package/types/Form/submissionController.d.ts +21 -0
  743. package/types/Form/submissionController.d.ts.map +1 -0
  744. package/types/InputParts/index.d.ts +34 -2
  745. package/types/InputParts/index.d.ts.map +1 -1
  746. package/types/Skeleton/index.d.ts.map +1 -1
  747. package/types/Wheel/index.d.ts.map +1 -1
  748. package/types/fields/Barcode/BarcodePreview.d.ts +7 -3
  749. package/types/fields/Barcode/BarcodePreview.d.ts.map +1 -1
  750. package/types/fields/Checkbox/CheckboxBox.d.ts +5 -0
  751. package/types/fields/Checkbox/CheckboxBox.d.ts.map +1 -1
  752. package/types/fields/ColorPicker/index.d.ts.map +1 -1
  753. package/types/fields/ColorPicker/parts.d.ts +2 -0
  754. package/types/fields/ColorPicker/parts.d.ts.map +1 -1
  755. package/types/fields/Combobox/index.d.ts.map +1 -1
  756. package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
  757. package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
  758. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  759. package/types/fields/Duration/index.d.ts.map +1 -1
  760. package/types/fields/FileUpload/index.d.ts.map +1 -1
  761. package/types/fields/FileUpload/nativePickerLoader.d.ts +8 -0
  762. package/types/fields/FileUpload/nativePickerLoader.d.ts.map +1 -1
  763. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  764. package/types/fields/Geolocation/geocoderContext.d.ts +24 -0
  765. package/types/fields/Geolocation/geocoderContext.d.ts.map +1 -0
  766. package/types/fields/Geolocation/index.d.ts +2 -1
  767. package/types/fields/Geolocation/index.d.ts.map +1 -1
  768. package/types/fields/Geolocation/photonGeocoder.d.ts +46 -0
  769. package/types/fields/Geolocation/photonGeocoder.d.ts.map +1 -0
  770. package/types/fields/Input/index.d.ts +19 -1
  771. package/types/fields/Input/index.d.ts.map +1 -1
  772. package/types/fields/MentionInput/index.d.ts.map +1 -1
  773. package/types/fields/OTPInput/index.d.ts +1 -1
  774. package/types/fields/OTPInput/index.d.ts.map +1 -1
  775. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  776. package/types/fields/PhoneInput/phone.d.ts.map +1 -1
  777. package/types/fields/PhoneInput/regionNames.d.ts +2 -0
  778. package/types/fields/PhoneInput/regionNames.d.ts.map +1 -0
  779. package/types/fields/RadioGroup/index.d.ts.map +1 -1
  780. package/types/fields/SearchInput/index.d.ts.map +1 -1
  781. package/types/fields/Select/index.d.ts.map +1 -1
  782. package/types/fields/Signature/index.d.ts.map +1 -1
  783. package/types/fields/Slider/index.d.ts.map +1 -1
  784. package/types/fields/Slider/jumpMotion.d.ts +1 -1
  785. package/types/fields/Slider/jumpMotion.d.ts.map +1 -1
  786. package/types/fields/Stepper/index.d.ts +6 -0
  787. package/types/fields/Stepper/index.d.ts.map +1 -1
  788. package/types/fields/Switch/footprint.d.ts +12 -0
  789. package/types/fields/Switch/footprint.d.ts.map +1 -0
  790. package/types/fields/Switch/index.d.ts.map +1 -1
  791. package/types/fields/TextArea/index.d.ts.map +1 -1
  792. package/types/fields/TimePicker/catalog.d.ts.map +1 -1
  793. package/types/fields/TimePicker/parts.d.ts.map +1 -1
  794. package/types/index.d.ts +8 -0
  795. package/types/index.d.ts.map +1 -1
  796. package/types/shared/panelPortal.d.ts +13 -0
  797. package/types/shared/panelPortal.d.ts.map +1 -0
  798. package/types/shared/pressSlopProps.d.ts +9 -2
  799. package/types/shared/pressSlopProps.d.ts.map +1 -1
  800. package/types/shared/utils.d.ts +1 -1
  801. package/types/shared/utils.d.ts.map +1 -1
  802. package/types/themedPrimitives.d.ts +48 -1
  803. package/types/themedPrimitives.d.ts.map +1 -1
@@ -1,5 +1,12 @@
1
1
  import type { ReactNode, RefObject, UIEvent } from "react";
2
- import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
2
+ import {
3
+ useCallback,
4
+ useEffect,
5
+ useLayoutEffect,
6
+ useRef,
7
+ useState,
8
+ useSyncExternalStore,
9
+ } from "react";
3
10
  import {
4
11
  OVERLAY_ATTACH_GAP,
5
12
  OVERLAY_BREAKPOINT,
@@ -7,7 +14,7 @@ import {
7
14
  wasKeyboardFocus,
8
15
  ensureKeyboardModalityTracking,
9
16
  } from "@multiplatform.one/theme";
10
- import { isWeb, Sheet, useMedia, View, YStack } from "tamagui";
17
+ import { isWeb, Sheet, View, YStack } from "tamagui";
11
18
  import { useClick, useDismiss, useInteractions } from "@floating-ui/react";
12
19
  import { ScrollArrow } from "../shared/floatingList";
13
20
  import { useReturnFocusOnClose, useSheetModalFocus } from "../shared/focusManagement";
@@ -16,6 +23,9 @@ import { useFloatingPanel, panelTransition, panelViewportPadding } from "./useFl
16
23
  import type { PanelWidthMode } from "./useFloatingPanel";
17
24
  import { zIndex } from "../shared/zIndex";
18
25
  import { isNestedPanelAction, type PanelActionEvent } from "./nestedAction";
26
+ import { PanelPortal } from "./PanelPortal";
27
+
28
+ type PointerOpenEvent = PanelActionEvent & { button?: number; target?: unknown };
19
29
 
20
30
  export { floatingPanelActionProps, isNestedPanelAction } from "./nestedAction";
21
31
 
@@ -98,6 +108,12 @@ export interface FloatingPanelProps {
98
108
  * that handle their own internal spacing.
99
109
  */
100
110
  contentPadding?: "none" | "default";
111
+ /**
112
+ * The content sits one density step below the page (LC-73), as the
113
+ * calendar does. The web panel's radius caps at that step's padding
114
+ * (CONTAINER-CAP), since a `contentPadding="none"` widget pads itself there.
115
+ */
116
+ compact?: boolean;
101
117
  /**
102
118
  * Tamagui transition token for sheet/overlay animations.
103
119
  */
@@ -185,6 +201,33 @@ function useKeyboardFocusIntoPanel(
185
201
  }, [open, frameRef, keyboardOpenRef]);
186
202
  }
187
203
 
204
+ /**
205
+ * Viewport y of the box a `position: fixed` panel is laid out against. The
206
+ * top math above is in viewport coordinates, which is only right while that
207
+ * box is the viewport. An ancestor with a transform, filter, perspective,
208
+ * paint containment or container query becomes the containing block instead.
209
+ * PanelPortal lifts the panel out of scroll views, but a panel hosted in a
210
+ * transformed dialog still lays out against that dialog. A `display: contents`
211
+ * node has no box, so its computed `contain` (Tamagui's theme span) is ignored.
212
+ */
213
+ function fixedContainingBlockTop(element: HTMLElement): number {
214
+ for (let node = element.parentElement; node; node = node.parentElement) {
215
+ const cs = getComputedStyle(node);
216
+ if (cs.display === "contents") continue;
217
+ const set = (value: string | undefined, initial: string) => !!value && value !== initial;
218
+ const captures =
219
+ set(cs.transform, "none") ||
220
+ set(cs.perspective, "none") ||
221
+ set(cs.filter, "none") ||
222
+ set(cs.backdropFilter, "none") ||
223
+ set(cs.containerType, "normal") ||
224
+ /transform|perspective|filter/.test(cs.willChange) ||
225
+ /paint|layout|strict|content/.test(cs.contain);
226
+ if (captures) return node.getBoundingClientRect().top + node.clientTop - node.scrollTop;
227
+ }
228
+ return 0;
229
+ }
230
+
188
231
  function panelTransformOrigin(placement: string): string {
189
232
  const rtl =
190
233
  isWeb &&
@@ -208,31 +251,30 @@ const overlayFloatBreakpoint = OVERLAY_BREAKPOINT;
208
251
  * re-render on resize). Name kept for API compatibility; "gtSm" reads as
209
252
  * "wide enough to float" (≥ OVERLAY_BREAKPOINT), not the dead v4 media key.
210
253
  */
254
+ function subscribeViewport(listener: () => void) {
255
+ if (!isWeb || typeof window === "undefined") return () => {};
256
+ window.addEventListener("resize", listener);
257
+ return () => window.removeEventListener("resize", listener);
258
+ }
259
+
260
+ function viewportSnapshot() {
261
+ return isWeb && typeof window !== "undefined" && window.innerWidth > overlayFloatBreakpoint;
262
+ }
263
+
264
+ const serverViewportSnapshot = () => false;
265
+
211
266
  export function useViewportGtSm() {
212
- const [wideEnoughToFloat, setWideEnoughToFloat] = useState(() =>
213
- isWeb && typeof window !== "undefined" ? window.innerWidth > overlayFloatBreakpoint : false,
214
- );
215
- useEffect(() => {
216
- if (!isWeb || typeof window === "undefined") return;
217
- const handler = () => setWideEnoughToFloat(window.innerWidth > overlayFloatBreakpoint);
218
- window.addEventListener("resize", handler);
219
- return () => window.removeEventListener("resize", handler);
220
- }, []);
221
- return wideEnoughToFloat;
267
+ return useSyncExternalStore(subscribeViewport, viewportSnapshot, serverViewportSnapshot);
222
268
  }
223
269
 
224
270
  export function FloatingPanel(props: FloatingPanelProps) {
225
271
  // LC-71: install modality tracking during render so the Enter that opens
226
272
  // the panel is already classified as keyboard-origin when focus moves in.
227
273
  if (isWeb) ensureKeyboardModalityTracking();
228
- const media = useMedia();
229
274
  const viewportGtSm = useViewportGtSm();
230
- // When sheet is undefined: sheet on native and below medium (viewport
231
- // < 640). Floating from `$sm` up. Use viewport on client so we update on
232
- // resize; `media.sm` (v5 minWidth 640 — `gtSm` died with the v5 media
233
- // map, MPO-13 C4) for SSR when window is unavailable.
234
- const effectiveGtSm = typeof window !== "undefined" ? viewportGtSm : media.sm === true;
235
- const shouldUseSheet = props.sheet ?? (!isWeb || !effectiveGtSm);
275
+ // SSR and the hydration render use the same sheet structure. The viewport
276
+ // snapshot switches to floating after hydration when the browser is wide.
277
+ const shouldUseSheet = props.sheet ?? (!isWeb || !viewportGtSm);
236
278
 
237
279
  if (shouldUseSheet) return <FloatingPanelSheet {...props} />;
238
280
  return <FloatingPanelWeb {...props} />;
@@ -240,6 +282,26 @@ export function FloatingPanel(props: FloatingPanelProps) {
240
282
 
241
283
  // ── Sheet (mobile / native / forced) ──────────────────────────
242
284
 
285
+ /**
286
+ * A closed tamagui Sheet keeps its children mounted and parks the frame
287
+ * below the viewport, so state inside survives a reopen. Parked, the frame
288
+ * must leave the accessibility tree and the Tab order (MPO-359).
289
+ */
290
+ function useParkedFrameInert(open: boolean, frameRef: RefObject<HTMLElement | null>) {
291
+ useEffect(() => {
292
+ if (!isWeb) return;
293
+ const frame = frameRef.current;
294
+ if (!frame || typeof frame.setAttribute !== "function") return;
295
+ if (open) {
296
+ frame.removeAttribute("inert");
297
+ frame.removeAttribute("aria-hidden");
298
+ } else {
299
+ frame.setAttribute("inert", "");
300
+ frame.setAttribute("aria-hidden", "true");
301
+ }
302
+ }, [open, frameRef]);
303
+ }
304
+
243
305
  function FloatingPanelSheet({
244
306
  open,
245
307
  onOpenChange,
@@ -274,6 +336,7 @@ function FloatingPanelSheet({
274
336
  // DG-A11Y-04 / Axiom 7: Sheet has no focus scope — move focus into the
275
337
  // frame on open, trap Tab while open, return focus to the trigger on close.
276
338
  const sheetFrameRef = useRef<HTMLElement | null>(null);
339
+ useParkedFrameInert(open, sheetFrameRef);
277
340
  useSheetModalFocus(open, sheetFrameRef, skipReturnFocusRef);
278
341
  useKeyboardFocusIntoPanel(open, sheetFrameRef);
279
342
 
@@ -389,6 +452,7 @@ function FloatingPanelWeb({
389
452
  sizing = "grow",
390
453
  widthMode,
391
454
  fitContent,
455
+ compact,
392
456
  contentPadding = "default",
393
457
  openOn = "press",
394
458
  }: FloatingPanelProps) {
@@ -413,6 +477,7 @@ function FloatingPanelWeb({
413
477
  wheelGrowRef: isFill ? undefined : grownRef,
414
478
  widthMode,
415
479
  fitContent,
480
+ compact,
416
481
  onBeforeOpen: () => {
417
482
  overlayStyleRef.current = null;
418
483
  pinnedTopRef.current = 0;
@@ -472,13 +537,14 @@ function FloatingPanelWeb({
472
537
  let height = Math.min(totalContentHeight, Math.max(0, available));
473
538
  height = Math.max(Math.min(120, Math.max(0, available)), height);
474
539
  const top = isDropup ? aboveBottom - height : belowTop;
540
+ const cssTop = top - fixedContainingBlockTop(dropdownElement);
475
541
 
476
542
  const cached = overlayStyleRef.current;
477
- if (!cached || cached.top !== top || cached.maxHeight !== height) {
478
- dropdownElement.style.top = `${top}px`;
543
+ if (!cached || cached.top !== cssTop || cached.maxHeight !== height) {
544
+ dropdownElement.style.top = `${cssTop}px`;
479
545
  dropdownElement.style.maxHeight = `${height}px`;
480
546
  dropdownElement.style.height = "";
481
- overlayStyleRef.current = { top, maxHeight: height };
547
+ overlayStyleRef.current = { top: cssTop, maxHeight: height };
482
548
  void dropdownElement.offsetHeight;
483
549
  }
484
550
 
@@ -545,12 +611,13 @@ function FloatingPanelWeb({
545
611
  }
546
612
  }
547
613
 
614
+ const cssTop = top - fixedContainingBlockTop(dropdownElement);
548
615
  const cached = overlayStyleRef.current;
549
- if (!cached || cached.top !== top || cached.maxHeight !== height) {
550
- dropdownElement.style.top = `${top}px`;
616
+ if (!cached || cached.top !== cssTop || cached.maxHeight !== height) {
617
+ dropdownElement.style.top = `${cssTop}px`;
551
618
  dropdownElement.style.maxHeight = `${height}px`;
552
619
  dropdownElement.style.height = "";
553
- overlayStyleRef.current = { top, maxHeight: height };
620
+ overlayStyleRef.current = { top: cssTop, maxHeight: height };
554
621
  void dropdownElement.offsetHeight;
555
622
  }
556
623
 
@@ -698,6 +765,24 @@ function FloatingPanelWeb({
698
765
  [disabled, onOpenChange],
699
766
  );
700
767
 
768
+ // useClick's mousedown opener calls preventDefault, so a pointer open never
769
+ // focuses the trigger the way a pressed button is focused. The render that
770
+ // opens the panel then captures whatever held focus before, often <body> or
771
+ // another trigger, and Escape returns there (LC-48). Focus the pressed
772
+ // control first so the capture is the trigger, as for a keyboard open.
773
+ const focusTriggerOnPointerOpen = (event: PointerOpenEvent) => {
774
+ if (open || disabled || isContextMenu || event.button !== 0 || !isWeb) return;
775
+ const reference = panel.triggerRef.current;
776
+ if (!reference) return;
777
+ const target = event.target instanceof Element ? event.target : null;
778
+ const pressed = target?.closest<HTMLElement>(PANEL_FOCUSABLE);
779
+ const focusable =
780
+ pressed && reference.contains(pressed)
781
+ ? pressed
782
+ : reference.querySelector<HTMLElement>(PANEL_FOCUSABLE);
783
+ focusable?.focus({ preventScroll: true, focusVisible: false } as FocusOptions);
784
+ };
785
+
701
786
  const referenceProps = getReferenceProps({
702
787
  ref: panel.setReferenceRef,
703
788
  onClickCapture: openFromSynthesizedClick,
@@ -709,7 +794,9 @@ function FloatingPanelWeb({
709
794
  const handler = referenceProps[name];
710
795
  if (typeof handler === "function") {
711
796
  referenceProps[name] = (event: PanelActionEvent) => {
712
- if (!isNestedPanelAction(event)) handler(event);
797
+ if (isNestedPanelAction(event)) return;
798
+ if (name === "onMouseDown") focusTriggerOnPointerOpen(event as PointerOpenEvent);
799
+ handler(event);
713
800
  };
714
801
  }
715
802
  }
@@ -732,67 +819,74 @@ function FloatingPanelWeb({
732
819
  </View>
733
820
 
734
821
  {panel.mounted && (
735
- <YStack
736
- {...getFloatingProps({
737
- ref: panel.refs.setFloating,
738
- style: {
739
- ...elevatedSurfaceStyle,
740
- position: panel.strategy,
741
- top: overlayStyleRef.current?.top ?? panel.y ?? 0,
742
- left: panel.x ?? 0,
743
- scrollbarWidth: "none" as any,
744
- zIndex: zIndex.dropdown,
745
- overflow: "auto",
746
- ...panel.floatingStyleRef.current,
747
- ...(overlayStyleRef.current ? { maxHeight: overlayStyleRef.current.maxHeight } : {}),
748
- opacity: panel.visible ? 1 : 0,
749
- transform: panel.visible ? "scale(1)" : "scale(0.96)",
750
- transition: webTransition,
751
- transformOrigin: panelTransformOrigin(panel.placement),
752
- },
753
- onScroll: handleScroll,
754
- onTransitionEnd: (event) => {
755
- if (
756
- event.target === event.currentTarget &&
757
- (event.propertyName === "height" || event.propertyName === "max-height")
758
- ) {
759
- panel.updateArrows(event.currentTarget);
760
- }
761
- },
762
- })}
763
- data-testid="floating-panel-viewport"
764
- data-fp-panel=""
765
- {...panelChromeFocus}
766
- pointerEvents={panel.visible ? "auto" : "none"}
767
- {...elevatedSurfaceProps}
768
- // Complete elevatedSurface fragment above is the ONLY surface source
769
- // (SF-OVERLAY "including border and elevation", Round 2 docket).
770
- // The one layered exception is anatomy, not surface: the dropdown
771
- // radius clamp (same shape as Card's containerRadius over
772
- // elevatedSurface) keeps list rows unclipped at large radius knobs.
773
- borderRadius={panel.dropdownRadius}
774
- paddingVertical={0}
775
- >
776
- <ScrollArrow
777
- direction="up"
778
- scrollRef={panel.refs.floating}
779
- visible={panel.arrowUp}
780
- arrowScrollDirRef={panel.arrowScrollDirRef}
781
- />
782
- <View
783
- ref={contentRef as any}
784
- {...(contentPadding !== "none" ? panel.knobProps.panelPadding : undefined)}
785
- {...(contentPadding !== "none" ? panel.knobProps.gapLg : undefined)}
822
+ <PanelPortal anchor={panel.triggerRef.current}>
823
+ <YStack
824
+ {...getFloatingProps({
825
+ ref: panel.refs.setFloating,
826
+ style: {
827
+ ...elevatedSurfaceStyle,
828
+ position: panel.strategy,
829
+ top: overlayStyleRef.current?.top ?? panel.y ?? 0,
830
+ left: panel.x ?? 0,
831
+ scrollbarWidth: "none" as any,
832
+ zIndex: zIndex.dropdown,
833
+ overflow: "auto",
834
+ ...panel.floatingStyleRef.current,
835
+ ...(overlayStyleRef.current
836
+ ? { maxHeight: overlayStyleRef.current.maxHeight }
837
+ : {}),
838
+ opacity: panel.visible ? 1 : 0,
839
+ // `none`, not scale(1): any transform makes this panel the
840
+ // containing block of a nested panel's `position: fixed`, which
841
+ // then positions against this box and is clipped by its scroll.
842
+ transform: panel.visible ? "none" : "scale(0.96)",
843
+ transition: webTransition,
844
+ transformOrigin: panelTransformOrigin(panel.placement),
845
+ },
846
+ onScroll: handleScroll,
847
+ onTransitionEnd: (event) => {
848
+ if (
849
+ event.target === event.currentTarget &&
850
+ (event.propertyName === "height" || event.propertyName === "max-height")
851
+ ) {
852
+ panel.updateArrows(event.currentTarget);
853
+ }
854
+ },
855
+ })}
856
+ data-testid="floating-panel-viewport"
857
+ data-fp-panel=""
858
+ {...panelChromeFocus}
859
+ pointerEvents={panel.visible ? "auto" : "none"}
860
+ {...elevatedSurfaceProps}
861
+ // Complete elevatedSurface fragment above is the ONLY surface source
862
+ // (SF-OVERLAY "including border and elevation", Round 2 docket).
863
+ // The one layered exception is anatomy, not surface: the dropdown
864
+ // radius clamp (same shape as Card's containerRadius over
865
+ // elevatedSurface) keeps list rows unclipped at large radius knobs.
866
+ borderRadius={panel.dropdownRadius}
867
+ paddingVertical={0}
786
868
  >
787
- {children}
788
- </View>
789
- <ScrollArrow
790
- direction="down"
791
- scrollRef={panel.refs.floating}
792
- visible={panel.arrowDown}
793
- arrowScrollDirRef={panel.arrowScrollDirRef}
794
- />
795
- </YStack>
869
+ <ScrollArrow
870
+ direction="up"
871
+ scrollRef={panel.refs.floating}
872
+ visible={panel.arrowUp}
873
+ arrowScrollDirRef={panel.arrowScrollDirRef}
874
+ />
875
+ <View
876
+ ref={contentRef as any}
877
+ {...(contentPadding !== "none" ? panel.knobProps.panelPadding : undefined)}
878
+ {...(contentPadding !== "none" ? panel.knobProps.gapLg : undefined)}
879
+ >
880
+ {children}
881
+ </View>
882
+ <ScrollArrow
883
+ direction="down"
884
+ scrollRef={panel.refs.floating}
885
+ visible={panel.arrowDown}
886
+ arrowScrollDirRef={panel.arrowScrollDirRef}
887
+ />
888
+ </YStack>
889
+ </PanelPortal>
796
890
  )}
797
891
  </>
798
892
  );
@@ -0,0 +1,142 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import { fireEvent, waitFor } from "@testing-library/react";
3
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { useState } from "react";
5
+ import { ScrollView, Text, Theme } from "tamagui";
6
+ import { Button } from "../Button";
7
+ import { Select } from "../fields/Select";
8
+ import { containsAcrossPanels, panelPortalAnchor } from "../shared/panelPortal";
9
+ import { FloatingPanel } from "./index";
10
+ import { panelPortalHost } from "./PanelPortal";
11
+
12
+ /**
13
+ * MPO-335. react-native-web's ScrollView sets `transform: translateZ(0)` on
14
+ * its scroll node, which makes it the containing block of any
15
+ * `position: fixed` descendant, so a web panel left in the scroller's DOM is
16
+ * clipped by it. Every web panel now portals out of the scroller.
17
+ */
18
+
19
+ const options = ["Apple", "Banana", "Cherry"].map((label) => ({
20
+ label,
21
+ value: label.toLowerCase(),
22
+ }));
23
+
24
+ const pointerPress = (el: Element) => {
25
+ fireEvent.pointerDown(el);
26
+ fireEvent.mouseDown(el, { detail: 1 });
27
+ fireEvent.mouseUp(el, { detail: 1 });
28
+ fireEvent.click(el, { detail: 1 });
29
+ };
30
+
31
+ function PanelHarness() {
32
+ const [open, setOpen] = useState(false);
33
+ return (
34
+ <FloatingPanel open={open} onOpenChange={setOpen} trigger={<Button>Open</Button>}>
35
+ <Text>panel body</Text>
36
+ </FloatingPanel>
37
+ );
38
+ }
39
+
40
+ let innerWidth = 0;
41
+ beforeEach(() => {
42
+ innerWidth = window.innerWidth;
43
+ Object.defineProperty(window, "innerWidth", { configurable: true, writable: true, value: 1200 });
44
+ });
45
+ afterEach(() => {
46
+ Object.defineProperty(window, "innerWidth", {
47
+ configurable: true,
48
+ writable: true,
49
+ value: innerWidth,
50
+ });
51
+ });
52
+
53
+ describe("web panels escape a react-native-web ScrollView (MPO-335)", () => {
54
+ it("a Select's listbox is not a descendant of the scroll node", async () => {
55
+ const result = renderWithProviders(
56
+ <ScrollView testID="scroller" height={120}>
57
+ <Select options={options} placeholder="Pick" />
58
+ </ScrollView>,
59
+ );
60
+ const scroller = result.getByTestId("scroller");
61
+ const trigger = result.getByTestId("select-trigger");
62
+ expect(scroller.contains(trigger)).toBe(true);
63
+ pointerPress(trigger);
64
+ await waitFor(() => {
65
+ expect(document.querySelector('[data-testid="select-dropdown"]')).not.toBeNull();
66
+ });
67
+ const dropdown = document.querySelector('[data-testid="select-dropdown"]') as HTMLElement;
68
+ expect(scroller.contains(dropdown)).toBe(false);
69
+ expect(dropdown.closest("[data-fp-portal]")).not.toBeNull();
70
+ const anchor = panelPortalAnchor(dropdown);
71
+ expect(anchor && scroller.contains(anchor)).toBe(true);
72
+ expect(containsAcrossPanels(scroller, dropdown)).toBe(true);
73
+ });
74
+
75
+ it("a FloatingPanel's viewport is not a descendant of the scroll node", async () => {
76
+ const result = renderWithProviders(
77
+ <ScrollView testID="scroller" height={120}>
78
+ <PanelHarness />
79
+ </ScrollView>,
80
+ );
81
+ const scroller = result.getByTestId("scroller");
82
+ pointerPress(result.container.querySelector("[role='button']") as Element);
83
+ await waitFor(() => {
84
+ expect(document.querySelector('[data-testid="floating-panel-viewport"]')).not.toBeNull();
85
+ });
86
+ const viewport = document.querySelector(
87
+ '[data-testid="floating-panel-viewport"]',
88
+ ) as HTMLElement;
89
+ expect(scroller.contains(viewport)).toBe(false);
90
+ expect(viewport.style.position).toBe("fixed");
91
+ expect(containsAcrossPanels(scroller, viewport)).toBe(true);
92
+ });
93
+
94
+ it("carries the trigger's theme across the portal", async () => {
95
+ const result = renderWithProviders(
96
+ <Theme name="dark">
97
+ <ScrollView testID="scroller" height={120}>
98
+ <PanelHarness />
99
+ </ScrollView>
100
+ </Theme>,
101
+ );
102
+ pointerPress(result.container.querySelector("[role='button']") as Element);
103
+ await waitFor(() => {
104
+ expect(document.querySelector('[data-testid="floating-panel-viewport"]')).not.toBeNull();
105
+ });
106
+ const viewport = document.querySelector(
107
+ '[data-testid="floating-panel-viewport"]',
108
+ ) as HTMLElement;
109
+ const portal = viewport.closest("[data-fp-portal]") as HTMLElement;
110
+ const themed = Array.from(portal.querySelectorAll<HTMLElement>(".is_Theme")).filter((el) =>
111
+ el.contains(viewport),
112
+ );
113
+ expect(themed.some((el) => /\bt_dark\b/.test(el.className))).toBe(true);
114
+ });
115
+ });
116
+
117
+ describe("panelPortalHost", () => {
118
+ it("mounts inside the nearest modal layer so its focus trap keeps the panel", () => {
119
+ const dialog = document.createElement("div");
120
+ dialog.setAttribute("role", "dialog");
121
+ const scroller = document.createElement("div");
122
+ const trigger = document.createElement("button");
123
+ scroller.append(trigger);
124
+ dialog.append(scroller);
125
+ document.body.append(dialog);
126
+ try {
127
+ expect(panelPortalHost(trigger)).toBe(dialog);
128
+ } finally {
129
+ dialog.remove();
130
+ }
131
+ });
132
+
133
+ it("falls back to the body", () => {
134
+ const trigger = document.createElement("button");
135
+ document.body.append(trigger);
136
+ try {
137
+ expect(panelPortalHost(trigger)).toBe(document.body);
138
+ } finally {
139
+ trigger.remove();
140
+ }
141
+ });
142
+ });
@@ -10,6 +10,8 @@
10
10
  * Calendar grids take fit-content (MPO-262): a full-width field wrapper is
11
11
  * unrelated to seven day columns and must not create a mostly empty popup.
12
12
  * Text listboxes retain at-least-trigger; icon/button launchers may also hug.
13
+ * The Icon glyph grid pins to its field exactly (match-trigger): fixed 64px
14
+ * cells wrap into more columns on a wider field instead of stretching.
13
15
  */
14
16
  import { readFileSync } from "node:fs";
15
17
  import { dirname, resolve } from "node:path";
@@ -19,7 +21,10 @@ import { describe, expect, it } from "vitest";
19
21
  const fieldsDir = resolve(dirname(fileURLToPath(import.meta.url)), "..", "fields");
20
22
 
21
23
  /** Pickers whose trigger is a form FIELD: the panel may never be narrower. */
22
- const fieldShapedPickers = ["TimePicker/catalog.tsx", "ColorPicker/parts.tsx", "Icon/index.tsx"];
24
+ const fieldShapedPickers = ["TimePicker/catalog.tsx", "ColorPicker/parts.tsx"];
25
+
26
+ /** Field-triggered pickers pinned to the field's width exactly. */
27
+ const matchTriggerPickers = ["Icon/index.tsx"];
23
28
 
24
29
  const intrinsicGridPickers = ["DatePicker/parts.tsx", "DatePicker/DatetimePicker.catalog.tsx"];
25
30
 
@@ -40,12 +45,19 @@ describe("FloatingPanel width contract (MPO-38, MPO-262)", () => {
40
45
  expect(source).toContain('widthMode="at-least-trigger"');
41
46
  });
42
47
 
43
- it.each(fieldShapedPickers)("%s no longer passes the fitContent boolean", (relative) => {
44
- const source = read(relative);
45
- expect(source).not.toMatch(/^\s*fitContent\s*$/m);
46
- expect(source).not.toMatch(/fitContent=\{?true/);
48
+ it.each(matchTriggerPickers)("%s declares match-trigger", (relative) => {
49
+ expect(read(relative)).toContain('widthMode="match-trigger"');
47
50
  });
48
51
 
52
+ it.each([...fieldShapedPickers, ...matchTriggerPickers])(
53
+ "%s no longer passes the fitContent boolean",
54
+ (relative) => {
55
+ const source = read(relative);
56
+ expect(source).not.toMatch(/^\s*fitContent\s*$/m);
57
+ expect(source).not.toMatch(/fitContent=\{?true/);
58
+ },
59
+ );
60
+
49
61
  it.each(buttonShapedPickers)("%s keeps fit-content deliberately", (relative) => {
50
62
  const source = read(relative);
51
63
  // Asserted, not merely tolerated: if this stops being true the exemption
@@ -0,0 +1,82 @@
1
+ // @vitest-environment jsdom
2
+ import { act } from "react";
3
+ import { renderToString } from "react-dom/server";
4
+ import { hydrateRoot } from "react-dom/client";
5
+ import { TestProviders } from "@multiplatform.one/test-utils";
6
+ import { describe, expect, it, vi } from "vitest";
7
+ import { TextArea } from "../fields/TextArea";
8
+ import { Input as InputParts } from "../InputParts";
9
+ import { Input } from "../fields/Input";
10
+ import { SearchInput } from "../fields/SearchInput";
11
+ import { Select } from "../fields/Select";
12
+ import { Combobox } from "../fields/Combobox";
13
+ const modality = vi.hoisted(() => ({ touch: true }));
14
+ vi.mock("@multiplatform.one/platform", async (original) => ({
15
+ ...(await original<object>()),
16
+ get isWebTouchable() {
17
+ return modality.touch && typeof window !== "undefined";
18
+ },
19
+ }));
20
+ const options = ["Alpha", "Beta", "Gamma", "Delta"].map((label) => ({ label, value: label }));
21
+ function Fixture() {
22
+ return (
23
+ <TestProviders>
24
+ <Input aria-label="Input" />
25
+ <TextArea aria-label="Area" />
26
+ <InputParts>
27
+ <InputParts.Box>
28
+ <InputParts.Area aria-label="Compound" />
29
+ <InputParts.Icon>
30
+ <span>Icon</span>
31
+ </InputParts.Icon>
32
+ <InputParts.Button aria-label="End">End</InputParts.Button>
33
+ </InputParts.Box>
34
+ </InputParts>
35
+ <SearchInput aria-label="Search" />
36
+ <Select aria-label="Select" options={options} defaultValue="Alpha" />
37
+ <Combobox aria-label="Combobox" options={options} defaultValue="Alpha" />
38
+ </TestProviders>
39
+ );
40
+ }
41
+ describe("touch recipe hydration", () => {
42
+ it.each([true, false, true])(
43
+ "hydrates actual controls on repeated coarse mount %s",
44
+ async (touch) => {
45
+ modality.touch = touch;
46
+ const browserWindow = window;
47
+ let html: string;
48
+ vi.stubGlobal("window", undefined);
49
+ try {
50
+ html = renderToString(<Fixture />);
51
+ } finally {
52
+ vi.stubGlobal("window", browserWindow);
53
+ }
54
+ const container = document.createElement("div");
55
+ container.innerHTML = html;
56
+ document.body.append(container);
57
+ const errors: unknown[] = [];
58
+ const spy = vi.spyOn(console, "error").mockImplementation((...args) => errors.push(args));
59
+ let root: ReturnType<typeof hydrateRoot> | undefined;
60
+ try {
61
+ await act(async () => {
62
+ root = hydrateRoot(container, <Fixture />, {
63
+ onRecoverableError: (error) => errors.push(error),
64
+ });
65
+ });
66
+ expect(
67
+ errors.filter((error) => /hydration|hydrated|didn't match/i.test(String(error))),
68
+ ).toEqual([]);
69
+ const heights = [...container.querySelectorAll("[data-visual-height]")].map((el) =>
70
+ Number(el.getAttribute("data-visual-height")),
71
+ );
72
+ expect(container.querySelector("[touch]")).toBeNull();
73
+ expect(heights.length).toBeGreaterThanOrEqual(2);
74
+ expect(heights.every((height) => height >= 44)).toBe(true);
75
+ } finally {
76
+ await act(async () => root?.unmount());
77
+ spy.mockRestore();
78
+ container.remove();
79
+ }
80
+ },
81
+ );
82
+ });