@12-apps/ui 6.55.0 → 6.56.1

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 (435) hide show
  1. package/NATIVE.md +5 -2
  2. package/components-catalog.md +6 -0
  3. package/components-guidelines.md +18 -2
  4. package/components.tasks.md +3 -0
  5. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
  6. package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
  7. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  8. package/dist/_internal/components/data-display/Badge/Badge.js +1 -1
  9. package/dist/_internal/components/data-display/Badge/Badge.styles.js +1 -1
  10. package/dist/_internal/components/data-display/Badge/BadgeContent.js +1 -1
  11. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +1 -1
  12. package/dist/_internal/components/data-display/Carousel/Carousel.js +3 -3
  13. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +1 -1
  14. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +1 -1
  15. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  16. package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -7
  17. package/dist/_internal/components/data-display/Chart/chart-context.js +1 -1
  18. package/dist/_internal/components/data-display/Chart/chart-internals.js +1 -1
  19. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  20. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  21. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  22. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +48 -48
  23. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +62 -62
  24. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +4 -4
  25. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +4 -4
  26. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +8 -8
  27. package/dist/_internal/components/data-display/DataViews/base-card.js +3 -3
  28. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
  29. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
  30. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
  31. package/dist/_internal/components/data-display/DataViews/base-list-card.js +10 -10
  32. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +14 -14
  33. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +1 -1
  34. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +20 -20
  35. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +7 -7
  36. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +43 -43
  37. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +20 -20
  38. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +17 -17
  39. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +18 -18
  40. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  41. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  42. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +8 -8
  43. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +13 -13
  44. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +7 -7
  45. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  46. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
  47. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +14 -14
  48. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +9 -9
  49. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +16 -16
  50. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +4 -4
  51. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
  52. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +5 -5
  53. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  54. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +3 -3
  55. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +8 -8
  56. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  57. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +1 -1
  58. package/dist/_internal/components/data-display/Sheet/Sheet.js +5 -5
  59. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +1 -1
  60. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  61. package/dist/_internal/components/data-display/Table/Table.js +3 -3
  62. package/dist/_internal/components/data-display/index.js +53 -53
  63. package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
  64. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +6 -6
  65. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +1 -1
  66. package/dist/_internal/components/feedback/index.js +9 -9
  67. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +2 -2
  68. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +8 -8
  69. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
  70. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
  71. package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
  72. package/dist/_internal/components/form/Calendar/Calendar.js +6 -6
  73. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  74. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  75. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +5 -5
  76. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +3 -3
  77. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +2 -2
  78. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +10 -10
  79. package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
  80. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +3 -3
  81. package/dist/_internal/components/form/Command/Command.js +1 -1
  82. package/dist/_internal/components/form/Command/Command.styles.js +1 -1
  83. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +9 -9
  84. package/dist/_internal/components/form/Label/Label.js +1 -1
  85. package/dist/_internal/components/form/Label/Label.styles.js +1 -1
  86. package/dist/_internal/components/form/Menubar/Menubar.item.js +1 -1
  87. package/dist/_internal/components/form/Menubar/Menubar.js +3 -3
  88. package/dist/_internal/components/form/Menubar/Menubar.styles.js +1 -1
  89. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +1 -1
  90. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +2 -2
  91. package/dist/_internal/components/form/Switch/Switch.js +4 -4
  92. package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
  93. package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
  94. package/dist/_internal/components/form/index.js +33 -33
  95. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +11 -11
  96. package/dist/_internal/components/form/total-form/Fields/index.js +17 -17
  97. package/dist/_internal/components/index.js +114 -114
  98. package/dist/_internal/components/layout/Box/Box.js +1 -1
  99. package/dist/_internal/components/layout/Screen/Screen.base.js +8 -0
  100. package/dist/_internal/components/layout/Screen/Screen.base.js.map +1 -0
  101. package/dist/_internal/components/layout/Screen/Screen.js +38 -0
  102. package/dist/_internal/components/layout/Screen/Screen.js.map +1 -0
  103. package/dist/_internal/components/layout/Screen/Screen.types.js +1 -0
  104. package/dist/_internal/components/layout/Screen/Screen.types.js.map +1 -0
  105. package/dist/_internal/components/layout/SettingCard/SettingCard.js +6 -6
  106. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +4 -4
  107. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +5 -5
  108. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +5 -5
  109. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +11 -11
  110. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +10 -10
  111. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +11 -11
  112. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +2 -2
  113. package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
  114. package/dist/_internal/components/layout/Stack/Stack.js +1 -1
  115. package/dist/_internal/components/layout/index.js +23 -23
  116. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +8 -8
  117. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +1 -1
  118. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  119. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +1 -1
  120. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +2 -2
  121. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +1 -1
  122. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +1 -1
  123. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +1 -1
  124. package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js +1 -1
  125. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +1 -1
  126. package/dist/_internal/components/navigation/SectionNav/__stories__/fixtures.js +1 -1
  127. package/dist/_internal/components/navigation/index.js +11 -11
  128. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +1 -1
  129. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +1 -1
  130. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +1 -1
  131. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +1 -1
  132. package/dist/_internal/components/utility/index.js +1 -1
  133. package/dist/_internal/icons/Icon.js +3 -3
  134. package/dist/_internal/icons/paths.generated.js +1 -1
  135. package/dist/_internal/provider/UiProvider.js +1 -1
  136. package/dist/_internal/provider/mui-bridge.js +1 -1
  137. package/dist/_internal/provider/use-ui-theme.js +1 -1
  138. package/dist/_internal/tokens/surfaces.js +1 -1
  139. package/dist/_internal/user-avatar/user-avatar.js +5 -5
  140. package/dist/charts.js +12 -12
  141. package/dist/{chunk-KZHNJ3ZS.js → chunk-2DV64INT.js} +5 -5
  142. package/dist/{chunk-YV3WIBIO.js → chunk-2IKWHUXG.js} +2 -2
  143. package/dist/{chunk-4EJBLJZK.js → chunk-2KGYTJCN.js} +50 -29
  144. package/dist/chunk-2KGYTJCN.js.map +1 -0
  145. package/dist/{chunk-EFLRNSE6.js → chunk-2W2MWEP2.js} +11 -11
  146. package/dist/{chunk-PLOLSGQY.js → chunk-35IEACIJ.js} +2 -2
  147. package/dist/{chunk-ANQRUO3L.js → chunk-3WIA25YQ.js} +10 -10
  148. package/dist/{chunk-KRREZNZF.js → chunk-44JLXXWQ.js} +2 -2
  149. package/dist/{chunk-QGH2FGDD.js → chunk-45PGSVOH.js} +16 -16
  150. package/dist/{chunk-EKKDZK4E.js → chunk-4JBS6NOT.js} +2 -2
  151. package/dist/{chunk-DQKMOGYZ.js → chunk-54PPITTH.js} +4 -4
  152. package/dist/{chunk-LX4GLIWE.js → chunk-573XC4HK.js} +3 -3
  153. package/dist/{chunk-N24K536I.js → chunk-5JWCNQSI.js} +4 -4
  154. package/dist/{chunk-XGNHRONE.js → chunk-5PN5MY2X.js} +4 -4
  155. package/dist/{chunk-WUVVJXUK.js → chunk-5XZEGI35.js} +3 -3
  156. package/dist/{chunk-ALREWFRX.js → chunk-6DGNMASB.js} +4 -4
  157. package/dist/{chunk-P6GIZZLJ.js → chunk-6E4XNOAC.js} +7 -7
  158. package/dist/{chunk-KEVPUBOE.js → chunk-6ZLP7BA7.js} +4 -1
  159. package/dist/chunk-6ZLP7BA7.js.map +1 -0
  160. package/dist/{chunk-5CFEXRQH.js → chunk-7M3DRP7Q.js} +8 -8
  161. package/dist/{chunk-CG5AWO24.js → chunk-7QTZJ2HY.js} +2 -2
  162. package/dist/{chunk-KRQWLYKF.js → chunk-A6EUQDRK.js} +2 -2
  163. package/dist/{chunk-AG3DY5TH.js → chunk-ADSA76T7.js} +2 -2
  164. package/dist/{chunk-T7DQ7RJU.js → chunk-AGXTIW3G.js} +2 -2
  165. package/dist/{chunk-HQIX7A5I.js → chunk-AL3Z24VG.js} +9 -9
  166. package/dist/{chunk-ZF4J3SRM.js → chunk-BQGWY577.js} +3 -3
  167. package/dist/{chunk-MMVAMUZY.js → chunk-C3BRCCHG.js} +4 -4
  168. package/dist/{chunk-DYYQSC2V.js → chunk-CLC4VIOF.js} +2 -2
  169. package/dist/{chunk-Y52BXZO3.js → chunk-CZV6NVCA.js} +9 -9
  170. package/dist/{chunk-KRLBT3IV.js → chunk-DUYPCBI2.js} +3 -3
  171. package/dist/{chunk-DOPD5J2Q.js → chunk-E2WNRYKA.js} +4 -4
  172. package/dist/{chunk-OUXJYKCL.js → chunk-ERTXRK6S.js} +7 -7
  173. package/dist/{chunk-N4BARJEQ.js → chunk-EW55ZS5W.js} +7 -7
  174. package/dist/{chunk-6PU3JYVY.js → chunk-F3AYISXT.js} +4 -4
  175. package/dist/{chunk-VEKTKCSB.js → chunk-FLJ3RIRP.js} +5 -5
  176. package/dist/{chunk-LXYV73TW.js → chunk-G5ORAVSP.js} +5 -5
  177. package/dist/{chunk-AKC5GRJF.js → chunk-G76BNXWE.js} +7 -7
  178. package/dist/{chunk-NPOQSACK.js → chunk-GDT235FP.js} +2 -2
  179. package/dist/{chunk-FTCCTQZB.js → chunk-GI24X7XA.js} +3 -3
  180. package/dist/{chunk-FQUIEXEY.js → chunk-GNBCSTXF.js} +4 -4
  181. package/dist/{chunk-JP32U64U.js → chunk-GWUJIO6Z.js} +2 -2
  182. package/dist/{chunk-NVXRV3PL.js → chunk-GYDUXL3D.js} +7 -7
  183. package/dist/{chunk-DKKINJHC.js → chunk-H4NS5MMP.js} +5 -5
  184. package/dist/{chunk-TSUXEWVX.js → chunk-HFBQCJNP.js} +2 -2
  185. package/dist/chunk-HG2YLNGJ.js +75 -0
  186. package/dist/chunk-HG2YLNGJ.js.map +1 -0
  187. package/dist/{chunk-4JZ6XDVA.js → chunk-I6ESCBY3.js} +2 -2
  188. package/dist/{chunk-CUREVLBT.js → chunk-ICSXPZXT.js} +3 -3
  189. package/dist/{chunk-2ZRZTGWP.js → chunk-ISW5K72V.js} +5 -5
  190. package/dist/{chunk-O3LX26CX.js → chunk-JC244QQF.js} +2 -2
  191. package/dist/{chunk-JF643Q7W.js → chunk-JF5LQOGB.js} +5 -5
  192. package/dist/{chunk-NT73ZLBO.js → chunk-JL77BSOL.js} +5 -5
  193. package/dist/{chunk-HNWNIBCU.js → chunk-JWXGZ4VM.js} +3 -3
  194. package/dist/{chunk-LL5KGYLG.js → chunk-KEKOPD43.js} +7 -7
  195. package/dist/{chunk-CFDWKQZT.js → chunk-KILA7LCC.js} +4 -4
  196. package/dist/{chunk-XTWOHAOT.js → chunk-KKWCAZM6.js} +5 -5
  197. package/dist/{chunk-VCGNH23W.js → chunk-LJKWWXZD.js} +8 -8
  198. package/dist/{chunk-FXZUVZON.js → chunk-LWZ2K225.js} +6 -6
  199. package/dist/{chunk-M24EG6JC.js → chunk-MKAA3YIJ.js} +4 -4
  200. package/dist/{chunk-VSKFRS32.js → chunk-MLCY7TSO.js} +2 -2
  201. package/dist/{chunk-AZ7YT2R4.js → chunk-MLLWGHIX.js} +2 -2
  202. package/dist/{chunk-J6A4ZQWD.js → chunk-N4MR4EMC.js} +5 -5
  203. package/dist/{chunk-TRD26PNE.js → chunk-NXMCTYBN.js} +7 -7
  204. package/dist/{chunk-KWF7C6IZ.js → chunk-NZZ2BTIK.js} +2 -2
  205. package/dist/{chunk-XDITTQIR.js → chunk-OBKUG7BW.js} +5 -5
  206. package/dist/{chunk-SSDYEOU4.js → chunk-OBMPE6PW.js} +5 -5
  207. package/dist/{chunk-XLRBJEYA.js → chunk-OGBLNORM.js} +5 -5
  208. package/dist/{chunk-SNFULDT7.js → chunk-PIIPEXRM.js} +2 -2
  209. package/dist/{chunk-M5GJYVDM.js → chunk-Q5G2EC24.js} +8 -8
  210. package/dist/chunk-QYCKZWBU.js +7 -0
  211. package/dist/chunk-QYCKZWBU.js.map +1 -0
  212. package/dist/{chunk-GOWBYHYW.js → chunk-R6SBP5M5.js} +4 -4
  213. package/dist/{chunk-AYRMZC5F.js → chunk-RBHBJDOZ.js} +4 -4
  214. package/dist/{chunk-RPKUZDRY.js → chunk-SE5WHKCB.js} +6 -6
  215. package/dist/{chunk-YUPUJZ2X.js → chunk-SIWXMNQT.js} +4 -4
  216. package/dist/{chunk-U2TC4DID.js → chunk-SJTQW6JK.js} +2 -2
  217. package/dist/{chunk-NMXTZSDE.js → chunk-T2S7NIUG.js} +3 -3
  218. package/dist/{chunk-V7APSQB4.js → chunk-TWWA7QPA.js} +7 -7
  219. package/dist/{chunk-RHCRHZ6D.js → chunk-TZ23DNKY.js} +9 -3
  220. package/dist/{chunk-RHCRHZ6D.js.map → chunk-TZ23DNKY.js.map} +1 -1
  221. package/dist/{chunk-YXE4FISF.js → chunk-ULTQIVF3.js} +5 -5
  222. package/dist/{chunk-PALISWDH.js → chunk-UNJMMLO7.js} +8 -8
  223. package/dist/{chunk-XBXJKYUN.js → chunk-UPAFHAF4.js} +4 -4
  224. package/dist/{chunk-OKBEWR6L.js → chunk-WSUHTLOA.js} +6 -6
  225. package/dist/{chunk-GMH4TYPP.js → chunk-XM2YEXGO.js} +9 -9
  226. package/dist/{chunk-R53ZOW4B.js → chunk-XP522FFM.js} +3 -3
  227. package/dist/{chunk-NRHQJEHB.js → chunk-XTHDWW4M.js} +5 -5
  228. package/dist/{chunk-ZI3AJEZS.js → chunk-Y2HCYT5W.js} +2 -2
  229. package/dist/{chunk-5GXLWNQ7.js → chunk-Y4T33THY.js} +4 -4
  230. package/dist/{chunk-TK5LNXMB.js → chunk-YCYGUTQX.js} +9 -9
  231. package/dist/{chunk-ANVIO75O.js → chunk-YRXFJIR5.js} +4 -4
  232. package/dist/{chunk-5WJFCQFN.js → chunk-YXIVQFNW.js} +4 -4
  233. package/dist/{chunk-WC3W36AM.js → chunk-ZOUWHGV3.js} +4 -4
  234. package/dist/data-display/AsyncStateContainer.js +4 -4
  235. package/dist/data-display/Avatar.js +4 -4
  236. package/dist/data-display/Badge.js +1 -1
  237. package/dist/data-display/CardKit.js +7 -7
  238. package/dist/data-display/Carousel.js +3 -3
  239. package/dist/data-display/Chart.js +12 -12
  240. package/dist/data-display/DataGrid.js +2 -2
  241. package/dist/data-display/DataViews.js +80 -80
  242. package/dist/data-display/FleetMap.js +16 -16
  243. package/dist/data-display/LazyImage.js +3 -3
  244. package/dist/data-display/Lightbox.js +5 -5
  245. package/dist/data-display/LoadingState.js +3 -3
  246. package/dist/data-display/MapPreview.js +8 -8
  247. package/dist/data-display/Progress.js +2 -2
  248. package/dist/data-display/Sheet.js +5 -5
  249. package/dist/data-display/StatCard.js +3 -3
  250. package/dist/data-display/Table.js +3 -3
  251. package/dist/en-US.js +14 -14
  252. package/dist/feedback/Dialog.js +3 -3
  253. package/dist/feedback/StackedModal.js +6 -6
  254. package/dist/form/AddressAutocomplete.js +8 -8
  255. package/dist/form/Autocomplete.js +2 -2
  256. package/dist/form/Calendar.js +6 -6
  257. package/dist/form/CategorySelect.js +10 -10
  258. package/dist/form/Checkbox.js +2 -2
  259. package/dist/form/CodeEditor.js +3 -3
  260. package/dist/form/Command.js +1 -1
  261. package/dist/form/DateRangePicker.js +9 -9
  262. package/dist/form/Label.js +1 -1
  263. package/dist/form/Menubar.js +3 -3
  264. package/dist/form/RichTextEditor.js +2 -2
  265. package/dist/form/Switch.js +4 -4
  266. package/dist/form/total-form.js +24 -24
  267. package/dist/icons.js +3 -3
  268. package/dist/layout/Box.js +1 -1
  269. package/dist/layout/ContentToolbar.js +7 -7
  270. package/dist/layout/Screen.js +38 -0
  271. package/dist/layout/Screen.js.map +1 -0
  272. package/dist/layout/SettingCard.js +14 -14
  273. package/dist/layout/SettingsLayout.js +2 -2
  274. package/dist/layout/Skeleton.js +2 -2
  275. package/dist/layout/Stack.js +1 -1
  276. package/dist/locales.js +17 -17
  277. package/dist/native/chunks/chunk-AAY5TJ6W.js +27 -0
  278. package/dist/native/chunks/chunk-AAY5TJ6W.js.map +1 -0
  279. package/dist/native/chunks/{chunk-F4NDP3G5.js → chunk-AOXH3Z2S.js} +2 -21
  280. package/dist/native/chunks/chunk-AOXH3Z2S.js.map +1 -0
  281. package/dist/native/chunks/{chunk-4JAP6O2Y.js → chunk-EZO2KJF7.js} +4 -1
  282. package/dist/native/chunks/chunk-EZO2KJF7.js.map +1 -0
  283. package/dist/native/chunks/{chunk-RJOHCM2O.js → chunk-QGTZGL7P.js} +2 -2
  284. package/dist/native/data-display/Alert.js +1 -1
  285. package/dist/native/data-display/Avatar.js +1 -1
  286. package/dist/native/data-display/Badge.js +1 -1
  287. package/dist/native/data-display/Chip.js +1 -1
  288. package/dist/native/data-display/EmptyState.js +2 -2
  289. package/dist/native/data-display/ErrorState.js +1 -1
  290. package/dist/native/data-display/FleetMap.js +2 -2
  291. package/dist/native/feedback/Dialog.js +1 -1
  292. package/dist/native/form/Checkbox.js +1 -1
  293. package/dist/native/form/Select.js +1 -1
  294. package/dist/native/icons.js +1 -1
  295. package/dist/native/layout/Box.js +4 -2
  296. package/dist/native/layout/Screen.js +78 -0
  297. package/dist/native/layout/Screen.js.map +1 -0
  298. package/dist/native/layout/Stack.js +2 -1
  299. package/dist/native/layout/Stack.js.map +1 -1
  300. package/dist/navigation/AppHeader.js +8 -8
  301. package/dist/navigation/CommandPalette.js +2 -2
  302. package/dist/navigation/SectionNav.js +2 -2
  303. package/dist/provider.js +1 -1
  304. package/dist/pt-BR.js +5 -5
  305. package/dist/tokens.js +1 -1
  306. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  307. package/dist/types/components/layout/Screen/Screen.base.d.ts +16 -0
  308. package/dist/types/components/layout/Screen/Screen.base.d.ts.map +1 -0
  309. package/dist/types/components/layout/Screen/Screen.d.ts +7 -0
  310. package/dist/types/components/layout/Screen/Screen.d.ts.map +1 -0
  311. package/dist/types/components/layout/Screen/Screen.types.d.ts +9 -0
  312. package/dist/types/components/layout/Screen/Screen.types.d.ts.map +1 -0
  313. package/dist/types/components/layout/Screen/index.d.ts +3 -0
  314. package/dist/types/components/layout/Screen/index.d.ts.map +1 -0
  315. package/dist/types/icons/paths.generated.d.ts +3 -0
  316. package/dist/types/icons/paths.generated.d.ts.map +1 -1
  317. package/dist/types/tokens/surfaces.d.ts +4 -0
  318. package/dist/types/tokens/surfaces.d.ts.map +1 -1
  319. package/dist/types-native/components/layout/Screen/Screen.base.d.ts +16 -0
  320. package/dist/types-native/components/layout/Screen/Screen.base.d.ts.map +1 -0
  321. package/dist/types-native/components/layout/Screen/Screen.native.d.ts +7 -0
  322. package/dist/types-native/components/layout/Screen/Screen.native.d.ts.map +1 -0
  323. package/dist/types-native/components/layout/Screen/Screen.types.native.d.ts +9 -0
  324. package/dist/types-native/components/layout/Screen/Screen.types.native.d.ts.map +1 -0
  325. package/dist/types-native/components/layout/Screen/index.native.d.ts +3 -0
  326. package/dist/types-native/components/layout/Screen/index.native.d.ts.map +1 -0
  327. package/dist/types-native/icons/paths.generated.d.ts +3 -0
  328. package/dist/types-native/icons/paths.generated.d.ts.map +1 -1
  329. package/dist/user-avatar.js +5 -5
  330. package/dist/utility/WorkflowStep.js +1 -1
  331. package/package.json +16 -3
  332. package/src/components/feedback/StackedModal/StackedModal.md +17 -2
  333. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +19 -3
  334. package/src/components/layout/Screen/NATIVE-NOTES.md +2 -0
  335. package/src/components/layout/Screen/Screen.base.ts +20 -0
  336. package/src/components/layout/Screen/Screen.md +71 -0
  337. package/src/components/layout/Screen/Screen.native.tsx +56 -0
  338. package/src/components/layout/Screen/Screen.tsx +41 -0
  339. package/src/components/layout/Screen/Screen.types.native.ts +13 -0
  340. package/src/components/layout/Screen/Screen.types.ts +10 -0
  341. package/src/components/layout/Screen/index.native.ts +2 -0
  342. package/src/components/layout/Screen/index.ts +2 -0
  343. package/src/components/layout/Screen/tests.md +64 -0
  344. package/src/components/layout/Screen/track.md +26 -0
  345. package/src/icons/glyphs.json +3 -0
  346. package/src/icons/paths.generated.ts +3 -0
  347. package/src/tokens/surfaces.ts +12 -2
  348. package/dist/chunk-4EJBLJZK.js.map +0 -1
  349. package/dist/chunk-KEVPUBOE.js.map +0 -1
  350. package/dist/native/chunks/chunk-4JAP6O2Y.js.map +0 -1
  351. package/dist/native/chunks/chunk-F4NDP3G5.js.map +0 -1
  352. /package/dist/{chunk-KZHNJ3ZS.js.map → chunk-2DV64INT.js.map} +0 -0
  353. /package/dist/{chunk-YV3WIBIO.js.map → chunk-2IKWHUXG.js.map} +0 -0
  354. /package/dist/{chunk-EFLRNSE6.js.map → chunk-2W2MWEP2.js.map} +0 -0
  355. /package/dist/{chunk-PLOLSGQY.js.map → chunk-35IEACIJ.js.map} +0 -0
  356. /package/dist/{chunk-ANQRUO3L.js.map → chunk-3WIA25YQ.js.map} +0 -0
  357. /package/dist/{chunk-KRREZNZF.js.map → chunk-44JLXXWQ.js.map} +0 -0
  358. /package/dist/{chunk-QGH2FGDD.js.map → chunk-45PGSVOH.js.map} +0 -0
  359. /package/dist/{chunk-EKKDZK4E.js.map → chunk-4JBS6NOT.js.map} +0 -0
  360. /package/dist/{chunk-DQKMOGYZ.js.map → chunk-54PPITTH.js.map} +0 -0
  361. /package/dist/{chunk-LX4GLIWE.js.map → chunk-573XC4HK.js.map} +0 -0
  362. /package/dist/{chunk-N24K536I.js.map → chunk-5JWCNQSI.js.map} +0 -0
  363. /package/dist/{chunk-XGNHRONE.js.map → chunk-5PN5MY2X.js.map} +0 -0
  364. /package/dist/{chunk-WUVVJXUK.js.map → chunk-5XZEGI35.js.map} +0 -0
  365. /package/dist/{chunk-ALREWFRX.js.map → chunk-6DGNMASB.js.map} +0 -0
  366. /package/dist/{chunk-P6GIZZLJ.js.map → chunk-6E4XNOAC.js.map} +0 -0
  367. /package/dist/{chunk-5CFEXRQH.js.map → chunk-7M3DRP7Q.js.map} +0 -0
  368. /package/dist/{chunk-CG5AWO24.js.map → chunk-7QTZJ2HY.js.map} +0 -0
  369. /package/dist/{chunk-KRQWLYKF.js.map → chunk-A6EUQDRK.js.map} +0 -0
  370. /package/dist/{chunk-AG3DY5TH.js.map → chunk-ADSA76T7.js.map} +0 -0
  371. /package/dist/{chunk-T7DQ7RJU.js.map → chunk-AGXTIW3G.js.map} +0 -0
  372. /package/dist/{chunk-HQIX7A5I.js.map → chunk-AL3Z24VG.js.map} +0 -0
  373. /package/dist/{chunk-ZF4J3SRM.js.map → chunk-BQGWY577.js.map} +0 -0
  374. /package/dist/{chunk-MMVAMUZY.js.map → chunk-C3BRCCHG.js.map} +0 -0
  375. /package/dist/{chunk-DYYQSC2V.js.map → chunk-CLC4VIOF.js.map} +0 -0
  376. /package/dist/{chunk-Y52BXZO3.js.map → chunk-CZV6NVCA.js.map} +0 -0
  377. /package/dist/{chunk-KRLBT3IV.js.map → chunk-DUYPCBI2.js.map} +0 -0
  378. /package/dist/{chunk-DOPD5J2Q.js.map → chunk-E2WNRYKA.js.map} +0 -0
  379. /package/dist/{chunk-OUXJYKCL.js.map → chunk-ERTXRK6S.js.map} +0 -0
  380. /package/dist/{chunk-N4BARJEQ.js.map → chunk-EW55ZS5W.js.map} +0 -0
  381. /package/dist/{chunk-6PU3JYVY.js.map → chunk-F3AYISXT.js.map} +0 -0
  382. /package/dist/{chunk-VEKTKCSB.js.map → chunk-FLJ3RIRP.js.map} +0 -0
  383. /package/dist/{chunk-LXYV73TW.js.map → chunk-G5ORAVSP.js.map} +0 -0
  384. /package/dist/{chunk-AKC5GRJF.js.map → chunk-G76BNXWE.js.map} +0 -0
  385. /package/dist/{chunk-NPOQSACK.js.map → chunk-GDT235FP.js.map} +0 -0
  386. /package/dist/{chunk-FTCCTQZB.js.map → chunk-GI24X7XA.js.map} +0 -0
  387. /package/dist/{chunk-FQUIEXEY.js.map → chunk-GNBCSTXF.js.map} +0 -0
  388. /package/dist/{chunk-JP32U64U.js.map → chunk-GWUJIO6Z.js.map} +0 -0
  389. /package/dist/{chunk-NVXRV3PL.js.map → chunk-GYDUXL3D.js.map} +0 -0
  390. /package/dist/{chunk-DKKINJHC.js.map → chunk-H4NS5MMP.js.map} +0 -0
  391. /package/dist/{chunk-TSUXEWVX.js.map → chunk-HFBQCJNP.js.map} +0 -0
  392. /package/dist/{chunk-4JZ6XDVA.js.map → chunk-I6ESCBY3.js.map} +0 -0
  393. /package/dist/{chunk-CUREVLBT.js.map → chunk-ICSXPZXT.js.map} +0 -0
  394. /package/dist/{chunk-2ZRZTGWP.js.map → chunk-ISW5K72V.js.map} +0 -0
  395. /package/dist/{chunk-O3LX26CX.js.map → chunk-JC244QQF.js.map} +0 -0
  396. /package/dist/{chunk-JF643Q7W.js.map → chunk-JF5LQOGB.js.map} +0 -0
  397. /package/dist/{chunk-NT73ZLBO.js.map → chunk-JL77BSOL.js.map} +0 -0
  398. /package/dist/{chunk-HNWNIBCU.js.map → chunk-JWXGZ4VM.js.map} +0 -0
  399. /package/dist/{chunk-LL5KGYLG.js.map → chunk-KEKOPD43.js.map} +0 -0
  400. /package/dist/{chunk-CFDWKQZT.js.map → chunk-KILA7LCC.js.map} +0 -0
  401. /package/dist/{chunk-XTWOHAOT.js.map → chunk-KKWCAZM6.js.map} +0 -0
  402. /package/dist/{chunk-VCGNH23W.js.map → chunk-LJKWWXZD.js.map} +0 -0
  403. /package/dist/{chunk-FXZUVZON.js.map → chunk-LWZ2K225.js.map} +0 -0
  404. /package/dist/{chunk-M24EG6JC.js.map → chunk-MKAA3YIJ.js.map} +0 -0
  405. /package/dist/{chunk-VSKFRS32.js.map → chunk-MLCY7TSO.js.map} +0 -0
  406. /package/dist/{chunk-AZ7YT2R4.js.map → chunk-MLLWGHIX.js.map} +0 -0
  407. /package/dist/{chunk-J6A4ZQWD.js.map → chunk-N4MR4EMC.js.map} +0 -0
  408. /package/dist/{chunk-TRD26PNE.js.map → chunk-NXMCTYBN.js.map} +0 -0
  409. /package/dist/{chunk-KWF7C6IZ.js.map → chunk-NZZ2BTIK.js.map} +0 -0
  410. /package/dist/{chunk-XDITTQIR.js.map → chunk-OBKUG7BW.js.map} +0 -0
  411. /package/dist/{chunk-SSDYEOU4.js.map → chunk-OBMPE6PW.js.map} +0 -0
  412. /package/dist/{chunk-XLRBJEYA.js.map → chunk-OGBLNORM.js.map} +0 -0
  413. /package/dist/{chunk-SNFULDT7.js.map → chunk-PIIPEXRM.js.map} +0 -0
  414. /package/dist/{chunk-M5GJYVDM.js.map → chunk-Q5G2EC24.js.map} +0 -0
  415. /package/dist/{chunk-GOWBYHYW.js.map → chunk-R6SBP5M5.js.map} +0 -0
  416. /package/dist/{chunk-AYRMZC5F.js.map → chunk-RBHBJDOZ.js.map} +0 -0
  417. /package/dist/{chunk-RPKUZDRY.js.map → chunk-SE5WHKCB.js.map} +0 -0
  418. /package/dist/{chunk-YUPUJZ2X.js.map → chunk-SIWXMNQT.js.map} +0 -0
  419. /package/dist/{chunk-U2TC4DID.js.map → chunk-SJTQW6JK.js.map} +0 -0
  420. /package/dist/{chunk-NMXTZSDE.js.map → chunk-T2S7NIUG.js.map} +0 -0
  421. /package/dist/{chunk-V7APSQB4.js.map → chunk-TWWA7QPA.js.map} +0 -0
  422. /package/dist/{chunk-YXE4FISF.js.map → chunk-ULTQIVF3.js.map} +0 -0
  423. /package/dist/{chunk-PALISWDH.js.map → chunk-UNJMMLO7.js.map} +0 -0
  424. /package/dist/{chunk-XBXJKYUN.js.map → chunk-UPAFHAF4.js.map} +0 -0
  425. /package/dist/{chunk-OKBEWR6L.js.map → chunk-WSUHTLOA.js.map} +0 -0
  426. /package/dist/{chunk-GMH4TYPP.js.map → chunk-XM2YEXGO.js.map} +0 -0
  427. /package/dist/{chunk-R53ZOW4B.js.map → chunk-XP522FFM.js.map} +0 -0
  428. /package/dist/{chunk-NRHQJEHB.js.map → chunk-XTHDWW4M.js.map} +0 -0
  429. /package/dist/{chunk-ZI3AJEZS.js.map → chunk-Y2HCYT5W.js.map} +0 -0
  430. /package/dist/{chunk-5GXLWNQ7.js.map → chunk-Y4T33THY.js.map} +0 -0
  431. /package/dist/{chunk-TK5LNXMB.js.map → chunk-YCYGUTQX.js.map} +0 -0
  432. /package/dist/{chunk-ANVIO75O.js.map → chunk-YRXFJIR5.js.map} +0 -0
  433. /package/dist/{chunk-5WJFCQFN.js.map → chunk-YXIVQFNW.js.map} +0 -0
  434. /package/dist/{chunk-WC3W36AM.js.map → chunk-ZOUWHGV3.js.map} +0 -0
  435. /package/dist/native/chunks/{chunk-RJOHCM2O.js.map → chunk-QGTZGL7P.js.map} +0 -0
