@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
@@ -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
  );
@@ -0,0 +1,53 @@
1
+ import userEvent from "@testing-library/user-event";
2
+ import { describe, expect, it } from "vitest";
3
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { Theme } from "tamagui";
5
+ import { Input } from "./index";
6
+
7
+ function SignIn({ scheme }: { scheme: "light" | "dark" }) {
8
+ return (
9
+ <Theme name={scheme}>
10
+ <form id="sign-in" action="/login" method="post">
11
+ <Input id="username" name="username" label="Username" labelHidden />
12
+ <Input id="password" name="password" label="Password" labelHidden secureTextEntry />
13
+ <input type="hidden" name="credentialId" value="" />
14
+ </form>
15
+ </Theme>
16
+ );
17
+ }
18
+
19
+ const field = (container: HTMLElement, id: string) =>
20
+ container.querySelector<HTMLInputElement>(`input#${id}`)!;
21
+
22
+ describe("Input posts under its name in a native form (FZ-8159)", () => {
23
+ it("keeps name through typing and a scheme change, so FormData carries both fields", async () => {
24
+ const user = userEvent.setup();
25
+ const view = renderWithProviders(<SignIn scheme="light" />);
26
+ const username = field(view.container, "username");
27
+ const password = field(view.container, "password");
28
+
29
+ await user.type(username, "ash");
30
+ await user.type(password, "pikachu");
31
+ expect(username.getAttribute("name")).toBe("username");
32
+ expect(password.getAttribute("name")).toBe("password");
33
+
34
+ view.rerender(<SignIn scheme="dark" />);
35
+ await user.type(field(view.container, "username"), "!");
36
+
37
+ const form = view.container.querySelector<HTMLFormElement>("form#sign-in")!;
38
+ const posted = new FormData(form);
39
+ expect(posted.get("username")).toBe("ash!");
40
+ expect(posted.get("password")).toBe("pikachu");
41
+ expect(posted.get("credentialId")).toBe("");
42
+ });
43
+
44
+ it("a read-only field still posts under its name", () => {
45
+ const view = renderWithProviders(
46
+ <form>
47
+ <Input id="realm" name="realm" label="Realm" readOnly value="pokemon" />
48
+ </form>,
49
+ );
50
+ const posted = new FormData(view.container.querySelector("form")!);
51
+ expect(posted.get("realm")).toBe("pokemon");
52
+ });
53
+ });
@@ -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
  );
@@ -11,7 +11,7 @@ import type {
11
11
  SizeTokens,
12
12
  TamaguiElement,
13
13
  } from "tamagui";
14
- import { Text } from "tamagui";
14
+ import { Text, isWeb } from "tamagui";
15
15
  import { Skeleton } from "../../Skeleton";
16
16
  import { resolveFieldInputProps } from "../../fieldDefaults";
17
17
  import { Field, FieldLayout } from "../../fieldLayout";
