@multiplatform.one/forms 7.66.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 (527) hide show
  1. package/dist/cjs/AdaptivePopup/index.cjs +45 -5
  2. package/dist/cjs/AdaptivePopup/index.native.js +47 -5
  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 +156 -27
  9. package/dist/cjs/Button/index.native.js.map +1 -1
  10. package/dist/cjs/ContextualSaveBar/index.cjs +6 -8
  11. package/dist/cjs/ContextualSaveBar/index.native.js +6 -8
  12. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  13. package/dist/cjs/DescriptionList/index.cjs +0 -1
  14. package/dist/cjs/DescriptionList/index.native.js +0 -1
  15. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  16. package/dist/cjs/FloatingPanel/RegularPanel.cjs +164 -0
  17. package/dist/cjs/FloatingPanel/RegularPanel.native.js +169 -0
  18. package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -0
  19. package/dist/cjs/FloatingPanel/compactFace.cjs +6 -0
  20. package/dist/cjs/FloatingPanel/compactFace.native.js +6 -0
  21. package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
  22. package/dist/cjs/FloatingPanel/containingBlock.cjs +46 -0
  23. package/dist/cjs/FloatingPanel/containingBlock.native.js +51 -0
  24. package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -0
  25. package/dist/cjs/FloatingPanel/index.cjs +2 -20
  26. package/dist/cjs/FloatingPanel/index.native.js +79 -45
  27. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  28. package/dist/cjs/FloatingPanel/pointAnchor.cjs +25 -0
  29. package/dist/cjs/FloatingPanel/pointAnchor.native.js +26 -0
  30. package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
  31. package/dist/cjs/FloatingPanel/regularPlacement.cjs +61 -0
  32. package/dist/cjs/FloatingPanel/regularPlacement.native.js +65 -0
  33. package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -0
  34. package/dist/cjs/fields/Barcode/BarcodeScanner.cjs +7 -8
  35. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +7 -8
  36. package/dist/cjs/fields/Barcode/BarcodeScanner.native.js.map +1 -1
  37. package/dist/cjs/fields/Combobox/index.cjs +1 -1
  38. package/dist/cjs/fields/Combobox/index.native.js +3 -1
  39. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  40. package/dist/cjs/fields/FileUpload/index.cjs +83 -60
  41. package/dist/cjs/fields/FileUpload/index.native.js +96 -73
  42. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  43. package/dist/cjs/fields/Geolocation/index.cjs +7 -8
  44. package/dist/cjs/fields/Geolocation/index.native.js +7 -8
  45. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  46. package/dist/cjs/fields/ImageField/index.cjs +4 -6
  47. package/dist/cjs/fields/ImageField/index.native.js +4 -6
  48. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  49. package/dist/cjs/fields/Input/index.cjs +5 -0
  50. package/dist/cjs/fields/Input/index.native.js +5 -0
  51. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  52. package/dist/cjs/fields/Select/InlineChoices.cjs +3 -2
  53. package/dist/cjs/fields/Select/InlineChoices.native.js +5 -2
  54. package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
  55. package/dist/cjs/fields/Select/SheetPickerRow.cjs +154 -0
  56. package/dist/cjs/fields/Select/SheetPickerRow.native.js +165 -0
  57. package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -0
  58. package/dist/cjs/fields/Select/index.cjs +63 -4
  59. package/dist/cjs/fields/Select/index.native.js +85 -26
  60. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  61. package/dist/cjs/fields/Select/shouldInlineChoices.cjs +14 -1
  62. package/dist/cjs/fields/Select/shouldInlineChoices.native.js +15 -1
  63. package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
  64. package/dist/cjs/fields/Slider/index.cjs +96 -4
  65. package/dist/cjs/fields/Slider/index.native.js +103 -5
  66. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  67. package/dist/cjs/fields/Switch/index.cjs +71 -1
  68. package/dist/cjs/fields/Switch/index.native.js +72 -1
  69. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  70. package/dist/cjs/fields/ToggleGroup/index.cjs +67 -1
  71. package/dist/cjs/fields/ToggleGroup/index.native.js +75 -1
  72. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  73. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +54 -47
  74. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +64 -49
  75. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  76. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.cjs +54 -0
  77. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
  78. package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  79. package/dist/cjs/index.cjs +19 -1
  80. package/dist/cjs/index.native.js +18 -0
  81. package/dist/cjs/index.native.js.map +1 -1
  82. package/dist/cjs/shared/colorRamps.cjs +0 -8
  83. package/dist/cjs/shared/colorRamps.native.js +0 -8
  84. package/dist/cjs/shared/colorRamps.native.js.map +1 -1
  85. package/dist/cjs/shared/overlaySizeClass.cjs +42 -0
  86. package/dist/cjs/shared/overlaySizeClass.native.js +45 -0
  87. package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -0
  88. package/dist/cjs/shared/sheetNavigation.cjs +76 -0
  89. package/dist/cjs/shared/sheetNavigation.native.js +129 -0
  90. package/dist/cjs/shared/sheetNavigation.native.js.map +1 -0
  91. package/dist/cjs/shared/systemControlModules.cjs +34 -0
  92. package/dist/cjs/shared/systemControlModules.gnome.cjs +34 -0
  93. package/dist/cjs/shared/systemControlModules.gnome.native.js +37 -0
  94. package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -0
  95. package/dist/cjs/shared/systemControlModules.native.js +77 -0
  96. package/dist/cjs/shared/systemControlModules.native.js.map +1 -0
  97. package/dist/cjs/shared/systemControls.cjs +47 -0
  98. package/dist/cjs/shared/systemControls.native.js +51 -0
  99. package/dist/cjs/shared/systemControls.native.js.map +1 -0
  100. package/dist/cjs/standardActions.cjs +117 -0
  101. package/dist/cjs/standardActions.native.js +120 -0
  102. package/dist/cjs/standardActions.native.js.map +1 -0
  103. package/dist/esm/AdaptivePopup/index.mjs +45 -5
  104. package/dist/esm/AdaptivePopup/index.mjs.map +1 -1
  105. package/dist/esm/AdaptivePopup/index.native.js +47 -5
  106. package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
  107. package/dist/esm/Button/glass.mjs +5 -0
  108. package/dist/esm/Button/glass.mjs.map +1 -0
  109. package/dist/esm/Button/glass.native.js +19 -0
  110. package/dist/esm/Button/glass.native.js.map +1 -0
  111. package/dist/esm/Button/index.mjs +153 -28
  112. package/dist/esm/Button/index.mjs.map +1 -1
  113. package/dist/esm/Button/index.native.js +153 -28
  114. package/dist/esm/Button/index.native.js.map +1 -1
  115. package/dist/esm/ContextualSaveBar/index.mjs +7 -9
  116. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  117. package/dist/esm/ContextualSaveBar/index.native.js +7 -9
  118. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  119. package/dist/esm/DescriptionList/index.mjs +0 -1
  120. package/dist/esm/DescriptionList/index.mjs.map +1 -1
  121. package/dist/esm/DescriptionList/index.native.js +0 -1
  122. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  123. package/dist/esm/FloatingPanel/RegularPanel.mjs +139 -0
  124. package/dist/esm/FloatingPanel/RegularPanel.mjs.map +1 -0
  125. package/dist/esm/FloatingPanel/RegularPanel.native.js +141 -0
  126. package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -0
  127. package/dist/esm/FloatingPanel/compactFace.mjs +5 -1
  128. package/dist/esm/FloatingPanel/compactFace.mjs.map +1 -1
  129. package/dist/esm/FloatingPanel/compactFace.native.js +5 -1
  130. package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
  131. package/dist/esm/FloatingPanel/containingBlock.mjs +21 -0
  132. package/dist/esm/FloatingPanel/containingBlock.mjs.map +1 -0
  133. package/dist/esm/FloatingPanel/containingBlock.native.js +23 -0
  134. package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -0
  135. package/dist/esm/FloatingPanel/index.mjs +1 -19
  136. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  137. package/dist/esm/FloatingPanel/index.native.js +83 -49
  138. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  139. package/dist/esm/FloatingPanel/pointAnchor.mjs +25 -1
  140. package/dist/esm/FloatingPanel/pointAnchor.mjs.map +1 -1
  141. package/dist/esm/FloatingPanel/pointAnchor.native.js +26 -1
  142. package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
  143. package/dist/esm/FloatingPanel/regularPlacement.mjs +35 -0
  144. package/dist/esm/FloatingPanel/regularPlacement.mjs.map +1 -0
  145. package/dist/esm/FloatingPanel/regularPlacement.native.js +36 -0
  146. package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -0
  147. package/dist/esm/fields/Barcode/BarcodeScanner.mjs +8 -9
  148. package/dist/esm/fields/Barcode/BarcodeScanner.mjs.map +1 -1
  149. package/dist/esm/fields/Barcode/BarcodeScanner.native.js +8 -9
  150. package/dist/esm/fields/Barcode/BarcodeScanner.native.js.map +1 -1
  151. package/dist/esm/fields/Combobox/index.mjs +1 -1
  152. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  153. package/dist/esm/fields/Combobox/index.native.js +3 -1
  154. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  155. package/dist/esm/fields/FileUpload/index.mjs +84 -61
  156. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  157. package/dist/esm/fields/FileUpload/index.native.js +97 -74
  158. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  159. package/dist/esm/fields/Geolocation/index.mjs +8 -9
  160. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  161. package/dist/esm/fields/Geolocation/index.native.js +8 -9
  162. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  163. package/dist/esm/fields/ImageField/index.mjs +6 -8
  164. package/dist/esm/fields/ImageField/index.mjs.map +1 -1
  165. package/dist/esm/fields/ImageField/index.native.js +6 -8
  166. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  167. package/dist/esm/fields/Input/index.mjs +6 -1
  168. package/dist/esm/fields/Input/index.mjs.map +1 -1
  169. package/dist/esm/fields/Input/index.native.js +6 -1
  170. package/dist/esm/fields/Input/index.native.js.map +1 -1
  171. package/dist/esm/fields/Select/InlineChoices.mjs +3 -2
  172. package/dist/esm/fields/Select/InlineChoices.mjs.map +1 -1
  173. package/dist/esm/fields/Select/InlineChoices.native.js +5 -2
  174. package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
  175. package/dist/esm/fields/Select/SheetPickerRow.mjs +129 -0
  176. package/dist/esm/fields/Select/SheetPickerRow.mjs.map +1 -0
  177. package/dist/esm/fields/Select/SheetPickerRow.native.js +137 -0
  178. package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -0
  179. package/dist/esm/fields/Select/index.mjs +64 -5
  180. package/dist/esm/fields/Select/index.mjs.map +1 -1
  181. package/dist/esm/fields/Select/index.native.js +86 -27
  182. package/dist/esm/fields/Select/index.native.js.map +1 -1
  183. package/dist/esm/fields/Select/shouldInlineChoices.mjs +12 -1
  184. package/dist/esm/fields/Select/shouldInlineChoices.mjs.map +1 -1
  185. package/dist/esm/fields/Select/shouldInlineChoices.native.js +13 -1
  186. package/dist/esm/fields/Select/shouldInlineChoices.native.js.map +1 -1
  187. package/dist/esm/fields/Slider/index.mjs +96 -4
  188. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  189. package/dist/esm/fields/Slider/index.native.js +103 -5
  190. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  191. package/dist/esm/fields/Switch/index.mjs +71 -1
  192. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  193. package/dist/esm/fields/Switch/index.native.js +72 -1
  194. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  195. package/dist/esm/fields/ToggleGroup/index.mjs +67 -1
  196. package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
  197. package/dist/esm/fields/ToggleGroup/index.native.js +75 -1
  198. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  199. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +56 -49
  200. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  201. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +66 -51
  202. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  203. package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
  204. package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
  205. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js +21 -0
  206. package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  207. package/dist/esm/index.mjs +5 -2
  208. package/dist/esm/index.mjs.map +1 -1
  209. package/dist/esm/index.native.js +5 -2
  210. package/dist/esm/index.native.js.map +1 -1
  211. package/dist/esm/shared/colorRamps.mjs +0 -8
  212. package/dist/esm/shared/colorRamps.mjs.map +1 -1
  213. package/dist/esm/shared/colorRamps.native.js +0 -8
  214. package/dist/esm/shared/colorRamps.native.js.map +1 -1
  215. package/dist/esm/shared/overlaySizeClass.mjs +14 -0
  216. package/dist/esm/shared/overlaySizeClass.mjs.map +1 -0
  217. package/dist/esm/shared/overlaySizeClass.native.js +14 -0
  218. package/dist/esm/shared/overlaySizeClass.native.js.map +1 -0
  219. package/dist/esm/shared/sheetNavigation.mjs +47 -0
  220. package/dist/esm/shared/sheetNavigation.mjs.map +1 -0
  221. package/dist/esm/shared/sheetNavigation.native.js +97 -0
  222. package/dist/esm/shared/sheetNavigation.native.js.map +1 -0
  223. package/dist/esm/shared/systemControlModules.gnome.mjs +8 -0
  224. package/dist/esm/shared/systemControlModules.gnome.mjs.map +1 -0
  225. package/dist/esm/shared/systemControlModules.gnome.native.js +8 -0
  226. package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -0
  227. package/dist/esm/shared/systemControlModules.mjs +8 -0
  228. package/dist/esm/shared/systemControlModules.mjs.map +1 -0
  229. package/dist/esm/shared/systemControlModules.native.js +47 -0
  230. package/dist/esm/shared/systemControlModules.native.js.map +1 -0
  231. package/dist/esm/shared/systemControls.mjs +19 -0
  232. package/dist/esm/shared/systemControls.mjs.map +1 -0
  233. package/dist/esm/shared/systemControls.native.js +20 -0
  234. package/dist/esm/shared/systemControls.native.js.map +1 -0
  235. package/dist/esm/standardActions.mjs +91 -0
  236. package/dist/esm/standardActions.mjs.map +1 -0
  237. package/dist/esm/standardActions.native.js +91 -0
  238. package/dist/esm/standardActions.native.js.map +1 -0
  239. package/dist/jsx/AdaptivePopup/index.mjs +45 -5
  240. package/dist/jsx/AdaptivePopup/index.mjs.map +1 -1
  241. package/dist/jsx/AdaptivePopup/index.native.js +47 -5
  242. package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
  243. package/dist/jsx/Button/glass.mjs +5 -0
  244. package/dist/jsx/Button/glass.mjs.map +1 -0
  245. package/dist/jsx/Button/glass.native.js +47 -0
  246. package/dist/jsx/Button/glass.native.js.map +1 -0
  247. package/dist/jsx/Button/index.mjs +153 -28
  248. package/dist/jsx/Button/index.mjs.map +1 -1
  249. package/dist/jsx/Button/index.native.js +156 -27
  250. package/dist/jsx/Button/index.native.js.map +1 -1
  251. package/dist/jsx/ContextualSaveBar/index.mjs +7 -9
  252. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  253. package/dist/jsx/ContextualSaveBar/index.native.js +6 -8
  254. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  255. package/dist/jsx/DescriptionList/index.mjs +0 -1
  256. package/dist/jsx/DescriptionList/index.mjs.map +1 -1
  257. package/dist/jsx/DescriptionList/index.native.js +0 -1
  258. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  259. package/dist/jsx/FloatingPanel/RegularPanel.mjs +139 -0
  260. package/dist/jsx/FloatingPanel/RegularPanel.mjs.map +1 -0
  261. package/dist/jsx/FloatingPanel/RegularPanel.native.js +169 -0
  262. package/dist/jsx/FloatingPanel/RegularPanel.native.js.map +1 -0
  263. package/dist/jsx/FloatingPanel/compactFace.mjs +5 -1
  264. package/dist/jsx/FloatingPanel/compactFace.mjs.map +1 -1
  265. package/dist/jsx/FloatingPanel/compactFace.native.js +6 -0
  266. package/dist/jsx/FloatingPanel/compactFace.native.js.map +1 -1
  267. package/dist/jsx/FloatingPanel/containingBlock.mjs +21 -0
  268. package/dist/jsx/FloatingPanel/containingBlock.mjs.map +1 -0
  269. package/dist/jsx/FloatingPanel/containingBlock.native.js +51 -0
  270. package/dist/jsx/FloatingPanel/containingBlock.native.js.map +1 -0
  271. package/dist/jsx/FloatingPanel/index.mjs +1 -19
  272. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  273. package/dist/jsx/FloatingPanel/index.native.js +79 -45
  274. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  275. package/dist/jsx/FloatingPanel/pointAnchor.mjs +25 -1
  276. package/dist/jsx/FloatingPanel/pointAnchor.mjs.map +1 -1
  277. package/dist/jsx/FloatingPanel/pointAnchor.native.js +26 -0
  278. package/dist/jsx/FloatingPanel/pointAnchor.native.js.map +1 -1
  279. package/dist/jsx/FloatingPanel/regularPlacement.mjs +35 -0
  280. package/dist/jsx/FloatingPanel/regularPlacement.mjs.map +1 -0
  281. package/dist/jsx/FloatingPanel/regularPlacement.native.js +65 -0
  282. package/dist/jsx/FloatingPanel/regularPlacement.native.js.map +1 -0
  283. package/dist/jsx/fields/Barcode/BarcodeScanner.mjs +8 -9
  284. package/dist/jsx/fields/Barcode/BarcodeScanner.mjs.map +1 -1
  285. package/dist/jsx/fields/Barcode/BarcodeScanner.native.js +7 -8
  286. package/dist/jsx/fields/Barcode/BarcodeScanner.native.js.map +1 -1
  287. package/dist/jsx/fields/Combobox/index.mjs +1 -1
  288. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  289. package/dist/jsx/fields/Combobox/index.native.js +3 -1
  290. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  291. package/dist/jsx/fields/FileUpload/index.mjs +84 -61
  292. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  293. package/dist/jsx/fields/FileUpload/index.native.js +96 -73
  294. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  295. package/dist/jsx/fields/Geolocation/index.mjs +8 -9
  296. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  297. package/dist/jsx/fields/Geolocation/index.native.js +7 -8
  298. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  299. package/dist/jsx/fields/ImageField/index.mjs +6 -8
  300. package/dist/jsx/fields/ImageField/index.mjs.map +1 -1
  301. package/dist/jsx/fields/ImageField/index.native.js +4 -6
  302. package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
  303. package/dist/jsx/fields/Input/index.mjs +6 -1
  304. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  305. package/dist/jsx/fields/Input/index.native.js +5 -0
  306. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  307. package/dist/jsx/fields/Select/InlineChoices.mjs +3 -2
  308. package/dist/jsx/fields/Select/InlineChoices.mjs.map +1 -1
  309. package/dist/jsx/fields/Select/InlineChoices.native.js +5 -2
  310. package/dist/jsx/fields/Select/InlineChoices.native.js.map +1 -1
  311. package/dist/jsx/fields/Select/SheetPickerRow.mjs +129 -0
  312. package/dist/jsx/fields/Select/SheetPickerRow.mjs.map +1 -0
  313. package/dist/jsx/fields/Select/SheetPickerRow.native.js +165 -0
  314. package/dist/jsx/fields/Select/SheetPickerRow.native.js.map +1 -0
  315. package/dist/jsx/fields/Select/index.mjs +64 -5
  316. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  317. package/dist/jsx/fields/Select/index.native.js +85 -26
  318. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  319. package/dist/jsx/fields/Select/shouldInlineChoices.mjs +12 -1
  320. package/dist/jsx/fields/Select/shouldInlineChoices.mjs.map +1 -1
  321. package/dist/jsx/fields/Select/shouldInlineChoices.native.js +15 -1
  322. package/dist/jsx/fields/Select/shouldInlineChoices.native.js.map +1 -1
  323. package/dist/jsx/fields/Slider/index.mjs +96 -4
  324. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  325. package/dist/jsx/fields/Slider/index.native.js +103 -5
  326. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  327. package/dist/jsx/fields/Switch/index.mjs +71 -1
  328. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  329. package/dist/jsx/fields/Switch/index.native.js +72 -1
  330. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  331. package/dist/jsx/fields/ToggleGroup/index.mjs +67 -1
  332. package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
  333. package/dist/jsx/fields/ToggleGroup/index.native.js +75 -1
  334. package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
  335. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +56 -49
  336. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  337. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +64 -49
  338. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  339. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs +21 -0
  340. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -0
  341. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js +57 -0
  342. package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -0
  343. package/dist/jsx/index.js +5 -2
  344. package/dist/jsx/index.js.map +1 -1
  345. package/dist/jsx/index.mjs +5 -2
  346. package/dist/jsx/index.mjs.map +1 -1
  347. package/dist/jsx/index.native.js +18 -0
  348. package/dist/jsx/index.native.js.map +1 -1
  349. package/dist/jsx/shared/colorRamps.mjs +0 -8
  350. package/dist/jsx/shared/colorRamps.mjs.map +1 -1
  351. package/dist/jsx/shared/colorRamps.native.js +0 -8
  352. package/dist/jsx/shared/colorRamps.native.js.map +1 -1
  353. package/dist/jsx/shared/overlaySizeClass.mjs +14 -0
  354. package/dist/jsx/shared/overlaySizeClass.mjs.map +1 -0
  355. package/dist/jsx/shared/overlaySizeClass.native.js +45 -0
  356. package/dist/jsx/shared/overlaySizeClass.native.js.map +1 -0
  357. package/dist/jsx/shared/sheetNavigation.mjs +47 -0
  358. package/dist/jsx/shared/sheetNavigation.mjs.map +1 -0
  359. package/dist/jsx/shared/sheetNavigation.native.js +129 -0
  360. package/dist/jsx/shared/sheetNavigation.native.js.map +1 -0
  361. package/dist/jsx/shared/systemControlModules.gnome.mjs +8 -0
  362. package/dist/jsx/shared/systemControlModules.gnome.mjs.map +1 -0
  363. package/dist/jsx/shared/systemControlModules.gnome.native.js +37 -0
  364. package/dist/jsx/shared/systemControlModules.gnome.native.js.map +1 -0
  365. package/dist/jsx/shared/systemControlModules.mjs +8 -0
  366. package/dist/jsx/shared/systemControlModules.mjs.map +1 -0
  367. package/dist/jsx/shared/systemControlModules.native.js +77 -0
  368. package/dist/jsx/shared/systemControlModules.native.js.map +1 -0
  369. package/dist/jsx/shared/systemControls.mjs +19 -0
  370. package/dist/jsx/shared/systemControls.mjs.map +1 -0
  371. package/dist/jsx/shared/systemControls.native.js +51 -0
  372. package/dist/jsx/shared/systemControls.native.js.map +1 -0
  373. package/dist/jsx/standardActions.mjs +91 -0
  374. package/dist/jsx/standardActions.mjs.map +1 -0
  375. package/dist/jsx/standardActions.native.js +120 -0
  376. package/dist/jsx/standardActions.native.js.map +1 -0
  377. package/package.json +20 -8
  378. package/src/AdaptivePopup/AdaptivePopup.spec.tsx +44 -0
  379. package/src/AdaptivePopup/AdaptivePopup.stories.tsx +12 -32
  380. package/src/AdaptivePopup/index.tsx +65 -13
  381. package/src/Button/Button.disabledGlyph.spec.tsx +111 -0
  382. package/src/Button/Button.iconButton.spec.tsx +279 -0
  383. package/src/Button/Button.stories.tsx +59 -3
  384. package/src/Button/glass.native.ts +38 -0
  385. package/src/Button/glass.ts +18 -0
  386. package/src/Button/index.tsx +272 -40
  387. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +3 -1
  388. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +2 -2
  389. package/src/ContextualSaveBar/index.tsx +7 -10
  390. package/src/ControlGroup/ControlGroup.stories.tsx +3 -2
  391. package/src/DescriptionList/index.tsx +0 -1
  392. package/src/ErrorSummary.stories.tsx +2 -1
  393. package/src/FieldLayout.stories.tsx +3 -2
  394. package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +73 -3
  395. package/src/FloatingPanel/FloatingPanel.regularWidth.native.spec.tsx +193 -0
  396. package/src/FloatingPanel/FloatingPanel.stories.tsx +6 -10
  397. package/src/FloatingPanel/RegularPanel.tsx +159 -0
  398. package/src/FloatingPanel/compactFace.spec.ts +24 -1
  399. package/src/FloatingPanel/compactFace.ts +16 -0
  400. package/src/FloatingPanel/containingBlock.ts +32 -0
  401. package/src/FloatingPanel/index.native.tsx +80 -35
  402. package/src/FloatingPanel/index.tsx +1 -33
  403. package/src/FloatingPanel/pointAnchor.spec.ts +29 -0
  404. package/src/FloatingPanel/pointAnchor.ts +30 -0
  405. package/src/FloatingPanel/regularPlacement.spec.ts +65 -0
  406. package/src/FloatingPanel/regularPlacement.ts +40 -0
  407. package/src/Form/Form.stories.tsx +6 -5
  408. package/src/errorSummaryStories.spec.tsx +4 -4
  409. package/src/fields/Barcode/BarcodeScanner.native.tsx +10 -9
  410. package/src/fields/Barcode/BarcodeScanner.tsx +10 -9
  411. package/src/fields/Checkbox/Checkbox.stories.tsx +3 -3
  412. package/src/fields/Checkbox/CheckboxGroup.stories.tsx +2 -2
  413. package/src/fields/ColorPicker/ColorPicker.stories.tsx +2 -2
  414. package/src/fields/Combobox/Combobox.regularWidth.native.spec.tsx +94 -0
  415. package/src/fields/Combobox/Combobox.stories.tsx +2 -2
  416. package/src/fields/Combobox/index.tsx +3 -1
  417. package/src/fields/DatePicker/DatePicker.stories.tsx +2 -1
  418. package/src/fields/DatePicker/DateRangePicker.stories.tsx +2 -2
  419. package/src/fields/DatePicker/DatetimePicker.stories.tsx +2 -1
  420. package/src/fields/DatePicker/MonthPicker.stories.tsx +2 -2
  421. package/src/fields/DatePicker/MultiDatePicker.stories.tsx +2 -2
  422. package/src/fields/FileUpload/FileUpload.spec.tsx +11 -6
  423. package/src/fields/FileUpload/FileUpload.stories.tsx +2 -2
  424. package/src/fields/FileUpload/index.tsx +101 -77
  425. package/src/fields/Geolocation/index.tsx +12 -7
  426. package/src/fields/ImageField/ImageField.spec.tsx +5 -5
  427. package/src/fields/ImageField/ImageField.stories.tsx +2 -2
  428. package/src/fields/ImageField/index.tsx +6 -9
  429. package/src/fields/Input/Input.formName.spec.tsx +53 -0
  430. package/src/fields/Input/Input.stories.tsx +2 -2
  431. package/src/fields/Input/index.tsx +6 -1
  432. package/src/fields/MentionInput/MentionInput.stories.tsx +2 -1
  433. package/src/fields/Progress/Progress.stories.tsx +2 -1
  434. package/src/fields/RadioGroup/RadioGroup.stories.tsx +2 -1
  435. package/src/fields/Select/InlineChoices.tsx +6 -3
  436. package/src/fields/Select/SheetPickerRow.tsx +160 -0
  437. package/src/fields/Select/index.tsx +65 -4
  438. package/src/fields/Select/shouldInlineChoices.spec.ts +21 -1
  439. package/src/fields/Select/shouldInlineChoices.ts +26 -0
  440. package/src/fields/Signature/Signature.stories.tsx +2 -2
  441. package/src/fields/Slider/Slider.system.native.spec.tsx +168 -0
  442. package/src/fields/Slider/index.tsx +166 -30
  443. package/src/fields/Stepper/Stepper.stories.tsx +2 -2
  444. package/src/fields/Switch/Switch.system.native.spec.tsx +162 -0
  445. package/src/fields/Switch/index.tsx +98 -0
  446. package/src/fields/TextArea/TextArea.stories.tsx +2 -2
  447. package/src/fields/ToggleGroup/ToggleGroup.stories.tsx +2 -2
  448. package/src/fields/ToggleGroup/ToggleGroup.system.native.spec.tsx +192 -0
  449. package/src/fields/ToggleGroup/index.tsx +111 -0
  450. package/src/fields/nativeDateTime/OsDateTimeSheet.presentation.spec.tsx +168 -0
  451. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +60 -30
  452. package/src/fields/nativeDateTime/sheetKeyboard.spec.ts +60 -0
  453. package/src/fields/nativeDateTime/sheetKeyboard.ts +45 -0
  454. package/src/index.ts +25 -2
  455. package/src/shared/colorRamps.ts +1 -11
  456. package/src/shared/overlaySizeClass.spec.ts +27 -0
  457. package/src/shared/overlaySizeClass.ts +36 -0
  458. package/src/shared/sheetNavigation.ts +82 -0
  459. package/src/shared/systemControlModules.gnome.ts +10 -0
  460. package/src/shared/systemControlModules.native.spec.ts +52 -0
  461. package/src/shared/systemControlModules.native.ts +66 -0
  462. package/src/shared/systemControlModules.ts +10 -0
  463. package/src/shared/systemControls.ts +70 -0
  464. package/src/standardActions.ts +96 -0
  465. package/types/AdaptivePopup/index.d.ts +13 -1
  466. package/types/AdaptivePopup/index.d.ts.map +1 -1
  467. package/types/Button/glass.d.ts +15 -0
  468. package/types/Button/glass.d.ts.map +1 -0
  469. package/types/Button/glass.native.d.ts +11 -0
  470. package/types/Button/glass.native.d.ts.map +1 -0
  471. package/types/Button/index.d.ts +45 -1
  472. package/types/Button/index.d.ts.map +1 -1
  473. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  474. package/types/DescriptionList/index.d.ts.map +1 -1
  475. package/types/FloatingPanel/RegularPanel.d.ts +29 -0
  476. package/types/FloatingPanel/RegularPanel.d.ts.map +1 -0
  477. package/types/FloatingPanel/compactFace.d.ts +12 -0
  478. package/types/FloatingPanel/compactFace.d.ts.map +1 -1
  479. package/types/FloatingPanel/containingBlock.d.ts +14 -0
  480. package/types/FloatingPanel/containingBlock.d.ts.map +1 -0
  481. package/types/FloatingPanel/index.d.ts.map +1 -1
  482. package/types/FloatingPanel/index.native.d.ts +6 -1
  483. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  484. package/types/FloatingPanel/pointAnchor.d.ts +12 -0
  485. package/types/FloatingPanel/pointAnchor.d.ts.map +1 -1
  486. package/types/FloatingPanel/regularPlacement.d.ts +20 -0
  487. package/types/FloatingPanel/regularPlacement.d.ts.map +1 -0
  488. package/types/fields/Barcode/BarcodeScanner.d.ts.map +1 -1
  489. package/types/fields/Barcode/BarcodeScanner.native.d.ts.map +1 -1
  490. package/types/fields/Combobox/index.d.ts.map +1 -1
  491. package/types/fields/FileUpload/index.d.ts.map +1 -1
  492. package/types/fields/Geolocation/index.d.ts.map +1 -1
  493. package/types/fields/ImageField/index.d.ts.map +1 -1
  494. package/types/fields/Input/index.d.ts.map +1 -1
  495. package/types/fields/Select/InlineChoices.d.ts.map +1 -1
  496. package/types/fields/Select/SheetPickerRow.d.ts +23 -0
  497. package/types/fields/Select/SheetPickerRow.d.ts.map +1 -0
  498. package/types/fields/Select/index.d.ts.map +1 -1
  499. package/types/fields/Select/shouldInlineChoices.d.ts +15 -0
  500. package/types/fields/Select/shouldInlineChoices.d.ts.map +1 -1
  501. package/types/fields/Slider/index.d.ts +7 -1
  502. package/types/fields/Slider/index.d.ts.map +1 -1
  503. package/types/fields/Switch/index.d.ts +7 -1
  504. package/types/fields/Switch/index.d.ts.map +1 -1
  505. package/types/fields/ToggleGroup/index.d.ts +8 -1
  506. package/types/fields/ToggleGroup/index.d.ts.map +1 -1
  507. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -1
  508. package/types/fields/nativeDateTime/sheetKeyboard.d.ts +20 -0
  509. package/types/fields/nativeDateTime/sheetKeyboard.d.ts.map +1 -0
  510. package/types/index.d.ts +8 -2
  511. package/types/index.d.ts.map +1 -1
  512. package/types/shared/colorRamps.d.ts +1 -11
  513. package/types/shared/colorRamps.d.ts.map +1 -1
  514. package/types/shared/overlaySizeClass.d.ts +24 -0
  515. package/types/shared/overlaySizeClass.d.ts.map +1 -0
  516. package/types/shared/sheetNavigation.d.ts +31 -0
  517. package/types/shared/sheetNavigation.d.ts.map +1 -0
  518. package/types/shared/systemControlModules.d.ts +5 -0
  519. package/types/shared/systemControlModules.d.ts.map +1 -0
  520. package/types/shared/systemControlModules.gnome.d.ts +5 -0
  521. package/types/shared/systemControlModules.gnome.d.ts.map +1 -0
  522. package/types/shared/systemControlModules.native.d.ts +20 -0
  523. package/types/shared/systemControlModules.native.d.ts.map +1 -0
  524. package/types/shared/systemControls.d.ts +53 -0
  525. package/types/shared/systemControls.d.ts.map +1 -0
  526. package/types/standardActions.d.ts +24 -0
  527. package/types/standardActions.d.ts.map +1 -0
