@nxgt/material 3.79.0 → 3.80.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 (279) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +45 -6
  3. package/dist/{alert-dialog-653apk3f.js → alert-dialog-DgHtXZuB.js} +1 -1
  4. package/dist/{async-slice-CXLbQuOc.js → async-slice-YBQsGtQT.js} +1 -1
  5. package/dist/{button-3op3rtZh.js → button-_vm-xSBU.js} +1 -1
  6. package/dist/{calculator-KqIMBXSh.js → calculator-CTd_S23A.js} +10 -10
  7. package/dist/calculator-field.js +6 -6
  8. package/dist/{calculator-segment-BlJE1LaS.js → calculator-segment-OI1BT3bA.js} +1 -1
  9. package/dist/calculator.js +1 -1
  10. package/dist/charts.js +3 -3
  11. package/dist/{chip-MuKDwtkG.js → chip-DumcVzUO.js} +2 -2
  12. package/dist/{code-editor-Bp2RrdNx.js → code-editor-CiwgfSOK.js} +4 -4
  13. package/dist/code-editor.js +4 -4
  14. package/dist/{code-language-items-B7WR5ua_.js → code-language-items-Dip0xnmc.js} +2 -2
  15. package/dist/components/components.css +3 -0
  16. package/dist/components/ui/actions/fab/fab-dock.css +19 -6
  17. package/dist/components/ui/layout/app-search/app-search.css +62 -0
  18. package/dist/components/ui/layout/app-shell/activity-backdrop.css +10 -2
  19. package/dist/components/ui/layout/app-shell/app-header.css +108 -0
  20. package/dist/components/ui/layout/navigation-toolbar/navigation-toolbar.css +43 -0
  21. package/dist/{components-ConMf2w-.js → components-CJFHhkZv.js} +21800 -17785
  22. package/dist/components.js +37 -37
  23. package/dist/{conversion-variant-BDFAxqe9.js → conversion-variant-CqrPwPjC.js} +3 -3
  24. package/dist/{currency-field-DWHB5oms.js → currency-field-CMFvctye.js} +4 -4
  25. package/dist/{dialog-Bm5LvVlB.js → dialog-B0iU3fmh.js} +3 -3
  26. package/dist/dnd.js +2 -2
  27. package/dist/{dropdown-menu-xlZ6NYUA.js → dropdown-menu-CPOgcajv.js} +1 -1
  28. package/dist/editor.js +7 -7
  29. package/dist/{empty-state-C0kviQdW.js → empty-state-D3Jggupu.js} +1 -1
  30. package/dist/{financial-variant-CggTpad2.js → financial-variant-BdyfYhnp.js} +5 -5
  31. package/dist/{hooks-Dg94jPRq.js → hooks-Z7KKbv4G.js} +2 -2
  32. package/dist/hooks.js +2 -2
  33. package/dist/{hover-card-B1g55Hi6.js → hover-card-CFGIX6kg.js} +1 -1
  34. package/dist/i18n.js +3 -3
  35. package/dist/{icon-badge-BcW66bRk.js → icon-badge-kxGWUvcO.js} +1 -1
  36. package/dist/{icon-button-Cogxy1cy.js → icon-button-BamxMwZs.js} +1 -1
  37. package/dist/lib/components/ui/collections/server-table/partials/server-table-band-classes.d.ts +13 -0
  38. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  39. package/dist/lib/components/ui/layout/app-bar/top-app-bar.d.ts +18 -3
  40. package/dist/lib/components/ui/layout/app-search/app-search-bar.d.ts +11 -0
  41. package/dist/lib/components/ui/layout/app-search/app-search.types.d.ts +47 -0
  42. package/dist/lib/components/ui/layout/app-search/index.d.ts +3 -0
  43. package/dist/lib/components/ui/layout/app-search/partials/on-phone.d.ts +2 -0
  44. package/dist/lib/components/ui/layout/app-search/partials/phone-search.d.ts +3 -0
  45. package/dist/lib/components/ui/layout/app-search/partials/pill-search.d.ts +3 -0
  46. package/dist/lib/components/ui/layout/app-search/pill-form.d.ts +18 -0
  47. package/dist/lib/components/ui/layout/app-search/search-panel.d.ts +24 -0
  48. package/dist/lib/components/ui/layout/app-search/search-results.d.ts +14 -0
  49. package/dist/lib/components/ui/layout/app-search/search-shortcut.d.ts +15 -0
  50. package/dist/lib/components/ui/layout/app-search/search-view.d.ts +22 -0
  51. package/dist/lib/components/ui/layout/app-search/use-pill-panel.d.ts +22 -0
  52. package/dist/lib/components/ui/layout/app-search/use-search-text.d.ts +8 -0
  53. package/dist/lib/components/ui/layout/app-shell/activity-app-bar.d.ts +35 -0
  54. package/dist/lib/components/ui/layout/app-shell/activity-chrome.d.ts +26 -3
  55. package/dist/lib/components/ui/layout/app-shell/activity-column-props.d.ts +22 -0
  56. package/dist/lib/components/ui/layout/app-shell/activity-column.d.ts +10 -2
  57. package/dist/lib/components/ui/layout/app-shell/activity-layout-navigation.types.d.ts +94 -0
  58. package/dist/lib/components/ui/layout/app-shell/activity-layout.d.ts +8 -1
  59. package/dist/lib/components/ui/layout/app-shell/activity-layout.types.d.ts +2 -1
  60. package/dist/lib/components/ui/layout/app-shell/activity-rails.d.ts +16 -0
  61. package/dist/lib/components/ui/layout/app-shell/activity-sidebar-lane.d.ts +22 -0
  62. package/dist/lib/components/ui/layout/app-shell/activity-top-nav.d.ts +11 -0
  63. package/dist/lib/components/ui/layout/app-shell/activity-two-level-lane.d.ts +14 -0
  64. package/dist/lib/components/ui/layout/app-shell/app-back.d.ts +22 -0
  65. package/dist/lib/components/ui/layout/app-shell/app-header-row.d.ts +3 -0
  66. package/dist/lib/components/ui/layout/app-shell/app-header.d.ts +33 -1
  67. package/dist/lib/components/ui/layout/app-shell/app-shell.utils.d.ts +8 -0
  68. package/dist/lib/components/ui/layout/app-shell/app-sidebar-entries.d.ts +13 -0
  69. package/dist/lib/components/ui/layout/app-shell/app-sidebar-label-item.d.ts +3 -1
  70. package/dist/lib/components/ui/layout/app-shell/bottom-chrome.d.ts +13 -0
  71. package/dist/lib/components/ui/layout/app-shell/header-title.d.ts +18 -2
  72. package/dist/lib/components/ui/layout/app-shell/header.utils.d.ts +37 -0
  73. package/dist/lib/components/ui/layout/app-shell/index.d.ts +3 -0
  74. package/dist/lib/components/ui/layout/app-shell/navigation-parts.d.ts +38 -0
  75. package/dist/lib/components/ui/layout/app-shell/navigation.utils.d.ts +36 -0
  76. package/dist/lib/components/ui/layout/app-shell/page-title-scope.d.ts +14 -0
  77. package/dist/lib/components/ui/layout/app-shell/page-title.d.ts +12 -1
  78. package/dist/lib/components/ui/layout/app-shell/shell-scroll.d.ts +32 -0
  79. package/dist/lib/components/ui/layout/app-shell/sticky-offset.d.ts +8 -0
  80. package/dist/lib/components/ui/layout/app-shell/types.d.ts +14 -0
  81. package/dist/lib/components/ui/layout/app-shell/use-focus-while-hidden.d.ts +9 -0
  82. package/dist/lib/components/ui/layout/app-shell/use-header-height.d.ts +12 -0
  83. package/dist/lib/components/ui/layout/app-shell/use-header-scroll.d.ts +19 -0
  84. package/dist/lib/components/ui/layout/app-shell/use-shell-header.d.ts +20 -0
  85. package/dist/lib/components/ui/layout/auth-card/auth-card-split.d.ts +14 -0
  86. package/dist/lib/components/ui/layout/auth-card/auth-card.d.ts +13 -1
  87. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid-context.d.ts +21 -0
  88. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.d.ts +9 -0
  89. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.state.d.ts +30 -0
  90. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.tiles.d.ts +8 -0
  91. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.types.d.ts +50 -0
  92. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.utils.d.ts +70 -0
  93. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-tile.d.ts +7 -0
  94. package/dist/lib/components/ui/layout/dashboard-grid/index.d.ts +4 -0
  95. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-announcer.d.ts +6 -0
  96. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-edit-bar.d.ts +11 -0
  97. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-move-buttons.d.ts +9 -0
  98. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-toolbar.d.ts +7 -0
  99. package/dist/lib/components/ui/layout/dashboard-grid/use-dashboard-grid.d.ts +21 -0
  100. package/dist/lib/components/ui/layout/dashboard-grid/use-dashboard-moves.d.ts +22 -0
  101. package/dist/lib/components/ui/layout/doc/doc-context.d.ts +2 -0
  102. package/dist/lib/components/ui/layout/doc/doc.d.ts +5 -0
  103. package/dist/lib/components/ui/layout/doc/index.d.ts +1 -1
  104. package/dist/lib/components/ui/layout/doc/partials/doc-embedded-bar.d.ts +9 -0
  105. package/dist/lib/components/ui/layout/doc/partials/doc-embedded.d.ts +8 -0
  106. package/dist/lib/components/ui/layout/doc/use-doc.d.ts +9 -1
  107. package/dist/lib/components/ui/layout/editor-layout/editor-layout.d.ts +14 -0
  108. package/dist/lib/components/ui/layout/editor-layout/editor-layout.types.d.ts +31 -0
  109. package/dist/lib/components/ui/layout/editor-layout/index.d.ts +4 -0
  110. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-body.d.ts +11 -0
  111. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-canvas.d.ts +8 -0
  112. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-context.d.ts +12 -0
  113. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-start.d.ts +8 -0
  114. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-triggers.d.ts +10 -0
  115. package/dist/lib/components/ui/layout/editor-layout/partials/use-editor-layout-names.d.ts +8 -0
  116. package/dist/lib/components/ui/layout/editor-layout/partials/use-editor-layout-state.d.ts +21 -0
  117. package/dist/lib/components/ui/layout/index.d.ts +9 -0
  118. package/dist/lib/components/ui/layout/landing/index.d.ts +6 -0
  119. package/dist/lib/components/ui/layout/landing/landing-layout.d.ts +15 -0
  120. package/dist/lib/components/ui/layout/landing/landing-layout.types.d.ts +27 -0
  121. package/dist/lib/components/ui/layout/landing/landing-section.d.ts +12 -0
  122. package/dist/lib/components/ui/layout/landing/landing-section.types.d.ts +32 -0
  123. package/dist/lib/components/ui/layout/landing/landing.classes.d.ts +20 -0
  124. package/dist/lib/components/ui/layout/landing/partials/landing-header.d.ts +11 -0
  125. package/dist/lib/components/ui/layout/landing/partials/landing-section-intro.d.ts +13 -0
  126. package/dist/lib/components/ui/layout/landing/partials/site-footer-group.d.ts +8 -0
  127. package/dist/lib/components/ui/layout/landing/site-footer.d.ts +13 -0
  128. package/dist/lib/components/ui/layout/landing/site-footer.types.d.ts +29 -0
  129. package/dist/lib/components/ui/layout/list-details-layout/internal.d.ts +2 -0
  130. package/dist/lib/components/ui/layout/list-details-layout/list-details-layout.d.ts +9 -17
  131. package/dist/lib/components/ui/layout/list-details-layout/partials/history-mark.d.ts +2 -0
  132. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-context.d.ts +17 -1
  133. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-history.d.ts +8 -0
  134. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-inspector.d.ts +21 -0
  135. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-layout.types.d.ts +47 -0
  136. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-resizer.d.ts +9 -0
  137. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-root.d.ts +3 -0
  138. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-trigger.d.ts +13 -4
  139. package/dist/lib/components/ui/layout/list-details-layout/partials/use-inspector-focus.d.ts +8 -0
  140. package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-details-param.d.ts +26 -0
  141. package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-details-state.d.ts +15 -0
  142. package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-width.d.ts +16 -0
  143. package/dist/lib/components/ui/layout/list-details-layout/partials/use-pane-focus.d.ts +6 -4
  144. package/dist/lib/components/ui/layout/navigation-bar/index.d.ts +3 -0
  145. package/dist/lib/components/ui/layout/navigation-bar/internal.d.ts +4 -0
  146. package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.classes.d.ts +14 -0
  147. package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.d.ts +35 -0
  148. package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.utils.d.ts +19 -0
  149. package/dist/lib/components/ui/layout/navigation-bar/partials/bar-badge.d.ts +5 -0
  150. package/dist/lib/components/ui/layout/navigation-bar/partials/bar-entry.d.ts +12 -0
  151. package/dist/lib/components/ui/layout/navigation-bar/partials/navigation-bar-item.d.ts +22 -0
  152. package/dist/lib/components/ui/layout/navigation-bar/partials/navigation-bar-more.d.ts +24 -0
  153. package/dist/lib/components/ui/layout/navigation-bar/use-nav-bar-inset.d.ts +12 -0
  154. package/dist/lib/components/ui/layout/navigation-drawer/index.d.ts +5 -0
  155. package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.classes.d.ts +9 -0
  156. package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.d.ts +45 -0
  157. package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.utils.d.ts +14 -0
  158. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-body.d.ts +3 -0
  159. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-item.d.ts +20 -0
  160. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-modal.d.ts +17 -0
  161. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-section.d.ts +15 -0
  162. package/dist/lib/components/ui/layout/navigation-rail/index.d.ts +3 -0
  163. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail-panel.d.ts +26 -0
  164. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.classes.d.ts +23 -0
  165. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.d.ts +42 -1
  166. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.utils.d.ts +4 -0
  167. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-body.d.ts +3 -0
  168. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-item.d.ts +20 -0
  169. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-panel-item.d.ts +7 -0
  170. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-toggle.d.ts +7 -0
  171. package/dist/lib/components/ui/layout/navigation-rail/use-rail-expanded.d.ts +13 -0
  172. package/dist/lib/components/ui/layout/navigation-toolbar/index.d.ts +2 -0
  173. package/dist/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.classes.d.ts +20 -0
  174. package/dist/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.d.ts +51 -0
  175. package/dist/lib/components/ui/layout/navigation-toolbar/partials/navigation-toolbar-item.d.ts +25 -0
  176. package/dist/lib/components/ui/layout/navigation-toolbar/partials/navigation-toolbar-more.d.ts +3 -0
  177. package/dist/lib/components/ui/layout/pane-layout/internal.d.ts +3 -0
  178. package/dist/lib/components/ui/layout/pane-layout/pane-layout.d.ts +16 -2
  179. package/dist/lib/components/ui/layout/pane-layout/partials/pane-layout-classes.d.ts +7 -0
  180. package/dist/lib/components/ui/layout/pane-layout/partials/pane-layout-context.d.ts +13 -0
  181. package/dist/lib/components/ui/layout/pane-layout/partials/use-pane-layout-state.d.ts +16 -0
  182. package/dist/lib/components/ui/layout/pane-layout/partials/use-pane-narrow.d.ts +6 -0
  183. package/dist/lib/components/ui/layout/responsive-grid/index.d.ts +4 -1
  184. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid-item.d.ts +19 -0
  185. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid-spans.d.ts +19 -0
  186. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid.d.ts +24 -2
  187. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid.utils.d.ts +12 -0
  188. package/dist/lib/components/ui/layout/settings-layout/index.d.ts +2 -0
  189. package/dist/lib/components/ui/layout/settings-layout/partials/settings-link.d.ts +7 -0
  190. package/dist/lib/components/ui/layout/settings-layout/partials/settings-list.d.ts +11 -0
  191. package/dist/lib/components/ui/layout/settings-layout/partials/settings-page.d.ts +5 -0
  192. package/dist/lib/components/ui/layout/settings-layout/settings-layout.d.ts +10 -0
  193. package/dist/lib/components/ui/layout/settings-layout/settings-layout.types.d.ts +33 -0
  194. package/dist/lib/components/ui/layout/settings-layout/settings-layout.utils.d.ts +13 -0
  195. package/dist/lib/components/ui/layout/thread-layout/thread-layout-classes.d.ts +17 -0
  196. package/dist/lib/components/ui/layout/thread-layout/thread-layout-parts.d.ts +14 -0
  197. package/dist/lib/components/ui/layout/thread-layout/thread-layout-stepper.d.ts +11 -0
  198. package/dist/lib/components/ui/layout/thread-layout/thread-layout.d.ts +30 -3
  199. package/dist/lib/components/ui/layout/top-nav/index.d.ts +5 -0
  200. package/dist/lib/components/ui/layout/top-nav/partials/top-nav-item.d.ts +23 -0
  201. package/dist/lib/components/ui/layout/top-nav/partials/top-nav-menu.d.ts +22 -0
  202. package/dist/lib/components/ui/layout/top-nav/top-nav.classes.d.ts +10 -0
  203. package/dist/lib/components/ui/layout/top-nav/top-nav.d.ts +34 -0
  204. package/dist/lib/components/ui/layout/top-nav/top-nav.utils.d.ts +10 -0
  205. package/dist/lib/components/ui/widgets/kanban/index.d.ts +1 -1
  206. package/dist/lib/components/ui/widgets/kanban/kanban-context.d.ts +5 -2
  207. package/dist/lib/components/ui/widgets/kanban/kanban.d.ts +11 -2
  208. package/dist/lib/components/ui/widgets/kanban/kanban.slice.d.ts +32 -0
  209. package/dist/lib/components/ui/widgets/kanban/kanban.utils.d.ts +9 -0
  210. package/dist/lib/components/ui/widgets/kanban/partials/kanban-card-preview.d.ts +3 -1
  211. package/dist/lib/components/ui/widgets/kanban/partials/kanban-column.d.ts +6 -0
  212. package/dist/lib/components/ui/widgets/kanban/partials/kanban-move-to.d.ts +13 -0
  213. package/dist/lib/components/ui/widgets/kanban/partials/kanban-phone-tabs.d.ts +10 -0
  214. package/dist/lib/components/ui/widgets/kanban/types.d.ts +7 -0
  215. package/dist/lib/components/ui/widgets/kanban/use-kanban-board-keys.d.ts +7 -0
  216. package/dist/lib/components/ui/widgets/kanban/use-kanban-item-actions.d.ts +5 -0
  217. package/dist/lib/components/ui/widgets/kanban/use-kanban-phone-column.d.ts +18 -0
  218. package/dist/lib/components/ui/widgets/kanban/use-kanban.d.ts +6 -1
  219. package/dist/lib/i18n/resources/en/en.d.ts +50 -0
  220. package/dist/lib/i18n/resources/en/material.json.d.ts +52 -2
  221. package/dist/lib/i18n/resources/fr/fr.d.ts +50 -0
  222. package/dist/lib/i18n/resources/fr/material.json.d.ts +52 -2
  223. package/dist/lib/i18n/resources/resources.d.ts +100 -0
  224. package/dist/lib/i18n/translator.d.ts +1 -1
  225. package/dist/lib.js +1 -1
  226. package/dist/main.js +52 -52
  227. package/dist/map.js +7 -7
  228. package/dist/material.css +1 -1
  229. package/dist/pdf-reader.js +1 -1
  230. package/dist/{percent-field--WIXV5dX.js → percent-field-C2LNr8NA.js} +1 -1
  231. package/dist/{picker-surface-CV09H7Nb.js → picker-surface-BUCFMoAZ.js} +4 -4
  232. package/dist/{popover-Cd7DkND4.js → popover-DFRwQF12.js} +1 -1
  233. package/dist/{pos-types-DKCkOTYy.js → pos-types-CXnEdjdy.js} +1 -1
  234. package/dist/{pos-variant-GrUfbTTP.js → pos-variant-DMwn_7is.js} +4 -4
  235. package/dist/print.js +1 -1
  236. package/dist/{programmer-variant-eKJNKENL.js → programmer-variant-Bo4eiDFi.js} +2 -2
  237. package/dist/{public-y6g4ddxd.js → public-CyQPkkSR.js} +9 -9
  238. package/dist/{rich-code-block-CRQ0iyLb.js → rich-code-block-iK7UcZdc.js} +5 -5
  239. package/dist/{scientific-variant-2y3UxAAU.js → scientific-variant-B9ScTgfx.js} +2 -2
  240. package/dist/{sortable-provider-DdiI3Fwk.js → sortable-provider-BZwVjSVU.js} +3 -3
  241. package/dist/{spinner-C1QIewWv.js → spinner-RITOxvpH.js} +2 -2
  242. package/dist/{tabs-KGKvve3y.js → tabs-DSo4eCUn.js} +1 -1
  243. package/dist/theme-picker.js +2 -2
  244. package/dist/{theme-toggle-C_VeiiCm.js → theme-toggle-3gbzQX0x.js} +1 -1
  245. package/dist/{toolbar-items-D310xDuM.js → toolbar-items-Bt5RK-Nx.js} +4 -4
  246. package/dist/{translate-material-BypJJ1l5.js → translate-material-CZTGqgen.js} +1 -1
  247. package/dist/{translator-DJkf4J7t.js → translator-DTlOlIoq.js} +108 -4
  248. package/dist/{use-chat-composer-BFhRMHcX.js → use-chat-composer-DBY01IpX.js} +16 -16
  249. package/dist/{use-heading-spy-DJR8YYm6.js → use-heading-spy-Dt48bBts.js} +4 -4
  250. package/dist/{use-material-translation-CD6QoVal.js → use-material-translation-BJucC_xe.js} +1 -1
  251. package/dist/{use-return-focus-Cevw_6yq.js → use-return-focus-BS1JLcnq.js} +1 -1
  252. package/docs/README.md +1 -0
  253. package/docs/components/data-display.md +4 -0
  254. package/docs/components/data-table-filter-and-lists.md +2 -0
  255. package/docs/components/navigation-and-layout.md +944 -27
  256. package/docs/components/rich-widgets.md +26 -0
  257. package/docs/guides/app-shell.md +641 -2
  258. package/docs/guides/i18n.md +13 -1
  259. package/docs/guides/layouts.md +215 -0
  260. package/docs/guides/ssr.md +1 -1
  261. package/docs/previews/navigation-layout-appshell-page-ground.webp +0 -0
  262. package/docs/previews/navigation-layout-appshell.webp +0 -0
  263. package/docs/previews/navigation-layout-authcard-split.webp +0 -0
  264. package/docs/previews/navigation-layout-authcard.webp +0 -0
  265. package/docs/previews/navigation-layout-dashboardgrid.webp +0 -0
  266. package/docs/previews/navigation-layout-editorlayout.webp +0 -0
  267. package/docs/previews/navigation-layout-landinglayout.webp +0 -0
  268. package/docs/previews/navigation-layout-panelayout.webp +0 -0
  269. package/docs/previews/navigation-layout-settingslayout.webp +0 -0
  270. package/docs/previews/navigation-layout-threadlayout-pages.webp +0 -0
  271. package/docs/previews/navigation-layout-threadlayout.webp +0 -0
  272. package/docs/roadmap.md +10 -2
  273. package/lib/components/components.css +3 -0
  274. package/lib/components/ui/actions/fab/fab-dock.css +19 -6
  275. package/lib/components/ui/layout/app-search/app-search.css +62 -0
  276. package/lib/components/ui/layout/app-shell/activity-backdrop.css +10 -2
  277. package/lib/components/ui/layout/app-shell/app-header.css +108 -0
  278. package/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.css +43 -0
  279. package/package.json +1 -1