@@ -0,0 +1,16 @@
1
+ import type { BoxBaseProps } from '../Box/Box.base';
2
+ /** Physical screen edges, independent of a native dependency. */
3
+ export type ScreenEdge = 'top' | 'right' | 'bottom' | 'left';
4
+ export declare const SCREEN_EDGES: readonly ScreenEdge[];
5
+ /** Padding and gap apply to the content, inside the selected safe-area edges. */
6
+ export interface ScreenBaseProps extends Pick<BoxBaseProps, 'children' | 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'gap' | 'bg' | 'testID' | 'dataTestId'> {
7
+ /** Vertical scrolling; turn off when a child owns scrolling. Default true. */
8
+ scroll?: boolean;
9
+ /** Omit bottom when a navigator's tab bar already owns that inset. */
10
+ safeAreaEdges?: readonly ScreenEdge[];
11
+ /** Lift the native viewport above the soft keyboard. Default true. */
12
+ keyboardAvoiding?: boolean;
13
+ /** Native distance from the window top to the screen's parent, in dp. */
14
+ keyboardVerticalOffset?: number;
15
+ }
16
+ //# sourceMappingURL=Screen.base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7D,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAuC,CAAC;AAEtF,iFAAiF;AACjF,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,YAAY,EACZ,UAAU,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,YAAY,CACpG;IACC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,aAAa,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ /** A bounded page viewport; browser keyboards remain the browser's responsibility. */
3
+ export declare const Screen: React.ForwardRefExoticComponent<import("./Screen.base").ScreenBaseProps & Omit<React.HTMLAttributes<HTMLDivElement>, keyof import("./Screen.base").ScreenBaseProps> & {
4
+ sx?: import("@mui/material").SxProps<import("@mui/material").Theme>;
5
+ contentSx?: import("@mui/material").SxProps<import("@mui/material").Theme>;
6
+ } & React.RefAttributes<HTMLDivElement>>;
7
+ //# sourceMappingURL=Screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,sFAAsF;AACtF,eAAO,MAAM,MAAM;;;wCAwBjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SxProps, Theme } from '@mui/material/styles/index.js';
2
+ import type * as React from 'react';
3
+ import type { ScreenBaseProps } from './Screen.base';
4
+ export type { ScreenBaseProps, ScreenEdge } from './Screen.base';
5
+ export type ScreenProps = ScreenBaseProps & Omit<React.HTMLAttributes<HTMLDivElement>, keyof ScreenBaseProps> & {
6
+ sx?: SxProps<Theme>;
7
+ contentSx?: SxProps<Theme>;
8
+ };
9
+ //# sourceMappingURL=Screen.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,eAAe,CAAC,GAAG;IAC9G,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;CAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Screen } from './Screen';
2
+ export type { ScreenProps, ScreenBaseProps, ScreenEdge } from './Screen.types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
@@ -23,6 +23,9 @@ export declare const ICON_PATHS: {
23
23
  readonly ExpandLess: readonly ["m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"];
24
24
  readonly ExpandMore: readonly ["M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"];
25
25
  readonly FilterList: readonly ["M10 18h4v-2h-4zM3 6v2h18V6zm3 7h12v-2H6z"];
26
+ readonly FitnessCenter: readonly ["M20.57 14.86 22 13.43 20.57 12 17 15.57 8.43 7 12 3.43 10.57 2 9.14 3.43 7.71 2 5.57 4.14 4.14 2.71 2.71 4.14l1.43 1.43L2 7.71l1.43 1.43L2 10.57 3.43 12 7 8.43 15.57 17 12 20.57 13.43 22l1.43-1.43L16.29 22l2.14-2.14 1.43 1.43 1.43-1.43-1.43-1.43L22 16.29z"];
27
+ readonly History: readonly ["M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9m-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8z"];
28
+ readonly Home: readonly ["M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"];
26
29
  readonly IndeterminateCheckBox: readonly ["M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-2 10H7v-2h10z"];
27
30
  readonly Info: readonly ["M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z"];
28
31
  readonly InfoOutlined: readonly ["M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8"];
@@ -1 +1 @@
1
- {"version":3,"file":"paths.generated.d.ts","sourceRoot":"","sources":["../../../src/icons/paths.generated.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Cb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C,eAAO,MAAM,UAAU,EAA8B,SAAS,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"paths.generated.d.ts","sourceRoot":"","sources":["../../../src/icons/paths.generated.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Cb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C,eAAO,MAAM,UAAU,EAA8B,SAAS,QAAQ,EAAE,CAAC"}
@@ -80,6 +80,10 @@ export declare function surfaces(theme: Theme): UiSurfaces;
80
80
  * Opaque on purpose. A translucent `alpha(main, 0.08)` is a different colour
81
81
  * on every surface it lands on, and its contrast with the signal's own text
82
82
  * cannot be known in advance; a composited value is the same colour anywhere.
83
+ *
84
+ * A palette MUI accepts but cannot decompose — a named colour (`white`), a
85
+ * `var(--…)`, a `color(display-p3 …)` — gets the same mix from the browser,
86
+ * as a CSS `color-mix()`, rather than throwing at render.
83
87
  */
84
88
  export declare function softSignal(theme: Theme, signal: SoftSignal): string;
85
89
  //# sourceMappingURL=surfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../../../src/tokens/surfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE,sEAAsE;AACtE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAA4C,CAAC;AAE3F;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,KAAK;QACb,2EAA2E;QAC3E,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,uFAAuF;QACvF,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;KACpD;IACD,UAAU,YAAY;QACpB;;;;WAIG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC;;;WAGG;QACH,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;KACpD;CACF;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAUjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAInE"}
1
+ {"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../../../src/tokens/surfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE,sEAAsE;AACtE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAA4C,CAAC;AAE3F;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,KAAK;QACb,2EAA2E;QAC3E,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,uFAAuF;QACvF,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;KACpD;IACD,UAAU,YAAY;QACpB;;;;WAIG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC;;;WAGG;QACH,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;KACpD;CACF;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAUjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAUnE"}
@@ -0,0 +1,16 @@
1
+ import type { BoxBaseProps } from '../Box/Box.base';
2
+ /** Physical screen edges, independent of a native dependency. */
3
+ export type ScreenEdge = 'top' | 'right' | 'bottom' | 'left';
4
+ export declare const SCREEN_EDGES: readonly ScreenEdge[];
5
+ /** Padding and gap apply to the content, inside the selected safe-area edges. */
6
+ export interface ScreenBaseProps extends Pick<BoxBaseProps, 'children' | 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'gap' | 'bg' | 'testID' | 'dataTestId'> {
7
+ /** Vertical scrolling; turn off when a child owns scrolling. Default true. */
8
+ scroll?: boolean;
9
+ /** Omit bottom when a navigator's tab bar already owns that inset. */
10
+ safeAreaEdges?: readonly ScreenEdge[];
11
+ /** Lift the native viewport above the soft keyboard. Default true. */
12
+ keyboardAvoiding?: boolean;
13
+ /** Native distance from the window top to the screen's parent, in dp. */
14
+ keyboardVerticalOffset?: number;
15
+ }
16
+ //# sourceMappingURL=Screen.base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7D,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAuC,CAAC;AAEtF,iFAAiF;AACjF,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,YAAY,EACZ,UAAU,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,YAAY,CACpG;IACC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,aAAa,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import { View } from 'react-native';
3
+ export declare const Screen: React.ForwardRefExoticComponent<import("./Screen.base").ScreenBaseProps & Omit<import("react-native").ViewProps, keyof import("./Screen.base").ScreenBaseProps> & {
4
+ contentContainerStyle?: import("react-native").StyleProp<import("react-native").ViewStyle>;
5
+ scrollViewProps?: Omit<import("react-native").ScrollViewProps, "children" | "style" | "contentContainerStyle" | "horizontal" | "scrollEnabled" | "automaticallyAdjustKeyboardInsets" | "automaticallyAdjustContentInsets" | "contentInsetAdjustmentBehavior">;
6
+ } & React.RefAttributes<View>>;
7
+ //# sourceMappingURL=Screen.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAA0D,IAAI,EAAE,MAAM,cAAc,CAAC;AAwB5F,eAAO,MAAM,MAAM;;;8BA6BjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ScrollViewProps, StyleProp, ViewProps, ViewStyle } from 'react-native';
2
+ import type { ScreenBaseProps } from './Screen.base';
3
+ export type { ScreenBaseProps, ScreenEdge } from './Screen.base';
4
+ export type ScreenProps = ScreenBaseProps & Omit<ViewProps, keyof ScreenBaseProps> & {
5
+ contentContainerStyle?: StyleProp<ViewStyle>;
6
+ /** Scroll events/indicators; Screen owns orientation, size and keyboard insets. */
7
+ scrollViewProps?: Omit<ScrollViewProps, 'children' | 'style' | 'contentContainerStyle' | 'horizontal' | 'scrollEnabled' | 'automaticallyAdjustKeyboardInsets' | 'automaticallyAdjustContentInsets' | 'contentInsetAdjustmentBehavior'>;
8
+ };
9
+ //# sourceMappingURL=Screen.types.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.types.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.types.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,eAAe,CAAC,GAAG;IACnF,qBAAqB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7C,mFAAmF;IACnF,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EACpC,UAAU,GAAG,OAAO,GAAG,uBAAuB,GAAG,YAAY,GAAG,eAAe,GAC/E,mCAAmC,GAAG,kCAAkC,GAAG,gCAAgC,CAC5G,CAAC;CACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Screen } from './Screen.native';
2
+ export type { ScreenProps, ScreenBaseProps, ScreenEdge } from './Screen.types.native';
3
+ //# sourceMappingURL=index.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
@@ -23,6 +23,9 @@ export declare const ICON_PATHS: {
23
23
  readonly ExpandLess: readonly ["m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"];
24
24
  readonly ExpandMore: readonly ["M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"];
25
25
  readonly FilterList: readonly ["M10 18h4v-2h-4zM3 6v2h18V6zm3 7h12v-2H6z"];
26
+ readonly FitnessCenter: readonly ["M20.57 14.86 22 13.43 20.57 12 17 15.57 8.43 7 12 3.43 10.57 2 9.14 3.43 7.71 2 5.57 4.14 4.14 2.71 2.71 4.14l1.43 1.43L2 7.71l1.43 1.43L2 10.57 3.43 12 7 8.43 15.57 17 12 20.57 13.43 22l1.43-1.43L16.29 22l2.14-2.14 1.43 1.43 1.43-1.43-1.43-1.43L22 16.29z"];
27
+ readonly History: readonly ["M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9m-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8z"];
28
+ readonly Home: readonly ["M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"];
26
29
  readonly IndeterminateCheckBox: readonly ["M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-2 10H7v-2h10z"];
27
30
  readonly Info: readonly ["M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z"];
28
31
  readonly InfoOutlined: readonly ["M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8"];
@@ -1 +1 @@
1
- {"version":3,"file":"paths.generated.d.ts","sourceRoot":"","sources":["../../../src/icons/paths.generated.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Cb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C,eAAO,MAAM,UAAU,EAA8B,SAAS,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"paths.generated.d.ts","sourceRoot":"","sources":["../../../src/icons/paths.generated.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Cb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C,eAAO,MAAM,UAAU,EAA8B,SAAS,QAAQ,EAAE,CAAC"}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  UserAvatar,
3
3
  UserMenu
4
- } from "./chunk-4JZ6XDVA.js";
4
+ } from "./chunk-I6ESCBY3.js";
5
5
  import "./chunk-UDQSIRAP.js";
6
- import "./chunk-AKC5GRJF.js";
7
- import "./chunk-NVXRV3PL.js";
8
- import "./chunk-MTEQEPNY.js";
9
- import "./chunk-6ZZGK5DT.js";
6
+ import "./chunk-G76BNXWE.js";
10
7
  import "./chunk-3ZVUNSFF.js";
8
+ import "./chunk-GYDUXL3D.js";
9
+ import "./chunk-6ZZGK5DT.js";
10
+ import "./chunk-MTEQEPNY.js";
11
11
  import "./chunk-VUHLNYAE.js";
12
12
  import "./chunk-2GSIEDGN.js";
13
13
  import "./chunk-J2QIICWP.js";
@@ -10,7 +10,7 @@ import "../chunk-BRHRK7BK.js";
10
10
  import "../chunk-25MSGLNU.js";
11
11
  import "../chunk-GAXHYRX6.js";
12
12
  import "../chunk-NP6SHLQ3.js";
13
- import "../chunk-RHCRHZ6D.js";
13
+ import "../chunk-TZ23DNKY.js";
14
14
  import "../chunk-7ZPUN7TV.js";
15
15
  import "../chunk-PT6TCWIW.js";
16
16
  import "../chunk-RGVNXES5.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.55.0",
3
+ "version": "6.56.1",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -707,6 +707,14 @@
707
707
  "./locales": {
708
708
  "types": "./dist/types/locales.d.ts",
709
709
  "default": "./dist/locales.js"
710
+ },
711
+ "./layout/Screen": {
712
+ "react-native": {
713
+ "types": "./dist/types-native/components/layout/Screen/index.native.d.ts",
714
+ "default": "./dist/native/layout/Screen.js"
715
+ },
716
+ "types": "./dist/types/components/layout/Screen/index.d.ts",
717
+ "default": "./dist/layout/Screen.js"
710
718
  }
711
719
  },
712
720
  "typesVersions": {
@@ -779,7 +787,8 @@
779
787
  "react": "^18.0.0 || ^19.0.0",
780
788
  "react-dom": "^18.0.0 || ^19.0.0",
781
789
  "react-native": ">=0.79.0",
782
- "react-native-svg": ">=15.0.0"
790
+ "react-native-svg": ">=15.0.0",
791
+ "react-native-safe-area-context": ">=5.0.0"
783
792
  },
784
793
  "dependencies": {
785
794
  "@12-apps/forms-core": "^1.21.0",
@@ -834,7 +843,8 @@
834
843
  "typescript": "^5.8.2",
835
844
  "vite": "^6.4.1",
836
845
  "vite-plugin-istanbul": "^7.2.1",
837
- "vitest": "^3.2.4"
846
+ "vitest": "^3.2.4",
847
+ "react-native-safe-area-context": "5.7.0"
838
848
  },
839
849
  "publishConfig": {
840
850
  "registry": "https://registry.npmjs.org",
@@ -868,6 +878,9 @@
868
878
  },
869
879
  "react-native-svg": {
870
880
  "optional": true
881
+ },
882
+ "react-native-safe-area-context": {
883
+ "optional": true
871
884
  }
872
885
  }
873
886
  }
@@ -164,6 +164,21 @@ const { stack, push, pop, clear } = useModalStack();
164
164
  - Semantic HTML structure
165
165
  - Accessible loading states
166
166
 
167
+ ### The title is one heading
168
+
169
+ With a `navigationTitle`, the panel has exactly ONE heading: the title, an
170
+ `h2`, carrying the id the dialog's `aria-labelledby` points at (the
171
+ `aria-labelledby` prop's value, or `modal-title-<modalId>`). The bar around it
172
+ (the ✕ or back button and the header actions) is a plain `div`, so the dialog's
173
+ accessible name is the title alone, and a screen reader announces it once.
174
+
175
+ Until 6.56.0 the bar was itself MUI's `DialogTitle` `h2` with the title nested
176
+ in it as a second `h2`: the same words read twice, a heading inside a heading,
177
+ and a dialog named by everything in the bar ("close Title Save").
178
+
179
+ Without a `navigationTitle` the bar is still MUI's `h2` and holds the id, as
180
+ before. Give such a panel its own `aria-labelledby` if it needs a name.
181
+
167
182
  ## Testing
168
183
 
169
184
  The StackedModal component provides comprehensive test IDs for all interactive elements through the `dataTestId` prop. When provided, it generates consistent test IDs for all child elements.
@@ -175,8 +190,8 @@ When you provide `dataTestId="my-modal"`, the following test IDs are automatical
175
190
  | Element | Test ID | Description |
176
191
  |---------|---------|-------------|
177
192
  | Modal Container | `my-modal` | The root dialog element |
178
- | Header | `my-modal-header` | The modal header container |
179
- | Title | `my-modal-title` | The navigation title text |
193
+ | Header | `my-modal-header` | The modal header bar (a `div` when there is a title) |
194
+ | Title | `my-modal-title` | The navigation title — the panel's one `h2` |
180
195
  | Close Button | `my-modal-close-button` | The close button (when no modals stacked) |
181
196
  | Back Button | `my-modal-back-button` | The back button (when modals are stacked) |
182
197
  | Header Actions | `my-modal-header-actions` | Container for header actions (desktop) |
@@ -9,7 +9,7 @@ import IconButton from '@mui/material/IconButton/index.js';
9
9
  import Skeleton from '@mui/material/Skeleton/index.js';
10
10
  import Typography from '@mui/material/Typography/index.js';
11
11
  import { styled, useTheme } from '@mui/material/styles/index.js';
12
- import type { FC, ReactNode } from 'react';
12
+ import type { ElementType, FC, ReactNode } from 'react';
13
13
  import React from 'react';
14
14
  import { rem } from '../../../tokens/relative';
15
15
  import { safeAreaBottom } from '../../../utils/viewport';
@@ -21,9 +21,10 @@ import {
21
21
  titleStyles,
22
22
  } from './StackedModal.styles';
23
23
 
24
+ // `component` typed through: the bar is a `div` when it holds a title (`ModalHeader`).
24
25
  const StyledDialogTitle = styled(DialogTitle, {
25
26
  shouldForwardProp: (prop) => prop !== 'rtl',
26
- })<{ rtl?: boolean }>(({ theme, rtl }) => titleStyles(theme, rtl));
27
+ })<{ rtl?: boolean; component?: ElementType }>(({ theme, rtl }) => titleStyles(theme, rtl));
27
28
 
