@multiplatform.one/forms 7.7.4 → 7.8.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 (579) hide show
  1. package/dist/cjs/Button/index.cjs +3 -36
  2. package/dist/cjs/Button/index.native.js +3 -36
  3. package/dist/cjs/Button/index.native.js.map +1 -1
  4. package/dist/cjs/Chip/index.cjs +1 -1
  5. package/dist/cjs/Chip/index.native.js +1 -1
  6. package/dist/cjs/Chip/index.native.js.map +1 -1
  7. package/dist/cjs/ContextualSaveBar/index.cjs +17 -10
  8. package/dist/cjs/ContextualSaveBar/index.native.js +18 -10
  9. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  10. package/dist/cjs/FloatingPanel/index.cjs +59 -14
  11. package/dist/cjs/FloatingPanel/index.native.js +16 -7
  12. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  13. package/dist/cjs/FloatingPanel/nestedAction.cjs +37 -0
  14. package/dist/cjs/FloatingPanel/nestedAction.native.js +42 -0
  15. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -0
  16. package/dist/cjs/InputParts/index.cjs +11 -7
  17. package/dist/cjs/InputParts/index.native.js +12 -10
  18. package/dist/cjs/InputParts/index.native.js.map +1 -1
  19. package/dist/cjs/Wheel/index.cjs +3 -3
  20. package/dist/cjs/Wheel/index.native.js +3 -3
  21. package/dist/cjs/Wheel/index.native.js.map +1 -1
  22. package/dist/cjs/fieldLayout.cjs +3 -3
  23. package/dist/cjs/fieldLayout.native.js +3 -3
  24. package/dist/cjs/fieldLayout.native.js.map +1 -1
  25. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.cjs +9 -2
  26. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  27. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  28. package/dist/cjs/fields/Combobox/index.cjs +74 -76
  29. package/dist/cjs/fields/Combobox/index.native.js +78 -86
  30. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  31. package/dist/cjs/fields/DatePicker/Calendar.cjs +6 -1
  32. package/dist/cjs/fields/DatePicker/Calendar.native.js +6 -1
  33. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  34. package/dist/cjs/fields/DatePicker/DateRangePicker.cjs +2 -2
  35. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  36. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  37. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +15 -12
  38. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  39. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  40. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +39 -14
  41. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  42. package/dist/cjs/fields/DatePicker/MonthPicker.cjs +10 -3
  43. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +10 -3
  44. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  45. package/dist/cjs/fields/DatePicker/MultiDatePicker.cjs +2 -2
  46. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  47. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  48. package/dist/cjs/fields/DatePicker/index.native.js +3 -0
  49. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  50. package/dist/cjs/fields/DatePicker/parts.cjs +26 -14
  51. package/dist/cjs/fields/DatePicker/parts.native.js +28 -14
  52. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  53. package/dist/cjs/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  54. package/dist/cjs/fields/Geolocation/geocoder.cjs +63 -0
  55. package/dist/cjs/fields/Geolocation/geocoder.native.js +68 -0
  56. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -0
  57. package/dist/cjs/fields/Geolocation/index.cjs +801 -152
  58. package/dist/cjs/fields/Geolocation/index.native.js +856 -167
  59. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  60. package/dist/cjs/fields/Geolocation/nativeSearchFocus.cjs +44 -0
  61. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js +47 -0
  62. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  63. package/dist/cjs/fields/Icon/drawnSet.cjs +14 -3
  64. package/dist/cjs/fields/Icon/drawnSet.native.js +18 -3
  65. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  66. package/dist/cjs/fields/Icon/index.cjs +102 -27
  67. package/dist/cjs/fields/Icon/index.native.js +115 -31
  68. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  69. package/dist/cjs/fields/Input/index.cjs +5 -12
  70. package/dist/cjs/fields/Input/index.native.js +5 -13
  71. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  72. package/dist/cjs/fields/PhoneInput/index.cjs +2 -2
  73. package/dist/cjs/fields/PhoneInput/index.native.js +2 -2
  74. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  75. package/dist/cjs/fields/SearchInput/index.cjs +8 -9
  76. package/dist/cjs/fields/SearchInput/index.native.js +8 -9
  77. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  78. package/dist/cjs/fields/Select/index.cjs +53 -18
  79. package/dist/cjs/fields/Select/index.native.js +63 -37
  80. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  81. package/dist/cjs/fields/Stepper/index.cjs +144 -31
  82. package/dist/cjs/fields/Stepper/index.native.js +151 -31
  83. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  84. package/dist/cjs/index.cjs +2 -0
  85. package/dist/cjs/index.native.js +2 -0
  86. package/dist/cjs/index.native.js.map +1 -1
  87. package/dist/cjs/shared/focusManagement.cjs +24 -11
  88. package/dist/cjs/shared/focusManagement.native.js +24 -11
  89. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  90. package/dist/cjs/shared/pickerTriggerContract.cjs +38 -0
  91. package/dist/cjs/shared/pickerTriggerContract.native.js +41 -0
  92. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -0
  93. package/dist/cjs/shared/pressSlopProps.cjs +68 -0
  94. package/dist/cjs/shared/pressSlopProps.native.js +72 -0
  95. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -0
  96. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  97. package/dist/esm/Button/index.mjs +1 -34
  98. package/dist/esm/Button/index.mjs.map +1 -1
  99. package/dist/esm/Button/index.native.js +1 -34
  100. package/dist/esm/Button/index.native.js.map +1 -1
  101. package/dist/esm/Chip/index.mjs +1 -1
  102. package/dist/esm/Chip/index.mjs.map +1 -1
  103. package/dist/esm/Chip/index.native.js +1 -1
  104. package/dist/esm/Chip/index.native.js.map +1 -1
  105. package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  106. package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  107. package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  108. package/dist/esm/ContextualSaveBar/index.mjs +17 -10
  109. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  110. package/dist/esm/ContextualSaveBar/index.native.js +18 -10
  111. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  112. package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  113. package/dist/esm/ControlGroup/index.native.js.map +1 -1
  114. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  115. package/dist/esm/ErrorSummary.native.js.map +1 -1
  116. package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
  117. package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
  118. package/dist/esm/FieldDisplay/index.native.js.map +1 -1
  119. package/dist/esm/FieldGroup.native.js.map +1 -1
  120. package/dist/esm/FloatingPanel/index.mjs +58 -15
  121. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  122. package/dist/esm/FloatingPanel/index.native.js +15 -8
  123. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  124. package/dist/esm/FloatingPanel/nestedAction.mjs +11 -0
  125. package/dist/esm/FloatingPanel/nestedAction.mjs.map +1 -0
  126. package/dist/esm/FloatingPanel/nestedAction.native.js +13 -0
  127. package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -0
  128. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  129. package/dist/esm/Form/index.native.js.map +1 -1
  130. package/dist/esm/Form/validateOn.native.js.map +1 -1
  131. package/dist/esm/FormGrid.native.js.map +1 -1
  132. package/dist/esm/FormSection.native.js.map +1 -1
  133. package/dist/esm/InputParts/index.mjs +12 -8
  134. package/dist/esm/InputParts/index.mjs.map +1 -1
  135. package/dist/esm/InputParts/index.native.js +13 -11
  136. package/dist/esm/InputParts/index.native.js.map +1 -1
  137. package/dist/esm/Label/index.native.js.map +1 -1
  138. package/dist/esm/Skeleton/index.native.js.map +1 -1
  139. package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
  140. package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
  141. package/dist/esm/Table/index.native.js.map +1 -1
  142. package/dist/esm/Wheel/haptic.native.js.map +1 -1
  143. package/dist/esm/Wheel/index.mjs +3 -3
  144. package/dist/esm/Wheel/index.mjs.map +1 -1
  145. package/dist/esm/Wheel/index.native.js +3 -3
  146. package/dist/esm/Wheel/index.native.js.map +1 -1
  147. package/dist/esm/actionLabel.native.js.map +1 -1
  148. package/dist/esm/fieldDefaults.native.js.map +1 -1
  149. package/dist/esm/fieldLayout.mjs +3 -3
  150. package/dist/esm/fieldLayout.mjs.map +1 -1
  151. package/dist/esm/fieldLayout.native.js +3 -3
  152. package/dist/esm/fieldLayout.native.js.map +1 -1
  153. package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
  154. package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
  155. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  156. package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
  157. package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
  158. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  159. package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  160. package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  161. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
  162. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
  163. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  164. package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  165. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  166. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  167. package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
  168. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  169. package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
  170. package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
  171. package/dist/esm/fields/Combobox/index.mjs +74 -76
  172. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  173. package/dist/esm/fields/Combobox/index.native.js +78 -86
  174. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  175. package/dist/esm/fields/DatePicker/Calendar.mjs +6 -1
  176. package/dist/esm/fields/DatePicker/Calendar.mjs.map +1 -1
  177. package/dist/esm/fields/DatePicker/Calendar.native.js +6 -1
  178. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  179. package/dist/esm/fields/DatePicker/DateRangePicker.mjs +2 -2
  180. package/dist/esm/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  181. package/dist/esm/fields/DatePicker/DateRangePicker.native.js +2 -2
  182. package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  183. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
  184. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  185. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  186. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  187. package/dist/esm/fields/DatePicker/DatetimePicker.native.js +39 -14
  188. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  189. package/dist/esm/fields/DatePicker/MonthPicker.mjs +10 -3
  190. package/dist/esm/fields/DatePicker/MonthPicker.mjs.map +1 -1
  191. package/dist/esm/fields/DatePicker/MonthPicker.native.js +10 -3
  192. package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
  193. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs +2 -2
  194. package/dist/esm/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  195. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js +2 -2
  196. package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  197. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
  198. package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  199. package/dist/esm/fields/DatePicker/index.native.js +3 -0
  200. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  201. package/dist/esm/fields/DatePicker/parts.mjs +28 -16
  202. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  203. package/dist/esm/fields/DatePicker/parts.native.js +30 -16
  204. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  205. package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
  206. package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
  207. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  208. package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  209. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  210. package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  211. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  212. package/dist/esm/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  213. package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  214. package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
  215. package/dist/esm/fields/Geolocation/geocoder.mjs +33 -0
  216. package/dist/esm/fields/Geolocation/geocoder.mjs.map +1 -0
  217. package/dist/esm/fields/Geolocation/geocoder.native.js +35 -0
  218. package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -0
  219. package/dist/esm/fields/Geolocation/index.mjs +792 -149
  220. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  221. package/dist/esm/fields/Geolocation/index.native.js +847 -164
  222. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  223. package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
  224. package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
  225. package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs +19 -0
  226. package/dist/esm/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
  227. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js +19 -0
  228. package/dist/esm/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  229. package/dist/esm/fields/Icon/drawnSet.mjs +14 -3
  230. package/dist/esm/fields/Icon/drawnSet.mjs.map +1 -1
  231. package/dist/esm/fields/Icon/drawnSet.native.js +18 -3
  232. package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
  233. package/dist/esm/fields/Icon/index.mjs +93 -18
  234. package/dist/esm/fields/Icon/index.mjs.map +1 -1
  235. package/dist/esm/fields/Icon/index.native.js +106 -22
  236. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  237. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  238. package/dist/esm/fields/Input/index.mjs +5 -12
  239. package/dist/esm/fields/Input/index.mjs.map +1 -1
  240. package/dist/esm/fields/Input/index.native.js +5 -13
  241. package/dist/esm/fields/Input/index.native.js.map +1 -1
  242. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  243. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  244. package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
  245. package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
  246. package/dist/esm/fields/PhoneInput/index.mjs +2 -2
  247. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  248. package/dist/esm/fields/PhoneInput/index.native.js +2 -2
  249. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  250. package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
  251. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  252. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  253. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  254. package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
  255. package/dist/esm/fields/Rating/types.native.js.map +1 -1
  256. package/dist/esm/fields/SearchInput/index.mjs +9 -10
  257. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  258. package/dist/esm/fields/SearchInput/index.native.js +9 -10
  259. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  260. package/dist/esm/fields/Select/index.mjs +54 -19
  261. package/dist/esm/fields/Select/index.mjs.map +1 -1
  262. package/dist/esm/fields/Select/index.native.js +64 -38
  263. package/dist/esm/fields/Select/index.native.js.map +1 -1
  264. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  265. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  266. package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
  267. package/dist/esm/fields/Stepper/index.mjs +145 -32
  268. package/dist/esm/fields/Stepper/index.mjs.map +1 -1
  269. package/dist/esm/fields/Stepper/index.native.js +152 -32
  270. package/dist/esm/fields/Stepper/index.native.js.map +1 -1
  271. package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  272. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  273. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  274. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -1
  275. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  276. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  277. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  278. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  279. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  280. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  281. package/dist/esm/fields/nativeSelect.native.js.map +1 -1
  282. package/dist/esm/fields/selectedOrder.native.js.map +1 -1
  283. package/dist/esm/formSpacing.native.js.map +1 -1
  284. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  285. package/dist/esm/index.mjs +2 -1
  286. package/dist/esm/index.mjs.map +1 -1
  287. package/dist/esm/index.native.js +2 -1
  288. package/dist/esm/index.native.js.map +1 -1
  289. package/dist/esm/requiredMarking.native.js.map +1 -1
  290. package/dist/esm/shared/TimeColumn.native.js.map +1 -1
  291. package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
  292. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  293. package/dist/esm/shared/devWarn.native.js.map +1 -1
  294. package/dist/esm/shared/floatingList.native.js.map +1 -1
  295. package/dist/esm/shared/focusManagement.mjs +24 -11
  296. package/dist/esm/shared/focusManagement.mjs.map +1 -1
  297. package/dist/esm/shared/focusManagement.native.js +24 -11
  298. package/dist/esm/shared/focusManagement.native.js.map +1 -1
  299. package/dist/esm/shared/groupContext.native.js.map +1 -1
  300. package/dist/esm/shared/i18n.native.js.map +1 -1
  301. package/dist/esm/shared/pickerTriggerContract.mjs +13 -0
  302. package/dist/esm/shared/pickerTriggerContract.mjs.map +1 -0
  303. package/dist/esm/shared/pickerTriggerContract.native.js +13 -0
  304. package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -0
  305. package/dist/esm/shared/pressSlopProps.mjs +43 -0
  306. package/dist/esm/shared/pressSlopProps.mjs.map +1 -0
  307. package/dist/esm/shared/pressSlopProps.native.js +44 -0
  308. package/dist/esm/shared/pressSlopProps.native.js.map +1 -0
  309. package/dist/esm/shared/t.native.js.map +1 -1
  310. package/dist/esm/shared/tableCellContext.native.js.map +1 -1
  311. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  312. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  313. package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
  314. package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
  315. package/dist/esm/shared/utils.native.js.map +1 -1
  316. package/dist/esm/shared/zIndex.native.js.map +1 -1
  317. package/dist/esm/themedPrimitives.native.js.map +1 -1
  318. package/dist/esm/types.native.js.map +1 -1
  319. package/dist/esm/utils/LinkCell.native.js.map +1 -1
  320. package/dist/jsx/Button/index.mjs +1 -34
  321. package/dist/jsx/Button/index.mjs.map +1 -1
  322. package/dist/jsx/Button/index.native.js +3 -36
  323. package/dist/jsx/Button/index.native.js.map +1 -1
  324. package/dist/jsx/Chip/index.mjs +1 -1
  325. package/dist/jsx/Chip/index.mjs.map +1 -1
  326. package/dist/jsx/Chip/index.native.js +1 -1
  327. package/dist/jsx/Chip/index.native.js.map +1 -1
  328. package/dist/jsx/ContextualSaveBar/index.mjs +17 -10
  329. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  330. package/dist/jsx/ContextualSaveBar/index.native.js +18 -10
  331. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  332. package/dist/jsx/FloatingPanel/index.mjs +58 -15
  333. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  334. package/dist/jsx/FloatingPanel/index.native.js +16 -7
  335. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  336. package/dist/jsx/FloatingPanel/nestedAction.mjs +11 -0
  337. package/dist/jsx/FloatingPanel/nestedAction.mjs.map +1 -0
  338. package/dist/jsx/FloatingPanel/nestedAction.native.js +42 -0
  339. package/dist/jsx/FloatingPanel/nestedAction.native.js.map +1 -0
  340. package/dist/jsx/InputParts/index.mjs +12 -8
  341. package/dist/jsx/InputParts/index.mjs.map +1 -1
  342. package/dist/jsx/InputParts/index.native.js +12 -10
  343. package/dist/jsx/InputParts/index.native.js.map +1 -1
  344. package/dist/jsx/Wheel/index.mjs +3 -3
  345. package/dist/jsx/Wheel/index.mjs.map +1 -1
  346. package/dist/jsx/Wheel/index.native.js +3 -3
  347. package/dist/jsx/Wheel/index.native.js.map +1 -1
  348. package/dist/jsx/fieldLayout.mjs +3 -3
  349. package/dist/jsx/fieldLayout.mjs.map +1 -1
  350. package/dist/jsx/fieldLayout.native.js +3 -3
  351. package/dist/jsx/fieldLayout.native.js.map +1 -1
  352. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs +8 -1
  353. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.mjs.map +1 -1
  354. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js +10 -1
  355. package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  356. package/dist/jsx/fields/Combobox/index.mjs +74 -76
  357. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  358. package/dist/jsx/fields/Combobox/index.native.js +78 -86
  359. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  360. package/dist/jsx/fields/DatePicker/Calendar.mjs +6 -1
  361. package/dist/jsx/fields/DatePicker/Calendar.mjs.map +1 -1
  362. package/dist/jsx/fields/DatePicker/Calendar.native.js +6 -1
  363. package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
  364. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs +2 -2
  365. package/dist/jsx/fields/DatePicker/DateRangePicker.mjs.map +1 -1
  366. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +2 -2
  367. package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  368. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +15 -12
  369. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
  370. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +16 -12
  371. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  372. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +39 -14
  373. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  374. package/dist/jsx/fields/DatePicker/MonthPicker.mjs +10 -3
  375. package/dist/jsx/fields/DatePicker/MonthPicker.mjs.map +1 -1
  376. package/dist/jsx/fields/DatePicker/MonthPicker.native.js +10 -3
  377. package/dist/jsx/fields/DatePicker/MonthPicker.native.js.map +1 -1
  378. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs +2 -2
  379. package/dist/jsx/fields/DatePicker/MultiDatePicker.mjs.map +1 -1
  380. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +2 -2
  381. package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  382. package/dist/jsx/fields/DatePicker/index.native.js +3 -0
  383. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  384. package/dist/jsx/fields/DatePicker/parts.mjs +28 -16
  385. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  386. package/dist/jsx/fields/DatePicker/parts.native.js +28 -14
  387. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  388. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  389. package/dist/jsx/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  390. package/dist/jsx/fields/Geolocation/geocoder.mjs +33 -0
  391. package/dist/jsx/fields/Geolocation/geocoder.mjs.map +1 -0
  392. package/dist/jsx/fields/Geolocation/geocoder.native.js +68 -0
  393. package/dist/jsx/fields/Geolocation/geocoder.native.js.map +1 -0
  394. package/dist/jsx/fields/Geolocation/index.mjs +792 -149
  395. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  396. package/dist/jsx/fields/Geolocation/index.native.js +856 -167
  397. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  398. package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs +19 -0
  399. package/dist/jsx/fields/Geolocation/nativeSearchFocus.mjs.map +1 -0
  400. package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js +47 -0
  401. package/dist/jsx/fields/Geolocation/nativeSearchFocus.native.js.map +1 -0
  402. package/dist/jsx/fields/Icon/drawnSet.mjs +14 -3
  403. package/dist/jsx/fields/Icon/drawnSet.mjs.map +1 -1
  404. package/dist/jsx/fields/Icon/drawnSet.native.js +18 -3
  405. package/dist/jsx/fields/Icon/drawnSet.native.js.map +1 -1
  406. package/dist/jsx/fields/Icon/index.mjs +93 -18
  407. package/dist/jsx/fields/Icon/index.mjs.map +1 -1
  408. package/dist/jsx/fields/Icon/index.native.js +115 -31
  409. package/dist/jsx/fields/Icon/index.native.js.map +1 -1
  410. package/dist/jsx/fields/Input/index.mjs +5 -12
  411. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  412. package/dist/jsx/fields/Input/index.native.js +5 -13
  413. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  414. package/dist/jsx/fields/PhoneInput/index.mjs +2 -2
  415. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  416. package/dist/jsx/fields/PhoneInput/index.native.js +2 -2
  417. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  418. package/dist/jsx/fields/SearchInput/index.mjs +9 -10
  419. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  420. package/dist/jsx/fields/SearchInput/index.native.js +8 -9
  421. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  422. package/dist/jsx/fields/Select/index.mjs +54 -19
  423. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  424. package/dist/jsx/fields/Select/index.native.js +63 -37
  425. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  426. package/dist/jsx/fields/Stepper/index.mjs +145 -32
  427. package/dist/jsx/fields/Stepper/index.mjs.map +1 -1
  428. package/dist/jsx/fields/Stepper/index.native.js +151 -31
  429. package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
  430. package/dist/jsx/index.js +2 -1
  431. package/dist/jsx/index.js.map +1 -1
  432. package/dist/jsx/index.mjs +2 -1
  433. package/dist/jsx/index.mjs.map +1 -1
  434. package/dist/jsx/index.native.js +2 -0
  435. package/dist/jsx/index.native.js.map +1 -1
  436. package/dist/jsx/shared/focusManagement.mjs +24 -11
  437. package/dist/jsx/shared/focusManagement.mjs.map +1 -1
  438. package/dist/jsx/shared/focusManagement.native.js +24 -11
  439. package/dist/jsx/shared/focusManagement.native.js.map +1 -1
  440. package/dist/jsx/shared/pickerTriggerContract.mjs +13 -0
  441. package/dist/jsx/shared/pickerTriggerContract.mjs.map +1 -0
  442. package/dist/jsx/shared/pickerTriggerContract.native.js +41 -0
  443. package/dist/jsx/shared/pickerTriggerContract.native.js.map +1 -0
  444. package/dist/jsx/shared/pressSlopProps.mjs +43 -0
  445. package/dist/jsx/shared/pressSlopProps.mjs.map +1 -0
  446. package/dist/jsx/shared/pressSlopProps.native.js +72 -0
  447. package/dist/jsx/shared/pressSlopProps.native.js.map +1 -0
  448. package/package.json +8 -7
  449. package/src/Button/Button.labelInk.spec.tsx +21 -18
  450. package/src/Button/Button.outlinedChannel.spec.tsx +46 -0
  451. package/src/Button/Button.sizeLadder.spec.tsx +4 -3
  452. package/src/Button/Button.stories.tsx +20 -0
  453. package/src/Button/index.tsx +26 -39
  454. package/src/Chip/Chip.spec.tsx +3 -1
  455. package/src/Chip/index.tsx +1 -5
  456. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +33 -0
  457. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +19 -0
  458. package/src/ContextualSaveBar/index.tsx +12 -8
  459. package/src/ContextualSaveBar/nativeFlow.spec.tsx +20 -0
  460. package/src/FieldLayout.stories.tsx +41 -0
  461. package/src/FloatingPanel/FloatingPanel.native.spec.tsx +54 -0
  462. package/src/FloatingPanel/FloatingPanel.spec.tsx +109 -0
  463. package/src/FloatingPanel/index.native.tsx +24 -7
  464. package/src/FloatingPanel/index.tsx +80 -13
  465. package/src/FloatingPanel/nestedAction.spec.ts +36 -0
  466. package/src/FloatingPanel/nestedAction.ts +15 -0
  467. package/src/FloatingPanel/panelWidthContract.spec.ts +12 -15
  468. package/src/FormsIntegration.stories.tsx +2 -6
  469. package/src/InputParts/index.tsx +20 -6
  470. package/src/InputParts/layoutGap.spec.tsx +43 -0
  471. package/src/Wheel/Wheel.spec.tsx +16 -0
  472. package/src/Wheel/index.tsx +3 -3
  473. package/src/fieldLayout.spec.tsx +42 -1
  474. package/src/fieldLayout.tsx +9 -9
  475. package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +18 -0
  476. package/src/fields/Checkbox/CheckboxFieldFrame.tsx +6 -1
  477. package/src/fields/Combobox/Combobox.spec.tsx +48 -1
  478. package/src/fields/Combobox/index.tsx +90 -80
  479. package/src/fields/DatePicker/Calendar.tsx +4 -1
  480. package/src/fields/DatePicker/DatePicker.stories.tsx +22 -1
  481. package/src/fields/DatePicker/DateRangePicker.tsx +4 -2
  482. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +21 -19
  483. package/src/fields/DatePicker/DatetimePicker.native.spec.tsx +144 -0
  484. package/src/fields/DatePicker/DatetimePicker.native.tsx +57 -32
  485. package/src/fields/DatePicker/DatetimePicker.stories.tsx +22 -0
  486. package/src/fields/DatePicker/MonthPicker.tsx +8 -3
  487. package/src/fields/DatePicker/MultiDatePicker.tsx +4 -2
  488. package/src/fields/DatePicker/index.native.tsx +1 -0
  489. package/src/fields/DatePicker/parts.spec.tsx +56 -0
  490. package/src/fields/DatePicker/parts.tsx +33 -12
  491. package/src/fields/Geolocation/Geolocation.spec.tsx +287 -35
  492. package/src/fields/Geolocation/Geolocation.stories.tsx +141 -7
  493. package/src/fields/Geolocation/GeolocationMap.native.tsx +3 -0
  494. package/src/fields/Geolocation/GeolocationMap.tsx +4 -0
  495. package/src/fields/Geolocation/geocoder.spec.ts +59 -0
  496. package/src/fields/Geolocation/geocoder.ts +84 -0
  497. package/src/fields/Geolocation/geocoderSeam.spec.tsx +203 -0
  498. package/src/fields/Geolocation/index.tsx +912 -180
  499. package/src/fields/Geolocation/nativeSearchFocus.spec.ts +34 -0
  500. package/src/fields/Geolocation/nativeSearchFocus.ts +19 -0
  501. package/src/fields/Geolocation/salvage.spec.tsx +398 -0
  502. package/src/fields/Geolocation/storyProviders.spec.tsx +44 -0
  503. package/src/fields/Icon/Icon.spec.tsx +215 -1
  504. package/src/fields/Icon/Icon.stories.tsx +9 -1
  505. package/src/fields/Icon/drawnSet.tsx +39 -4
  506. package/src/fields/Icon/index.tsx +118 -18
  507. package/src/fields/Input/Input.copy.spec.tsx +1 -0
  508. package/src/fields/Input/Input.spec.tsx +50 -0
  509. package/src/fields/Input/Input.stories.tsx +1 -1
  510. package/src/fields/Input/index.tsx +7 -13
  511. package/src/fields/PhoneInput/index.tsx +2 -2
  512. package/src/fields/SearchInput/SearchInput.spec.tsx +14 -0
  513. package/src/fields/SearchInput/index.tsx +5 -6
  514. package/src/fields/Select/Select.spec.tsx +54 -0
  515. package/src/fields/Select/index.tsx +63 -33
  516. package/src/fields/Stepper/Stepper.spec.tsx +34 -1
  517. package/src/fields/Stepper/index.tsx +193 -33
  518. package/src/fields/pickerActivation.spec.tsx +105 -0
  519. package/src/fields/pickerDensity.spec.tsx +86 -0
  520. package/src/fields/pickerRows.spec.tsx +66 -0
  521. package/src/index.ts +9 -0
  522. package/src/shared/focusManagement.spec.tsx +68 -0
  523. package/src/shared/focusManagement.ts +20 -10
  524. package/src/shared/pickerTriggerContract.ts +13 -0
  525. package/src/shared/pressSlopProps.spec.ts +39 -0
  526. package/src/shared/pressSlopProps.ts +52 -0
  527. package/types/Button/index.d.ts +22 -3
  528. package/types/Button/index.d.ts.map +1 -1
  529. package/types/Chip/index.d.ts.map +1 -1
  530. package/types/ContextualSaveBar/index.d.ts +1 -1
  531. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  532. package/types/FloatingPanel/index.d.ts +11 -1
  533. package/types/FloatingPanel/index.d.ts.map +1 -1
  534. package/types/FloatingPanel/index.native.d.ts +2 -1
  535. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  536. package/types/FloatingPanel/nestedAction.d.ts +13 -0
  537. package/types/FloatingPanel/nestedAction.d.ts.map +1 -0
  538. package/types/InputParts/index.d.ts.map +1 -1
  539. package/types/fields/Checkbox/CheckboxFieldFrame.d.ts +46 -2
  540. package/types/fields/Checkbox/CheckboxFieldFrame.d.ts.map +1 -1
  541. package/types/fields/Checkbox/index.d.ts +3 -3
  542. package/types/fields/Combobox/index.d.ts +3 -1
  543. package/types/fields/Combobox/index.d.ts.map +1 -1
  544. package/types/fields/DatePicker/Calendar.d.ts.map +1 -1
  545. package/types/fields/DatePicker/DateRangePicker.d.ts.map +1 -1
  546. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
  547. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
  548. package/types/fields/DatePicker/MonthPicker.d.ts.map +1 -1
  549. package/types/fields/DatePicker/MultiDatePicker.d.ts.map +1 -1
  550. package/types/fields/DatePicker/index.native.d.ts.map +1 -1
  551. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  552. package/types/fields/Geolocation/GeolocationMap.d.ts +4 -0
  553. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  554. package/types/fields/Geolocation/GeolocationMap.native.d.ts +3 -0
  555. package/types/fields/Geolocation/GeolocationMap.native.d.ts.map +1 -1
  556. package/types/fields/Geolocation/geocoder.d.ts +53 -0
  557. package/types/fields/Geolocation/geocoder.d.ts.map +1 -0
  558. package/types/fields/Geolocation/index.d.ts +18 -2
  559. package/types/fields/Geolocation/index.d.ts.map +1 -1
  560. package/types/fields/Geolocation/nativeSearchFocus.d.ts +8 -0
  561. package/types/fields/Geolocation/nativeSearchFocus.d.ts.map +1 -0
  562. package/types/fields/Icon/drawnSet.d.ts.map +1 -1
  563. package/types/fields/Icon/index.d.ts.map +1 -1
  564. package/types/fields/Input/index.d.ts.map +1 -1
  565. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  566. package/types/fields/RadioGroup/index.d.ts +2 -2
  567. package/types/fields/SearchInput/index.d.ts.map +1 -1
  568. package/types/fields/Select/index.d.ts.map +1 -1
  569. package/types/fields/Stepper/index.d.ts.map +1 -1
  570. package/types/fields/ToggleGroup/index.d.ts +1 -1
  571. package/types/index.d.ts +2 -0
  572. package/types/index.d.ts.map +1 -1
  573. package/types/shared/focusManagement.d.ts +2 -2
  574. package/types/shared/focusManagement.d.ts.map +1 -1
  575. package/types/shared/pickerTriggerContract.d.ts +18 -0
  576. package/types/shared/pickerTriggerContract.d.ts.map +1 -0
  577. package/types/shared/pressSlopProps.d.ts +8 -0
  578. package/types/shared/pressSlopProps.d.ts.map +1 -0
  579. package/src/router.d.ts +0 -16
