@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,14 +10,28 @@
10
10
  * does a missing `@react-native-community/datetimepicker` (an optional peer,
11
11
  * loaded through `loadDateTimePicker`).
12
12
  */
13
- import { useCallback, useState } from "react";
14
- import { Modal, Pressable, StyleSheet, useColorScheme, Platform } from "react-native";
13
+ import { useCallback, useContext, useState } from "react";
14
+ import {
15
+ Modal,
16
+ Pressable,
17
+ StyleSheet,
18
+ useColorScheme,
19
+ useWindowDimensions,
20
+ View as RNView,
21
+ } from "react-native";
22
+ import { platform } from "@multiplatform.one/platform";
23
+ import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
15
24
  import { useResolvedKnobs, Text } from "@multiplatform.one/theme";
16
25
  import { View, XStack, YStack, useTheme, useThemeName } from "tamagui";
26
+ import { ArrowRightIcon } from "@phosphor-icons/react";
27
+ import { IconButton } from "../../Button";
28
+ import { standardActions } from "../../standardActions";
17
29
  import { formCommonColors } from "../../shared/colorRamps";
18
30
  import { t } from "../../shared/t";
19
31
  import { type DateTimePickerEvent, loadDateTimePicker } from "./dateTimePickerLoader";
20
32
  import { osDateTimeIosDisplay } from "./osDateTimeIosDisplay";
33
+ import { datePickerHeight, dateSheetBottomPadding, dateSheetMaxHeight } from "./sheetKeyboard";
34
+ import { useKeyboardInset } from "../../shared/useKeyboardInset";
21
35
 
22
36
  export type OsDateTimeMode = "date" | "time" | "datetime";
23
37
 