28
29
  const DialogTitleLeft = styled(Box)(({ theme }) => titleLeftStyles(theme));
29
30
  const DialogTitleRight = styled(Box)(({ theme }) => titleRightStyles(theme));
@@ -186,7 +187,21 @@ export const ModalHeader: FC<ModalHeaderProps> = ({
186
187
  rtl,
187
188
  dataTestId,
188
189
  }) => (
189
- <StyledDialogTitle id={titleId} rtl={rtl} data-testid={testId(dataTestId, 'header')}>
190
+ // The BAR is not a heading: it holds the ✕ or back button and the header
191
+ // actions. The title inside it is the panel's one heading and carries the id
192
+ // the dialog's `aria-labelledby` names, so the dialog is named by the title
193
+ // alone — not "close Title Save" — and a screen reader hears it once.
194
+ //
195
+ // The bar's id is stated, never left to MUI: `DialogTitle` falls back to the
196
+ // Dialog's `aria-labelledby` and would claim the title's id a second time.
197
+ // With NO title the bar is drawn exactly as it always was — MUI's own `h2`,
198
+ // holding the id — so an untitled panel keeps its markup and its name.
199
+ <StyledDialogTitle
200
+ component={navigationTitle ? 'div' : 'h2'}
201
+ id={navigationTitle ? `${titleId}-bar` : titleId}
202
+ rtl={rtl}
203
+ data-testid={testId(dataTestId, 'header')}
204
+ >
190
205
  <DialogTitleLeft>
191
206
  <HeaderLeadingButton
192
207
  canGoBack={canGoBack}
@@ -199,6 +214,7 @@ export const ModalHeader: FC<ModalHeaderProps> = ({
199
214
  />
200
215
  {navigationTitle && (
201
216
  <Typography
217
+ id={titleId}
202
218
  variant="h6"
203
219
  component="h2"
204
220
  noWrap
@@ -0,0 +1,2 @@
1
+ - Keyboard geometry uses React Native KeyboardAvoidingView; react-native-web unit/story lanes verify its wiring, not a real Android/iOS keyboard. Device keyboard/rotation QA remains explicit.
2
+ - Web safe-area values come from CSS environment variables; native values come from the existing navigator or an internal safe-area provider. Browser keyboard resizing remains browser-managed.
@@ -0,0 +1,20 @@
1
+ import type { BoxBaseProps } from '../Box/Box.base';
2
+
3
+ /** Physical screen edges, independent of a native dependency. */
4
+ export type ScreenEdge = 'top' | 'right' | 'bottom' | 'left';
5
+ export const SCREEN_EDGES: readonly ScreenEdge[] = ['top', 'right', 'bottom', 'left'];
6
+
7
+ /** Padding and gap apply to the content, inside the selected safe-area edges. */
8
+ export interface ScreenBaseProps extends Pick<
9
+ BoxBaseProps,
10
+ 'children' | 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'gap' | 'bg' | 'testID' | 'dataTestId'
11
+ > {
12
+ /** Vertical scrolling; turn off when a child owns scrolling. Default true. */
13
+ scroll?: boolean;
14
+ /** Omit bottom when a navigator's tab bar already owns that inset. */
15
+ safeAreaEdges?: readonly ScreenEdge[];
16
+ /** Lift the native viewport above the soft keyboard. Default true. */
17
+ keyboardAvoiding?: boolean;
18
+ /** Native distance from the window top to the screen's parent, in dp. */
19
+ keyboardVerticalOffset?: number;
20
+ }
@@ -0,0 +1,71 @@
1
+ # Screen
2
+
3
+ `@12-apps/ui/layout/Screen` is a bounded page viewport on web, Android and iOS.
4
+ It combines safe-area edges, vertical scrolling and native keyboard avoidance.
5
+ It renders existing Box/Stack/form components without consumer imports from a
6
+ visual platform library. It is for ordinary screens, not virtualized lists.
7
+
8
+ ```tsx
9
+ import { Screen } from '@12-apps/ui/layout/Screen';
10
+ import { Text } from '@12-apps/ui/typography/Text';
11
+
12
+ <Screen p={2} gap={2} safeAreaEdges={['top', 'left', 'right']}>
13
+ <Text>Content above a navigator-owned bottom tab bar</Text>
14
+ </Screen>
15
+ ```
16
+
17
+ ## Props
18
+
19
+ - `children`: screen content
20
+ - `scroll` (true): a vertical scrolling viewport; use false if a child owns scrolling
21
+ - `safeAreaEdges` (all four): physical edges; use an empty array when an ancestor
22
+ already owns every inset. Exclude bottom when a tab bar owns that edge
23
+ - `p`, `px`, `py`, `pt`, `pr`, `pb`, `pl`, `gap`: content spacing in theme units,
24
+ inside the safe area; side overrides axis, axis overrides shorthand
25
+ - `bg` (`default`): the same surface/palette role as Box
26
+ - `keyboardAvoiding` (true): native keyboard lift; disable if a parent owns it
27
+ - `keyboardVerticalOffset` (0): native distance from the window top to the
28
+ screen's parent, in dp; set for a non-overlay navigation header
29
+ - `testID` / `dataTestId`: outer screen id; scroll viewport also has `<id>-viewport`
30
+ - Native: View accessibility props, `style`, `contentContainerStyle`,
31
+ `scrollViewProps` for scroll callbacks and indicators
32
+ - Web: div accessibility props, `sx`, `contentSx`, `style`
33
+ - Ref: native outer View / web outer div
34
+
35
+ ## Native setup
36
+
37
+ Install the optional peer `react-native-safe-area-context` (5+) using the version
38
+ supported by your Expo/RN app. A web-only consumer does not need this peer. Screen
39
+ reuses the navigator's safe-area context. Without one it creates a provider
40
+ outside the scroll viewport. Do not wrap Screen in another safe-area view;
41
+ select the edges the screen actually owns instead.
42
+
43
+ The safe-area view wraps React Native's KeyboardAvoidingView, which uses padding
44
+ on iOS and height on Android. Its measured viewport already excludes the bottom
45
+ safe area, so the home-indicator inset is not added again above the keyboard.
46
+ ScrollView automatic keyboard and content insets are off so those owners do not
47
+ also apply the same lift/insets. Handled child taps remain usable with the
48
+ keyboard open; dragging dismisses it. `scrollViewProps` can change tap/dismiss
49
+ policy, but cannot override the viewport geometry or automatic inset ownership.
50
+
51
+ ## Layout and accessibility
52
+
53
+ The parent must give Screen a bounded height (a navigator does this). On the web,
54
+ the ancestor chain must carry a definite height/flex size; Screen grows within it.
55
+ Content has a minimum viewport height, so short screens fill the available area
56
+ and long screens scroll. No app-specific padding, colors, header or footer are
57
+ invented. Use a meaningful accessibility label where the screen needs one;
58
+ children retain their own focus and accessibility semantics.
59
+
60
+ The web uses CSS `env(safe-area-inset-*)`; set viewport-fit=cover when deploying
61
+ edge-to-edge. Browser keyboard/visual-viewport behavior belongs to the browser;
62
+ the native keyboard props are accepted but not forwarded to the DOM.
63
+
64
+ ## Verification boundary
65
+
66
+ Shared Storybook tests prove bounded scrolling and text entry on both browser
67
+ renderers. Native unit tests exercise safe-area/keyboard/scroll ownership and
68
+ rerenders, but react-native-web does not simulate a device keyboard. Device QA
69
+ must cover both OSes, a notched screen, bottom tabs, keyboard show/hide/resize,
70
+ last-field reachability, rotation and Android back dismissal before claiming
71
+ that those device behaviors have been observed.
@@ -0,0 +1,56 @@
1
+ import * as React from 'react';
2
+ import { KeyboardAvoidingView, Platform, ScrollView, StyleSheet, View } from 'react-native';
3
+ import { SafeAreaInsetsContext, SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
4
+
5
+ import { SCREEN_EDGES } from './Screen.base';
6
+ import type { ScreenProps } from './Screen.types.native';
7
+ import { resolveBoxLayout, splitBoxProps } from '../Box/box-layout';
8
+ import { resolveTestId } from '../../../platform/test-id';
9
+ import { useUiTheme } from '../../../provider/use-ui-theme.native';
10
+
11
+ const styles = StyleSheet.create({ fill: { flex: 1 }, content: { flexGrow: 1 } });
12
+
13
+ function keyboardBehavior(enabled: boolean): 'padding' | 'height' | undefined {
14
+ if (!enabled) return undefined;
15
+ return Platform.OS === 'ios' ? 'padding' : 'height';
16
+ }
17
+
18
+ /** Reuse a navigator's context, or own one outside the scrolling view. */
19
+ function ScreenBoundary({ children }: { children: React.ReactNode }): React.JSX.Element {
20
+ const insets = React.useContext(SafeAreaInsetsContext);
21
+ return insets === null
22
+ ? <SafeAreaProvider style={styles.fill}>{children}</SafeAreaProvider>
23
+ : <>{children}</>;
24
+ }
25
+
26
+ export const Screen = React.forwardRef<View, ScreenProps>(({
27
+ children, scroll = true, safeAreaEdges = SCREEN_EDGES,
28
+ keyboardAvoiding = true, keyboardVerticalOffset = 0, bg = 'default',
29
+ style, contentContainerStyle, scrollViewProps, ...props
30
+ }, ref) => {
31
+ const theme = useUiTheme();
32
+ const { layout, rest } = splitBoxProps(props);
33
+ const testID = resolveTestId(layout);
34
+ const contentStyle = [styles.content, resolveBoxLayout({ ...layout, direction: 'column' }, theme), contentContainerStyle];
35
+ return (
36
+ <ScreenBoundary>
37
+ <View ref={ref} testID={testID} {...rest} style={[styles.fill, resolveBoxLayout({ bg }, theme), style]}>
38
+ <SafeAreaView edges={safeAreaEdges} style={styles.fill}>
39
+ <KeyboardAvoidingView style={styles.fill} enabled={keyboardAvoiding}
40
+ behavior={keyboardBehavior(keyboardAvoiding)} keyboardVerticalOffset={keyboardVerticalOffset}>
41
+ {scroll ? (
42
+ <ScrollView keyboardShouldPersistTaps="handled" keyboardDismissMode="on-drag" {...scrollViewProps}
43
+ testID={scrollViewProps?.testID ?? (testID ? `${testID}-viewport` : undefined)}
44
+ style={styles.fill} contentContainerStyle={contentStyle}
45
+ horizontal={false} automaticallyAdjustKeyboardInsets={false}
46
+ automaticallyAdjustContentInsets={false} contentInsetAdjustmentBehavior="never">
47
+ {children}
48
+ </ScrollView>
49
+ ) : <View style={[styles.fill, contentStyle]}>{children}</View>}
50
+ </KeyboardAvoidingView>
51
+ </SafeAreaView>
52
+ </View>
53
+ </ScreenBoundary>
54
+ );
55
+ });
56
+ Screen.displayName = 'Screen';
@@ -0,0 +1,41 @@
1
+ import MuiBox from '@mui/material/Box/index.js';
2
+ import * as React from 'react';
3
+
4
+ import { SCREEN_EDGES } from './Screen.base';
5
+ import type { ScreenProps } from './Screen.types';
6
+ import { Box } from '../Box/Box';
7
+ import { splitBoxProps } from '../Box/box-layout';
8
+ import { resolveTestId, withoutTestIdProps } from '../../../platform/test-id';
9
+
10
+ function sxEntries(sx: ScreenProps['sx']) {
11
+ if (sx === undefined) return [];
12
+ return Array.isArray(sx) ? sx : [sx];
13
+ }
14
+
15
+ /** A bounded page viewport; browser keyboards remain the browser's responsibility. */
16
+ export const Screen = React.forwardRef<HTMLDivElement, ScreenProps>(({
17
+ children, scroll = true, safeAreaEdges = SCREEN_EDGES,
18
+ keyboardAvoiding: _keyboardAvoiding = true, keyboardVerticalOffset: _keyboardVerticalOffset = 0,
19
+ bg = 'default', sx, contentSx, ...props
20
+ }, ref) => {
21
+ const { layout, rest } = splitBoxProps(props);
22
+ const testID = resolveTestId(layout);
23
+ const safeArea = Object.fromEntries(SCREEN_EDGES.map((edge) => [
24
+ `padding${edge[0]!.toUpperCase()}${edge.slice(1)}`,
25
+ safeAreaEdges.includes(edge) ? `env(safe-area-inset-${edge}, 0px)` : 0,
26
+ ]));
27
+ return (
28
+ <Box ref={ref} bg={bg} dataTestId={testID} {...rest}
29
+ sx={[{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0, minWidth: 0, overflow: 'hidden', ...safeArea },
30
+ ...sxEntries(sx)]}>
31
+ <MuiBox data-testid={testID ? `${testID}-viewport` : undefined}
32
+ sx={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0, overflowY: scroll ? 'auto' : 'hidden' }}>
33
+ <Box {...withoutTestIdProps(layout)} direction="column"
34
+ sx={[scroll ? { flexGrow: 1, flexShrink: 0 } : { flex: 1, minHeight: 0, minWidth: 0 }, ...sxEntries(contentSx)]}>
35
+ {children}
36
+ </Box>
37
+ </MuiBox>
38
+ </Box>
39
+ );
40
+ });
41
+ Screen.displayName = 'Screen';
@@ -0,0 +1,13 @@
1
+ import type { ScrollViewProps, StyleProp, ViewProps, ViewStyle } from 'react-native';
2
+
3
+ import type { ScreenBaseProps } from './Screen.base';
4
+
5
+ export type { ScreenBaseProps, ScreenEdge } from './Screen.base';
6
+ export type ScreenProps = ScreenBaseProps & Omit<ViewProps, keyof ScreenBaseProps> & {
7
+ contentContainerStyle?: StyleProp<ViewStyle>;
8
+ /** Scroll events/indicators; Screen owns orientation, size and keyboard insets. */
9
+ scrollViewProps?: Omit<ScrollViewProps,
10
+ 'children' | 'style' | 'contentContainerStyle' | 'horizontal' | 'scrollEnabled' |
11
+ 'automaticallyAdjustKeyboardInsets' | 'automaticallyAdjustContentInsets' | 'contentInsetAdjustmentBehavior'
12
+ >;
13
+ };
@@ -0,0 +1,10 @@
1
+ import type { SxProps, Theme } from '@mui/material/styles/index.js';
2
+ import type * as React from 'react';
3
+
4
+ import type { ScreenBaseProps } from './Screen.base';
5
+
6
+ export type { ScreenBaseProps, ScreenEdge } from './Screen.base';
7
+ export type ScreenProps = ScreenBaseProps & Omit<React.HTMLAttributes<HTMLDivElement>, keyof ScreenBaseProps> & {
8
+ sx?: SxProps<Theme>;
9
+ contentSx?: SxProps<Theme>;
10
+ };
@@ -0,0 +1,2 @@
1
+ export { Screen } from './Screen.native';
2
+ export type { ScreenProps, ScreenBaseProps, ScreenEdge } from './Screen.types.native';
@@ -0,0 +1,2 @@
1
+ export { Screen } from './Screen';
2
+ export type { ScreenProps, ScreenBaseProps, ScreenEdge } from './Screen.types';