@@ -236,7 +236,8 @@ the camera's button, toggle and image (`material.camera.capture`, `captured`,
236
236
  barcode accessible names, the calendar's navigation tooltips
237
237
  (`material.calendar.*`), the data table's selection checkboxes, the filter's
238
238
  presets and `Min`/`Max` fields, the `variant="4"` spinner's label,
239
- `ScrollToTop`, the network upload field's `Retry` and `Remove {name}`, the map's
239
+ `ScrollToTop`, the bottom bar's `material.navigation.more` and `.close` (not shown
240
+ until the bar is drawn), the `ThreadLayout` stepper's `nav` name `material.navigation.steps` ("Progress"), the network upload field's `Retry` and `Remove {name}`, the map's
240
241
  `You are here` and zoom buttons, and the icon-only close button of
241
242
  `DialogClose`, `DrawerClose`, `SheetClose` and `SheetContent`'s
242
243
  `withCloseButton`. A range `Slider`'s readout inputs read
@@ -331,6 +332,17 @@ and its emoji buttons (`material['rich-text-editor'].placeholder` /
331
332
  (`material['circular-progress'].label`); `MediaPlayer`'s "Media player" for a
332
333
  track without a title (`material['media-player'].label`); `PaneLayoutPane`'s
333
334
  sheet title on a phone (`material['pane-layout']['sheet-title']`);
335
+ `EditorLayout`'s region names, "Toolbar", "Canvas", "Outline" and "Properties"
336
+ (`material['editor-layout'].toolbar` / `canvas` / `start` / `properties`; French
337
+ "Barre d'outils", "Zone de travail", "Plan", "Propriétés");
338
+ `ListDetailsLayout`'s way back, inspector close and back buttons and the list
339
+ separator's name (`material['list-details'].back` / `inspector-back` /
340
+ `inspector-close` / `resize`);
341
+ `SettingsLayout`'s default title, search name and empty message
342
+ (`material['settings-layout'].title` / `search` / `empty`);
343
+ `LandingLayout`'s phone menu button, "Menu", and `SiteFooter`'s links landmark,
344
+ "Footer" and new-tab hint, "opens in a new tab" (`material.landing.menu` / `footer` /
345
+ `new-tab`; French "Menu", "Pied de page" and "s'ouvre dans un nouvel onglet");
334
346
  `JsonViewer`'s "Empty JSON" (`material['json-viewer'].empty`);
