@multiplatform.one/forms 7.67.0 → 7.68.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 (419) hide show
  1. package/dist/cjs/AdaptivePopup/index.cjs +45 -5
  2. package/dist/cjs/AdaptivePopup/index.native.js +48 -6
  3. package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
  4. package/dist/cjs/Button/glass.cjs +30 -0
  5. package/dist/cjs/Button/glass.native.js +47 -0
  6. package/dist/cjs/Button/glass.native.js.map +1 -0
  7. package/dist/cjs/Button/index.cjs +157 -28
  8. package/dist/cjs/Button/index.native.js +158 -29
  9. package/dist/cjs/Button/index.native.js.map +1 -1
  10. package/dist/cjs/Chip/index.native.js.map +1 -1
  11. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
  12. package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
  13. package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
  14. package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
  15. package/dist/cjs/ContextualSaveBar/index.cjs +6 -8
  16. package/dist/cjs/ContextualSaveBar/index.native.js +9 -11
  17. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  18. package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
  19. package/dist/cjs/ControlGroup/index.native.js +1 -1
  20. package/dist/cjs/ControlGroup/index.native.js.map +1 -1
  21. package/dist/cjs/DescriptionList/index.cjs +0 -1
  22. package/dist/cjs/DescriptionList/index.native.js +2 -3
  23. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  24. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  25. package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
  26. package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
  27. package/dist/cjs/FieldDisplay/index.native.js +1 -1
  28. package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
  29. package/dist/cjs/FieldGroup.native.js.map +1 -1
  30. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
  31. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  32. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
  33. package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
  34. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  35. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
  36. package/dist/cjs/FloatingPanel/trailingAction.native.js +1 -1
  37. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
  38. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  39. package/dist/cjs/Form/index.native.js +1 -1
  40. package/dist/cjs/Form/index.native.js.map +1 -1
  41. package/dist/cjs/Form/submissionController.native.js.map +1 -1
  42. package/dist/cjs/Form/validateOn.native.js.map +1 -1
  43. package/dist/cjs/FormGrid.native.js.map +1 -1
  44. package/dist/cjs/FormSection.native.js.map +1 -1
  45. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -1
  46. package/dist/cjs/InputParts/index.native.js.map +1 -1
  47. package/dist/cjs/Label/index.native.js.map +1 -1
  48. package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
  49. package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
  50. package/dist/cjs/MediaPicker/types.native.js.map +1 -1
  51. package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
  52. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  53. package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
  54. package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
  55. package/dist/cjs/Table/index.native.js.map +1 -1
  56. package/dist/cjs/Wheel/haptic.native.js.map +1 -1
  57. package/dist/cjs/Wheel/index.native.js.map +1 -1
  58. package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
  59. package/dist/cjs/actionLabel.native.js.map +1 -1
  60. package/dist/cjs/fieldDefaults.native.js.map +1 -1
  61. package/dist/cjs/fieldLayout.native.js +1 -1
  62. package/dist/cjs/fieldLayout.native.js.map +1 -1
  63. package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
  64. package/dist/cjs/fields/Barcode/BarcodeScanner.cjs +7 -8
  65. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +8 -9
  66. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js.map +1 -1
  67. package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
  68. package/dist/cjs/fields/Barcode/index.native.js +2 -2
  69. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  70. package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
  71. package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
  72. package/dist/cjs/fields/Checkbox/Checkbox.native.js +1 -1
  73. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  74. package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
  75. package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
  76. package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
  77. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +1 -1
  78. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  79. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
  80. package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
  81. package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
  82. package/dist/cjs/fields/ColorPicker/index.native.js +2 -2
  83. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  84. package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
  85. package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
  86. package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
  87. package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
  88. package/dist/cjs/fields/Combobox/index.native.js +5 -5
  89. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  90. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  91. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
  92. package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
  93. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
  94. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
  95. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
  96. package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
  97. package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
  98. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
  99. package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
  100. package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
  101. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
  102. package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
  103. package/dist/cjs/fields/DatePicker/index.native.js +2 -2
  104. package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
  105. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  106. package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
  107. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  108. package/dist/cjs/fields/Duration/index.native.js +3 -3
  109. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  110. package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
  111. package/dist/cjs/fields/FileUpload/index.cjs +83 -60
  112. package/dist/cjs/fields/FileUpload/index.native.js +98 -75
  113. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  114. package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
  115. package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
  116. package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
  117. package/dist/cjs/fields/Geolocation/geocoder.native.js.map +1 -1
  118. package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
  119. package/dist/cjs/fields/Geolocation/index.cjs +7 -8
  120. package/dist/cjs/fields/Geolocation/index.native.js +12 -13
  121. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  122. package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
  123. package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
  124. package/dist/cjs/fields/Geolocation/nativeSearchFocus.native.js.map +1 -1
  125. package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
  126. package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
  127. package/dist/cjs/fields/Icon/index.native.js +3 -3
  128. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  129. package/dist/cjs/fields/ImageField/index.cjs +4 -6
  130. package/dist/cjs/fields/ImageField/index.native.js +6 -8
  131. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  132. package/dist/cjs/fields/Input/index.native.js +3 -3
  133. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  134. package/dist/cjs/fields/MentionInput/index.native.js +3 -3
  135. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  136. package/dist/cjs/fields/OTPInput/index.native.js +3 -3
  137. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  138. package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
  139. package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
  140. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  141. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  142. package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
  143. package/dist/cjs/fields/PhoneInput/regionNames.native.js.map +1 -1
  144. package/dist/cjs/fields/Progress/index.native.js +1 -1
  145. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  146. package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
  147. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  148. package/dist/cjs/fields/Rating/index.native.js +1 -1
  149. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  150. package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
  151. package/dist/cjs/fields/Rating/types.native.js.map +1 -1
  152. package/dist/cjs/fields/SearchInput/index.native.js +2 -2
  153. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  154. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  155. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
  156. package/dist/cjs/fields/Select/index.native.js +4 -4
  157. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  158. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  159. package/dist/cjs/fields/Signature/index.native.js +2 -2
  160. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  161. package/dist/cjs/fields/Slider/index.native.js +1 -1
  162. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  163. package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
  164. package/dist/cjs/fields/Stepper/index.native.js +2 -2
  165. package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
  166. package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
  167. package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
  168. package/dist/cjs/fields/Switch/index.native.js +2 -2
  169. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  170. package/dist/cjs/fields/TextArea/index.native.js +2 -2
  171. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  172. package/dist/cjs/fields/TimePicker/catalog.native.js +3 -3
  173. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
  174. package/dist/cjs/fields/TimePicker/index.native.js +2 -2
  175. package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
  176. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  177. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  178. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
  179. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  180. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  181. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  182. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +20 -28
  183. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +20 -28
  184. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  185. package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
  186. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
  187. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
  188. package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
  189. package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
  190. package/dist/cjs/formSpacing.native.js.map +1 -1
  191. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  192. package/dist/cjs/index.cjs +8 -1
  193. package/dist/cjs/index.native.js +52 -45
  194. package/dist/cjs/index.native.js.map +1 -1
  195. package/dist/cjs/keyboard/KeyboardDoneBar.native.js +1 -1
  196. package/dist/cjs/keyboard/chain.native.js.map +1 -1
  197. package/dist/cjs/keyboard/index.native.js.map +1 -1
  198. package/dist/cjs/keyboard/types.native.js.map +1 -1
  199. package/dist/cjs/requiredMarking.native.js.map +1 -1
  200. package/dist/cjs/shared/TimeColumn.native.js +1 -1
  201. package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
  202. package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
  203. package/dist/cjs/shared/choiceRowPress.native.js.map +1 -1
  204. package/dist/cjs/shared/colorRamps.cjs +0 -8
  205. package/dist/cjs/shared/colorRamps.native.js +0 -8
  206. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  207. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  208. package/dist/cjs/shared/floatingList.native.js +1 -1
  209. package/dist/cjs/shared/floatingList.native.js.map +1 -1
  210. package/dist/cjs/shared/focusManagement.native.js.map +1 -1
  211. package/dist/cjs/shared/groupContext.native.js.map +1 -1
  212. package/dist/cjs/shared/i18n.native.js.map +1 -1
  213. package/dist/cjs/shared/instantMotion.native.js.map +1 -1
  214. package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
  215. package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
  216. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
  217. package/dist/cjs/shared/overlayStack.native.js.map +1 -1
  218. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  219. package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
  220. package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
  221. package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
  222. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
  223. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
  224. package/dist/cjs/shared/systemControls.native.js.map +1 -1
  225. package/dist/cjs/shared/t.native.js.map +1 -1
  226. package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
  227. package/dist/cjs/shared/touchWebPicker.native.js.map +1 -1
  228. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  229. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  230. package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
  231. package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
  232. package/dist/cjs/shared/utils.native.js +1 -1
  233. package/dist/cjs/shared/utils.native.js.map +1 -1
  234. package/dist/cjs/shared/zIndex.native.js.map +1 -1
  235. package/dist/cjs/standardActions.cjs +117 -0
  236. package/dist/cjs/standardActions.native.js +120 -0
  237. package/dist/cjs/standardActions.native.js.map +1 -0
  238. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  239. package/dist/cjs/types.native.js.map +1 -1
  240. package/dist/cjs/utils/LinkCell.native.js.map +1 -1
  241. package/dist/esm/AdaptivePopup/index.mjs +45 -5
  242. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  243. package/dist/esm/AdaptivePopup/index.native.js +47 -5
  244. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  245. package/dist/esm/Button/glass.mjs +5 -0
  246. package/dist/esm/Button/glass.mjs.map +1 -0
  247. package/dist/esm/Button/glass.native.js +19 -0
  248. package/dist/esm/Button/glass.native.js.map +1 -0
  249. package/dist/esm/Button/index.mjs +153 -28
  250. package/dist/esm/Button/index.mjs.map +1 -1
  251. package/dist/esm/Button/index.native.js +153 -28
  252. package/dist/esm/Button/index.native.js.map +1 -1
  253. package/dist/esm/ContextualSaveBar/index.mjs +7 -9
  254. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  255. package/dist/esm/ContextualSaveBar/index.native.js +7 -9
  256. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  257. package/dist/esm/DescriptionList/index.mjs +0 -1
  258. package/dist/esm/DescriptionList/index.mjs.map +1 -1
  259. package/dist/esm/DescriptionList/index.native.js +0 -1
  260. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  261. package/dist/esm/fields/Barcode/BarcodeScanner.mjs +8 -9
  262. package/dist/esm/fields/Barcode/BarcodeScanner.mjs.map +1 -1
  263. package/dist/esm/fields/Barcode/BarcodeScanner.native.js +8 -9
  264. package/dist/esm/fields/Barcode/BarcodeScanner.native.js.map +1 -1
  265. package/dist/esm/fields/FileUpload/index.mjs +84 -61
  266. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  267. package/dist/esm/fields/FileUpload/index.native.js +97 -74
  268. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  269. package/dist/esm/fields/Geolocation/index.mjs +8 -9
  270. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  271. package/dist/esm/fields/Geolocation/index.native.js +8 -9
  272. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  273. package/dist/esm/fields/ImageField/index.mjs +6 -8
  274. package/dist/esm/fields/ImageField/index.mjs.map +1 -1
  275. package/dist/esm/fields/ImageField/index.native.js +6 -8
  276. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  277. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +20 -28
  278. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  279. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +20 -28
  280. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  281. package/dist/esm/index.mjs +3 -2
  282. package/dist/esm/index.mjs.map +1 -1
  283. package/dist/esm/index.native.js +3 -2
  284. package/dist/esm/index.native.js.map +1 -1
  285. package/dist/esm/shared/colorRamps.mjs +0 -8
  286. package/dist/esm/shared/colorRamps.mjs.map +1 -1
  287. package/dist/esm/shared/colorRamps.native.js +0 -8
  288. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  289. package/dist/esm/standardActions.mjs +91 -0
  290. package/dist/esm/standardActions.mjs.map +1 -0
  291. package/dist/esm/standardActions.native.js +91 -0
  292. package/dist/esm/standardActions.native.js.map +1 -0
  293. package/dist/jsx/AdaptivePopup/index.mjs +45 -5
  294. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  295. package/dist/jsx/AdaptivePopup/index.native.js +47 -5
  296. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  297. package/dist/jsx/Button/glass.mjs +5 -0
  298. package/dist/jsx/Button/glass.mjs.map +1 -0
  299. package/dist/jsx/Button/glass.native.js +47 -0
  300. package/dist/jsx/Button/glass.native.js.map +1 -0
  301. package/dist/jsx/Button/index.mjs +153 -28
  302. package/dist/jsx/Button/index.mjs.map +1 -1
  303. package/dist/jsx/Button/index.native.js +156 -27
  304. package/dist/jsx/Button/index.native.js.map +1 -1
  305. package/dist/jsx/ContextualSaveBar/index.mjs +7 -9
  306. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  307. package/dist/jsx/ContextualSaveBar/index.native.js +6 -8
  308. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  309. package/dist/jsx/DescriptionList/index.mjs +0 -1
  310. package/dist/jsx/DescriptionList/index.mjs.map +1 -1
  311. package/dist/jsx/DescriptionList/index.native.js +0 -1
  312. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  313. package/dist/jsx/fields/Barcode/BarcodeScanner.mjs +8 -9
  314. package/dist/jsx/fields/Barcode/BarcodeScanner.mjs.map +1 -1
  315. package/dist/jsx/fields/Barcode/BarcodeScanner.native.js +7 -8
  316. package/dist/jsx/fields/Barcode/BarcodeScanner.native.js.map +1 -1
  317. package/dist/jsx/fields/FileUpload/index.mjs +84 -61
  318. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  319. package/dist/jsx/fields/FileUpload/index.native.js +96 -73
  320. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  321. package/dist/jsx/fields/Geolocation/index.mjs +8 -9
  322. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  323. package/dist/jsx/fields/Geolocation/index.native.js +7 -8
  324. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  325. package/dist/jsx/fields/ImageField/index.mjs +6 -8
  326. package/dist/jsx/fields/ImageField/index.mjs.map +1 -1
  327. package/dist/jsx/fields/ImageField/index.native.js +4 -6
  328. package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
  329. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +20 -28
  330. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  331. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +20 -28
  332. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  333. package/dist/jsx/index.js +3 -2
  334. package/dist/jsx/index.js.map +1 -1
  335. package/dist/jsx/index.mjs +3 -2
  336. package/dist/jsx/index.mjs.map +1 -1
  337. package/dist/jsx/index.native.js +7 -0
  338. package/dist/jsx/index.native.js.map +1 -1
  339. package/dist/jsx/shared/colorRamps.mjs +0 -8
  340. package/dist/jsx/shared/colorRamps.mjs.map +1 -1
  341. package/dist/jsx/shared/colorRamps.native.js +0 -8
  342. package/dist/jsx/shared/colorRamps.native.js.map +1 -1
  343. package/dist/jsx/standardActions.mjs +91 -0
  344. package/dist/jsx/standardActions.mjs.map +1 -0
  345. package/dist/jsx/standardActions.native.js +120 -0
  346. package/dist/jsx/standardActions.native.js.map +1 -0
  347. package/package.json +12 -8
  348. package/src/AdaptivePopup/AdaptivePopup.spec.tsx +44 -0
  349. package/src/AdaptivePopup/AdaptivePopup.stories.tsx +12 -32
  350. package/src/AdaptivePopup/index.tsx +65 -13
  351. package/src/Button/Button.disabledGlyph.spec.tsx +111 -0
  352. package/src/Button/Button.iconButton.spec.tsx +279 -0
  353. package/src/Button/Button.stories.tsx +59 -3
  354. package/src/Button/glass.native.ts +38 -0
  355. package/src/Button/glass.ts +18 -0
  356. package/src/Button/index.tsx +272 -40
  357. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +3 -1
  358. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +2 -2
  359. package/src/ContextualSaveBar/index.tsx +7 -10
  360. package/src/ControlGroup/ControlGroup.stories.tsx +3 -2
  361. package/src/DescriptionList/index.tsx +0 -1
  362. package/src/ErrorSummary.stories.tsx +2 -1
  363. package/src/FieldLayout.stories.tsx +3 -2
  364. package/src/FloatingPanel/FloatingPanel.stories.tsx +6 -10
  365. package/src/Form/Form.stories.tsx +6 -5
  366. package/src/errorSummaryStories.spec.tsx +4 -4
  367. package/src/fields/Barcode/BarcodeScanner.native.tsx +10 -9
  368. package/src/fields/Barcode/BarcodeScanner.tsx +10 -9
  369. package/src/fields/Checkbox/Checkbox.stories.tsx +3 -3
  370. package/src/fields/Checkbox/CheckboxGroup.stories.tsx +2 -2
  371. package/src/fields/ColorPicker/ColorPicker.stories.tsx +2 -2
  372. package/src/fields/Combobox/Combobox.stories.tsx +2 -2
  373. package/src/fields/DatePicker/DatePicker.stories.tsx +2 -1
  374. package/src/fields/DatePicker/DateRangePicker.stories.tsx +2 -2
  375. package/src/fields/DatePicker/DatetimePicker.stories.tsx +2 -1
  376. package/src/fields/DatePicker/MonthPicker.stories.tsx +2 -2
  377. package/src/fields/DatePicker/MultiDatePicker.stories.tsx +2 -2
  378. package/src/fields/FileUpload/FileUpload.spec.tsx +11 -6
  379. package/src/fields/FileUpload/FileUpload.stories.tsx +2 -2
  380. package/src/fields/FileUpload/index.tsx +101 -77
  381. package/src/fields/Geolocation/index.tsx +12 -7
  382. package/src/fields/ImageField/ImageField.spec.tsx +5 -5
  383. package/src/fields/ImageField/ImageField.stories.tsx +2 -2
  384. package/src/fields/ImageField/index.tsx +6 -9
  385. package/src/fields/Input/Input.stories.tsx +2 -2
  386. package/src/fields/MentionInput/MentionInput.stories.tsx +2 -1
  387. package/src/fields/Progress/Progress.stories.tsx +2 -1
  388. package/src/fields/RadioGroup/RadioGroup.stories.tsx +2 -1
  389. package/src/fields/Signature/Signature.stories.tsx +2 -2
  390. package/src/fields/Stepper/Stepper.stories.tsx +2 -2
  391. package/src/fields/TextArea/TextArea.stories.tsx +2 -2
  392. package/src/fields/ToggleGroup/ToggleGroup.stories.tsx +2 -2
  393. package/src/fields/nativeDateTime/OsDateTimeSheet.presentation.spec.tsx +6 -5
  394. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +24 -12
  395. package/src/index.ts +10 -2
  396. package/src/shared/colorRamps.ts +1 -11
  397. package/src/standardActions.ts +96 -0
  398. package/types/AdaptivePopup/index.d.ts +13 -1
  399. package/types/AdaptivePopup/index.d.ts.map +1 -1
  400. package/types/Button/glass.d.ts +15 -0
  401. package/types/Button/glass.d.ts.map +1 -0
  402. package/types/Button/glass.native.d.ts +11 -0
  403. package/types/Button/glass.native.d.ts.map +1 -0
  404. package/types/Button/index.d.ts +45 -1
  405. package/types/Button/index.d.ts.map +1 -1
  406. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  407. package/types/DescriptionList/index.d.ts.map +1 -1
  408. package/types/fields/Barcode/BarcodeScanner.d.ts.map +1 -1
  409. package/types/fields/Barcode/BarcodeScanner.native.d.ts.map +1 -1
  410. package/types/fields/FileUpload/index.d.ts.map +1 -1
  411. package/types/fields/Geolocation/index.d.ts.map +1 -1
  412. package/types/fields/ImageField/index.d.ts.map +1 -1
  413. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -1
  414. package/types/index.d.ts +4 -2
  415. package/types/index.d.ts.map +1 -1
  416. package/types/shared/colorRamps.d.ts +1 -11
  417. package/types/shared/colorRamps.d.ts.map +1 -1
  418. package/types/standardActions.d.ts +24 -0
  419. package/types/standardActions.d.ts.map +1 -0