@@ -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 } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { ColorPicker } from "./index";
9
+ import { ActionButton } from "@multiplatform.one/components";
10
10
 
11
11
  const meta: Meta<typeof ColorPicker> = {
12
12
  title: "Forms/ColorPicker",
@@ -69,7 +69,7 @@ export const Main: Story = {
69
69
  helperText="Choose background color"
70
70
  />
71
71
  <ColorPicker label="Text Color" name="textColor" helperText="Choose text color" />
72
- <Button action="submit">Submit</Button>
72
+ <ActionButton kind="submit" formAction="submit" />
73
73
  </YStack>
74
74
  </Form>
75
75
  );
@@ -0,0 +1,94 @@
1
+ /**
2
+ * FZ-8116 (LC-266): on native the Link picker (Combobox) takes the window's
3
+ * size class like Select and ColorPicker do. At regular width (an iPad) it
4
+ * opens over its field with its search inside; at compact width (iPhone,
5
+ * Slide Over) it keeps the bottom sheet.
6
+ */
7
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
8
+ import { act } from "@testing-library/react";
9
+ import type { ReactNode } from "react";
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
11
+ import { authorOptions } from "./authorOptions";
12
+ import { Combobox } from "./index";
13
+
14
+ const screen = vi.hoisted(() => ({ width: 820, height: 1180 }));
15
+ const sheetProps = vi.hoisted(() => [] as unknown[]);
16
+
17
+ vi.mock("tamagui", async (importOriginal) => ({
18
+ ...(await importOriginal<typeof import("tamagui")>()),
19
+ isWeb: false,
20
+ }));
21
+ vi.mock("react-native-web", async (importOriginal) => ({
22
+ ...(await importOriginal<typeof import("react-native")>()),
23
+ ActionSheetIOS: undefined,
24
+ Modal: ({ children, visible }: { children: ReactNode; visible: boolean }) =>
25
+ visible ? children : null,
26
+ useWindowDimensions: () => ({ ...screen, scale: 2, fontScale: 1 }),
27
+ }));
28
+ vi.mock("../../FloatingPanel", async (importOriginal) => {
29
+ const actual = await importOriginal<typeof import("../../FloatingPanel")>();
30
+ const native = await import("../../FloatingPanel/index.native");
31
+ return {
32
+ ...actual,
33
+ FloatingPanel: (props: Parameters<typeof native.FloatingPanel>[0]) => {
34
+ sheetProps.push(props.sheet);
35
+ return <native.FloatingPanel {...props} />;
36
+ },
37
+ };
38
+ });
39
+
40
+ beforeEach(() => {
41
+ vi.useFakeTimers();
42
+ sheetProps.length = 0;
43
+ });
44
+ afterEach(() => {
45
+ vi.restoreAllMocks();
46
+ vi.useRealTimers();
47
+ screen.width = 820;
48
+ screen.height = 1180;
49
+ });
50
+
51
+ function tap(target: Element) {
52
+ act(() => {
53
+ target.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, button: 0 }));
54
+ target.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, button: 0 }));
55
+ target.dispatchEvent(new MouseEvent("click", { bubbles: true, button: 0 }));
56
+ });
57
+ act(() => {
58
+ vi.advanceTimersByTime(1);
59
+ });
60
+ }
61
+
62
+ function open() {
63
+ const view = renderWithProviders(<Combobox options={authorOptions} aria-label="Author" />);
64
+ tap(view.getByRole("button", { name: "Author" }));
65
+ return view;
66
+ }
67
+
68
+ const regular = () => document.querySelector('[data-testid="floating-panel-regular"]');
69
+ const sheet = () => document.querySelector('[data-testid="floating-panel-sheet"]');
70
+
71
+ describe("Combobox native at regular width (FZ-8116)", () => {
72
+ it("leaves the overlay form to the size class instead of forcing the sheet", () => {
73
+ renderWithProviders(<Combobox options={authorOptions} aria-label="Author" />);
74
+ expect(sheetProps.length).toBeGreaterThan(0);
75
+ expect(sheetProps.every((value) => value !== true)).toBe(true);
76
+ });
77
+
78
+ it("opens over its field on an iPad-wide window", () => {
79
+ open();
80
+ expect(regular()).not.toBeNull();
81
+ expect(sheet()).toBeNull();
82
+ });
83
+
84
+ it.each([
85
+ ["an iPhone", 390, 844],
86
+ ["iPad Slide Over", 320, 1180],
87
+ ])("keeps the bottom sheet on %s", (_name, width, height) => {
88
+ screen.width = width;
89
+ screen.height = height;
90
+ open();
91
+ expect(regular()).toBeNull();
92
+ expect(sheet()).not.toBeNull();
93
+ });
94
+ });
@@ -4,11 +4,11 @@ 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 { XStack, YStack } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { Combobox, type ComboboxOption } from "./index";
10
9
  import { authorOptions } from "./authorOptions";
