@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
@@ -0,0 +1,149 @@
1
+ import type { CSSProperties, FocusEvent, ReactNode } from "react";
2
+ import { useLayoutEffect, useRef } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { TamaguiRoot, useThemeName } from "@tamagui/web";
5
+ import { panelPortalAttribute, registerPanelPortal } from "../shared/panelPortal";
6
+
7
+ export interface PanelPortalProps {
8
+ /** The element the panel opened from: the trigger it attaches to. */
9
+ anchor: HTMLElement | null;
10
+ children: ReactNode;
11
+ }
12
+
13
+ const layerRootSelector = '[role="dialog"], [aria-modal="true"]';
14
+
15
+ const tabbableSelector =
16
+ 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
17
+
18
+ const focusGuardAttribute = "data-fp-focus-guard";
19
+
20
+ const focusGuardStyle: CSSProperties = {
21
+ position: "fixed",
22
+ top: 0,
23
+ left: 0,
24
+ width: 1,
25
+ height: 1,
26
+ margin: -1,
27
+ padding: 0,
28
+ overflow: "hidden",
29
+ clipPath: "inset(50%)",
30
+ whiteSpace: "nowrap",
31
+ border: 0,
32
+ };
33
+
34
+ /**
35
+ * Where a web panel mounts: the nearest modal layer around its trigger, else
36
+ * the body. Staying inside a dialog keeps that dialog's focus trap and
37
+ * outside-press test treating the panel as its own content; every scroll
38
+ * view between the trigger and that layer is escaped either way.
39
+ */
40
+ export function panelPortalHost(anchor: Element | null): HTMLElement | null {
41
+ if (typeof document === "undefined") return null;
42
+ return anchor?.closest<HTMLElement>(layerRootSelector) ?? document.body;
43
+ }
44
+
45
+ function isTabbable(element: HTMLElement): boolean {
46
+ if (element.hasAttribute(focusGuardAttribute) || element.tabIndex < 0) return false;
47
+ if (element.closest("[inert]")) return false;
48
+ return element.getClientRects().length > 0;
49
+ }
50
+
51
+ function tabbablesIn(root: Element | null): HTMLElement[] {
52
+ if (!root) return [];
53
+ return Array.from(root.querySelectorAll<HTMLElement>(tabbableSelector)).filter(isTabbable);
54
+ }
55
+
56
+ /** Tab order resumes beside the trigger, not at the end of the portal host. */
57
+ function focusBesideAnchor(anchor: HTMLElement | null, side: "before" | "after") {
58
+ if (!anchor) return;
59
+ const inAnchor = tabbablesIn(anchor);
60
+ if (side === "before" && isTabbable(anchor)) inAnchor.unshift(anchor);
61
+ const own = side === "before" ? inAnchor[inAnchor.length - 1] : undefined;
62
+ if (own) {
63
+ own.focus();
64
+ return;
65
+ }
66
+ const edge =
67
+ side === "before" ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
68
+ const page = tabbablesIn(document.body).filter((element) => {
69
+ if (anchor.contains(element) || !(anchor.compareDocumentPosition(element) & edge)) {
70
+ return false;
71
+ }
72
+ const portal = element.closest(`[${panelPortalAttribute}]`);
73
+ return !portal || portal.contains(anchor);
74
+ });
75
+ (side === "before" ? page[page.length - 1] : page[0])?.focus();
76
+ }
77
+
78
+ /**
79
+ * Web: renders a floating panel outside every scroll view between its trigger
80
+ * and the page (MPO-335, LC-90). react-native-web's ScrollView sets
81
+ * `transform: translateZ(0)`, which makes it the containing block of a
82
+ * `position: fixed` descendant, so a panel left in place is clipped by the
83
+ * scroller. The portal carries the trigger's theme across (knobs are React
84
+ * context and follow on their own). Hidden focus guards keep the panel in Tab
85
+ * order right after the trigger, where it sat before it moved.
86
+ */
87
+ export function PanelPortal({ anchor, children }: PanelPortalProps) {
88
+ const themeName = useThemeName();
89
+ const portalRef = useRef<HTMLSpanElement | null>(null);
90
+ const host = panelPortalHost(anchor);
91
+ const direction = anchor?.closest("[dir]")?.getAttribute("dir") ?? undefined;
92
+
93
+ useLayoutEffect(() => {
94
+ const portal = portalRef.current;
95
+ if (!portal || !anchor) return;
96
+ return registerPanelPortal(portal, anchor);
97
+ }, [anchor, host]);
98
+
99
+ if (!host) return null;
100
+ // Stands where the panel used to be in tab order: right after the trigger.
101
+ const enterPanel = (event: FocusEvent<HTMLSpanElement>) => {
102
+ const guard = event.currentTarget;
103
+ const from = event.relatedTarget;
104
+ const forward =
105
+ !(from instanceof Node) ||
106
+ Boolean(guard.compareDocumentPosition(from) & Node.DOCUMENT_POSITION_PRECEDING);
107
+ const inside = tabbablesIn(portalRef.current);
108
+ const target = forward ? inside[0] : inside[inside.length - 1];
109
+ if (target) target.focus();
110
+ else focusBesideAnchor(anchor, forward ? "after" : "before");
111
+ };
112
+ const portal = createPortal(
113
+ <span
114
+ ref={portalRef}
115
+ {...{ [panelPortalAttribute]: "" }}
116
+ dir={direction}
117
+ style={{ display: "contents" }}
118
+ >
119
+ <span
120
+ {...{ [focusGuardAttribute]: "" }}
121
+ aria-hidden
122
+ tabIndex={0}
123
+ style={focusGuardStyle}
124
+ onFocus={() => focusBesideAnchor(anchor, "before")}
125
+ />
126
+ <TamaguiRoot theme={themeName}>{children}</TamaguiRoot>
127
+ <span
128
+ {...{ [focusGuardAttribute]: "" }}
129
+ aria-hidden
130
+ tabIndex={0}
131
+ style={focusGuardStyle}
132
+ onFocus={() => focusBesideAnchor(anchor, "after")}
133
+ />
134
+ </span>,
135
+ host,
136
+ );
137
+ return (
138
+ <>
139
+ <span
140
+ {...{ [focusGuardAttribute]: "" }}
141
+ aria-hidden
142
+ tabIndex={0}
143
+ style={focusGuardStyle}
144
+ onFocus={enterPanel}
145
+ />
146
+ {portal}
147
+ </>
148
+ );
149
+ }
@@ -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.