@@ -1,3 +1,4 @@
1
+ import { pressSlopProps } from "../shared/pressSlopProps";
1
2
  import {
2
3
  Children,
3
4
  createElement,
@@ -20,7 +21,6 @@ import {
20
21
  sizeRecipeFromHeight,
21
22
  solidButtonIntents,
22
23
  useResolvedKnobs,
23
- type HitSlopInsets,
24
24
  type RecipeFamilyName,
25
25
  type SizeRecipe,
26
26
  type SizeRecipeRadiusStop,
@@ -56,8 +56,8 @@ import { useControlGrouped } from "../shared/groupContext";
56
56
  * Coordinated size recipe (Polaris slim/medium/large, Primer s/m/l, Linear
57
57
  * 28/32/40, Spectrum S/M, M3 XS/S). Height, pad, type, icon, gap and radius
58
58
  * step together from the size table. The borderRadius knob is an override
59
- * that retargets both painted radius and inner gap (`resolveControlRadius`).
60
- * Density is a different axis (pad/gap only).
59
+ * of painted corners only (`resolveControlRadius`); internal gap keeps the
60
+ * icon and label grouped. Density selects the same-height compact family.
61
61
  *
62
62
  * GENERATED (LC-75 / LC-80): Button consumes `recipeFamilies.control` — the
63
63
  * handwritten mirror table this file used to carry drifted (md font 13 vs the
@@ -105,40 +105,6 @@ function sizeTokenPx(size: SizeTokens | number | undefined): number {
105
105
  return typeof resolved === "number" && Number.isFinite(resolved) ? resolved : MIN_PRESS_TARGET;
106
106
  }
107
107
 
108
- const PRESS_SLOP_STYLE_ID = "mp-button-press-slop";
109
-
110
- function pressSlopStylesheet(): string {
111
- const rules = ["[data-mp-press-slop]{position:relative}"];
112
- for (let n = 1; n <= 16; n++) {
113
- rules.push(`[data-mp-press-slop="${n}"]::after{content:"";position:absolute;inset:-${n}px}`);
114
- }
115
- return rules.join("");
116
- }
117
-
118
- function ensureButtonPressSlop(): void {
119
- if (!isWeb || typeof document === "undefined") return;
120
- if (document.getElementById(PRESS_SLOP_STYLE_ID)) return;
121
- const tag = document.createElement("style");
122
- tag.id = PRESS_SLOP_STYLE_ID;
123
- tag.textContent = pressSlopStylesheet();
124
- document.head.appendChild(tag);
125
- }
126
-
127
- function pressSlopProps(
128
- visualPx: number,
129
- enabled: boolean,
130
- ): { "data-mp-press-slop": string } | { hitSlop: HitSlopInsets } | undefined {
131
- if (!enabled || visualPx >= MIN_PRESS_TARGET) return undefined;
132
- const hitSlop = pressTargetHitSlop(visualPx);
133
- const outset = hitSlop.top;
134
- if (outset <= 0) return undefined;
135
- if (isWeb) {
136
- ensureButtonPressSlop();
137
- return { "data-mp-press-slop": String(outset) };
138
- }
139
- return { hitSlop };
140
- }
141
-
142
108
  /** DG-ACT-01 role within an ActionBar / action region. */
143
109
  export type ButtonActionRole = "primary" | "secondary" | "chrome";
144
110
 
@@ -273,7 +239,29 @@ export const ButtonFrame = styled(View, {
273
239
  },
274
240
  });
275
241
 
276
- export interface ButtonProps extends Omit<TamaguiButtonProps, "form" | "icon" | "iconAfter"> {
242
+ /**
243
+ * MPO-91: `variant` is Omitted, and that Omit IS the guard.
244
+ *
245
+ * `ButtonFrame` is `styled(View)` and declares only an `outlined` BOOLEAN, so
246
+ * `variant="outlined"` was never read — it landed on the frame as an unread
247
+ * prop and the button rendered FILLED. Because `TamaguiButtonProps` carries
248
+ * `variant`, the inherited type advertised a channel this component ignores,
249
+ * so 75 call sites across 29 files typechecked, rendered wrong, and said
250
+ * nothing. Declaring the prop and dropping it on the floor is the lying API
251
+ * MPO-81 refused to ship.
252
+ *
253
+ * Omitting it turns every one of those call sites into a compile error instead
254
+ * of a silent no-op, which is what stops the prop coming back. The house
255
+ * channel is the `outlined` boolean.
256
+ *
257
+ * `@multiplatform.one/components`' Button still accepts `variant` and maps it
258
+ * onto `outlined` — that shim is the documented raw-tamagui compat hatch, and
259
+ * it declares the prop itself rather than inheriting it from here.
260
+ */
261
+ export interface ButtonProps extends Omit<
262
+ TamaguiButtonProps,
263
+ "form" | "icon" | "iconAfter" | "variant"
264
+ > {
277
265
  action?: "submit" | "reset";
278
266
  form?: AnyFormApi;
279
267
  loading?: boolean;
@@ -684,7 +672,6 @@ export function Button({
684
672
  circular={!nested && isCircular ? true : undefined}
685
673
  chromeless={selectedFill ? false : chromeless}
686
674
  selected={selectedFill || undefined}
687
- {...(outlined ? { variant: "outlined" as const } : undefined)}
688
675
  {...(!isCircular || nested
689
676
  ? {
690
677
  paddingHorizontal: padX,
@@ -161,7 +161,9 @@ describe("Chip", () => {
161
161
 
162
162
  it("selected chip renders a leading check when no icon is passed", () => {
163
163
  const result = renderWithProviders(<Chip selected>On</Chip>);
164
- expect(result.container.querySelector("svg")).not.toBeNull();
164
+ const fill = result.container.querySelector("svg")?.getAttribute("fill");
165
+ expect(fill).toBeTruthy();
166
+ expect(fill?.startsWith("$")).toBe(false);
165
167
  });
166
168
 
167
169
  it("onPress fires from the chip body and does not fire dismiss", () => {
@@ -436,11 +436,7 @@ export function Chip({
436
436
  ? t("Remove {{label}}", { label: String(children) })
437
437
  : t("Remove");
438
438
  const leading =
439
- icon !== undefined ? (
440
- icon
441
- ) : selected ? (
442
- <CheckIcon size={iconSize} color={textColor as string} />
443
- ) : null;
439
+ icon !== undefined ? icon : selected ? <CheckIcon size={iconSize} color={glyphInk} /> : null;
444
440
 
445
441
  const onBodyKeyDown = ((e: KeyboardEvent) => {
446
442
  if ((e.key === "Enter" || e.key === " ") && onPress) {
@@ -119,6 +119,39 @@ describe("ContextualSaveBar", () => {
119
119
  expect(savebar()).toBeNull();
120
120
  });
121
121
 
122
+ it.each([undefined, "Review changes"])(
123
+ "shows the complete narrow-form refusal with custom status %s",
124
+ async (message) => {
125
+ const refusal =
126
+ "service_identifier_already_exists_012345678901234567890123456789. Choose a different identifier and retry.";
127
+ const result = renderWithProviders(
128
+ <div style={{ width: 309 }}>
129
+ <Form
130
+ saveBar={{ message }}
131
+ formOptions={{ defaultValues: { name: "svc" } }}
132
+ onSubmit={async () => {
133
+ throw new Error(refusal);
134
+ }}
135
+ >
136
+ <Input name="name" label="Service name" />
137
+ </Form>
138
+ </div>,
139
+ );
140
+ const input = result.container.querySelector("input")!;
141
+ await act(async () => typeIn(input, "svc-billing"));
142
+ await act(async () => fireEvent.click(barButton("Save")));
143
+ await waitFor(() => expect(savebar()?.textContent).toContain(refusal));
144
+ const status = savebar()!.querySelector('[role="status"]')!;
145
+ expect(getComputedStyle(status).whiteSpace).not.toBe("nowrap");
146
+ expect(getComputedStyle(status).textOverflow).not.toBe("ellipsis");
147
+ expect(getComputedStyle(status).overflowWrap).toBe("anywhere");
148
+ expect(getComputedStyle(savebar()!).flexDirection).toBe("column");
149
+ expect(barButton("Save").getAttribute("aria-disabled")).toBeNull();
150
+ expect(barButton("Discard").getAttribute("aria-disabled")).toBeNull();
151
+ expect((input as HTMLInputElement).value).toBe("svc-billing");
152
+ },
153
+ );
154
+
122
155
  it("clears after Save and after Discard confirm", async () => {
123
156
  const onSubmit = vi.fn();
124
157
  const result = renderWithProviders(
@@ -89,3 +89,22 @@ export const Dirty: Story = {
89
89
  </Form>
90
90
  ),
91
91
  };
92
+
93
+ export const NarrowRefusal: Story = {
94
+ name: "Narrow refusal",
95
+ render: () => (
96
+ <YStack width={309} maxWidth="100%">
97
+ <Form
98
+ saveBar={{ forceVisible: true }}
99
+ formOptions={{ defaultValues: { name: "service-example" } }}
100
+ onSubmit={async () => {
101
+ throw new Error(
102
+ "service_identifier_already_exists_012345678901234567890123456789. Choose a different identifier and retry.",
103
+ );
104
+ }}
105
+ >
106
+ <Input name="name" label="Service name" />
107
+ </Form>
108
+ </YStack>
109
+ ),
110
+ };
@@ -39,7 +39,7 @@ export interface ContextualSaveBarProps {
39
39
  * Form reads this; the bar itself does not.
40
40
  */
41
41
  onAutoCommit?: (name: string, value: unknown) => void;
42
- /** Override the in-bar status line. */
42
+ /** Override normal dirty-state copy; saving and failures retain their status. */
43
43
  message?: string;
44
44
  }
45
45
 
@@ -83,7 +83,6 @@ function statusCopy(args: {
83
83
  dirty: number;
84
84
  override?: string;
85
85
  }): { text: string; failed: boolean; qualifier?: string } {
86
- if (args.override) return { text: args.override, failed: false };
87
86
  if (args.isSubmitting) return { text: t("Saving…"), failed: false };
88
87
  if (args.saveError) {
89
88
  return {
@@ -101,6 +100,7 @@ function statusCopy(args: {
101
100
  failed: true,
102
101
  };
103
102
  }
103
+ if (args.override) return { text: args.override, failed: false };
104
104
  const qualifier =
105
105
  args.dirty > 0
106
106
  ? args.dirty === 1
@@ -236,11 +236,13 @@ export function ContextualSaveBar({
236
236
  data-mp-savebar-bottom-radius="0"
237
237
  role="region"
238
238
  aria-label={t("Unsaved changes")}
239
- position="sticky"
240
- bottom={0}
239
+ // Tamagui maps sticky to absolute on native; keep the dock in flow there.
240
+ position={isWeb ? "sticky" : "relative"}
241
+ bottom={isWeb ? 0 : undefined}
241
242
  width="100%"
242
243
  zIndex={zIndex.sheet}
243
- alignItems="center"
244
+ flexDirection={copy.failed ? "column" : "row"}
245
+ alignItems={copy.failed ? "stretch" : "center"}
244
246
  paddingTop="$2.5"
245
247
  paddingHorizontal={padX as never}
246
248
  paddingBottom="$2.5"
@@ -266,15 +268,17 @@ export function ContextualSaveBar({
266
268
  ...(elevationProps.style as object | undefined),
267
269
  }}
268
270
  >
269
- <XStack flex={1} minWidth={0} alignItems="baseline" gap="$2">
271
+ <XStack flex={copy.failed ? undefined : 1} minWidth={0} alignItems="baseline" gap="$2">
270
272
  <Text
271
273
  role="status"
272
274
  {...knobProps.body}
273
275
  fontSize="$4"
274
276
  lineHeight="$4"
275
277
  color={copy.failed ? formCommonColors.error : "$color"}
276
- numberOfLines={1}
277
- ellipsizeMode="tail"
278
+ flexShrink={1}
279
+ numberOfLines={copy.failed ? undefined : 1}
280
+ ellipsizeMode={copy.failed ? undefined : "tail"}
281
+ {...(isWeb && copy.failed ? { style: { overflowWrap: "anywhere" } } : {})}
278
282
  >
279
283
  {copy.text}
280
284
  </Text>
@@ -0,0 +1,20 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { expect, it, vi } from "vitest";
3
+ import { Form } from "../Form";
4
+ import { ContextualSaveBar } from "./index";
5
+
6
+ vi.mock("tamagui", async (importOriginal) => ({
7
+ ...(await importOriginal<typeof import("tamagui")>()),
8
+ isWeb: false,
9
+ }));
10
+
11
+ it("reserves native layout space instead of mapping a sticky dock to absolute", () => {
12
+ const view = renderWithProviders(
13
+ <Form formOptions={{ defaultValues: { name: "example" } }}>
14
+ <ContextualSaveBar forceVisible />
15
+ </Form>,
16
+ );
17
+ const bar = view.container.querySelector("[data-mp-contextual-savebar]")!;
18
+ expect(getComputedStyle(bar).position).toBe("relative");
19
+ expect(getComputedStyle(bar).bottom).not.toBe("0px");
20
+ });
@@ -1,10 +1,14 @@
1
1
  import { action } from "@multiplatform.one/storybook";
2
2
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
3
3
  import { useForm } from "@tanstack/react-form";
4
+ import { useState } from "react";
5
+ import { Preset } from "@multiplatform.one/theme";
4
6
  import { Input as TamaguiInput, Paragraph, YStack, XStack } from "tamagui";
5
7
  import { Button } from "./Button";
6
8
  import { Form } from "./Form";
7
9
  import { Field, FieldLayout } from "./fieldLayout";
10
+ import { Input } from "./fields/Input";
11
+ import { Checkbox } from "./fields/Checkbox";
8
12
 
9
13
  const meta: Meta<typeof FieldLayout> = {
10
14
  title: "Forms/FieldLayout",
@@ -39,6 +43,43 @@ export const Basic: Story = {
39
43
  ),
40
44
  };
41
45
 
46
+ /** Shared message order with real controls, including the inline checkbox row. */
47
+ export const MessageOrder: Story = {
48
+ render: () => {
49
+ const Example = () => {
50
+ const [showErrors, setShowErrors] = useState(false);
51
+ return (
52
+ <YStack gap="$4" width="100%" maxWidth={480}>
53
+ <Input
54
+ id="message-top"
55
+ label="Contact"
56
+ helperText="Use an address where we can reach you"
57
+ error={showErrors ? "Enter a contact address" : undefined}
58
+ />
59
+ <Preset overrides={{ fieldLabelPlacement: "side" }}>
60
+ <Input
61
+ id="message-side"
62
+ label="Office"
63
+ helperText="Use the office name shown on your account"
64
+ error={showErrors ? "Enter your office name" : undefined}
65
+ />
66
+ </Preset>
67
+ <Checkbox
68
+ id="message-inline"
69
+ label="Accept terms"
70
+ helperText="Read the terms before continuing"
71
+ error={showErrors ? "Accept the terms to continue" : undefined}
72
+ />
73
+ <Button onPress={() => setShowErrors((shown) => !shown)}>
74
+ {showErrors ? "Show helpers" : "Show validation"}
75
+ </Button>
76
+ </YStack>
77
+ );
78
+ };
79
+ return <Example />;
80
+ },
81
+ };
82
+
42
83
  export const ErrorStates: Story = {
43
84
  render: () => (
44
85
  <YStack gap="$6" maxWidth={360}>
@@ -57,6 +57,60 @@ function panel(open: boolean) {
57
57
  }
58
58
 
59
59
  describe("FloatingPanel native presentation lifecycle", () => {
60
+ it("keeps full-field triggers stretched and allows content-sized composite adornments", () => {
61
+ for (const triggerSizing of [undefined, "content"] as const) {
62
+ const result = renderWithProviders(
63
+ <FloatingPanel
64
+ open={false}
65
+ onOpenChange={onOpenChange}
66
+ trigger={<Text>Country</Text>}
67
+ triggerSizing={triggerSizing}
68
+ triggerA11y={{ label: "Country code" }}
69
+ >
70
+ <Text>row</Text>
71
+ </FloatingPanel>,
72
+ );
73
+ const trigger = result.getByRole("button", { name: "Country code" });
74
+ expect(getComputedStyle(trigger).width).toBe(triggerSizing === "content" ? "" : "100%");
75
+ expect(getComputedStyle(trigger).alignSelf).toBe("stretch");
76
+ expect(getComputedStyle(trigger.parentElement!).width).toBe(
77
+ triggerSizing === "content" ? "" : "100%",
78
+ );
79
+ result.unmount();
80
+ }
81
+ });
82
+
83
+ it("composes native readiness with entrance and ignores late closed or unmounted events", () => {
84
+ const onNativeShow = vi.fn();
85
+ const example = (open: boolean) => (
86
+ <FloatingPanel
87
+ open={open}
88
+ onOpenChange={onOpenChange}
89
+ onNativeShow={onNativeShow}
90
+ trigger={<Text>Pick</Text>}
91
+ >
92
+ <Text>row</Text>
93
+ </FloatingPanel>
94
+ );
95
+ const result = renderWithProviders(example(true));
96
+ expect(Animated.timing).toHaveBeenCalledTimes(1);
97
+ expect(onNativeShow).not.toHaveBeenCalled();
98
+ const shown = modal.onShow;
99
+ act(() => shown?.());
100
+ expect(onNativeShow).toHaveBeenCalledTimes(1);
101
+ expect(Animated.timing).toHaveBeenCalledTimes(1);
102
+ result.rerender(example(false));
103
+ act(() => shown?.());
104
+ expect(onNativeShow).toHaveBeenCalledTimes(1);
105
+ result.rerender(example(true));
106
+ const nextShown = modal.onShow;
107
+ act(() => nextShown?.());
108
+ expect(onNativeShow).toHaveBeenCalledTimes(2);
109
+ result.unmount();
110
+ act(() => nextShown?.());
111
+ expect(onNativeShow).toHaveBeenCalledTimes(2);
112
+ });
113
+
60
114
  it("enters without onShow and ignores onShow for the same presentation", () => {
61
115
  renderWithProviders(panel(true));
62
116
  expect(Animated.timing).toHaveBeenCalledTimes(1);
@@ -40,12 +40,16 @@ function Harness({
40
40
  sheet,
41
41
  onOpenChange,
42
42
  extra,
43
+ openOn,
44
+ sizing,
43
45
  }: {
44
46
  trigger: ReactNode;
45
47
  disabled?: boolean;
46
48
  sheet?: boolean;
47
49
  onOpenChange?: (open: boolean) => void;
48
50
  extra?: ReactNode;
51
+ openOn?: "press" | "contextmenu";
52
+ sizing?: "grow" | "fill";
49
53
  }) {
50
54
  const [open, setOpen] = useState(false);
51
55
  return (
@@ -64,6 +68,8 @@ function Harness({
64
68
  trigger={trigger}
65
69
  disabled={disabled}
66
70
  sheet={sheet}
71
+ openOn={openOn}
72
+ sizing={sizing}
67
73
  >
68
74
  <Text>panel body</Text>
69
75
  {extra}
@@ -79,6 +85,75 @@ const isOpen = (result: { container: HTMLElement }) =>
79
85
 
80
86
  const floatingViewport = () => document.querySelector('[data-testid="floating-panel-viewport"]');
81
87
 
88
+ describe("FloatingPanel nested actions", () => {
89
+ it("does not require a marked DOM button to stop propagation", () => {
90
+ const action = vi.fn();
91
+ const onOpenChange = vi.fn();
92
+ const result = renderWithProviders(
93
+ <Harness
94
+ onOpenChange={onOpenChange}
95
+ trigger={
96
+ <button type="button" data-floating-panel-action="true" onClick={action}>
97
+ Clear selection
98
+ </button>
99
+ }
100
+ />,
101
+ );
102
+ fireEvent.click(result.getByRole("button", { name: "Clear selection" }), { detail: 0 });
103
+ expect(action).toHaveBeenCalledOnce();
104
+ expect(onOpenChange).not.toHaveBeenCalled();
105
+ });
106
+
107
+ for (const sheet of [true, false]) {
108
+ for (const activation of ["pointer", "keyboard"] as const) {
109
+ it(`lets a marked ${activation} action run without opening ${sheet ? "sheet" : "float"}`, () => {
110
+ const action = vi.fn();
111
+ const onOpenChange = vi.fn();
112
+ const result = renderWithProviders(
113
+ <Harness
114
+ sheet={sheet}
115
+ onOpenChange={onOpenChange}
116
+ trigger={
117
+ <Button
118
+ data-floating-panel-action="true"
119
+ onPress={(event) => {
120
+ event.stopPropagation();
121
+ action();
122
+ }}
123
+ >
124
+ Clear selection
125
+ </Button>
126
+ }
127
+ />,
128
+ );
129
+ const button = result.getByRole("button", { name: "Clear selection" });
130
+ if (activation === "pointer") pointerPress(button);
131
+ else {
132
+ fireEvent.keyDown(button, { key: "Enter" });
133
+ fireEvent.keyUp(button, { key: "Enter" });
134
+ }
135
+ expect(action).toHaveBeenCalledOnce();
136
+ expect(onOpenChange).not.toHaveBeenCalled();
137
+ expect(isOpen(result)).toBe(false);
138
+ });
139
+ }
140
+
141
+ it(`preserves context-menu opening from a marked action in ${sheet ? "sheet" : "float"}`, () => {
142
+ const onOpenChange = vi.fn();
143
+ const result = renderWithProviders(
144
+ <Harness
145
+ sheet={sheet}
146
+ openOn="contextmenu"
147
+ onOpenChange={onOpenChange}
148
+ trigger={<Button data-floating-panel-action="true">Context action</Button>}
149
+ />,
150
+ );
151
+ fireEvent.contextMenu(result.getByRole("button", { name: "Context action" }));
152
+ expect(onOpenChange).toHaveBeenCalledWith(true);
153
+ });
154
+ }
155
+ });
156
+
82
157
  /** The DEEPEST node carrying the whole label — several ancestors report the
83
158
  * same `textContent`, and pressing one of those would sidestep the very
84
159
  * swallow these cases exist to catch. */
@@ -260,4 +335,38 @@ describe("FloatingPanel trigger — floating mode", () => {
260
335
  expect(document.activeElement).toBe(trigger);
261
336
  });
262
337
  });
338
+
339
+ it("disconnects fill content observation on close and unmount", async () => {
340
+ const observers: { target: Element; disconnected: boolean }[] = [];
341
+ class TrackingResizeObserver {
342
+ private tracked?: { target: Element; disconnected: boolean };
343
+ observe(target: Element) {
344
+ if (target.parentElement?.getAttribute("data-testid") !== "floating-panel-viewport") return;
345
+ this.tracked = { target, disconnected: false };
346
+ observers.push(this.tracked);
347
+ }
348
+ unobserve() {}
349
+ disconnect() {
350
+ if (this.tracked) this.tracked.disconnected = true;
351
+ }
352
+ }
353
+ vi.stubGlobal("ResizeObserver", TrackingResizeObserver);
354
+ const result = renderWithProviders(
355
+ <Harness sizing="fill" trigger={<Button>Open Panel</Button>} />,
356
+ );
357
+ try {
358
+ const trigger = result.container.querySelector("[role='button']") as HTMLElement;
359
+ pointerPress(trigger);
360
+ await waitFor(() => expect(observers.some((observer) => !observer.disconnected)).toBe(true));
361
+ fireEvent.keyDown(document, { key: "Escape" });
362
+ await waitFor(() => expect(observers.every((observer) => observer.disconnected)).toBe(true));
363
+ pointerPress(trigger);
364
+ await waitFor(() => expect(observers.some((observer) => !observer.disconnected)).toBe(true));
365
+ result.unmount();
366
+ expect(observers.every((observer) => observer.disconnected)).toBe(true);
367
+ } finally {
368
+ result.unmount();
369
+ vi.unstubAllGlobals();
370
+ }
371
+ });
263
372
  });
@@ -76,6 +76,7 @@ export {
76
76
  } from "./useFloatingPanel";
77
77
  export type { UseFloatingPanelOptions, UseFloatingPanelReturn } from "./useFloatingPanel";
78
78
  export type { FloatingPanelProps } from "./index";
79
+ export { floatingPanelActionProps, isNestedPanelAction } from "./nestedAction";
79
80
 
80
81
  /** Native never has a >sm web viewport; AdaptivePopup uses this to pick Sheet mode. */
81
82
  export function useViewportGtSm() {
@@ -103,8 +104,10 @@ const enterDuration = 280;
103
104
  export function FloatingPanel({
104
105
  open,
105
106
  onOpenChange,
107
+ onNativeShow,
106
108
  trigger,
107
109
  triggerEnd,
110
+ triggerSizing = "stretch",
108
111
  children,
109
112
  scrollable,
110
113
  disabled,
@@ -355,7 +358,13 @@ export function FloatingPanel({
355
358
 
356
359
  return (
357
360
  <>
358
- <RNView style={{ flexDirection: "row", alignItems: "center", width: "100%" }}>
361
+ <RNView
362
+ style={{
363
+ flexDirection: "row",
364
+ alignItems: "center",
365
+ width: triggerSizing === "content" ? undefined : "100%",
366
+ }}
367
+ >
359
368
  <Pressable
360
369
  {...(isContextMenu
361
370
  ? { onLongPress: handleTriggerLongPress, delayLongPress: 500 }
@@ -368,18 +377,22 @@ export function FloatingPanel({
368
377
  ? { accessibilityValue: { text: triggerA11y.value } }
369
378
  : undefined)}
370
379
  {...(triggerA11y?.hint ? { accessibilityHint: triggerA11y.hint } : undefined)}
371
- // Stretch to the cell/row width — content-sized triggers (~70pt) make
372
- // most of the edit box look tappable but miss the Pressable.
380
+ // Whole-field triggers stretch; composite adornments hug their
381
+ // content so sibling inputs retain their editable space.
373
382
  style={{
374
- flex: 1,
383
+ flex: triggerSizing === "content" ? undefined : 1,
375
384
  minWidth: 0,
376
385
  alignSelf: "stretch",
377
- width: "100%",
386
+ width: triggerSizing === "content" ? undefined : "100%",
378
387
  opacity: disabled ? 0.5 : 1,
379
388
  }}
380
389
  >
381
390
  {/* Own the hit target — see file header for why pointerEvents="none". */}
382
- <RNView pointerEvents="none" collapsable={false} style={{ width: "100%" }}>
391
+ <RNView
392
+ pointerEvents="none"
393
+ collapsable={false}
394
+ style={{ width: triggerSizing === "content" ? undefined : "100%" }}
395
+ >
383
396
  {trigger}
384
397
  </RNView>
385
398
  </Pressable>
@@ -391,7 +404,11 @@ export function FloatingPanel({
391
404
  animationType="fade"
392
405
  statusBarTranslucent
393
406
  onRequestClose={close}
394
- onShow={enter}
407
+ onShow={() => {
408
+ if (!activeRef.current) return;
409
+ enter();
410
+ onNativeShow?.();
411
+ }}
395
412
  >
396
413
  {/*
397
414
  A plain padded column, not KeyboardAvoidingView: inside a Modal the