@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
@@ -45,7 +45,15 @@
45
45
  * backdrop dismiss is armed a short delay after the present begins.
46
46
  */
47
47
 
48
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
48
+ import {
49
+ useCallback,
50
+ useContext,
51
+ useEffect,
52
+ useLayoutEffect,
53
+ useMemo,
54
+ useRef,
55
+ useState,
56
+ } from "react";
49
57
  import {
50
58
  Animated,
51
59
  Easing,
@@ -58,6 +66,7 @@ import {
58
66
  useWindowDimensions,
59
67
  View as RNView,
60
68
  } from "react-native";
69
+ import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
61
70
  import { Surface, useResolvedKnobs } from "@multiplatform.one/theme";
62
71
  import { View, YStack } from "tamagui";
63
72
  import { t } from "../shared/t";
@@ -84,8 +93,7 @@ export function useViewportGtSm() {
84
93
  }
85
94
 
86
95
  const sheetMaxHeightRatio = 0.85;
87
- // Home-indicator / gesture-bar clearance (no react-native-safe-area-context
88
- // dependency in this package).
96
+ // Home-indicator / gesture-bar clearance.
89
97
  const bottomInset = Platform.OS === "ios" ? 24 : 16;
90
98
  // Backdrop left visible above the sheet: the scrim has to stay tappable, and a
91
99
  // sheet flush with the status bar reads as a page, not a sheet.
@@ -122,6 +130,7 @@ export function FloatingPanel({
122
130
  const { height: windowHeight } = useWindowDimensions();
123
131
  // MPO-64: the sheet must end ABOVE the keyboard, not run under it.
124
132
  const keyboardInset = useKeyboardInset();
133
+ const topInset = useContext(SafeAreaInsetsContext)?.top ?? initialWindowMetrics?.insets.top ?? 0;
125
134
  const [backdropArmed, setBackdropArmed] = useState(false);
126
135
  const armTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
127
136
  const close = useCallback(() => onOpenChange(false), [onOpenChange]);
@@ -142,18 +151,18 @@ export function FloatingPanel({
142
151
  /*
143
152
  * MPO-64. Two numbers, both of which have to know about the keyboard:
144
153
  *
145
- * - the sheet may never be taller than the space ABOVE the keyboard, less
146
- * a strip of backdrop so it still reads as a sheet and the scrim stays
147
- * tappable. Without this the frame extends under the keyboard, the last
148
- * row is clipped mid-glyph, and the rounded top edge is drawn over the
149
- * autocomplete suggestion strip.
154
+ * - the sheet may never be taller than the space between the status bar
155
+ * and the keyboard, less a strip of backdrop so it still reads as a sheet
156
+ * and the scrim stays tappable. Without this the frame extends under the
157
+ * keyboard, the last row is clipped mid-glyph, and the rounded top edge
158
+ * is drawn over the autocomplete suggestion strip.
150
159
  * - the bottom padding is home-indicator clearance. The keyboard already
151
160
  * covers the home indicator, so keeping 24pt there just wastes a row.
152
161
  */
153
162
  const available = Math.max(0, windowHeight - keyboardInset);
154
163
  const maxHeight = Math.max(
155
164
  minSheetHeight,
156
- Math.round(Math.min(windowHeight * sheetMaxHeightRatio, available - backdropStrip)),
165
+ Math.round(Math.min(windowHeight * sheetMaxHeightRatio, available - topInset - backdropStrip)),
157
166
  );
158
167
  const sheetBottomPadding = keyboardInset > 0 ? 8 : bottomInset;
159
168
 
@@ -202,8 +211,59 @@ export function FloatingPanel({
202
211
  const presentationRef = useRef(0);
203
212
  const activeRef = useRef(false);
204
213
 
214
+ /*
215
+ * MPO-68: a sheet at rest below full height is LAID OUT at that height.
216
+ * Translating a full-height frame down pushed its last rows off the screen,
217
+ * or under the keyboard, while the list still measured the full height, so
218
+ * they could never be scrolled into view.
219
+ *
220
+ * `frameCap` rides the same Animated.View as `translateY`, so the swap
221
+ * between "full height, translated" and "detent height, at 0" lands in one
222
+ * commit and the top edge does not move. `restHeightRef` is null at full
223
+ * height; a gesture always runs uncapped, in `travel` coordinates.
224
+ */
225
+ const frameCap = useRef(new Animated.Value(maxHeight)).current;
226
+ const maxHeightRef = useRef(maxHeight);
227
+ const restHeightRef = useRef<number | null>(null);
228
+ // The last uncapped layout, and whether it filled the max height. A capped
229
+ // frame measures only its cap, so when the keyboard moves the max height
230
+ // under a resting sheet, its full height is re-derived from these.
231
+ const naturalRef = useRef(0);
232
+ const filledRef = useRef(false);
233
+
234
+ useLayoutEffect(() => {
235
+ maxHeightRef.current = maxHeight;
236
+ const rest = restHeightRef.current;
237
+ frameCap.setValue(rest === null ? maxHeight : Math.min(maxHeight, rest));
238
+ if (rest !== null && naturalRef.current > 0) {
239
+ setMeasuredHeight(filledRef.current ? maxHeight : Math.min(naturalRef.current, maxHeight));
240
+ }
241
+ }, [frameCap, maxHeight]);
242
+
243
+ const restAt = useCallback(
244
+ (height: number) => {
245
+ restHeightRef.current = height;
246
+ frameCap.setValue(Math.min(maxHeightRef.current, height));
247
+ restRef.current = 0;
248
+ translateY.setValue(0);
249
+ },
250
+ [frameCap, translateY],
251
+ );
252
+
253
+ const releaseRest = useCallback(() => {
254
+ const rest = restHeightRef.current;
255
+ if (rest === null) return;
256
+ restHeightRef.current = null;
257
+ const offset = Math.max(0, travelRef.current - Math.min(maxHeightRef.current, rest));
258
+ frameCap.setValue(maxHeightRef.current);
259
+ restRef.current = offset;
260
+ translateY.setValue(offset);
261
+ }, [frameCap, translateY]);
262
+
205
263
  const settleTo = useCallback(
206
- (toValue: number, velocity = 0) => {
264
+ (height: number, velocity = 0) => {
265
+ const presentation = presentationRef.current;
266
+ const toValue = Math.max(0, travelRef.current - height);
207
267
  restRef.current = toValue;
208
268
  Animated.spring(translateY, {
209
269
  toValue,
@@ -215,9 +275,12 @@ export function FloatingPanel({
215
275
  // JS driver: see the header. A native-driven node inside this Modal
216
276
  // does not advance, and the drag already writes the value from JS.
217
277
  useNativeDriver: false,
218
- }).start();
278
+ }).start(({ finished }) => {
279
+ if (!finished || toValue === 0) return;
280
+ if (activeRef.current && presentation === presentationRef.current) restAt(height);
281
+ });
219
282
  },
220
- [translateY],
283
+ [restAt, translateY],
221
284
  );
222
285
 
223
286
  const dismiss = useCallback(
@@ -245,10 +308,15 @@ export function FloatingPanel({
245
308
  PanResponder.create({
246
309
  onStartShouldSetPanResponder: () => true,
247
310
  onMoveShouldSetPanResponder: (_evt, g) => Math.abs(g.dy) > 2,
311
+ // Lifting a rest cap can scroll the list inside, and a scroll lets
312
+ // any ancestor ScrollView the finger started under claim the touch,
313
+ // ending the drag and blurring a focused input on release.
314
+ onPanResponderTerminationRequest: () => false,
248
315
  onPanResponderGrant: () => {
249
316
  translateY.stopAnimation((value) => {
250
317
  if (typeof value === "number" && Number.isFinite(value)) restRef.current = value;
251
318
  });
319
+ releaseRest();
252
320
  },
253
321
  onPanResponderMove: (_evt, g) => {
254
322
  const next = restRef.current + g.dy;
@@ -277,11 +345,11 @@ export function FloatingPanel({
277
345
  best = height;
278
346
  }
279
347
  }
280
- settleTo(t - best, g.vy);
348
+ settleTo(best, g.vy);
281
349
  },
282
- onPanResponderTerminate: () => settleTo(restRef.current),
350
+ onPanResponderTerminate: () => settleTo(travelRef.current - restRef.current),
283
351
  }),
284
- [dismiss, settleTo, translateY],
352
+ [dismiss, releaseRest, settleTo, translateY],
285
353
  );
286
354
 
287
355
  // One entrance per present, whichever trigger gets here first: the effect
@@ -321,6 +389,8 @@ export function FloatingPanel({
321
389
  useEffect(() => {
322
390
  presentationRef.current += 1;
323
391
  activeRef.current = open;
392
+ restHeightRef.current = null;
393
+ frameCap.setValue(maxHeightRef.current);
324
394
  if (open) {
325
395
  enter();
326
396
  } else {
@@ -340,7 +410,7 @@ export function FloatingPanel({
340
410
  }
341
411
  translateY.stopAnimation();
342
412
  };
343
- }, [open, enter, translateY]);
413
+ }, [open, enter, frameCap, translateY]);
344
414
 
345
415
  const content = scrollable ? (
346
416
  <RNScrollView
@@ -430,19 +500,24 @@ export function FloatingPanel({
430
500
  from option rows / calendar days and blocks commit.
431
501
  */}
432
502
  <Animated.View
503
+ testID="floating-panel-sheet"
433
504
  onLayout={(e) => {
434
505
  // Travel distance for a dismiss, and the basis for the detents.
435
506
  // A content-sized picker is shorter than maxHeight, and sliding
436
507
  // it by maxHeight would overshoot into a visible lag.
508
+ if (restHeightRef.current !== null) return;
437
509
  const h = Math.round(e.nativeEvent.layout.height);
438
- if (h > 0 && h !== measuredHeight) setMeasuredHeight(h);
510
+ if (h <= 0) return;
511
+ naturalRef.current = h;
512
+ filledRef.current = h >= maxHeightRef.current - 1;
513
+ if (h !== measuredHeight) setMeasuredHeight(h);
439
514
  }}
440
515
  style={{
441
516
  // MPO-64: a flex child defaults to flexShrink 0, so without this
442
517
  // the sheet cannot give way to the keyboard at all.
443
518
  flexShrink: 1,
444
519
  minHeight: 0,
445
- maxHeight,
520
+ maxHeight: frameCap,
446
521
  transform: [{ translateY }],
447
522
  }}
448
523
  >
@@ -451,9 +526,11 @@ export function FloatingPanel({
451
526
  borderBottomLeftRadius={0}
452
527
  borderBottomRightRadius={0}
453
528
  maxHeight={maxHeight}
529
+ flexShrink={1}
530
+ minHeight={0}
454
531
  // sheetFill opens at full sheet height (flexShrink keeps the
455
532
  // keyboard from pushing the top of the sheet off-screen).
456
- {...(sheetFill ? { height: maxHeight, flexShrink: 1 } : undefined)}
533
+ {...(sheetFill ? { height: maxHeight } : undefined)}
457
534
  paddingTop="$2"
458
535
  paddingBottom={sheetBottomPadding}
459
536
  // VoiceOver escape gesture (two-finger Z) dismisses the sheet.
@@ -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
 
@@ -185,6 +195,33 @@ function useKeyboardFocusIntoPanel(
185
195
  }, [open, frameRef, keyboardOpenRef]);
186
196
  }
187
197
 
198
+ /**
199
+ * Viewport y of the box a `position: fixed` panel is laid out against. The
200
+ * top math above is in viewport coordinates, which is only right while that
201
+ * box is the viewport. An ancestor with a transform, filter, perspective,
202
+ * paint containment or container query becomes the containing block instead.
203
+ * PanelPortal lifts the panel out of scroll views, but a panel hosted in a
204
+ * transformed dialog still lays out against that dialog. A `display: contents`
205
+ * node has no box, so its computed `contain` (Tamagui's theme span) is ignored.
206
+ */
207
+ function fixedContainingBlockTop(element: HTMLElement): number {
208
+ for (let node = element.parentElement; node; node = node.parentElement) {
209
+ const cs = getComputedStyle(node);
210
+ if (cs.display === "contents") continue;
211
+ const set = (value: string | undefined, initial: string) => !!value && value !== initial;
212
+ const captures =
213
+ set(cs.transform, "none") ||
214
+ set(cs.perspective, "none") ||
215
+ set(cs.filter, "none") ||
216
+ set(cs.backdropFilter, "none") ||
217
+ set(cs.containerType, "normal") ||
218
+ /transform|perspective|filter/.test(cs.willChange) ||
219
+ /paint|layout|strict|content/.test(cs.contain);
220
+ if (captures) return node.getBoundingClientRect().top + node.clientTop - node.scrollTop;
221
+ }
222
+ return 0;
223
+ }
224
+
188
225
  function panelTransformOrigin(placement: string): string {
189
226
  const rtl =
190
227
  isWeb &&
@@ -208,31 +245,30 @@ const overlayFloatBreakpoint = OVERLAY_BREAKPOINT;
208
245
  * re-render on resize). Name kept for API compatibility; "gtSm" reads as
209
246
  * "wide enough to float" (≥ OVERLAY_BREAKPOINT), not the dead v4 media key.
210
247
  */
248
+ function subscribeViewport(listener: () => void) {
249
+ if (!isWeb || typeof window === "undefined") return () => {};
250
+ window.addEventListener("resize", listener);
251
+ return () => window.removeEventListener("resize", listener);
252
+ }
253
+
254
+ function viewportSnapshot() {
255
+ return isWeb && typeof window !== "undefined" && window.innerWidth > overlayFloatBreakpoint;
256
+ }
257
+
258
+ const serverViewportSnapshot = () => false;
259
+
211
260
  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;
261
+ return useSyncExternalStore(subscribeViewport, viewportSnapshot, serverViewportSnapshot);
222
262
  }
223
263
 
224
264
  export function FloatingPanel(props: FloatingPanelProps) {
225
265
  // LC-71: install modality tracking during render so the Enter that opens
226
266
  // the panel is already classified as keyboard-origin when focus moves in.
227
267
  if (isWeb) ensureKeyboardModalityTracking();
228
- const media = useMedia();
229
268
  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);
269
+ // SSR and the hydration render use the same sheet structure. The viewport
270
+ // snapshot switches to floating after hydration when the browser is wide.
271
+ const shouldUseSheet = props.sheet ?? (!isWeb || !viewportGtSm);
236
272
 
237
273
  if (shouldUseSheet) return <FloatingPanelSheet {...props} />;
238
274
  return <FloatingPanelWeb {...props} />;
@@ -240,6 +276,26 @@ export function FloatingPanel(props: FloatingPanelProps) {
240
276
 
241
277
  // ── Sheet (mobile / native / forced) ──────────────────────────
242
278
 
279
+ /**
280
+ * A closed tamagui Sheet keeps its children mounted and parks the frame
281
+ * below the viewport, so state inside survives a reopen. Parked, the frame
282
+ * must leave the accessibility tree and the Tab order (MPO-359).
283
+ */
284
+ function useParkedFrameInert(open: boolean, frameRef: RefObject<HTMLElement | null>) {
285
+ useEffect(() => {
286
+ if (!isWeb) return;
287
+ const frame = frameRef.current;
288
+ if (!frame || typeof frame.setAttribute !== "function") return;
289
+ if (open) {
290
+ frame.removeAttribute("inert");
291
+ frame.removeAttribute("aria-hidden");
292
+ } else {
293
+ frame.setAttribute("inert", "");
294
+ frame.setAttribute("aria-hidden", "true");
295
+ }
296
+ }, [open, frameRef]);
297
+ }
298
+
243
299
  function FloatingPanelSheet({
244
300
  open,
245
301
  onOpenChange,
@@ -274,6 +330,7 @@ function FloatingPanelSheet({
274
330
  // DG-A11Y-04 / Axiom 7: Sheet has no focus scope — move focus into the
275
331
  // frame on open, trap Tab while open, return focus to the trigger on close.
276
332
  const sheetFrameRef = useRef<HTMLElement | null>(null);
333
+ useParkedFrameInert(open, sheetFrameRef);
277
334
  useSheetModalFocus(open, sheetFrameRef, skipReturnFocusRef);
278
335
  useKeyboardFocusIntoPanel(open, sheetFrameRef);
279
336
 
@@ -472,13 +529,14 @@ function FloatingPanelWeb({
472
529
  let height = Math.min(totalContentHeight, Math.max(0, available));
473
530
  height = Math.max(Math.min(120, Math.max(0, available)), height);
474
531
  const top = isDropup ? aboveBottom - height : belowTop;
532
+ const cssTop = top - fixedContainingBlockTop(dropdownElement);
475
533
 
476
534
  const cached = overlayStyleRef.current;
477
- if (!cached || cached.top !== top || cached.maxHeight !== height) {
478
- dropdownElement.style.top = `${top}px`;
535
+ if (!cached || cached.top !== cssTop || cached.maxHeight !== height) {
536
+ dropdownElement.style.top = `${cssTop}px`;
479
537
  dropdownElement.style.maxHeight = `${height}px`;
480
538
  dropdownElement.style.height = "";
481
- overlayStyleRef.current = { top, maxHeight: height };
539
+ overlayStyleRef.current = { top: cssTop, maxHeight: height };
482
540
  void dropdownElement.offsetHeight;
483
541
  }
484
542
 
@@ -545,12 +603,13 @@ function FloatingPanelWeb({
545
603
  }
546
604
  }
547
605
 
606
+ const cssTop = top - fixedContainingBlockTop(dropdownElement);
548
607
  const cached = overlayStyleRef.current;
549
- if (!cached || cached.top !== top || cached.maxHeight !== height) {
550
- dropdownElement.style.top = `${top}px`;
608
+ if (!cached || cached.top !== cssTop || cached.maxHeight !== height) {
609
+ dropdownElement.style.top = `${cssTop}px`;
551
610
  dropdownElement.style.maxHeight = `${height}px`;
552
611
  dropdownElement.style.height = "";
553
- overlayStyleRef.current = { top, maxHeight: height };
612
+ overlayStyleRef.current = { top: cssTop, maxHeight: height };
554
613
  void dropdownElement.offsetHeight;
555
614
  }
556
615
 
@@ -698,6 +757,24 @@ function FloatingPanelWeb({
698
757
  [disabled, onOpenChange],
699
758
  );
700
759
 
760
+ // useClick's mousedown opener calls preventDefault, so a pointer open never
761
+ // focuses the trigger the way a pressed button is focused. The render that
762
+ // opens the panel then captures whatever held focus before, often <body> or
763
+ // another trigger, and Escape returns there (LC-48). Focus the pressed
764
+ // control first so the capture is the trigger, as for a keyboard open.
765
+ const focusTriggerOnPointerOpen = (event: PointerOpenEvent) => {
766
+ if (open || disabled || isContextMenu || event.button !== 0 || !isWeb) return;
767
+ const reference = panel.triggerRef.current;
768
+ if (!reference) return;
769
+ const target = event.target instanceof Element ? event.target : null;
770
+ const pressed = target?.closest<HTMLElement>(PANEL_FOCUSABLE);
771
+ const focusable =
772
+ pressed && reference.contains(pressed)
773
+ ? pressed
774
+ : reference.querySelector<HTMLElement>(PANEL_FOCUSABLE);
775
+ focusable?.focus({ preventScroll: true, focusVisible: false } as FocusOptions);
776
+ };
777
+
701
778
  const referenceProps = getReferenceProps({
702
779
  ref: panel.setReferenceRef,
703
780
  onClickCapture: openFromSynthesizedClick,
@@ -709,7 +786,9 @@ function FloatingPanelWeb({
709
786
  const handler = referenceProps[name];
710
787
  if (typeof handler === "function") {
711
788
  referenceProps[name] = (event: PanelActionEvent) => {
712
- if (!isNestedPanelAction(event)) handler(event);
789
+ if (isNestedPanelAction(event)) return;
790
+ if (name === "onMouseDown") focusTriggerOnPointerOpen(event as PointerOpenEvent);
791
+ handler(event);
713
792
  };
714
793
  }
715
794
  }
@@ -732,67 +811,74 @@ function FloatingPanelWeb({
732
811
  </View>
733
812
 
734
813
  {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)}
814
+ <PanelPortal anchor={panel.triggerRef.current}>
815
+ <YStack
816
+ {...getFloatingProps({
817
+ ref: panel.refs.setFloating,
818
+ style: {
819
+ ...elevatedSurfaceStyle,
820
+ position: panel.strategy,
821
+ top: overlayStyleRef.current?.top ?? panel.y ?? 0,
822
+ left: panel.x ?? 0,
823
+ scrollbarWidth: "none" as any,
824
+ zIndex: zIndex.dropdown,
825
+ overflow: "auto",
826
+ ...panel.floatingStyleRef.current,
827
+ ...(overlayStyleRef.current
828
+ ? { maxHeight: overlayStyleRef.current.maxHeight }
829
+ : {}),
830
+ opacity: panel.visible ? 1 : 0,
831
+ // `none`, not scale(1): any transform makes this panel the
832
+ // containing block of a nested panel's `position: fixed`, which
833
+ // then positions against this box and is clipped by its scroll.
834
+ transform: panel.visible ? "none" : "scale(0.96)",
835
+ transition: webTransition,
836
+ transformOrigin: panelTransformOrigin(panel.placement),
837
+ },
838
+ onScroll: handleScroll,
839
+ onTransitionEnd: (event) => {
840
+ if (
841
+ event.target === event.currentTarget &&
842
+ (event.propertyName === "height" || event.propertyName === "max-height")
843
+ ) {
844
+ panel.updateArrows(event.currentTarget);
845
+ }
846
+ },
847
+ })}
848
+ data-testid="floating-panel-viewport"
849
+ data-fp-panel=""
850
+ {...panelChromeFocus}
851
+ pointerEvents={panel.visible ? "auto" : "none"}
852
+ {...elevatedSurfaceProps}
853
+ // Complete elevatedSurface fragment above is the ONLY surface source
854
+ // (SF-OVERLAY "including border and elevation", Round 2 docket).
855
+ // The one layered exception is anatomy, not surface: the dropdown
856
+ // radius clamp (same shape as Card's containerRadius over
857
+ // elevatedSurface) keeps list rows unclipped at large radius knobs.
858
+ borderRadius={panel.dropdownRadius}
859
+ paddingVertical={0}
786
860
  >
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>
861
+ <ScrollArrow
862
+ direction="up"
863
+ scrollRef={panel.refs.floating}
864
+ visible={panel.arrowUp}
865
+ arrowScrollDirRef={panel.arrowScrollDirRef}
866
+ />
867
+ <View
868
+ ref={contentRef as any}
869
+ {...(contentPadding !== "none" ? panel.knobProps.panelPadding : undefined)}
870
+ {...(contentPadding !== "none" ? panel.knobProps.gapLg : undefined)}
871
+ >
872
+ {children}
873
+ </View>
874
+ <ScrollArrow
875
+ direction="down"
876
+ scrollRef={panel.refs.floating}
877
+ visible={panel.arrowDown}
878
+ arrowScrollDirRef={panel.arrowScrollDirRef}
879
+ />
880
+ </YStack>
881
+ </PanelPortal>
796
882
  )}
797
883
  </>
798
884
  );