11
10
  import { Text } from "@multiplatform.one/theme";
11
+ import { ActionButton } from "@multiplatform.one/components";
12
12
 
13
13
  const meta: Meta<typeof Combobox> = {
14
14
  title: "Forms/Combobox",
@@ -117,7 +117,7 @@ export const Main: StoryObj<typeof Combobox> = {
117
117
  searchPlaceholder="Type to search..."
118
118
  />
119
119
 
120
- <Button action="submit">Submit</Button>
120
+ <ActionButton kind="submit" formAction="submit" />
121
121
  </YStack>
122
122
  </Form>
123
123
  );
@@ -2509,7 +2509,9 @@ function NativeComboboxCore({
2509
2509
  <FloatingPanel
2510
2510
  open={open}
2511
2511
  onOpenChange={handleOpenChange}
2512
- sheet
2512
+ // Native leaves the form to the window's size class (FZ-8116): a sheet
2513
+ // when compact, a panel over the field at regular width.
2514
+ sheet={isWeb}
2513
2515
  // Search-driven comboboxes open the sheet tall: results stream in as
2514
2516
  // the user types, so a content-fit sheet would open as a sliver.
2515
2517
  sheetFill={Boolean(onSearch)}
@@ -14,6 +14,7 @@ import { MonthPicker } from "./MonthPicker";
14
14
  import { MultiDatePicker } from "./MultiDatePicker";
15
15
  import { DatePicker } from "./index";
16
16
  import { formatCalendarDate, Text } from "@multiplatform.one/theme";
17
+ import { ActionButton } from "@multiplatform.one/components";
17
18
  import { TimePicker } from "../TimePicker";
18
19
 
19
20
  const meta: Meta<typeof DatePicker> = {
@@ -86,7 +87,7 @@ export const Main: Story = {
86
87
  name={"endDate" as any}
87
88
  helperText="Select project end date"
88
89
  />
89
- <Button action="submit">Submit</Button>
90
+ <ActionButton kind="submit" formAction="submit" />
90
91
  </YStack>
91
92
  </Form>
92
93
  );
@@ -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 { YStack } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { DateRangePicker } from "./DateRangePicker";
10
9
  import { Text } from "@multiplatform.one/theme";
10
+ import { ActionButton } from "@multiplatform.one/components";
11
11
 
12
12
  const meta: Meta<typeof DateRangePicker> = {
13
13
  title: "Forms/DateRangePicker",
@@ -103,7 +103,7 @@ export const FormBound: Story = {
103
103
  <FormSubscribe selector={(s: any) => [s.values.range]}>
104
104
  {([range]: any[]) => <Text>{`form-value:${JSON.stringify(range)}`}</Text>}
105
105
  </FormSubscribe>
106
- <Button action="submit">Submit</Button>
106
+ <ActionButton kind="submit" formAction="submit" />
107
107
  </YStack>
108
108
  </Form>
109
109
  );
@@ -8,6 +8,7 @@ import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { DatetimePicker } from "./DatetimePicker";
10
10
  import { Text } from "@multiplatform.one/theme";
11
+ import { ActionButton } from "@multiplatform.one/components";
11
12
 
12
13
  const meta: Meta<typeof DatetimePicker> = {
13
14
  title: "Forms/DatetimePicker",
@@ -170,7 +171,7 @@ export const FormBound: Story = {
170
171
  </Text>
171
172
  )}
172
173
  </FormSubscribe>
173
- <Button action="submit">Submit</Button>
174
+ <ActionButton kind="submit" formAction="submit" />
174
175
  </YStack>
175
176
  </Form>
176
177
  );
@@ -2,10 +2,10 @@ 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
4
  import { YStack } from "tamagui";
5
- import { Button } from "../../Button";
6
5
  import { Form } from "../../Form";
7
6
  import { MonthPicker } from "./MonthPicker";
8
7
  import { Text } from "@multiplatform.one/theme";
8
+ import { ActionButton } from "@multiplatform.one/components";
9
9
 
10
10
  const meta: Meta<typeof MonthPicker> = {
11
11
  title: "Forms/MonthPicker",
@@ -104,7 +104,7 @@ export const FormBound: Story = {
104
104
  <FormSubscribe selector={(s: any) => [s.values.period]}>
105
105
  {([period]: any[]) => <Text>{`form-value:${JSON.stringify(period)}`}</Text>}
106
106
  </FormSubscribe>
107
- <Button action="submit">Submit</Button>
107
+ <ActionButton kind="submit" formAction="submit" />
108
108
  </YStack>
109
109
  </Form>
110
110
  );
@@ -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 { YStack } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { MultiDatePicker } from "./MultiDatePicker";
10
9
  import { Text } from "@multiplatform.one/theme";
10
+ import { ActionButton } from "@multiplatform.one/components";
11
11
 
12
12
  const meta: Meta<typeof MultiDatePicker> = {
13
13
  title: "Forms/MultiDatePicker",
@@ -115,7 +115,7 @@ export const FormBound: Story = {
115
115
  </Text>
116
116
  )}
117
117
  </FormSubscribe>
118
- <Button action="submit">Submit</Button>
118
+ <ActionButton kind="submit" formAction="submit" />
119
119
  </YStack>
120
120
  </Form>
121
121
  );
@@ -67,7 +67,12 @@ describe("FileUpload", () => {
67
67
  const result = renderWithProviders(
68
68
  <FileUpload existing={{ src: "/files/sprite.png" }} onExistingRemove={remove} />,
69
69
  );
70
- expect(result.container.textContent).toContain("Replace");
70
+ // LC-260: Replace and Remove are glyphs on the media plate over the image.
71
+ const actions = result.container.querySelector('[data-file-upload="preview-actions"]');
72
+ expect(
73
+ actions?.querySelector('[aria-label="Replace"]')?.getAttribute("data-mp-icon-button"),
74
+ ).toBe("media");
75
+ expect(result.container.textContent).not.toContain("Replace");
71
76
  expect(result.container.textContent).not.toContain("Choose File");
72
77
  expect(result.container.textContent).not.toContain("Drag a file");
73
78
  expect(result.container.querySelector('[data-file-upload="preview"] img')).toBeTruthy();
@@ -344,7 +349,7 @@ describe("FileUpload bento-derived dropzone (MPO-57)", () => {
344
349
  expect(zone.textContent).toContain("Drag a file into this area");
345
350
  });
346
351
 
347
- it("renders picked files as in-zone rows: name, bold size line, filled $color12 remove disc (29 painted, hitSlop 44)", async () => {
352
+ it("renders picked files as in-zone rows: name, bold size line, bare ✕ remove (29 painted, hitSlop 44)", async () => {
348
353
  const { container } = renderWithHouseThemes(
349
354
  <FileUpload label="Attachment" name="attachment" multiple />,
350
355
  );
@@ -367,14 +372,14 @@ describe("FileUpload bento-derived dropzone (MPO-57)", () => {
367
372
  expect(sizeLine).toBeTruthy();
368
373
  expect(sizeLine.className).toMatch(/_fow-700/);
369
374
 
370
- // Remove: a circular filled $color12 disc painted at nestedControl (29)
371
- // with hitSlop restoring the 44 floor (data-mp-press-slop 8 → 29+16=45).
375
+ // Remove: LC-176's bare ✕, no fill or border, painted at nestedControl
376
+ // (29) with hitSlop restoring the 44 floor (data-mp-press-slop 8 → 45).
377
+ // The filled $color12 disc it replaced read as a plate on plain content.
372
378
  const remove = flist.querySelector('[aria-label="Remove hello.txt"]') as HTMLElement;
373
379
  expect(remove).toBeTruthy();
374
380
  expect(remove.getAttribute("data-nested-px")).toBe("29");
375
381
  expect(remove.getAttribute("data-mp-press-slop")).toBe("8");
376
- expect(remove.className).toMatch(/_bg-color12/);
377
- // The inverse ✕ rides inside the disc.
382
+ expect(remove.className).not.toMatch(/_bg-color12/);
378
383
  expect(remove.querySelector("svg")).toBeTruthy();
379
384
  // The caption is dropped once files exist; the CTA stays.
380
385
  expect(zone.textContent).not.toContain("Drag a file into this area");
@@ -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 { useEffect, useRef, useState } from "react";
6
6
  import { YStack } from "tamagui";
7
- import { Button } from "../../Button";
8
7
  import { Form } from "../../Form";
9
8
  import { FileUpload } from "./index";
9
+ import { ActionButton } from "@multiplatform.one/components";
10
10
 
11
11
  const meta: Meta<typeof FileUpload> = {
12
12
  title: "Forms/FileUpload",
@@ -80,7 +80,7 @@ export const Main: Story = {
80
80
  helperText: "Upload multiple files",
81
81
  } as any)}
82
82
  />
83
- <Button action="submit">Submit</Button>
83
+ <ActionButton kind="submit" formAction="submit" />
84
84
  </YStack>
85
85
  </Form>
86
86
  );
@@ -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
  );