335
347
  `TimePicker`'s AM / PM (`material['time-picker'].am` / `pm`, "a.m." / "p.m." in
336
348
  French); and the names of `DurationField`'s inputs, "Hours" and "Minutes"
@@ -0,0 +1,215 @@
1
+ # Layouts
2
+
3
+ A map of the layouts `@nxgt/material` draws, to pick from by need: how the app
4
+ navigates, what its header looks like, and which layout a page takes. Every
5
+ choice is a prop or a component; nothing here is on unless you ask, and the
6
+ shell's default is unchanged. Each section gives a working example and links
7
+ the page that has the full props. Every component in the snippets is imported
8
+ from `@nxgt/material/components`.
9
+
10
+ Three sizes decide what is drawn, by CSS only (so the server and the client
11
+ agree): a **phone** below 768px, a **tablet** from 768px to 1279px and a
12
+ **desktop** from 1280px.
13
+
14
+ ## Pick a navigation
15
+
16
+ `ActivityLayout` takes `navigation`: one name for every size, or one per size.
17
+
18
+ | The app needs | Use | Notes |
19
+ | --- | --- | --- |
20
+ | three to five main destinations, one thumb away | `'bar'` | a bottom bar on a phone only (below 768px); from 768px the default rail shows, and `{ tablet: 'bar' }` keeps the bar there; the rest go under "More"; badges on the icons |
21
+ | a compact column of icons | `'rail'` | a rail with an optional FAB (`navigationFab`); a phone never draws it: it keeps its menu sheet |
22
+ | the same, with labels and a primary action | `'rail-expanded'` | a wider rail, extended FAB; a phone never draws it: it keeps its menu sheet |
23
+ | many destinations in groups | `'drawer'` | a standard drawer; modal on a phone |
24
+ | a dense tool with the sidebar the user collapses | `'sidebar'` | remembered with `persistKey` |
25
+ | a website-like app with menus | `'top'` | a top navigation with dropdowns; nested in the phone menu |
26
+ | two levels: sections, then pages | `'two-level'` | a rail beside a panel of the section's pages |
27
+ | a content app that wants the whole screen | `'floating'` | a pill of links at the bottom, `hideOnScroll` |
28
+ | the default: a menu sheet on a phone, a rail from 768px | `'modal-drawer'` (the phone preset) | what an unset `navigation` draws |
29
+ | no navigation of its own | `'none'` | |
30
+
31
+ ```tsx
32
+ import { ActivityLayout, type MenuItem } from '@nxgt/material/components';
33
+ import { Outlet } from 'react-router';
34
+
35
+ const items: MenuItem[] = [
36
+ { label: 'Home', url: '/', icon: 'house' },
37
+ { label: 'Inbox', url: '/inbox', icon: 'envelope', badge: 3 },
38
+ { label: 'Tasks', url: '/tasks', icon: 'check' },
39
+ { label: 'Settings', url: '/settings', icon: 'gear', priority: -1 },
40
+ ];
41
+
42
+ // a bottom bar on a phone, a rail with a button on a tablet, a sidebar on a desktop
43
+ export function Shell() {
44
+ return (
45
+ <ActivityLayout
46
+ items={items}
47
+ logo="/logo.svg"
48
+ name="Acme"
49
+ navigation={{ phone: 'bar', tablet: 'rail', desktop: 'sidebar', persistKey: 'acme-nav' }}
50
+ >
51
+ <Outlet />
52
+ </ActivityLayout>
53
+ );
54
+ }
55
+ ```
56
+
57
+ Each preset is also exported as a part (`NavigationBar`, `NavigationRail`,
58
+ `NavigationDrawer`, `TopNav`, `NavigationRailPanel`, `NavigationToolbar`) for a
59
+ layout of your own. Every preset, its entries (`bar`, `priority`, `group`,
60
+ `children`, `badge`) and its accessibility are in the
61
+ [app shell guide](app-shell.md#navigation-and-header).
62
+
63
+ ## Pick a header
64
+
65
+ `header` takes a name or `{ variant, collapse, hideOnScroll, tabs, search }`.
66
+
67
+ | Variant | What it is |
68
+ | --- | --- |
69
+ | `'small'` | the default bar: title at the start, actions at the end |
70
+ | `'center'` | the title centred |
71
+ | `'medium'`, `'large'` | a taller bar whose headline collapses to the small one on scroll |
72
+ | `'none'` | no bar (a full-bleed page) |
73
+
74
+ ```tsx
75
+ <ActivityLayout
76
+ items={items}
77
+ header={{
78
+ variant: 'large',
79
+ hideOnScroll: true,
80
+ search: { placeholder: 'Search projects', shortcut: '/' },
81
+ tabs: (
82
+ <TabsNav aria-label="Project sections" value="activity">
83
+ <TabsNavLink to="/projects/overview" value="overview">Overview</TabsNavLink>
84
+ <TabsNavLink to="/projects/activity" value="activity">Activity</TabsNavLink>
85
+ </TabsNav>
86
+ ),
87
+ }}
88
+ >
89
+ <Outlet />
90
+ </ActivityLayout>
91
+ ```
92
+
93
+ A route changes its own bar with a handle, and draws a back arrow:
94
+
95
+ ```tsx
96
+ export const handle = {
97
+ title: 'Atlas redesign',
98
+ header: { variant: 'medium' },
99
+ back: { to: '/projects', label: 'Projects' },
100
+ } satisfies AppShellHandle;
101
+ ```
102
+
103
+ The search is a pill with a docked results panel from 768px and a full-screen
104
+ view on a phone. See [The app bar variants](app-shell.md#the-app-bar-variants),
105
+ [the search](app-shell.md#the-app-bars-search),
106
+ [the tabs](app-shell.md#tabs-under-the-app-bar) and
107
+ [the back arrow](app-shell.md#the-back-arrow).
108
+
109
+ ## Pick a page layout
110
+
111
+ Inside the shell, a page is one of these. All of them follow the width of their
112
+ own container where noted, so they also work in a dialog or a split pane.
113
+
114
+ | The page is | Use | Phone |
115
+ | --- | --- | --- |
116
+ | a list beside the selected record | `ListDetailsLayout` (`inspector` adds a third pane) | one view at a time, with a back bar |
117
+ | content with a side panel (filters, folders) | `PaneLayout` | the pane is a sheet (`phone="sheet"`, `"bottom"` or `"stack"`) |
118
+ | a form, a wizard or a conversation in a centred column | `ThreadLayout` | the same column, full width |
119
+ | grouped settings | `SettingsLayout` | the list, then the section's page |
120
+ | cards or tiles | `ResponsiveGrid` (spans, masonry) | one column |
121
+ | tiles the user rearranges | `DashboardGrid` | one or two columns |
122
+ | a board of columns | `Kanban` with `phoneLayout="tabs"` | one column per tab, swipe |
123
+ | a tool with a canvas | `EditorLayout` | properties in a bottom sheet |
124
+ | a public page outside the shell | `LandingLayout` | the links in a drawer |
125
+ | sign-in and sign-up | `AuthCard` with `layout="split"` | the card alone |
126
+ | documentation | `Doc` with `chrome="embedded"` inside the shell | the tree in a sheet |
127
+
128
+ A settings screen, from sections:
129
+
130
+ ```tsx
131
+ import { SettingsLayout } from '@nxgt/material/components';
132
+
133
+ <SettingsLayout
134
+ search
135
+ sections={[
136
+ { id: 'profile', group: 'Account', title: 'Profile', description: 'Name and language', content: <ProfileForm /> },
137
+ { id: 'alerts', group: 'Preferences', title: 'Notifications', description: 'Email and push', content: <AlertsForm /> },
138
+ ]}
139
+ />
140
+ ```
141
+
142
+ A list with its detail, selected in the URL. `history="push"` keeps the view in
143
+ `?view=`, so the browser's Back goes from the details to the list on a phone, and
144
+ `useListDetailsParam()` reads and sets the selected id:
145
+
146
+ ```tsx
147
+ const [id, select] = useListDetailsParam();
148
+
149
+ <ListDetailsLayout history="push">
150
+ <ListDetailsLayout.List>
151
+ {patients.map((p) => <Row key={p.id} onClick={() => select(p.id, { open: 'details' })} />)}
152
+ </ListDetailsLayout.List>
153
+ <ListDetailsLayout.Details back="Patients"><Sheet id={id} /></ListDetailsLayout.Details>
154
+ </ListDetailsLayout>
155
+ ```
156
+
157
+ An editor, with its properties in a sheet on a phone:
158
+
159
+ ```tsx
160
+ <EditorLayout
161
+ className="h-dvh"
162
+ toolbar={<><UndoRedoButtons /><span className="flex-1" /><EditorLayout.PropertiesTrigger /></>}
163
+ properties={<SelectionForm />}
164
+ >
165
+ <Artboard />
166
+ </EditorLayout>
167
+ ```
168
+
169
+ A dashboard the user rearranges (the order is yours to store):
170
+
171
+ ```tsx
172
+ <DashboardGrid aria-label="Dashboard" order={order} onOrderChange={setOrder}>
173
+ <DashboardTile id="revenue" title="Revenue" span={{ base: 1, md: 2 }}><RevenueChart /></DashboardTile>
174
+ <DashboardTile id="orders" title="Orders"><OrdersCount /></DashboardTile>
175
+ </DashboardGrid>
176
+ ```
177
+
178
+ A landing page, outside the shell (it needs a router, like the shell):
179
+
180
+ ```tsx
181
+ <LandingLayout
182
+ name="Acme"
183
+ items={[{ label: 'Pricing', url: '/pricing', icon: 'tag' }]}
184
+ actions={<LinkButton to="/start" variant="filled">Get started</LinkButton>}
185
+ hero={<LandingSection variant="hero" tone="ground" title="Plan the work" />}
186
+ footer={<SiteFooter brand="Acme" groups={[]} legal="© 2026 Acme" />}
187
+ >
188
+ <LandingSection title="Everything in one place">…</LandingSection>
189
+ </LandingLayout>
190
+ ```
191
+
192
+ The props of each are in
193
+ [Navigation & layout](../components/navigation-and-layout.md):
194
+ [`ListDetailsLayout`](../components/navigation-and-layout.md#listdetailslayout)
195
+ (with `PaneLayout` and `ThreadLayout`),
196
+ [`SettingsLayout`](../components/navigation-and-layout.md#settingslayout),
197
+ [`ResponsiveGrid`](../components/navigation-and-layout.md#responsivegrid),
198
+ [`DashboardGrid`](../components/navigation-and-layout.md#dashboardgrid),
199
+ [`EditorLayout`](../components/navigation-and-layout.md#editorlayout) and
200
+ [`LandingLayout`](../components/navigation-and-layout.md#landinglayout).
201
+
202
+ ## Whole screens to start from
203
+
204
+ The `Guides/Recipes` stories in Storybook are tested whole screens (the code
205
+ ships with the `screen-recipes` skill of the `nxgt-material` plugin): a home
206
+ dashboard, a list and detail, a form and dialog, a table and settings, a dense
207
+ detail page, a status board and a landing page. Start from the closest one and
208
+ replace the data.
209
+
210
+ ## See also
211
+
212
+ - [App shell](app-shell.md): `items`, breadcrumbs, the page's title, the
213
+ background and the route transitions.
214
+ - [Cards and tiles](cards-and-tiles.md): what goes inside a grid.
215
+ - [Themes](themes.md): the surfaces the layouts sit on.
@@ -167,7 +167,7 @@ State the server cannot know must be resolved the same way on both sides:
167
167
  | Language | no `localStorage`: `defaultLanguage` | Resolve it from the request and pass `initialLanguage` to `I18nProvider`. See [i18n](i18n.md#server-rendering) |
168
168
  | Theme | no preference: light | An inline boot script in `<head>`, and `suppressHydrationWarning` on `<html>`. See [theming](theming.md#no-flash-on-load-a-boot-script) |
169
169
  | `formatAmount`, `formatDate` | the server's locale and time zone, unless you pass them | Use `useFormatters({ timeZone })`, which follows the `I18nProvider` language, or pass `locale` and `timeZone` (`createFormatters` binds them). A date-only `YYYY-MM-DD` is the same everywhere. See [printing](printing.md#formatamount-and-formatdate) |
170
- | Screen width, `prefers-color-scheme` (`useIsMobile`, `useTheme`, `AppHeader`, `DataTable`, `TimeField`, `PaneLayout`, `ListDetailsLayout`, the code blocks, …) | no screen: a desktop, light | Nothing: a hydrating client renders the same, then switches on a phone or a dark screen |
170
+ | Screen width, `prefers-color-scheme` (`useIsMobile`, `useTheme`, `AppHeader`, `DataTable`, `TimeField`, `PaneLayout`, `ListDetailsLayout`, the code blocks, …) | no screen: a desktop, light | Nothing: a hydrating client renders the same, then switches on a phone or a dark screen (`ListDetailsLayout`'s `listWidth` is the default width until then; its inspector is switched by CSS) |
171
171
  | An attribute's `DATETIME` / `TIME` instant (`AttributesSummary`, `AttributesEditor`), the opening hours' first day of the week | the server's time zone and Intl data differ from the browser's | Nothing: the instant is written in UTC and the week starts on the language's first day until mount, then the viewer's zone and the locale's week info take over, so hydration matches |
172
172
  | `Stepper` layout, `Timeline` sides | CSS breakpoints and a container query, no screen width in JavaScript | Nothing: server and client markup are the same |
173
173
  | `Timeline` `grouped` | the server's time zone and clock differ from the browser's | Pass `timeZone` and `now` to group on the server too; without them the day headings appear after mount (the items do not remount) |
package/docs/roadmap.md CHANGED
@@ -169,8 +169,10 @@ version they shipped in, and planned entries may name the major they target.
169
169
 
170
170
  ## Next
171
171
 
172
- - **Layouts: adaptive navigation, headers and page layouts** — `ActivityLayout` takes `navigation` (a bottom bar, a rail with a FAB, standard and modal drawers, a collapsible sidebar, a top navigation with dropdowns, two-level navigation or a floating toolbar, chosen for phone, tablet and desktop) and `header` (small, center-aligned, medium and large collapsing on scroll, a search bar with full-screen search on a phone, sticky tabs, hide on scroll); each piece is also exported. Page layouts grow with it: an inspector pane and URL state for `ListDetailsLayout`, phone modes for `PaneLayout`, spans and masonry for `ResponsiveGrid`, tabs for `Kanban` on a phone, and new settings, dashboard (rearranging tiles), editor and landing layouts, each with a screen recipe. Everything is opt-in; the shell's default is unchanged. Tracked in [#2103](https://github.com/softistx/nxgt-material/issues/2103).
173
-
172
+ - **Seven more layout recipes** — Feed, Gallery, Auth, Thread, settings,
173
+ dashboard and editor screens, each a tested Storybook recipe under
174
+ Guides/Recipes with its code beside it, on the layouts the shell now ships
175
+ ([#2413](https://github.com/softistx/nxgt-material/issues/2413)).
174
176
  - **FilterBar "Add a filter" stays on its row** — the button no longer wraps
175
177
  alone onto a second row on a desktop screen ([#1752](https://github.com/softistx/nxgt-material/issues/1752)).
176
178
 
@@ -259,6 +261,10 @@ version they shipped in, and planned entries may name the major they target.
259
261
 
260
262
  ## Later
261
263
 
264
+ - **A lighter first load for the app shell** — `ActivityLayout` pulls about
265
+ 831 KB gzipped through the library's single shared chunk; splitting it so the
266
+ shell costs tens of KB at first load, the rest loaded where a page uses it
267
+ (#2417; measured by `scripts/shell-size.spec.ts`).
262
268
  - **One `onUpload` options object (next major)** — the upload fields'
263
269
  `onUpload(file, onProgress?, signal?)` becomes `onUpload(file, { onProgress,
264
270
  signal })`, like the editor's upload context.
@@ -377,6 +383,8 @@ version they shipped in, and planned entries may name the major they target.
377
383
 
378
384
  ## Shipped
379
385
 
386
+ - **Layouts: adaptive navigation, headers and page layouts (next minor)** — `ActivityLayout` takes `navigation` (a bottom bar with More and badges, a rail with a FAB or expanded, a standard or modal drawer, a collapsible sidebar, a top navigation with dropdowns, two-level navigation, a floating toolbar or none, chosen for phone, tablet and desktop) and `header` (small, center-aligned, medium and large collapsing on scroll, hide on scroll, a search bar that opens full screen on a phone, sticky tabs), and a route adds a back arrow with `handle.back`; each piece is also exported. Page layouts grow with it: an inspector pane and the selection in the URL for `ListDetailsLayout`, phone modes and a container breakpoint for `PaneLayout`, a centred form and wizard for `ThreadLayout`, a split `AuthCard`, spans and masonry for `ResponsiveGrid`, tabs for `Kanban` on a phone, `Doc` drawn inside the shell, and new `SettingsLayout`, `DashboardGrid` (tiles the user rearranges), `EditorLayout` and `LandingLayout` (with `LandingSection` and `SiteFooter`). Everything is opt-in; the shell's default is unchanged. [Layouts guide](guides/layouts.md) ([#2103](https://github.com/softistx/nxgt-material/issues/2103)). Follow-ups: a resize handle for `EditorLayout`'s properties panel and a separate open state for its phone sheet.
387
+
380
388
  - **Moment (3.74.0)** — a transient full-screen announcement for a one-off event (a player is eliminated, a role is revealed): a modal dialog named by its title, with an illustration, description, action and tone, dismissed by Escape, a tap, its action or a timer, and no motion under reduced motion ([#2220](https://github.com/softistx/nxgt-material/issues/2220), [#2247](https://github.com/softistx/nxgt-material/pull/2247)). A `modal={false}` variant for live events (focus stays, taps pass through, polite status) follows in the next minor ([#2313](https://github.com/softistx/nxgt-material/issues/2313)).
381
389
  - **RecordActionsMenu (next minor)** — one menu for a record's lifecycle: archive with an Undo toast (or confirm first with `archivePolicy="confirm"`), restore, and delete that always confirms and shows the backend's refusal, with `ConfirmDialog` gaining `details` and `refusal` slots.
382
390
  - **Assistant approval card (next minor)** — `ChatActionProposal` shows an action an assistant proposes, with its status, deadline and Confirm / Reject, and `ChatToolActivity` is a compact row for a tool step in a chat thread ([#2134](https://github.com/softistx/nxgt-material/issues/2134)).
@@ -54,6 +54,7 @@
54
54
  @import "./ui/actions/button-group/button-group-standard.css";
55
55
  /* ActivityLayout: the route transition (cross-fade, none under reduced motion). */
56
56
  @import "./ui/layout/app-shell/route-transition.css";
57
+ @import "./ui/layout/app-shell/app-header.css";
57
58
  @import "./ui/layout/app-shell/activity-backdrop.css";
58
59
  @import "./ui/layout/app-shell/activity-backdrop-shapes.css";
59
60
  @import "./ui/layout/auth-card/auth-card-backdrop.css";
@@ -97,6 +98,7 @@
97
98
  @import "./ui/actions/toolbar/toolbar-morph-slots.css";
98
99
  @import "./ui/actions/toolbar/toolbar-morph-widen.css";
99
100
  @import "./ui/actions/toolbar/toolbar-expressive-look.css";
101
+ @import "./ui/layout/navigation-toolbar/navigation-toolbar.css";
100
102
  @import "./ui/actions/toolbar/toolbar-density.css";
101
103
  @import "./editor-toolbar-expressive.css";
102
104
  @import "./editor-floating-bar.css";
@@ -206,6 +208,7 @@
206
208
  @import "./ui/fields/attributes/attributes.css";
207
209
  /* Background: the gradient preset's CSS, shared (lib/backgrounds/css); the other presets are opt-in: backgrounds.css. */
208
210
  @import "./background-shared.css";
211
+ @import "./ui/layout/app-search/app-search.css"; /* AppSearchBar, SearchView */
209
212
  @import "./ui/widgets/drawing/drawing.css"; /* @nxgt/material/draw: role colours, focus ring */
210
213
  @import "./ui/widgets/drawing/drawing-animate.css";
211
214
  @import "./ui/widgets/barcode/barcode.css"; /* @nxgt/material/barcode: symbol colours, label sheet */
@@ -1,6 +1,9 @@
1
1
  /* FabDock: the bottom-end corner, 16px in (24px from 840px wide, M3's
2
- * medium window), above the home indicator and above a docked bar that
3
- * sets --nxgt-media-dock. `contained` places it in its positioned parent.
2
+ * medium window), above the home indicator, above a docked bar that sets
3
+ * --nxgt-media-dock and above a bottom navigation bar (--nxgt-nav-bar);
4
+ * --nxgt-bottom-chrome is the two together. The bar's room holds the
5
+ * safe area, so the dock clears the taller of the two, not their sum. `contained` places it in its
6
+ * positioned parent.
4
7
  * While a FabMenu in it is open, a light scrim covers the page (contained:
5
8
  * the pane) behind the pills. The menu is modal, so the whole page is inert
6
9
  * either way. */
@@ -11,8 +14,13 @@
11
14
  inset-inline-end: var(--fab-dock-gap);
12
15
  inset-block-end: calc(
13
16
  var(--fab-dock-gap) +
14
- env(safe-area-inset-bottom, 0px) +
15
- var(--nxgt-media-dock, 0px)
17
+ max(
18
+ env(safe-area-inset-bottom, 0px),
19
+ var(
20
+ --nxgt-bottom-chrome,
21
+ calc(var(--nxgt-nav-bar, 0px) + var(--nxgt-media-dock, 0px))
22
+ )
23
+ )
16
24
  );
17
25
  z-index: 40;
18
26
  display: flex;
@@ -33,8 +41,13 @@
33
41
  padding: var(--fab-dock-gap);
34
42
  padding-block-end: calc(
35
43
  var(--fab-dock-gap) +
36
- env(safe-area-inset-bottom, 0px) +
37
- var(--nxgt-media-dock, 0px)
44
+ max(
45
+ env(safe-area-inset-bottom, 0px),
46
+ var(
47
+ --nxgt-bottom-chrome,
48
+ calc(var(--nxgt-nav-bar, 0px) + var(--nxgt-media-dock, 0px))
49
+ )
50
+ )
38
51
  );
39
52
  }
40
53
  @media (min-width: 840px) {
@@ -0,0 +1,62 @@
1
+ /* The app bar's search (app-search-bar.tsx, search-view.tsx). One source for
2
+ * the sizes: --nxgt-search-h is the pill's height, 2.75rem in the bar and
3
+ * 3rem (a 48px target) in the phone's full-screen view; the back arrow, the
4
+ * phone's button and the field read it. The pill is a filled, fully rounded
5
+ * field box: no border at rest, the field box's focus ring when focused.
6
+ * Classes in the `components` layer: a utility passed as `className` wins. */
7
+ @layer components {
8
+ .nxgt-search-bar {
9
+ --nxgt-search-h: 2.75rem;
10
+ }
11
+ .nxgt-search-button {
12
+ --nxgt-search-h: 3rem;
13
+ }
14
+ .nxgt-search-view {
15
+ --nxgt-search-h: 3rem;
16
+ }
17
+ .nxgt-search-pill {
18
+ --nxgt-field-radius: calc(var(--nxgt-search-h) / 2);
19
+ }
20
+ .nxgt-search-pill [data-slot="input-group"] {
21
+ height: var(--nxgt-search-h);
22
+ border-color: transparent;
23
+ background-color: var(--muted);
24
+ }
25
+ .nxgt-search-pill [data-slot="input-group"]:focus-within {
26
+ background-color: var(--background);
27
+ }
28
+ /* The bar's pill: grows to a comfortable width and gives way to the title. */
29
+ .nxgt-search-bar {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 0.5rem;
33
+ flex: 0 1 28rem;
34
+ min-width: 0;
35
+ }
36
+ .nxgt-search-form {
37
+ flex: 1 1 auto;
38
+ min-width: 0;
39
+ }
40
+ .nxgt-search-button {
41
+ flex: none;
42
+ }
43
+ .nxgt-search-view-row {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 0.5rem;
47
+ padding: 0.5rem;
48
+ padding-top: max(0.5rem, env(safe-area-inset-top));
49
+ padding-left: max(0.5rem, env(safe-area-inset-left));
50
+ padding-right: max(0.5rem, env(safe-area-inset-right));
51
+ }
52
+ .nxgt-search-view-back {
53
+ flex: none;
54
+ }
55
+ .nxgt-search-view-results {
56
+ min-height: 0;
57
+ overflow-y: auto;
58
+ overscroll-behavior: contain;
59
+ padding: 0.5rem 1rem;
60
+ padding-bottom: max(0.5rem, env(safe-area-inset-bottom));
61
+ }
62
+ }
@@ -82,8 +82,16 @@
82
82
  --nxgt-backdrop-height: calc(
83
83
  100dvh -
84
84
  var(--nxgt-backdrop-top) -
85
- max(0.5rem, env(safe-area-inset-bottom)) -
86
- var(--nxgt-media-dock, 0px)
85
+ max(
86
+ max(0.5rem, env(safe-area-inset-bottom)),
87
+ calc(
88
+ 0.5rem +
89
+ var(
90
+ --nxgt-bottom-chrome,
91
+ calc(var(--nxgt-nav-bar, 0px) + var(--nxgt-media-dock, 0px))
92
+ )
93
+ )
94
+ )
87
95
  );
88
96
  position: sticky;
89
97
  top: var(--nxgt-backdrop-top);
@@ -0,0 +1,108 @@
1
+ /* The app bar's variants (app-header.tsx). A medium or large bar is a first row
2
+ * (the small bar) and a headline row under it. `--nxgt-header-progress` (0
3
+ * expanded, 1 collapsed) is set on the bar by use-header-scroll.ts as the shell
4
+ * scrolls; unset (the server, a bar outside the shell) it is 0, the expanded
5
+ * bar. Scoped to the bar's `data-variant`: the default small bar is untouched. */
6
+ [data-slot="app-header"][data-variant="medium"] {
7
+ --nxgt-header-extra: 5rem;
8
+ }
9
+ [data-slot="app-header"][data-variant="large"] {
10
+ --nxgt-header-extra: 8rem;
11
+ }
12
+ /* The bar's height now: the row, and the headline's share still showing. */
13
+ [data-slot="app-header"][data-variant] {
14
+ --nxgt-header-h: var(--nxgt-header-height);
15
+ }
16
+ [data-slot="app-header"]:is([data-variant="medium"], [data-variant="large"]) {
17
+ --nxgt-header-h: calc(
18
+ var(--nxgt-header-height) +
19
+ var(--nxgt-header-extra) *
20
+ (1 - var(--nxgt-header-progress, 0))
21
+ );
22
+ height: var(--nxgt-header-h);
23
+ }
24
+ [data-slot="app-header-headline"] {
25
+ min-height: 0;
26
+ opacity: clamp(0, calc(1 - var(--nxgt-header-progress, 0) * 1.6), 1);
27
+ transform: translateY(calc(var(--nxgt-header-progress, 0) * -0.75rem));
28
+ }
29
+ /* Not collapsing: the headline stays. */
30
+ [data-slot="app-header"]:not([data-collapsible])
31
+ [data-slot="app-header-headline"] {
32
+ opacity: 1;
33
+ transform: none;
34
+ }
35
+ /* The copy of the title in the small row appears once the headline is going. */
36
+ [data-slot="app-header-collapsed-title"] {
37
+ opacity: clamp(0, calc((var(--nxgt-header-progress, 0) - 0.5) * 2), 1);
38
+ }
39
+
40
+ /* Hide on scroll: the bar slides up under the gutter, and out of the tab order
41
+ * (`inert`, set with data-hidden). A bar in a contained shell is in the flow,
42
+ * so it also gives its room back. */
43
+ [data-slot="app-header"][data-variant] {
44
+ transition: transform 200ms ease;
45
+ }
46
+ [data-slot="app-header"][data-hidden] {
47
+ transform: translateY(calc(-100% - 1rem - env(safe-area-inset-top, 0px)));
48
+ }
49
+ [data-slot="activity-layout"][data-scroll="container"]
50
+ [data-slot="app-header"][data-hidden] {
51
+ margin-bottom: calc(-1 * var(--nxgt-header-h) - 0.5rem);
52
+ }
53
+ @media (prefers-reduced-motion: reduce) {
54
+ [data-slot="app-header"][data-variant] {
55
+ transition: none;
56
+ }
57
+ }
58
+
59
+ /* Tabs: a row of one size under the bar, stuck to it (app-header.tsx). The bar
60
+ * is that much taller; while it hides on scroll it slides up by everything but
61
+ * the tabs, which stay pinned at the top of the window. */
62
+ [data-slot="app-header"] {
63
+ --nxgt-header-tabs: 3rem;
64
+ }
65
+ [data-slot="app-header"][data-tabs]:is(
66
+ [data-variant="medium"],
67
+ [data-variant="large"]
68
+ ) {
69
+ height: calc(var(--nxgt-header-h) + var(--nxgt-header-tabs));
70
+ }
71
+ [data-slot="app-header"][data-tabs][data-hidden] {
72
+ transform: translateY(calc(var(--nxgt-header-tabs) - 100%));
73
+ }
74
+ [data-slot="activity-layout"][data-scroll="container"]
75
+ [data-slot="app-header"][data-tabs][data-hidden] {
76
+ margin-bottom: calc(-1 * var(--nxgt-header-h));
77
+ }
78
+ /* The headline's bottom padding goes with the collapse when tabs close the bar,
79
+ * else it would keep 1rem the tabs have no room for. */
80
+ [data-slot="app-header"][data-tabs] [data-slot="app-header-headline"] {
81
+ padding-bottom: calc(1rem * (1 - var(--nxgt-header-progress, 0)));
82
+ }
83
+ [data-slot="app-header"][data-tabs]:not([data-collapsible])
84
+ [data-slot="app-header-headline"] {
85
+ padding-bottom: 1rem;
86
+ }
87
+
88
+ /* The bar's whole height on the layout root (ActivityLayout sets data-header and
89
+ * data-header-tabs on it: nothing restyles the page from a descendant), for the sticky panels
90
+ * (sticky-offset.ts): worked out here from the bar's variant and tabs so the
91
+ * server's first paint is right; use-header-height.ts then replaces it with the
92
+ * measured height (a custom row, a wrapped tab bar). */
93
+ [data-slot="activity-layout"] {
94
+ --nxgt-header-total: calc(
95
+ var(--nxgt-header-height, 4rem) +
96
+ var(--nxgt-header-total-extra, 0rem) +
97
+ var(--nxgt-header-total-tabs, 0rem)
98
+ );
99
+ }
100
+ [data-slot="activity-layout"][data-header="medium"] {
101
+ --nxgt-header-total-extra: 5rem;
102
+ }
103
+ [data-slot="activity-layout"][data-header="large"] {
104
+ --nxgt-header-total-extra: 8rem;
105
+ }
106
+ [data-slot="activity-layout"][data-header-tabs] {
107
+ --nxgt-header-total-tabs: 3rem;
108
+ }
@@ -0,0 +1,43 @@
1
+ /* The navigation toolbar: the floating Toolbar's pill (its tokens, shadow and
2
+ * the slide away, toolbar.css and toolbar-variants.css, are used as they are)
3
+ * holding navigation links instead of actions. What differs: it is fixed at
4
+ * the bottom centre, an item is a 48px link at every pointer, and the current
5
+ * page (data-active, beside aria-current) takes the pressed look of toolbar-selected.css. Sizes
6
+ * are mirrored in navigation-toolbar.classes.ts. */
7
+ @layer components {
8
+ .nxgt-toolbar.nxgt-nav-toolbar {
9
+ --nxgt-nav-toolbar-gap: 1rem;
10
+ --tb-item: 3rem;
11
+ --tb-icon: 1.5rem;
12
+ position: fixed;
13
+ inset-inline: 0;
14
+ /* A docked media bar sits above the pill (its bottom is --nxgt-nav-bar). */
15
+ bottom: calc(
16
+ env(safe-area-inset-bottom, 0px) +
17
+ var(--nxgt-nav-toolbar-gap)
18
+ );
19
+ z-index: 30;
20
+ margin-inline: auto;
21
+ max-width: calc(100% - 1rem);
22
+ }
23
+ .nxgt-nav-toolbar .nxgt-toolbar-item {
24
+ text-decoration: none;
25
+ }
26
+ .nxgt-nav-toolbar .nxgt-toolbar-item[data-active],
27
+ .nxgt-nav-toolbar .nxgt-toolbar-item[data-active]:is(:hover, :active) {
28
+ background: var(--tb-on);
29
+ color: var(--tb-on-fg);
30
+ }
31
+ /* Reduced motion: it snaps away instead of sliding. */
32
+ @media (prefers-reduced-motion: reduce) {
33
+ .nxgt-toolbar.nxgt-nav-toolbar {
34
+ transition: none;
35
+ }
36
+ }
37
+ @media (forced-colors: active) {
38
+ .nxgt-nav-toolbar .nxgt-toolbar-item[data-active] {
39
+ outline: 2px solid Highlight;
40
+ outline-offset: -2px;
41
+ }
42
+ }
43
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxgt/material",
3
- "version": "3.79.0",
3
+ "version": "3.80.0",
4
4
  "license": "MIT",
5
5
  "bugs": {
6
6
  "email": "stevegires@gmail.com"