@@ -5,7 +5,8 @@ import type { DeepKeys, DeepValue } from "@tanstack/form-core";
5
5
  import { type DragEvent, type ReactNode, useCallback, useEffect, useRef, useState } from "react";
6
6
  import { useMedia, useProps, type SizeTokens } from "tamagui";
7
7
  import { Image, isWeb, Text, XStack, YStack, styled } from "tamagui";
8
- import { Button } from "../../Button";
8
+ import { Button, IconButton } from "../../Button";
9
+ import { standardActions } from "../../standardActions";
9
10
  import { Field, FieldLayout } from "../../fieldLayout";
10
11
  import { Skeleton } from "../../Skeleton";
11
12
  import {
@@ -756,25 +757,16 @@ export function FileUpload<
756
757
  const existingName = existing?.name || fileNameFromSrc(existing?.src ?? "");
757
758
  const hasRows = selectedFiles.length > 0 || transfers.length > 0 || showExisting;
758
759
 
759
- const renderRemoveDisc = (ariaLabel: string, onPress: () => void) =>
760
+ // LC-176 ICON-BUTTON: a row's remove is a bare ✕; on an image tile it
761
+ // floats over the picture on the media plate. Painted at nestedControl with
762
+ // hitSlop restoring the 44 floor via `nested` (held exception).
763
+ const renderRemoveDisc = (ariaLabel: string, onPress: () => void, overMedia = false) =>
760
764
  canInteract ? (
761
765
  <Button
762
- // Bento remove: a filled $color12 disc with the inverse
763
- // ✕ — painted at nestedControl (32) with hitSlop
764
- // restoring the 44 floor via `nested` (held exception);
765
- // the nested icon step lands the board's 14px ✕.
766
766
  nested
767
- circular
767
+ {...(overMedia ? { plate: "media" as const } : undefined)}
768
768
  icon={XIcon}
769
769
  aria-label={ariaLabel}
770
- backgroundColor={formDropzoneColors.removeDisc.background.base}
771
- color={formDropzoneColors.removeDisc.ink}
772
- hoverStyle={{
773
- backgroundColor: formDropzoneColors.removeDisc.background.hover,
774
- }}
775
- pressStyle={{
776
- backgroundColor: formDropzoneColors.removeDisc.background.press,
777
- }}
778
770
  onPress={(e) => {
779
771
  e.stopPropagation();
780
772
  onPress();
@@ -782,6 +774,61 @@ export function FileUpload<
782
774
  />
783
775
  ) : null;
784
776
 
777
+ // LC-260 ICONS-OVER-WORDS: the preview's Replace and Remove are their
778
+ // symbols; over an image they float at its top-right on the LC-176 media
779
+ // plate. While replacing, the one ✕ backs out of the source choices.
780
+ const previewActions = (overMedia: boolean, onValueChange?: (nextValue: TData) => void) => {
781
+ const plate = overMedia ? { plate: "media" as const } : undefined;
782
+ const stop = (event: { stopPropagation: () => void }) => event.stopPropagation();
783
+ if (replacing)
784
+ return (
785
+ <IconButton
786
+ {...plate}
787
+ icon={standardActions.cancel.icon}
788
+ aria-label={t("Cancel replacement")}
789
+ aria-expanded
790
+ onPress={(event) => {
791
+ stop(event);
792
+ transfersRef.current.forEach((item) => item.controller.abort());
793
+ setTransfersAndRef(() => []);
794
+ if (fileInputRef.current) fileInputRef.current.value = "";
795
+ if (isWeb)
796
+ replaceRef.current?.querySelector<HTMLElement>('button, [role="button"]')?.focus();
797
+ setReplacing(false);
798
+ }}
799
+ />
800
+ );
801
+ return (
802
+ <>
803
+ <IconButton
804
+ {...plate}
805
+ icon={standardActions.replace.icon}
806
+ aria-label={t("Replace")}
807
+ aria-expanded={false}
808
+ onPress={(event) => {
809
+ stop(event);
810
+ setReplacing(true);
811
+ }}
812
+ />
813
+ {singleFile || onExistingRemove ? (
814
+ <IconButton
815
+ {...plate}
816
+ icon={standardActions.remove.icon}
817
+ aria-label={t("Remove {{name}}", { name: singleFile?.name ?? existingName })}
818
+ onPress={(event) => {
819
+ stop(event);
820
+ transfersRef.current.forEach((item) => item.controller.abort());
821
+ setTransfersAndRef(() => []);
822
+ if (singleFile) handleFileRemove(singleFile, onValueChange);
823
+ else onExistingRemove?.();
824
+ setReplacing(false);
825
+ }}
826
+ />
827
+ ) : null}
828
+ </>
829
+ );
830
+ };
831
+
785
832
  const renderFileMeta = (file: File, preview: string | null, extra?: ReactNode) => (
786
833
  <XStack flex={1} gap="$2" alignItems="center">
787
834
  {preview ? (
@@ -846,8 +893,10 @@ export function FileUpload<
846
893
  right={tileRemoveInset}
847
894
  zIndex={1}
848
895
  >
849
- {renderRemoveDisc(t("Remove {{name}}", { name: file.name }), () =>
850
- handleFileRemove(file, onValueChange),
896
+ {renderRemoveDisc(
897
+ t("Remove {{name}}", { name: file.name }),
898
+ () => handleFileRemove(file, onValueChange),
899
+ true,
851
900
  )}
852
901
  </YStack>
853
902
  ) : null}
@@ -1016,22 +1065,37 @@ export function FileUpload<
1016
1065
  width="100%"
1017
1066
  >
1018
1067
  {singlePreview ? (
1019
- <Image
1020
- src={singlePreview}
1021
- alt={singleFile?.name ?? existingName}
1022
- width="$14"
1023
- height="$14"
1024
- maxWidth="100%"
1025
- objectFit="contain"
1026
- onLoad={(event) => {
1027
- if (!isWeb) return;
1028
- const image = event.currentTarget as unknown as HTMLImageElement;
1029
- setPixelated(image.naturalWidth > 0 && image.naturalWidth < image.width);
1030
- }}
1031
- {...(isWeb && pixelated
1032
- ? { style: { imageRendering: "pixelated" } as any }
1033
- : {})}
1034
- />
1068
+ <YStack position="relative" maxWidth="100%">
1069
+ <Image
1070
+ src={singlePreview}
1071
+ alt={singleFile?.name ?? existingName}
1072
+ width="$14"
1073
+ height="$14"
1074
+ maxWidth="100%"
1075
+ objectFit="contain"
1076
+ onLoad={(event) => {
1077
+ if (!isWeb) return;
1078
+ const image = event.currentTarget as unknown as HTMLImageElement;
1079
+ setPixelated(image.naturalWidth > 0 && image.naturalWidth < image.width);
1080
+ }}
1081
+ {...(isWeb && pixelated
1082
+ ? { style: { imageRendering: "pixelated" } as any }
1083
+ : {})}
1084
+ />
1085
+ {canInteract ? (
1086
+ <XStack
1087
+ ref={replaceRef as any}
1088
+ data-file-upload="preview-actions"
1089
+ position="absolute"
1090
+ top={-tileRemoveInset}
1091
+ right={-tileRemoveInset}
1092
+ zIndex={1}
1093
+ {...knobProps.gap}
1094
+ >
1095
+ {previewActions(true, onValueChange)}
1096
+ </XStack>
1097
+ ) : null}
1098
+ </YStack>
1035
1099
  ) : (
1036
1100
  <YStack alignItems="center" {...knobProps.gap}>
1037
1101
  <FileIcon size={rowGlyphSize} />
@@ -1041,50 +1105,9 @@ export function FileUpload<
1041
1105
  </YStack>
1042
1106
  )}
1043
1107
  </YStack>
1044
- {canInteract ? (
1045
- <XStack
1046
- ref={replaceRef as any}
1047
- {...knobProps.gap}
1048
- justifyContent="center"
1049
- flexWrap="wrap"
1050
- >
1051
- <Button
1052
- size={knobProps.sizeToken}
1053
- aria-label={replacing ? t("Cancel replacement") : t("Replace")}
1054
- aria-expanded={replacing}
1055
- onPress={(event) => {
1056
- event.stopPropagation();
1057
- if (replacing) {
1058
- transfersRef.current.forEach((item) => item.controller.abort());
1059
- setTransfersAndRef(() => []);
1060
- if (fileInputRef.current) fileInputRef.current.value = "";
1061
- if (isWeb)
1062
- replaceRef.current
1063
- ?.querySelector<HTMLElement>('button, [role="button"]')
1064
- ?.focus();
1065
- }
1066
- setReplacing(!replacing);
1067
- }}
1068
- >
1069
- {replacing ? t("Cancel") : t("Replace")}
1070
- </Button>
1071
- {singleFile || onExistingRemove ? (
1072
- <Button
1073
- size={knobProps.sizeToken}
1074
- outlined
1075
- aria-label={t("Remove {{name}}", { name: singleFile?.name ?? existingName })}
1076
- onPress={(event) => {
1077
- event.stopPropagation();
1078
- transfersRef.current.forEach((item) => item.controller.abort());
1079
- setTransfersAndRef(() => []);
1080
- if (singleFile) handleFileRemove(singleFile, onValueChange);
1081
- else onExistingRemove?.();
1082
- setReplacing(false);
1083
- }}
1084
- >
1085
- {t("Remove")}
1086
- </Button>
1087
- ) : null}
1108
+ {canInteract && !singlePreview ? (
1109
+ <XStack ref={replaceRef as any} {...knobProps.gap} justifyContent="center">
1110
+ {previewActions(false, onValueChange)}
1088
1111
  </XStack>
1089
1112
  ) : null}
1090
1113
  </YStack>
@@ -1175,6 +1198,7 @@ export function FileUpload<
1175
1198
  {renderRemoveDisc(
1176
1199
  t("Remove {{name}}", { name: existingName }),
1177
1200
  onExistingRemove,
1201
+ true,
1178
1202
  )}
1179
1203
  </YStack>
1180
1204
  ) : null}
@@ -15,7 +15,8 @@ import { useCallback, useEffect, useId, useRef, useState } from "react";
15
15
  import type { LabelProps, SizeTokens } from "tamagui";
16
16
  import { ScrollView, Spinner, Text as TamaguiText, View, XStack, YStack, isWeb } from "tamagui";
17
17
  import { AdaptivePopup } from "../../AdaptivePopup";
18
- import { Button } from "../../Button";
18
+ import { Button, IconButton } from "../../Button";
19
+ import { standardActions } from "../../standardActions";
19
20
  import { Field, FieldLayout } from "../../fieldLayout";
20
21
  import { FloatingPanel, useViewportGtSm } from "../../FloatingPanel";
21
22
  import { Input as InputParts } from "../../InputParts";
@@ -699,12 +700,16 @@ function GeoMapSurface({
699
700
  {locateError}
700
701
  </TamaguiText>
701
702
  <XStack gap="$2">
702
- <Button size="$2" onPress={onRetryLocate} aria-label={t("Retry location")}>
703
- {t("Retry")}
704
- </Button>
705
- <Button size="$2" onPress={onCloseLocate} aria-label={t("Close location")}>
706
- {t("Close")}
707
- </Button>
703
+ <IconButton
704
+ icon={standardActions.retry.icon}
705
+ onPress={onRetryLocate}
706
+ aria-label={t("Retry location")}
707
+ />
708
+ <IconButton
709
+ icon={standardActions.close.icon}
710
+ onPress={onCloseLocate}
711
+ aria-label={t("Close location")}
712
+ />
708
713
  </XStack>
709
714
  </YStack>
710
715
  ) : null}
@@ -106,7 +106,7 @@ describe("ImageField", () => {
106
106
  if (img) fireEvent.error(img);
107
107
  });
108
108
  expect(result.findTextElement("Image failed to load")).toBeDefined();
109
- expect(result.findTextElement("Remove")).toBeDefined();
109
+ expect(result.container.querySelector('[aria-label="Remove image"]')).toBeTruthy();
110
110
  });
111
111
 
112
112
  it("clears the value from the Remove action", async () => {
@@ -121,7 +121,7 @@ describe("ImageField", () => {
121
121
  imageHeight={96}
122
122
  />,
123
123
  );
124
- const remove = result.findTextElement("Remove");
124
+ const remove = result.container.querySelector('[aria-label="Remove image"]');
125
125
  expect(remove).toBeDefined();
126
126
  await act(async () => {
127
127
  if (remove) fireEvent.click(remove);
@@ -197,8 +197,8 @@ describe("ImageField", () => {
197
197
  );
198
198
  const tile = mediaTile(result.container);
199
199
  expect(tile).not.toBeNull();
200
- expect(tile?.textContent ?? "").not.toMatch(/Remove/);
201
- expect(result.findTextElement("Remove")).toBeDefined();
200
+ expect(tile?.querySelector('[aria-label="Remove image"]')).toBeNull();
201
+ expect(result.container.querySelector('[aria-label="Remove image"]')).toBeTruthy();
202
202
  });
203
203
 
204
204
  it("rides the unclamped radius knob including full", () => {
@@ -231,7 +231,7 @@ describe("ImageField", () => {
231
231
  </TableCellContext.Provider>,
232
232
  );
233
233
  expect(mediaTile(result.container)).not.toBeNull();
234
- expect(result.findTextElement("Remove")).toBeFalsy();
234
+ expect(result.container.querySelector('[aria-label="Remove image"]')).toBeFalsy();
235
235
  });
236
236
  });
237
237
  });
@@ -4,9 +4,9 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
6
  import { YStack, XStack } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { ImageField } from "./index";
9
+ import { ActionButton } from "@multiplatform.one/components";
10
10
 
11
11
  const ATTACHED = `data:image/svg+xml;utf8,${encodeURIComponent(
12
12
  '<svg xmlns="http://www.w3.org/2000/svg" width="240" height="120"><rect width="240" height="120" fill="#4a90d9"/><circle cx="120" cy="60" r="36" fill="#fff"/></svg>',
@@ -77,7 +77,7 @@ export const Main: Story = {
77
77
  objectFit: "contain",
78
78
  } as any)}
79
79
  />
80
- <Button action="submit">Submit</Button>
80
+ <ActionButton kind="submit" formAction="submit" />
81
81
  </YStack>
82
82
  </Form>
83
83
  );
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { edgeColorAt, transitionProps, Text } from "@multiplatform.one/theme";
13
- import { ImageSquareIcon, XIcon } from "@phosphor-icons/react";
13
+ import { ImageSquareIcon } from "@phosphor-icons/react";
14
14
  import {
15
15
  ensureFocusVisibleRing,
16
16
  ensureKeyboardModalityTracking,
@@ -22,7 +22,8 @@ import type { DragEvent, ReactNode } from "react";
22
22
  import { useCallback, useEffect, useRef, useState } from "react";
23
23
  import type { LabelProps, SizeTokens } from "tamagui";
24
24
  import { Image, Text as TamaguiText, View, YStack, isWeb, styled } from "tamagui";
25
- import { Button } from "../../Button";
25
+ import { IconButton } from "../../Button";
26
+ import { standardActions } from "../../standardActions";
26
27
  import { Field, FieldLayout, useFieldA11y, useFieldDescribedBy } from "../../fieldLayout";
27
28
  import { Skeleton } from "../../Skeleton";
28
29
  import { t } from "../../shared/t";
@@ -422,15 +423,11 @@ function ImageControl({
422
423
  </ImageFrame>
423
424
 
424
425
  {showRemove && hasValue && canInteract && !inTableCell && (
425
- <Button
426
- chromeless
427
- size="$2"
428
- icon={XIcon}
426
+ <IconButton
427
+ icon={standardActions.remove.icon}
429
428
  aria-label={t("Remove image")}
430
429
  onPress={() => handleRemove()}
431
- >
432
- {t("Remove")}
433
- </Button>
430
+ />
434
431
  )}
435
432
  </YStack>
436
433
  );
@@ -5,11 +5,11 @@ import { MagnifyingGlassIcon, XIcon } from "@phosphor-icons/react";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
7
  import { Input as TamaguiInput, XStack, YStack } from "tamagui";
8
- import { Button } from "../../Button";
9
8
  import { Form } from "../../Form";
10
9
  import { SearchInput } from "../SearchInput";
11
10
  import { Input } from "./index";
12
11
  import { Paragraph } from "@multiplatform.one/theme";
12
+ import { ActionButton } from "@multiplatform.one/components";
13
13
 
14
14
  const meta: Meta<typeof Input> = {
15
15
  title: "Forms/Input",
@@ -64,7 +64,7 @@ export const Main: Story = {
64
64
  },
65
65
  }}
66
66
  />
67
- <Button action="submit">Submit</Button>
67
+ <ActionButton kind="submit" formAction="submit" />
68
68
  </YStack>
69
69
  </Form>
70
70
  );
@@ -8,6 +8,7 @@ import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { MentionInput } from "./index";
10
10
  import type { MentionConfig } from "./index";
11
+ import { ActionButton } from "@multiplatform.one/components";
11
12
 
12
13
  const meta: Meta<typeof MentionInput> = {
13
14
  title: "Forms/MentionInput",
@@ -120,7 +121,7 @@ export const Main: Story = {
120
121
  helperText="Write a message to your team"
121
122
  placeholder="Type @ to mention someone"
122
123
  />
123
- <Button action="submit">Submit</Button>
124
+ <ActionButton kind="submit" formAction="submit" />
124
125
  </YStack>
125
126
  </Form>
126
127
  );
@@ -8,6 +8,7 @@ import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { Progress } from "./index";
10
10
  import { Paragraph } from "@multiplatform.one/theme";
11
+ import { ActionButton } from "@multiplatform.one/components";
11
12
 
12
13
  const meta: Meta<typeof Progress> = {
13
14
  title: "Forms/Progress",
@@ -59,7 +60,7 @@ export const Main: Story = {
59
60
  name="completion"
60
61
  helperText="Read from form state"
61
62
  />
62
- <Button action="submit">Submit</Button>
63
+ <ActionButton kind="submit" formAction="submit" />
63
64
  </YStack>
64
65
  </Form>
65
66
  );
@@ -12,6 +12,7 @@ import { Form } from "../../Form";
12
12
  import { Checkbox } from "../Checkbox";
13
13
  import { Switch } from "../Switch";
14
14
  import { RadioGroup } from "./index";
15
+ import { ActionButton } from "@multiplatform.one/components";
15
16
 
16
17
  const meta: Meta<typeof RadioGroup> = {
17
18
  title: "Forms/RadioGroup",
@@ -395,7 +396,7 @@ export const RowPressInSheet: Story = {
395
396
  return (
396
397
  <YStack gap="$3">
397
398
  <Text>{summary}</Text>
398
- <Button onPress={() => setOpen(true)}>Filter</Button>
399
+ <ActionButton kind="filter" onPress={() => setOpen(true)} />
399
400
  <AdaptivePopup open={open} onOpenChange={setOpen} title="Filter">
400
401
  <YStack gap="$4">
401
402
  <RadioGroup
@@ -5,10 +5,10 @@ import { EraserIcon } from "@phosphor-icons/react";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
7
  import { YStack } from "tamagui";
8
- import { Button } from "../../Button";
9
8
  import { Form } from "../../Form";
10
9
  import { Signature } from "./index";
11
10
  import { Text } from "@multiplatform.one/theme";
11
+ import { ActionButton } from "@multiplatform.one/components";
12
12
 
13
13
  const meta: Meta<typeof Signature> = {
14
14
  title: "Forms/Signature",
@@ -61,7 +61,7 @@ export const Main: Story = {
61
61
  required
62
62
  clearIcon={<EraserIcon size={16} />}
63
63
  />
64
- <Button action="submit">Submit</Button>
64
+ <ActionButton kind="submit" formAction="submit" />
65
65
  </YStack>
66
66
  </Form>
67
67
  );
@@ -5,10 +5,10 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
7
  import { YStack } from "tamagui";
8
- import { Button } from "../../Button";
9
8
  import { Form } from "../../Form";
10
9
  import { Stepper } from "./index";
11
10
  import { Paragraph } from "@multiplatform.one/theme";
11
+ import { ActionButton } from "@multiplatform.one/components";
12
12
 
13
13
  const meta: Meta<typeof Stepper> = {
14
14
  title: "Forms/Stepper",
@@ -60,7 +60,7 @@ export const Main: Story = {
60
60
  <Stepper label="Quantity" name="quantity" min={1} max={100} buttonPosition="both" />
61
61
  <Stepper label="Price" name="price" step={0.01} precision={2} min={0} />
62
62
  <Stepper label="Discount (%)" name="discount" min={0} max={50} step={5} />
63
- <Button action="submit">Submit</Button>
63
+ <ActionButton kind="submit" formAction="submit" />
64
64
  </YStack>
65
65
  </Form>
66
66
  );
@@ -4,10 +4,10 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
6
  import { TextArea as TamaguiTextArea, XStack, YStack } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { TextArea } from "./index";
10
9
  import { Paragraph } from "@multiplatform.one/theme";
10
+ import { ActionButton } from "@multiplatform.one/components";
11
11
 
12
12
  const meta: Meta<typeof TextArea> = {
13
13
  title: "Forms/TextArea",
@@ -82,7 +82,7 @@ export const Main: Story = {
82
82
  }}
83
83
  />
84
84
 
85
- <Button action="submit">Save</Button>
85
+ <ActionButton kind="save" formAction="submit" />
86
86
  </YStack>
87
87
  </Form>
88
88
  );
@@ -3,10 +3,10 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
3
3
  import { useForm } from "@tanstack/react-form";
4
4
  import { useState } from "react";
5
5
  import { ToggleGroup as TamaguiToggleGroup, XStack, YStack } from "tamagui";
6
- import { Button } from "../../Button";
7
6
  import { Form } from "../../Form";
8
7
  import { ToggleGroup } from "./index";
9
8
  import { Paragraph, SizableText, Text } from "@multiplatform.one/theme";
9
+ import { ActionButton } from "@multiplatform.one/components";
10
10
 
11
11
  const meta: Meta<typeof ToggleGroup> = {
12
12
  title: "Forms/ToggleGroup",
@@ -99,7 +99,7 @@ export const Main: Story = {
99
99
  { label: "Attachments", value: "attachments" },
100
100
  ]}
101
101
  />
102
- <Button action="submit">Submit</Button>
102
+ <ActionButton kind="submit" formAction="submit" />
103
103
  </YStack>
104
104
  </Form>
105
105
  );
@@ -70,10 +70,11 @@ const norm = (value: string) => value.replace(/\s+/gu, " ").trim();
70
70
  async function press(text: string) {
71
71
  let target: Element | null = null;
72
72
  await waitFor(() => {
73
- const node = Array.from(document.body.querySelectorAll("*")).find(
74
- (el) => el.children.length === 0 && norm(el.textContent ?? "") === norm(text),
75
- );
76
- if (!node) throw new Error(`no element with text "${text}"`);
73
+ const node =
74
+ Array.from(document.body.querySelectorAll("*")).find(
75
+ (el) => el.children.length === 0 && norm(el.textContent ?? "") === norm(text),
76
+ ) ?? document.body.querySelector(`[aria-label="${text}"]`);
77
+ if (!node) throw new Error(`no element with text or label "${text}"`);
77
78
  target = node.closest('button, [role="button"]') ?? node;
78
79
  });
79
80
  fireEvent.click(target!);
@@ -142,7 +143,7 @@ describe("OS date/time sheet — Android presentation", () => {
142
143
  open("date", new Date(2026, 2, 15));
143
144
  expect(lastPick().mode).toBe("date");
144
145
  expect(lastPick().display).toBe("default");
145
- expect(document.body.textContent).not.toContain("Done");
146
+ expect(document.querySelector('[aria-label="Done"]')).toBeNull();
146
147
  });
147
148
 
148
149
  it("a datetime advances from date to time after the first commit", async () => {
@@ -23,6 +23,9 @@ import { platform } from "@multiplatform.one/platform";
23
23
  import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
24
24
  import { useResolvedKnobs, Text } from "@multiplatform.one/theme";
25
25
  import { View, XStack, YStack, useTheme, useThemeName } from "tamagui";
26
+ import { ArrowRightIcon } from "@phosphor-icons/react";
27
+ import { IconButton } from "../../Button";
28
+ import { standardActions } from "../../standardActions";
26
29
  import { formCommonColors } from "../../shared/colorRamps";
27
30
  import { t } from "../../shared/t";
28
31
  import { type DateTimePickerEvent, loadDateTimePicker } from "./dateTimePickerLoader";
@@ -164,9 +167,11 @@ export function OsDateTimeSheet({
164
167
  <Text color={formCommonColors.muted}>
165
168
  {t("Date picker unavailable — requires @react-native-community/datetimepicker")}
166
169
  </Text>
167
- <Pressable onPress={onCancel} accessibilityRole="button">
168
- <Text color="$accentColor">{t("Cancel")}</Text>
169
- </Pressable>
170
+ <IconButton
171
+ icon={standardActions.cancel.icon}
172
+ aria-label={t(standardActions.cancel.label)}
173
+ onPress={onCancel}
174
+ />
170
175
  </YStack>
171
176
  </Pressable>
172
177
  </Modal>
@@ -209,17 +214,24 @@ export function OsDateTimeSheet({
209
214
  paddingBottom={dateSheetBottomPadding(keyboardInset, isIOS)}
210
215
  >
211
216
  <XStack justifyContent="space-between" {...knobProps.panelPadding}>
212
- <Pressable onPress={onCancel} accessibilityRole="button">
213
- <Text color={formCommonColors.text}>{t("Cancel")}</Text>
214
- </Pressable>
217
+ <IconButton
218
+ icon={standardActions.cancel.icon}
219
+ aria-label={t(standardActions.cancel.label)}
220
+ onPress={onCancel}
221
+ />
215
222
  {mode === "datetime" && !showTimePicker ? (
216
- <Pressable onPress={() => setShowTimePicker(true)} accessibilityRole="button">
217
- <Text color="$accentColor">{t("Next")}</Text>
218
- </Pressable>
223
+ <IconButton
224
+ icon={ArrowRightIcon}
225
+ aria-label={t("Next")}
226
+ onPress={() => setShowTimePicker(true)}
227
+ />
219
228
  ) : (
220
- <Pressable onPress={confirm} accessibilityRole="button">
221
- <Text color="$accentColor">{t("Done")}</Text>
222
- </Pressable>
229
+ <IconButton
230
+ icon={standardActions.done.icon}
231
+ plate="primary"
232
+ aria-label={t(standardActions.done.label)}
233
+ onPress={confirm}
234
+ />
223
235
  )}
224
236
  </XStack>
225
237
  <YStack {...knobProps.panelPadding} flexShrink={1} minHeight={0}>
package/src/index.ts CHANGED
@@ -112,8 +112,14 @@ export { formatActionLabel } from "./actionLabel";
112
112
  export type { ActionLabelParts } from "./actionLabel";
113
113
 
114
114
  // ── Core Primitives ──────────────────────────────────────────
115
- export { Button } from "./Button";
116
- export type { ButtonProps, ButtonActionRole } from "./Button";
115
+ export {
116
+ Button,
117
+ IconButton,
118
+ ICON_BUTTON_GLYPH_PX,
119
+ ICON_BUTTON_NEUTRAL_GLYPH_PX,
120
+ ICON_BUTTON_PRESS_OPACITY,
121
+ } from "./Button";
122
+ export type { ButtonProps, ButtonActionRole, IconButtonProps } from "./Button";
117
123
 
118
124
  export { Input } from "./fields/Input";
119
125
  export type { InputProps } from "./fields/Input";
@@ -460,3 +466,5 @@ export type {
460
466
  PickedMedia,
461
467
  MediaPickerErrorCode,
462
468
  } from "./MediaPicker/types";
469
+ export { standardActions, standardActionWords } from "./standardActions";
470
+ export type { StandardAction, StandardActionKind } from "./standardActions";