@@ -52,7 +66,12 @@ export function OsDateTimeSheet({
52
66
  const themeVariant = useNativePickerScheme();
53
67
  const theme = useTheme();
54
68
  const accentColor = theme.accentColor?.val;
55
- const isIOS = Platform.OS === "ios";
69
+ const isIOS = platform.isIos;
70
+ // MPO-64: the sheet ends ABOVE the keyboard and the picker shrinks to fit.
71
+ const keyboardInset = useKeyboardInset();
72
+ const { height: windowHeight } = useWindowDimensions();
73
+ const topInset = useContext(SafeAreaInsetsContext)?.top ?? initialWindowMetrics?.insets.top ?? 0;
74
+ const maxHeight = dateSheetMaxHeight(windowHeight, keyboardInset, topInset);
56
75
  const [showTimePicker, setShowTimePicker] = useState(false);
57
76
  const [temp, setTemp] = useState(value);
58
77
  const pickerMode: "date" | "time" =
@@ -148,9 +167,11 @@ export function OsDateTimeSheet({
148
167
  <Text color={formCommonColors.muted}>
149
168
  {t("Date picker unavailable — requires @react-native-community/datetimepicker")}
150
169
  </Text>
151
- <Pressable onPress={onCancel} accessibilityRole="button">
152
- <Text color="$accentColor">{t("Cancel")}</Text>
153
- </Pressable>
170
+ <IconButton
171
+ icon={standardActions.cancel.icon}
172
+ aria-label={t(standardActions.cancel.label)}
173
+ onPress={onCancel}
174
+ />
154
175
  </YStack>
155
176
  </Pressable>
156
177
  </Modal>
@@ -172,37 +193,48 @@ export function OsDateTimeSheet({
172
193
 
173
194
  return (
174
195
  <Modal transparent animationType="fade" visible={open} onRequestClose={onCancel}>
175
- <Pressable style={styles.modalOverlay} onPress={onCancel}>
176
- <View
177
- pointerEvents="none"
178
- position="absolute"
179
- top={0}
180
- right={0}
181
- bottom={0}
182
- left={0}
183
- backgroundColor="$shadow6"
184
- />
196
+ {/*
197
+ A plain padded column, not KeyboardAvoidingView: inside a Modal the
198
+ latter pads the container while the sheet keeps its own height, so the
199
+ sheet overflows off the top instead of shrinking (MPO-64).
200
+ */}
201
+ <RNView style={[styles.modalOverlay, { paddingBottom: keyboardInset }]}>
202
+ <Pressable style={StyleSheet.absoluteFill} onPress={onCancel}>
203
+ <View pointerEvents="none" flex={1} backgroundColor="$shadow6" />
204
+ </Pressable>
185
205
  <Pressable onPress={(e) => e.stopPropagation()}>
186
206
  <YStack
207
+ testID="os-date-time-sheet"
187
208
  {...knobProps.elevatedSurface}
188
209
  borderBottomLeftRadius={0}
189
210
  borderBottomRightRadius={0}
211
+ maxHeight={maxHeight}
212
+ flexShrink={1}
213
+ minHeight={0}
214
+ paddingBottom={dateSheetBottomPadding(keyboardInset, isIOS)}
190
215
  >
191
216
  <XStack justifyContent="space-between" {...knobProps.panelPadding}>
192
- <Pressable onPress={onCancel} accessibilityRole="button">
193
- <Text color={formCommonColors.text}>{t("Cancel")}</Text>
194
- </Pressable>
217
+ <IconButton
218
+ icon={standardActions.cancel.icon}
219
+ aria-label={t(standardActions.cancel.label)}
220
+ onPress={onCancel}
221
+ />
195
222
  {mode === "datetime" && !showTimePicker ? (
196
- <Pressable onPress={() => setShowTimePicker(true)} accessibilityRole="button">
197
- <Text color="$accentColor">{t("Next")}</Text>
198
- </Pressable>
223
+ <IconButton
224
+ icon={ArrowRightIcon}
225
+ aria-label={t("Next")}
226
+ onPress={() => setShowTimePicker(true)}
227
+ />
199
228
  ) : (
200
- <Pressable onPress={confirm} accessibilityRole="button">
201
- <Text color="$accentColor">{t("Done")}</Text>
202
- </Pressable>
229
+ <IconButton
230
+ icon={standardActions.done.icon}
231
+ plate="primary"
232
+ aria-label={t(standardActions.done.label)}
233
+ onPress={confirm}
234
+ />
203
235
  )}
204
236
  </XStack>
205
- <YStack {...knobProps.panelPadding}>
237
+ <YStack {...knobProps.panelPadding} flexShrink={1} minHeight={0}>
206
238
  <DateTimePicker
207
239
  value={temp}
208
240
  mode={pickerMode}
@@ -212,12 +244,12 @@ export function OsDateTimeSheet({
212
244
  onChange={handleIOSChange}
213
245
  minimumDate={mode !== "time" ? minDate : undefined}
214
246
  maximumDate={mode !== "time" ? maxDate : undefined}
215
- style={pickerMode === "time" ? styles.wheel : styles.calendar}
247
+ style={{ width: "100%", height: datePickerHeight(pickerMode, maxHeight) }}
216
248
  />
217
249
  </YStack>
218
250
  </YStack>
219
251
  </Pressable>
220
- </Pressable>
252
+ </RNView>
221
253
  </Modal>
222
254
  );
223
255
  }
@@ -227,6 +259,4 @@ const styles = StyleSheet.create({
227
259
  flex: 1,
228
260
  justifyContent: "flex-end",
229
261
  },
230
- wheel: { height: 216 },
231
- calendar: { height: 360 },
232
262
  });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * MPO-64 leftover: the OS date/time iOS sheet must use the same keyboard
3
+ * cap as FloatingPanel / SheetModal. KeyboardAvoidingView cannot shrink a
4
+ * fixed-height calendar, so the cap is the only thing that keeps the sheet
5
+ * above the suggestion strip.
6
+ */
7
+ import { describe, expect, it } from "vitest";
8
+ import {
9
+ datePickerHeight,
10
+ dateSheetBottomPadding,
11
+ dateSheetMaxHeight,
12
+ DATE_PICKER_CALENDAR_HEIGHT,
13
+ DATE_SHEET_BACKDROP_STRIP,
14
+ DATE_SHEET_MIN_HEIGHT,
15
+ } from "./sheetKeyboard";
16
+
17
+ describe("dateSheetMaxHeight", () => {
18
+ it("uses the 85% detent when the keyboard is down", () => {
19
+ expect(dateSheetMaxHeight(800, 0, 47)).toBe(Math.round(800 * 0.85));
20
+ });
21
+
22
+ it("caps to the space above the keyboard, less the 48pt backdrop strip", () => {
23
+ expect(dateSheetMaxHeight(800, 400, 0)).toBe(800 - 400 - DATE_SHEET_BACKDROP_STRIP);
24
+ expect(dateSheetMaxHeight(800, 400, 0)).toBeLessThan(dateSheetMaxHeight(800, 0, 0));
25
+ });
26
+
27
+ it("keeps the backdrop strip below the status bar, not inside it", () => {
28
+ const windowHeight = 874;
29
+ const keyboardInset = 335;
30
+ const topInset = 62;
31
+ const sheetTop =
32
+ windowHeight - keyboardInset - dateSheetMaxHeight(windowHeight, keyboardInset, topInset);
33
+ expect(sheetTop - topInset).toBe(DATE_SHEET_BACKDROP_STRIP);
34
+ });
35
+
36
+ it("never collapses below the minimum sheet height", () => {
37
+ expect(dateSheetMaxHeight(800, 700, 47)).toBe(DATE_SHEET_MIN_HEIGHT);
38
+ });
39
+ });
40
+
41
+ describe("datePickerHeight", () => {
42
+ it("keeps the calendar grid when the sheet is tall enough", () => {
43
+ expect(datePickerHeight("date", 700)).toBe(DATE_PICKER_CALENDAR_HEIGHT);
44
+ });
45
+
46
+ it("shrinks the calendar so the sheet can sit above the keyboard", () => {
47
+ const maxHeight = dateSheetMaxHeight(800, 400, 47);
48
+ const height = datePickerHeight("date", maxHeight);
49
+ expect(height).toBeLessThan(DATE_PICKER_CALENDAR_HEIGHT);
50
+ expect(height).toBeLessThanOrEqual(maxHeight);
51
+ });
52
+ });
53
+
54
+ describe("dateSheetBottomPadding", () => {
55
+ it("drops the home-indicator inset while the keyboard covers it", () => {
56
+ expect(dateSheetBottomPadding(0, true)).toBe(24);
57
+ expect(dateSheetBottomPadding(336, true)).toBe(8);
58
+ expect(dateSheetBottomPadding(0, false)).toBe(16);
59
+ });
60
+ });
@@ -0,0 +1,45 @@
1
+ /**
2
+ * MPO-64 leftover: same keyboard cap as FloatingPanel / SheetModal.
3
+ *
4
+ * The Date iOS sheet used to give the calendar a fixed 360pt height inside a
5
+ * Modal. KeyboardAvoidingView cannot shrink that shape — it pads the container
6
+ * and the sheet overflows off the top. Cap the sheet to the space between the
7
+ * status bar and the keyboard (less a strip of backdrop) and shrink the picker
8
+ * to fit.
9
+ */
10
+
11
+ export const DATE_SHEET_MAX_HEIGHT_RATIO = 0.85;
12
+ export const DATE_SHEET_BACKDROP_STRIP = 48;
13
+ export const DATE_SHEET_MIN_HEIGHT = 180;
14
+ export const DATE_SHEET_CHROME = 96;
15
+ export const DATE_PICKER_CALENDAR_HEIGHT = 360;
16
+ export const DATE_PICKER_WHEEL_HEIGHT = 216;
17
+ const minPickerHeight = 120;
18
+
19
+ export function dateSheetMaxHeight(
20
+ windowHeight: number,
21
+ keyboardInset: number,
22
+ topInset: number,
23
+ ): number {
24
+ const available = Math.max(0, windowHeight - keyboardInset);
25
+ return Math.max(
26
+ DATE_SHEET_MIN_HEIGHT,
27
+ Math.round(
28
+ Math.min(
29
+ windowHeight * DATE_SHEET_MAX_HEIGHT_RATIO,
30
+ available - topInset - DATE_SHEET_BACKDROP_STRIP,
31
+ ),
32
+ ),
33
+ );
34
+ }
35
+
36
+ /** Home-indicator clearance; drop it while the keyboard already covers that band. */
37
+ export function dateSheetBottomPadding(keyboardInset: number, isIos: boolean): number {
38
+ if (keyboardInset > 0) return 8;
39
+ return isIos ? 24 : 16;
40
+ }
41
+
42
+ export function datePickerHeight(mode: "date" | "time", maxHeight: number): number {
43
+ const preferred = mode === "time" ? DATE_PICKER_WHEEL_HEIGHT : DATE_PICKER_CALENDAR_HEIGHT;
44
+ return Math.min(preferred, Math.max(minPickerHeight, maxHeight - DATE_SHEET_CHROME));
45
+ }
package/src/index.ts CHANGED
@@ -112,8 +112,14 @@ export { formatActionLabel } from "./actionLabel";
112
112
  export type { ActionLabelParts } from "./actionLabel";
113
113
 
114
114
  // ── Core Primitives ──────────────────────────────────────────
115
- export { Button } from "./Button";
116
- export type { ButtonProps, ButtonActionRole } from "./Button";
115
+ export {
116
+ Button,
117
+ IconButton,
118
+ ICON_BUTTON_GLYPH_PX,
119
+ ICON_BUTTON_NEUTRAL_GLYPH_PX,
120
+ ICON_BUTTON_PRESS_OPACITY,
121
+ } from "./Button";
122
+ export type { ButtonProps, ButtonActionRole, IconButtonProps } from "./Button";
117
123
 
118
124
  export { Input } from "./fields/Input";
119
125
  export type { InputProps } from "./fields/Input";
@@ -425,8 +431,23 @@ export {
425
431
  withOverlayStack,
426
432
  } from "./shared/overlayStack";
427
433
  export type { OverlayTier } from "./shared/overlayStack";
434
+ export {
435
+ createSheetNavigationStore,
436
+ SheetNavigationProvider,
437
+ useSheetNavigation,
438
+ useSheetPageOpen,
439
+ useSheetPages,
440
+ } from "./shared/sheetNavigation";
441
+ export type { SheetNavigationStore, SheetPage } from "./shared/sheetNavigation";
428
442
  export { OverlayWindow } from "./shared/OverlayWindow";
429
443
  export type { OverlayWindowProps } from "./shared/OverlayWindow";
444
+ export {
445
+ SHEET_PANEL_WIDTH,
446
+ overlaySizeClass,
447
+ sheetPanelWidth,
448
+ useOverlaySizeClass,
449
+ } from "./shared/overlaySizeClass";
450
+ export type { OverlaySizeClass } from "./shared/overlaySizeClass";
430
451
 
431
452
  // ── TanStack Form re-exports ─────────────────────────────────
432
453
  export {
@@ -445,3 +466,5 @@ export type {
445
466
  PickedMedia,
446
467
  MediaPickerErrorCode,
447
468
  } from "./MediaPicker/types";
469
+ export { standardActions, standardActionWords } from "./standardActions";
470
+ export type { StandardAction, StandardActionKind } from "./standardActions";
@@ -101,20 +101,10 @@ export const formCardColors = {
101
101
  * step (boards media-01..04 measure 1px dashed rgb(77,77,77) light /
102
102
  * rgb(133,133,133) dark) — the `$borderColor` hairline tier measured
103
103
  * near-invisible as a dash. Picked files ride IN-ZONE rows parted by the
104
- * same dashed hairline; each row carries a filled $color12 remove disc with
105
- * the inverse ✕ ($color1). Disc hover/press step back down the ramp so the
106
- * dark chrome never flashes the light state-layer fills.
104
+ * same dashed hairline; each row's remove is a bare ✕ (LC-176 ICON-BUTTON).
107
105
  */
108
106
  export const formDropzoneColors = {
109
107
  border: "$color9",
110
- removeDisc: {
111
- background: {
112
- base: "$color12",
113
- hover: "$color11",
114
- press: "$color10",
115
- },
116
- ink: "$color1",
117
- },
118
108
  // Attachments / media-01 transfer bar (MPO-55): 11px pill, $color4 track,
119
109
  // $color11 fill — the same pair the measured attachments row draws.
120
110
  progress: {
@@ -0,0 +1,27 @@
1
+ import { OVERLAY_BREAKPOINT } from "@multiplatform.one/theme";
2
+ import { describe, expect, it } from "vitest";
3
+ import { SHEET_PANEL_WIDTH, overlaySizeClass, sheetPanelWidth } from "./overlaySizeClass";
4
+
5
+ describe("overlaySizeClass (FZ-8116)", () => {
6
+ it.each([
7
+ ["iPad Slide Over", 320, "compact"],
8
+ ["iPhone", 390, "compact"],
9
+ ["iPhone Pro Max", 440, "compact"],
10
+ ["the web pivot itself", OVERLAY_BREAKPOINT, "compact"],
11
+ ["iPad mini portrait", 744, "regular"],
12
+ ["iPad Air portrait", 820, "regular"],
13
+ ["iPad Pro landscape", 1366, "regular"],
14
+ ])("%s (%ipt) is %s", (_name, width, expected) => {
15
+ expect(overlaySizeClass(width)).toBe(expected);
16
+ });
17
+ });
18
+
19
+ describe("sheetPanelWidth", () => {
20
+ it("caps the panel where the window has room", () => {
21
+ expect(sheetPanelWidth(820)).toBe(SHEET_PANEL_WIDTH);
22
+ expect(sheetPanelWidth(1366)).toBe(SHEET_PANEL_WIDTH);
23
+ });
24
+ it("spans a window narrower than the cap, as the compact sheet does", () => {
25
+ expect(sheetPanelWidth(600)).toBe(600);
26
+ });
27
+ });
@@ -0,0 +1,36 @@
1
+ import { OVERLAY_BREAKPOINT, layoutBreakpoints } from "@multiplatform.one/theme";
2
+ import { useWindowDimensions } from "react-native";
3
+
4
+ /**
5
+ * The horizontal size class an overlay presents for (FZ-8116, LC-266). It is
6
+ * read from the window, not the device: an iPad in Slide Over or a narrow
7
+ * Split View is compact, an iPad full screen or a wide Android window is
8
+ * regular. The pivot is the web's, so a native window and a browser at the
9
+ * same width draw the same overlay.
10
+ *
11
+ * - `"compact"`: the bottom sheet (FloatingPanel, SheetModal).
12
+ * - `"regular"`: a FloatingPanel opens over its field (LC-105, LC-112), and a
13
+ * SheetModal is a bottom panel, width-capped and centred, that slides up.
14
+ */
15
+ export type OverlaySizeClass = "compact" | "regular";
16
+
17
+ export function overlaySizeClass(windowWidth: number): OverlaySizeClass {
18
+ return windowWidth > OVERLAY_BREAKPOINT ? "regular" : "compact";
19
+ }
20
+
21
+ export function useOverlaySizeClass(): OverlaySizeClass {
22
+ return overlaySizeClass(useWindowDimensions().width);
23
+ }
24
+
25
+ /**
26
+ * The widest a regular-width sheet panel draws (FZ-8116): a bottom panel that
27
+ * slides up like the compact sheet, centred, never a wall across an iPad.
28
+ * Drover's composer sheets set the number, and it is the overlay pivot's own
29
+ * width (LC-28), so every regular-width window is wider than the panel.
30
+ */
31
+ export const SHEET_PANEL_WIDTH = layoutBreakpoints.medium;
32
+
33
+ /** The sheet panel's width in a window: the cap, or the whole window below it. */
34
+ export function sheetPanelWidth(windowWidth: number): number {
35
+ return Math.max(0, Math.min(SHEET_PANEL_WIDTH, windowWidth));
36
+ }
@@ -0,0 +1,82 @@
1
+ import { createContext, useContext, useSyncExternalStore, type ReactNode } from "react";
2
+
3
+ /**
4
+ * A sheet's own navigation stack (LC-262, FZ-7830 round 3). A long choice list
5
+ * inside a sheet is a Settings row that pushes its checkmark list here, inside
6
+ * the same sheet, instead of floating a menu over the field (HIG: navigation
7
+ * within a sheet). The sheet renders the top page in place of its body, with a
8
+ * back control that pops it.
9
+ */
10
+ export interface SheetPage {
11
+ id: string;
12
+ title: string;
13
+ content: ReactNode;
14
+ }
15
+
16
+ export interface SheetNavigationStore {
17
+ subscribe: (listener: () => void) => () => void;
18
+ getPages: () => readonly SheetPage[];
19
+ has: (id: string) => boolean;
20
+ push: (page: SheetPage) => void;
21
+ update: (page: SheetPage) => void;
22
+ remove: (id: string) => void;
23
+ pop: () => void;
24
+ }
25
+
26
+ export function createSheetNavigationStore(): SheetNavigationStore {
27
+ let pages: readonly SheetPage[] = [];
28
+ const listeners = new Set<() => void>();
29
+ const set = (next: readonly SheetPage[]) => {
30
+ pages = next;
31
+ for (const listener of listeners) listener();
32
+ };
33
+ return {
34
+ subscribe(listener) {
35
+ listeners.add(listener);
36
+ return () => listeners.delete(listener);
37
+ },
38
+ getPages: () => pages,
39
+ has: (id) => pages.some((page) => page.id === id),
40
+ push(page) {
41
+ set([...pages.filter((p) => p.id !== page.id), page]);
42
+ },
43
+ update(page) {
44
+ if (!pages.some((p) => p.id === page.id)) return;
45
+ set(pages.map((p) => (p.id === page.id ? page : p)));
46
+ },
47
+ remove(id) {
48
+ if (!pages.some((p) => p.id === id)) return;
49
+ set(pages.filter((p) => p.id !== id));
50
+ },
51
+ pop() {
52
+ if (pages.length) set(pages.slice(0, -1));
53
+ },
54
+ };
55
+ }
56
+
57
+ const SheetNavigationContext = createContext<SheetNavigationStore | undefined>(undefined);
58
+
59
+ export const SheetNavigationProvider = SheetNavigationContext.Provider;
60
+
61
+ /** The navigation stack of the sheet this subtree sits in, or undefined outside one. */
62
+ export function useSheetNavigation(): SheetNavigationStore | undefined {
63
+ return useContext(SheetNavigationContext);
64
+ }
65
+
66
+ const noPages: readonly SheetPage[] = [];
67
+ const noSubscribe = () => () => {};
68
+
69
+ /** The pages pushed on `store`, oldest first. */
70
+ export function useSheetPages(store: SheetNavigationStore | undefined): readonly SheetPage[] {
71
+ return useSyncExternalStore(
72
+ store?.subscribe ?? noSubscribe,
73
+ store ? store.getPages : () => noPages,
74
+ store ? store.getPages : () => noPages,
75
+ );
76
+ }
77
+
78
+ /** Whether the page `id` is on `store`. */
79
+ export function useSheetPageOpen(store: SheetNavigationStore | undefined, id: string): boolean {
80
+ const has = () => store?.has(id) ?? false;
81
+ return useSyncExternalStore(store?.subscribe ?? noSubscribe, has, has);
82
+ }
@@ -0,0 +1,10 @@
1
+ import type { SystemSegmentedControlComponent, SystemSliderComponent } from "./systemControls";
2
+
3
+ /** GNOME: the MPO slider and segmented control are the platform form. */
4
+ export function loadSystemSlider(): SystemSliderComponent | null {
5
+ return null;
6
+ }
7
+
8
+ export function loadSystemSegmentedControl(): SystemSegmentedControlComponent | null {
9
+ return null;
10
+ }
@@ -0,0 +1,52 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { loadSystemModule } from "./systemControlModules.native";
3
+
4
+ const SystemView = () => null;
5
+ const registry = (has: (name: string) => boolean) => ({ hasViewManagerConfig: vi.fn(has) });
6
+
7
+ // LC-266 (FZ-8118, FZ-8119). An OTA reaches binaries built before a module
8
+ // was added: the JS is in the bundle but the native view is not, and
9
+ // rendering it would crash. A module counts only when both are there.
10
+ describe("loadSystemModule", () => {
11
+ it("returns the component when the JS and the native view are both present", () => {
12
+ const views = registry(() => true);
13
+ expect(loadSystemModule(() => ({ default: SystemView }), "RNCSlider", views)).toBe(SystemView);
14
+ expect(views.hasViewManagerConfig).toHaveBeenCalledWith("RNCSlider");
15
+ });
16
+
17
+ it("returns null when the binary lacks the native view", () => {
18
+ const views = registry(() => false);
19
+ expect(loadSystemModule(() => ({ default: SystemView }), "RNCSlider", views)).toBeNull();
20
+ });
21
+
22
+ it("returns null when the package is not installed", () => {
23
+ const missing = () => {
24
+ throw new Error("Cannot find module '@react-native-segmented-control/segmented-control'");
25
+ };
26
+ expect(
27
+ loadSystemModule(
28
+ missing,
29
+ "RNCSegmentedControl",
30
+ registry(() => true),
31
+ ),
32
+ ).toBeNull();
33
+ expect(
34
+ loadSystemModule(
35
+ () => undefined,
36
+ "RNCSegmentedControl",
37
+ registry(() => true),
38
+ ),
39
+ ).toBeNull();
40
+ });
41
+
42
+ it("returns null when the registry lookup throws", () => {
43
+ const views = registry(() => {
44
+ throw new Error("unstable_hasComponent: Global function is not registered");
45
+ });
46
+ expect(loadSystemModule(() => ({ default: SystemView }), "RNCSlider", views)).toBeNull();
47
+ });
48
+
49
+ it("returns null when the registry has no lookup at all", () => {
50
+ expect(loadSystemModule(() => ({ default: SystemView }), "RNCSlider", {})).toBeNull();
51
+ });
52
+ });
@@ -0,0 +1,66 @@
1
+ import { UIManager } from "react-native";
2
+ import type { SystemSegmentedControlComponent, SystemSliderComponent } from "./systemControls";
3
+
4
+ /**
5
+ * The system slider and segmented control are optional native modules: Kitchen
6
+ * Sink ships `@react-native-community/slider`, One does not yet, and neither
7
+ * ships `@react-native-segmented-control/segmented-control`. The JS can be in
8
+ * the bundle while the binary lacks the view (an OTA on an older build), so a
9
+ * module counts only when its native view is registered too. Anything else
10
+ * returns null and the field keeps the MPO control. Each `require` sits inside
11
+ * its own `try` so Metro bundles a missing package as an optional dependency
12
+ * instead of failing the build, as in dateTimePickerLoader.ts (FZ-7357).
13
+ */
14
+ export interface NativeViewRegistry {
15
+ hasViewManagerConfig?: (name: string) => boolean;
16
+ }
17
+
18
+ function hasNativeView(name: string, registry: NativeViewRegistry): boolean {
19
+ try {
20
+ return Boolean(registry.hasViewManagerConfig?.(name));
21
+ } catch {
22
+ return false;
23
+ }
24
+ }
25
+
26
+ export function loadSystemModule<T>(
27
+ requireModule: () => { default?: T } | undefined,
28
+ viewName: string,
29
+ registry: NativeViewRegistry = UIManager,
30
+ ): T | null {
31
+ try {
32
+ const component = requireModule()?.default;
33
+ return component && hasNativeView(viewName, registry) ? component : null;
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+
39
+ let slider: SystemSliderComponent | null | undefined;
40
+ let segmentedControl: SystemSegmentedControlComponent | null | undefined;
41
+
42
+ export function loadSystemSlider(): SystemSliderComponent | null {
43
+ if (slider === undefined) {
44
+ slider = loadSystemModule<SystemSliderComponent>(() => {
45
+ try {
46
+ return require("@react-native-community/slider");
47
+ } catch {
48
+ return undefined;
49
+ }
50
+ }, "RNCSlider");
51
+ }
52
+ return slider;
53
+ }
54
+
55
+ export function loadSystemSegmentedControl(): SystemSegmentedControlComponent | null {
56
+ if (segmentedControl === undefined) {
57
+ segmentedControl = loadSystemModule<SystemSegmentedControlComponent>(() => {
58
+ try {
59
+ return require("@react-native-segmented-control/segmented-control");
60
+ } catch {
61
+ return undefined;
62
+ }
63
+ }, "RNCSegmentedControl");
64
+ }
65
+ return segmentedControl;
66
+ }
@@ -0,0 +1,10 @@
1
+ import type { SystemSegmentedControlComponent, SystemSliderComponent } from "./systemControls";
2
+
3
+ /** Web: the MPO slider and segmented control are the platform form. */
4
+ export function loadSystemSlider(): SystemSliderComponent | null {
5
+ return null;
6
+ }
7
+
8
+ export function loadSystemSegmentedControl(): SystemSegmentedControlComponent | null {
9
+ return null;
10
+ }