@@ -241,6 +241,9 @@ export function Input({
241
241
 
242
242
  const areaName =
243
243
  visibleLabel || !resolvedAriaLabel ? undefined : { "aria-label": resolvedAriaLabel };
244
+ // A native <form> posts the field under its name, and React DOM drops a
245
+ // `name` it doesn't own on every update, so the Area carries it as a prop.
246
+ const domName = isWeb && name ? { name } : undefined;
244
247
 
245
248
  const handleCopy = useCallback(
246
249
  async (text: string) => {
@@ -332,6 +335,7 @@ export function Input({
332
335
  value={inputValue ?? ""}
333
336
  readOnly
334
337
  id={id}
338
+ {...domName}
335
339
  aria-readonly="true"
336
340
  aria-required={required || undefined}
337
341
  aria-invalid={hasError || undefined}
@@ -364,6 +368,7 @@ export function Input({
364
368
  {...(placeholder !== undefined ? { placeholder } : undefined)}
365
369
  disabled={disabled}
366
370
  id={id}
371
+ {...domName}
367
372
  {...(handleChange || value !== undefined
368
373
  ? { value: inputValue ?? "" }
369
374
  : { defaultValue: inputValue })}
@@ -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
@@ -55,6 +55,7 @@ export function InlineChoices({
55
55
  const textColor = knobProps.textAccentColor;
56
56
  const selectedIndex = options.findIndex((option) => option.value === value);
57
57
  const tabStop = selectedIndex >= 0 ? selectedIndex : 0;
58
+ const glyphed = options.some((option) => option.icon != null);
58
59
 
59
60
  const choose = (index: number) => {
60
61
  const option = options[index];
@@ -85,9 +86,11 @@ export function InlineChoices({
85
86
  borderColor={formCommonColors.divider}
86
87
  pointerEvents="none"
87
88
  >
88
- <View flexShrink={0} alignItems="center" justifyContent="center" minWidth={18}>
89
- <IconSlot icon={option.icon} color={textColor} />
90
- </View>
89
+ {glyphed ? (
90
+ <View flexShrink={0} alignItems="center" justifyContent="center" minWidth={18}>
91
+ <IconSlot icon={option.icon} color={textColor} />
92
+ </View>
93
+ ) : null}
91
94
  <Text
92
95
  fontFamily={knobProps.body.fontFamily}
93
96
  fontWeight={knobProps.body.fontWeight}
@@ -0,0 +1,160 @@
1
+ import { keyboardFocusRingProps, useGlyphColor } from "@multiplatform.one/theme";
2
+ import { CaretRightIcon } from "@phosphor-icons/react";
3
+ import { useId, useLayoutEffect, useEffect } from "react";
4
+ import { Pressable } from "react-native";
5
+ import { isWeb, Text, View, XStack } from "tamagui";
6
+ import { useFieldDescribedBy } from "../../fieldLayout";
7
+ import { formInputColors } from "../../shared/colorRamps";
8
+ import { useSheetPageOpen, type SheetNavigationStore } from "../../shared/sheetNavigation";
9
+ import { InlineChoices, type InlineChoice } from "./InlineChoices";
10
+
11
+ const useIsoLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
12
+
13
+ export interface SheetPickerRowProps {
14
+ store: SheetNavigationStore;
15
+ label: string;
16
+ options: InlineChoice[];
17
+ value?: string;
18
+ placeholder?: string;
19
+ onValueChange: (value: string) => void;
20
+ onBlur?: (...args: any[]) => void;
21
+ disabled?: boolean;
22
+ id?: string;
23
+ knobProps: any;
24
+ markColor: string;
25
+ }
26
+
27
+ /**
28
+ * A long choice list inside a sheet (LC-262, FZ-7830 round 3): a Settings row
29
+ * with the label, the current value and a chevron. Pressing it pushes the
30
+ * checkmark list onto the sheet's own navigation stack; Back returns with the
31
+ * value set. Nothing floats over the field.
32
+ */
33
+ export function SheetPickerRow({
34
+ store,
35
+ label,
36
+ options,
37
+ value,
38
+ placeholder,
39
+ onValueChange,
40
+ onBlur,
41
+ disabled,
42
+ id,
43
+ knobProps,
44
+ markColor,
45
+ }: SheetPickerRowProps) {
46
+ const pageId = `sheet-picker-${useId()}`;
47
+ const pushed = useSheetPageOpen(store, pageId);
48
+ const describedBy = useFieldDescribedBy();
49
+ const current = options.find((option) => option.value === value);
50
+ const textColor = knobProps.textAccentColor;
51
+ const chevronInk = useGlyphColor("$textMuted");
52
+
53
+ const page = {
54
+ id: pageId,
55
+ title: label,
56
+ content: (
57
+ <InlineChoices
58
+ options={options}
59
+ value={value}
60
+ onValueChange={onValueChange}
61
+ disabled={disabled}
62
+ aria-label={label}
63
+ knobProps={knobProps}
64
+ markColor={markColor}
65
+ />
66
+ ),
67
+ };
68
+
69
+ useIsoLayoutEffect(() => {
70
+ if (pushed) store.update(page);
71
+ });
72
+ useEffect(() => () => store.remove(pageId), [store, pageId]);
73
+
74
+ const open = () => {
75
+ if (disabled) return;
76
+ store.push(page);
77
+ };
78
+
79
+ const row = (
80
+ <XStack
81
+ alignItems="center"
82
+ minHeight={knobProps.menuRow.minHeight}
83
+ paddingHorizontal={knobProps.panelPadding.padding}
84
+ {...knobProps.gap}
85
+ pointerEvents="none"
86
+ >
87
+ <Text
88
+ fontFamily={knobProps.body.fontFamily}
89
+ fontWeight={knobProps.body.fontWeight}
90
+ color={textColor}
91
+ numberOfLines={1}
92
+ flex={1}
93
+ >
94
+ {label}
95
+ </Text>
96
+ <Text
97
+ testID="sheet-picker-value"
98
+ fontFamily={knobProps.body.fontFamily}
99
+ color="$textMuted"
100
+ numberOfLines={1}
101
+ flexShrink={1}
102
+ >
103
+ {current?.label ?? placeholder}
104
+ </Text>
105
+ <CaretRightIcon size={14} weight="bold" color={chevronInk} />
106
+ </XStack>
107
+ );
108
+
109
+ const surface = {
110
+ ...knobProps.borderRadius,
111
+ borderColor: formInputColors.border.base,
112
+ backgroundColor: formInputColors.background.base,
113
+ overflow: "hidden" as const,
114
+ width: "100%" as const,
115
+ opacity: disabled ? 0.5 : 1,
116
+ };
117
+
118
+ if (isWeb) {
119
+ return (
120
+ <View
121
+ id={id}
122
+ role="button"
123
+ aria-label={label}
124
+ aria-describedby={describedBy}
125
+ aria-disabled={disabled || undefined}
126
+ data-testid="sheet-picker-row"
127
+ tabIndex={disabled ? -1 : 0}
128
+ cursor={disabled ? "default" : "pointer"}
129
+ onPress={open}
130
+ onKeyDown={(event: any) => {
131
+ if (event.key === "Enter" || event.key === " ") {
132
+ event.preventDefault();
133
+ open();
134
+ }
135
+ }}
136
+ onBlur={onBlur}
137
+ outlineWidth={0}
138
+ focusVisibleStyle={keyboardFocusRingProps}
139
+ {...surface}
140
+ >
141
+ {row}
142
+ </View>
143
+ );
144
+ }
145
+ return (
146
+ <View {...surface}>
147
+ <Pressable
148
+ testID="sheet-picker-row"
149
+ accessibilityRole="button"
150
+ accessibilityLabel={label}
151
+ accessibilityValue={{ text: current?.label ?? placeholder ?? "" }}
152
+ accessibilityState={{ disabled: !!disabled }}
153
+ disabled={disabled}
154
+ onPress={open}
155
+ >
156
+ {row}
157
+ </Pressable>
158
+ </View>
159
+ );
160
+ }
@@ -66,6 +66,7 @@ import {
66
66
  } from "../../FloatingPanel";
67
67
  import { pickerCompactFace, resolveCompactFace } from "../../FloatingPanel/compactFace";
68
68
  import { PanelPortal } from "../../FloatingPanel/PanelPortal";
69
+ import { fixedContainingBlockOrigin } from "../../FloatingPanel/containingBlock";
69
70
  import { useInsideOverlay, useOverlayZIndex } from "../../shared/overlayStack";
70
71
  import { useDragScroll } from "../../shared/useDragScroll";
71
72
  import { useIsInTableCell } from "../../shared/tableCellContext";
@@ -73,7 +74,9 @@ import { t } from "../../shared/t";
73
74
  import { orderOptionsBySelected, type SelectedOrder } from "../selectedOrder";
74
75
  import { shouldUseIosNativeSelect } from "../nativeSelect";
75
76
  import { InlineChoices } from "./InlineChoices";
76
- import { shouldInlineChoices } from "./shouldInlineChoices";
77
+ import { SheetPickerRow } from "./SheetPickerRow";
78
+ import { opensBesideTrigger, shouldInlineChoices, shouldPushChoices } from "./shouldInlineChoices";
79
+ import { useSheetNavigation } from "../../shared/sheetNavigation";
77
80
 
78
81
  /** Undefined on web (RNW ships no ActionSheetIOS); real on iOS. */
79
82
  const actionSheetIOS = (ReactNative as { ActionSheetIOS?: typeof ReactNative.ActionSheetIOS })
@@ -540,6 +543,7 @@ function FloatingSelectCore({
540
543
  const { style: elevatedSurfaceStyle, ...elevatedSurfaceProps } = knobProps.elevatedSurface;
541
544
  const hydrationTouch = useTouchSurface();
542
545
  const inTableCell = useIsInTableCell();
546
+ const beside = useInsideOverlay() && !inTableCell && opensBesideTrigger(options.length);
543
547
  const describedBy = useFieldDescribedBy();
544
548
  const glyphColor = useGlyphColor();
545
549
  const [open, setOpen] = useState(false);
@@ -672,8 +676,31 @@ function FloatingSelectCore({
672
676
  const selectedItemIndex = selectedIndex >= 0 ? selectedIndex : 0;
673
677
  const selectedItem = listItemsRef.current[selectedItemIndex];
674
678
  const trigger = panel.triggerRef.current;
675
- if (!dropdownElement || !selectedItem || !trigger) return;
679
+ if (!dropdownElement || !trigger) return;
680
+
681
+ if (beside) {
682
+ const isInitial = panel.initializingRef.current;
683
+ if (isInitial) dropdownElement.style.transition = "none";
684
+ const bounds = trigger.getBoundingClientRect();
685
+ const contentHeight = dropdownElement.scrollHeight;
686
+ const below = window.innerHeight - panelViewportPadding - bounds.bottom;
687
+ const above = bounds.top - panelViewportPadding;
688
+ const opensUp = contentHeight > below && above > below;
689
+ const maxHeight = Math.min(contentHeight || Infinity, opensUp ? above : below);
690
+ const top =
691
+ (opensUp ? bounds.top - maxHeight : bounds.bottom) -
692
+ fixedContainingBlockOrigin(dropdownElement).top;
693
+ dropdownElement.style.top = `${top}px`;
694
+ dropdownElement.style.maxHeight = `${maxHeight}px`;
695
+ dropdownElement.style.height = "";
696
+ overlayStyle.current = { top, maxHeight };
697
+ panel.initializingRef.current = false;
698
+ void dropdownElement.offsetHeight;
699
+ if (isInitial) dropdownElement.style.transition = panel.panelTransition;
700
+ return;
701
+ }
676
702
 
703
+ if (!selectedItem) return;
677
704
  const isInitial = panel.initializingRef.current;
678
705
  if (isInitial) dropdownElement.style.transition = "none";
679
706
 
@@ -813,6 +840,7 @@ function FloatingSelectCore({
813
840
  panel.placement,
814
841
  panel.panelTransition,
815
842
  options.length,
843
+ beside,
816
844
  ]);
817
845
 
818
846
  repositionRef.current = repositionOverlay;
@@ -1574,6 +1602,9 @@ function NativeSelectCore({
1574
1602
  // A short list opens as a menu over its trigger; a long one keeps its
1575
1603
  // sheet at page level and opens as a menu inside another overlay (FZ-7830).
1576
1604
  compactFace={compactFace}
1605
+ {...(asMenu && insideOverlay && opensBesideTrigger(options.length)
1606
+ ? { anchorMode: "attach" as const, triggerEcho: false }
1607
+ : null)}
1577
1608
  triggerA11y={{
1578
1609
  label: ariaLabel ?? fieldA11y?.label,
1579
1610
  value: triggerValueText,
@@ -1762,6 +1793,13 @@ export function Select({
1762
1793
  const shouldUseSheet = !isWeb || (!effectiveGtSm && !compactMenu);
1763
1794
  const inTableCell = useIsInTableCell();
1764
1795
  const inline = !inTableCell && shouldInlineChoices({ insideOverlay, multiple, options });
1796
+ const sheetNavigation = useSheetNavigation();
1797
+ const rowLabel = typeof label === "string" ? label : ariaLabel;
1798
+ const pushed =
1799
+ !inline &&
1800
+ !inTableCell &&
1801
+ Boolean(rowLabel) &&
1802
+ shouldPushChoices({ inSheet: Boolean(sheetNavigation), multiple, options });
1765
1803
  // DG-CTRL-01 / DG-CTRL-05 — short single-select lists prefer RadioGroup,
1766
1804
  // which the inline face already is.
1767
1805
  if (!inline) {
@@ -1837,6 +1875,27 @@ export function Select({
1837
1875
  handleBlur?: (...args: any[]) => void,
1838
1876
  ) => {
1839
1877
  if (readOnly) return renderReadOnly(selectValue);
1878
+ if (pushed && sheetNavigation) {
1879
+ return (
1880
+ <SheetPickerRow
1881
+ store={sheetNavigation}
1882
+ label={rowLabel as string}
1883
+ options={options}
1884
+ value={typeof selectValue === "string" ? selectValue : undefined}
1885
+ placeholder={placeholder}
1886
+ onValueChange={(val) => {
1887
+ if (disabled) return;
1888
+ handleValueChange?.(val);
1889
+ emitValueChange(val);
1890
+ }}
1891
+ onBlur={handleBlur}
1892
+ disabled={disabled}
1893
+ id={id}
1894
+ knobProps={knobProps}
1895
+ markColor={markColor}
1896
+ />
1897
+ );
1898
+ }
1840
1899
  if (inline) {
1841
1900
  return (
1842
1901
  <InlineChoices
@@ -1887,7 +1946,8 @@ export function Select({
1887
1946
  return (
1888
1947
  <FieldLayout
1889
1948
  id={id}
1890
- label={label}
1949
+ label={pushed ? undefined : label}
1950
+ aria-label={pushed ? rowLabel : undefined}
1891
1951
  labelProps={labelProps}
1892
1952
  error={error}
1893
1953
  helperText={helperText}
@@ -1922,7 +1982,8 @@ export function Select({
1922
1982
  return (
1923
1983
  <FieldLayout
1924
1984
  id={id}
1925
- label={label}
1985
+ label={pushed ? undefined : label}
1986
+ aria-label={pushed ? rowLabel : undefined}
1926
1987
  labelProps={labelProps}
1927
1988
  error={resolvedError}
1928
1989
  helperText={helperText}
@@ -1,5 +1,10 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { INLINE_CHOICES_MAX, shouldInlineChoices } from "./shouldInlineChoices";
2
+ import {
3
+ INLINE_CHOICES_MAX,
4
+ opensBesideTrigger,
5
+ shouldInlineChoices,
6
+ shouldPushChoices,
7
+ } from "./shouldInlineChoices";
3
8
 
4
9
  const glyph = "•";
5
10
  const withIcons = (n: number) => Array.from({ length: n }, () => ({ icon: glyph }));
@@ -23,3 +28,18 @@ describe("shouldInlineChoices (LC-262, FZ-7830)", () => {
23
28
  expect(shouldInlineChoices({ insideOverlay: true, options: [] })).toBe(false);
24
29
  });
25
30
  });
31
+
32
+ describe("shouldPushChoices and opensBesideTrigger (LC-262, FZ-7830 round 3)", () => {
33
+ it("pushes a single-choice list past five options inside a sheet", () => {
34
+ expect(shouldPushChoices({ inSheet: true, options: withIcons(6) })).toBe(true);
35
+ expect(shouldPushChoices({ inSheet: true, options: withIcons(5) })).toBe(false);
36
+ expect(shouldPushChoices({ inSheet: false, options: withIcons(8) })).toBe(false);
37
+ expect(shouldPushChoices({ inSheet: true, multiple: true, options: withIcons(8) })).toBe(false);
38
+ });
39
+
40
+ it("opens a list of five or fewer beside its field", () => {
41
+ expect(opensBesideTrigger(5)).toBe(true);
42
+ expect(opensBesideTrigger(6)).toBe(false);
43
+ expect(opensBesideTrigger(0)).toBe(false);
44
+ });
45
+ });
@@ -20,3 +20,29 @@ export function shouldInlineChoices({
20
20
  if (!insideOverlay || multiple || !options?.length) return false;
21
21
  return options.length <= INLINE_CHOICES_MAX && options.every((option) => option.icon != null);
22
22
  }
23
+
24
+ /**
25
+ * A single-choice Select inside a sheet with more options than the inline
26
+ * list holds pushes its checkmark list onto the sheet's navigation stack from
27
+ * a Settings row (LC-262, FZ-7830 round 3), instead of a menu over the field.
28
+ */
29
+ export function shouldPushChoices({
30
+ inSheet,
31
+ multiple,
32
+ options,
33
+ }: {
34
+ inSheet: boolean;
35
+ multiple?: boolean;
36
+ options: ReadonlyArray<unknown> | undefined;
37
+ }): boolean {
38
+ if (!inSheet || multiple || !options?.length) return false;
39
+ return options.length > INLINE_CHOICES_MAX;
40
+ }
41
+
42
+ /**
43
+ * A short list inside a sheet that is not laid out inline opens as a menu
44
+ * beside its field, under it or above it, never over it (LC-262).
45
+ */
46
+ export function opensBesideTrigger(optionCount: number): boolean {
47
+ return optionCount > 0 && optionCount <= INLINE_CHOICES_MAX;
48
+ }
@@ -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
  );