@nxgt/material 3.79.1 → 3.81.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 (352) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +48 -8
  3. package/dist/{alert-dialog-653apk3f.js → alert-dialog-DOZ0SfQs.js} +1 -1
  4. package/dist/{async-slice-CXLbQuOc.js → async-slice-BfVokA46.js} +1 -1
  5. package/dist/{button-3op3rtZh.js → button-CSKUtMI3.js} +2 -2
  6. package/dist/{calculator-KqIMBXSh.js → calculator-Cv00UQgR.js} +10 -10
  7. package/dist/calculator-field.js +6 -6
  8. package/dist/{calculator-segment-BlJE1LaS.js → calculator-segment-CwnC2cV_.js} +1 -1
  9. package/dist/calculator.js +1 -1
  10. package/dist/charts.js +3 -3
  11. package/dist/{chip-MuKDwtkG.js → chip-BGn0V6Pt.js} +3 -3
  12. package/dist/{code-editor-Bp2RrdNx.js → code-editor-B25-mWhb.js} +4 -4
  13. package/dist/code-editor.js +4 -4
  14. package/dist/{code-language-items-B7WR5ua_.js → code-language-items-oRjtO3qV.js} +2 -2
  15. package/dist/components/base-content.css +11 -0
  16. package/dist/components/components.css +5 -0
  17. package/dist/components/ui/actions/fab/fab-dock.css +19 -6
  18. package/dist/components/ui/collections/data-table/data-table-items-tiles.css +27 -1
  19. package/dist/components/ui/display/tube-cap/tube-cap.css +87 -0
  20. package/dist/components/ui/layout/app-search/app-search.css +62 -0
  21. package/dist/components/ui/layout/app-shell/activity-backdrop.css +10 -2
  22. package/dist/components/ui/layout/app-shell/app-header.css +108 -0
  23. package/dist/components/ui/layout/navigation-toolbar/navigation-toolbar.css +43 -0
  24. package/dist/{components-CTyNC_zW.js → components-B00kDHzJ.js} +23101 -18734
  25. package/dist/components.js +37 -37
  26. package/dist/{conversion-variant-BDFAxqe9.js → conversion-variant-wZd-G6xR.js} +3 -3
  27. package/dist/{currency-field-DWHB5oms.js → currency-field-DizBTAat.js} +4 -4
  28. package/dist/{date.utils-DUvqcjan.js → date.utils-JTEIo3mM.js} +98 -98
  29. package/dist/{dialog-Bm5LvVlB.js → dialog-B-3s-oXt.js} +3 -3
  30. package/dist/dnd.js +2 -2
  31. package/dist/{dropdown-menu-xlZ6NYUA.js → dropdown-menu-C6rcYGB9.js} +1 -1
  32. package/dist/editor.js +19 -19
  33. package/dist/{empty-state-C0kviQdW.js → empty-state-CSkghnD9.js} +1 -1
  34. package/dist/{financial-variant-CggTpad2.js → financial-variant-igpGRbGw.js} +5 -5
  35. package/dist/{hooks-Dg94jPRq.js → hooks-DvIsom2p.js} +2 -2
  36. package/dist/hooks.js +9 -8
  37. package/dist/{hover-card-B1g55Hi6.js → hover-card-DuaVVKMb.js} +1 -1
  38. package/dist/i18n.js +3 -3
  39. package/dist/{icon-badge-BcW66bRk.js → icon-badge-3ThP6EOl.js} +1 -1
  40. package/dist/{icon-button-Cogxy1cy.js → icon-button-4PKlaI1g.js} +2 -2
  41. package/dist/lib/components/ui/actions/button/button-tones.d.ts +17 -16
  42. package/dist/lib/components/ui/collections/day-grouped-list/day-grouped-list.d.ts +6 -1
  43. package/dist/lib/components/ui/collections/filter/use-filter-field-config.d.ts +2 -0
  44. package/dist/lib/components/ui/collections/server-table/types-states.d.ts +5 -1
  45. package/dist/lib/components/ui/display/index.d.ts +1 -0
  46. package/dist/lib/components/ui/display/tube-cap/index.d.ts +2 -0
  47. package/dist/lib/components/ui/display/tube-cap/tube-cap.d.ts +27 -0
  48. package/dist/lib/components/ui/display/tube-cap/tube-cap.kinds.d.ts +7 -0
  49. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  50. package/dist/lib/components/ui/fields/repeatable-group/partials/repeatable-group-row.d.ts +3 -1
  51. package/dist/lib/components/ui/fields/repeatable-group/partials/repeatable-group-rows.d.ts +2 -1
  52. package/dist/lib/components/ui/fields/repeatable-group/repeatable-group.d.ts +1 -1
  53. package/dist/lib/components/ui/fields/repeatable-group/types.d.ts +7 -0
  54. package/dist/lib/components/ui/layout/app-bar/top-app-bar.d.ts +18 -3
  55. package/dist/lib/components/ui/layout/app-search/app-search-bar.d.ts +11 -0
  56. package/dist/lib/components/ui/layout/app-search/app-search.types.d.ts +47 -0
  57. package/dist/lib/components/ui/layout/app-search/index.d.ts +3 -0
  58. package/dist/lib/components/ui/layout/app-search/partials/on-phone.d.ts +2 -0
  59. package/dist/lib/components/ui/layout/app-search/partials/phone-search.d.ts +3 -0
  60. package/dist/lib/components/ui/layout/app-search/partials/pill-search.d.ts +3 -0
  61. package/dist/lib/components/ui/layout/app-search/pill-form.d.ts +18 -0
  62. package/dist/lib/components/ui/layout/app-search/search-panel.d.ts +24 -0
  63. package/dist/lib/components/ui/layout/app-search/search-results.d.ts +14 -0
  64. package/dist/lib/components/ui/layout/app-search/search-shortcut.d.ts +15 -0
  65. package/dist/lib/components/ui/layout/app-search/search-view.d.ts +22 -0
  66. package/dist/lib/components/ui/layout/app-search/use-pill-panel.d.ts +22 -0
  67. package/dist/lib/components/ui/layout/app-search/use-search-text.d.ts +8 -0
  68. package/dist/lib/components/ui/layout/app-shell/activity-app-bar.d.ts +35 -0
  69. package/dist/lib/components/ui/layout/app-shell/activity-chrome.d.ts +26 -3
  70. package/dist/lib/components/ui/layout/app-shell/activity-column-props.d.ts +22 -0
  71. package/dist/lib/components/ui/layout/app-shell/activity-column.d.ts +10 -2
  72. package/dist/lib/components/ui/layout/app-shell/activity-layout-navigation.types.d.ts +94 -0
  73. package/dist/lib/components/ui/layout/app-shell/activity-layout.d.ts +8 -1
  74. package/dist/lib/components/ui/layout/app-shell/activity-layout.types.d.ts +2 -1
  75. package/dist/lib/components/ui/layout/app-shell/activity-rails.d.ts +16 -0
  76. package/dist/lib/components/ui/layout/app-shell/activity-sidebar-lane.d.ts +22 -0
  77. package/dist/lib/components/ui/layout/app-shell/activity-top-nav.d.ts +11 -0
  78. package/dist/lib/components/ui/layout/app-shell/activity-two-level-lane.d.ts +14 -0
  79. package/dist/lib/components/ui/layout/app-shell/app-back.d.ts +22 -0
  80. package/dist/lib/components/ui/layout/app-shell/app-header-row.d.ts +3 -0
  81. package/dist/lib/components/ui/layout/app-shell/app-header.d.ts +33 -1
  82. package/dist/lib/components/ui/layout/app-shell/app-shell.utils.d.ts +8 -0
  83. package/dist/lib/components/ui/layout/app-shell/app-sidebar-entries.d.ts +13 -0
  84. package/dist/lib/components/ui/layout/app-shell/app-sidebar-label-item.d.ts +3 -1
  85. package/dist/lib/components/ui/layout/app-shell/bottom-chrome.d.ts +13 -0
  86. package/dist/lib/components/ui/layout/app-shell/header-title.d.ts +18 -2
  87. package/dist/lib/components/ui/layout/app-shell/header.utils.d.ts +37 -0
  88. package/dist/lib/components/ui/layout/app-shell/index.d.ts +3 -0
  89. package/dist/lib/components/ui/layout/app-shell/navigation-parts.d.ts +38 -0
  90. package/dist/lib/components/ui/layout/app-shell/navigation.utils.d.ts +36 -0
  91. package/dist/lib/components/ui/layout/app-shell/page-title-scope.d.ts +14 -0
  92. package/dist/lib/components/ui/layout/app-shell/page-title.d.ts +12 -1
  93. package/dist/lib/components/ui/layout/app-shell/shell-scroll.d.ts +32 -0
  94. package/dist/lib/components/ui/layout/app-shell/sticky-offset.d.ts +8 -0
  95. package/dist/lib/components/ui/layout/app-shell/types.d.ts +14 -0
  96. package/dist/lib/components/ui/layout/app-shell/use-focus-while-hidden.d.ts +9 -0
  97. package/dist/lib/components/ui/layout/app-shell/use-header-height.d.ts +12 -0
  98. package/dist/lib/components/ui/layout/app-shell/use-header-scroll.d.ts +19 -0
  99. package/dist/lib/components/ui/layout/app-shell/use-shell-header.d.ts +20 -0
  100. package/dist/lib/components/ui/layout/auth-card/auth-card-split.d.ts +14 -0
  101. package/dist/lib/components/ui/layout/auth-card/auth-card.d.ts +13 -1
  102. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid-context.d.ts +21 -0
  103. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.d.ts +9 -0
  104. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.state.d.ts +30 -0
  105. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.tiles.d.ts +8 -0
  106. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.types.d.ts +50 -0
  107. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.utils.d.ts +70 -0
  108. package/dist/lib/components/ui/layout/dashboard-grid/dashboard-tile.d.ts +7 -0
  109. package/dist/lib/components/ui/layout/dashboard-grid/index.d.ts +4 -0
  110. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-announcer.d.ts +6 -0
  111. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-edit-bar.d.ts +11 -0
  112. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-move-buttons.d.ts +9 -0
  113. package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-toolbar.d.ts +7 -0
  114. package/dist/lib/components/ui/layout/dashboard-grid/use-dashboard-grid.d.ts +21 -0
  115. package/dist/lib/components/ui/layout/dashboard-grid/use-dashboard-moves.d.ts +22 -0
  116. package/dist/lib/components/ui/layout/doc/doc-context.d.ts +2 -0
  117. package/dist/lib/components/ui/layout/doc/doc.d.ts +5 -0
  118. package/dist/lib/components/ui/layout/doc/index.d.ts +1 -1
  119. package/dist/lib/components/ui/layout/doc/partials/doc-embedded-bar.d.ts +9 -0
  120. package/dist/lib/components/ui/layout/doc/partials/doc-embedded.d.ts +8 -0
  121. package/dist/lib/components/ui/layout/doc/use-doc.d.ts +9 -1
  122. package/dist/lib/components/ui/layout/editor-layout/editor-layout.d.ts +14 -0
  123. package/dist/lib/components/ui/layout/editor-layout/editor-layout.types.d.ts +31 -0
  124. package/dist/lib/components/ui/layout/editor-layout/index.d.ts +4 -0
  125. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-body.d.ts +11 -0
  126. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-canvas.d.ts +8 -0
  127. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-context.d.ts +12 -0
  128. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-start.d.ts +8 -0
  129. package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-triggers.d.ts +10 -0
  130. package/dist/lib/components/ui/layout/editor-layout/partials/use-editor-layout-names.d.ts +8 -0
  131. package/dist/lib/components/ui/layout/editor-layout/partials/use-editor-layout-state.d.ts +21 -0
  132. package/dist/lib/components/ui/layout/index.d.ts +9 -0
  133. package/dist/lib/components/ui/layout/landing/index.d.ts +6 -0
  134. package/dist/lib/components/ui/layout/landing/landing-layout.d.ts +15 -0
  135. package/dist/lib/components/ui/layout/landing/landing-layout.types.d.ts +27 -0
  136. package/dist/lib/components/ui/layout/landing/landing-section.d.ts +12 -0
  137. package/dist/lib/components/ui/layout/landing/landing-section.types.d.ts +32 -0
  138. package/dist/lib/components/ui/layout/landing/landing.classes.d.ts +20 -0
  139. package/dist/lib/components/ui/layout/landing/partials/landing-header.d.ts +11 -0
  140. package/dist/lib/components/ui/layout/landing/partials/landing-section-intro.d.ts +13 -0
  141. package/dist/lib/components/ui/layout/landing/partials/site-footer-group.d.ts +8 -0
  142. package/dist/lib/components/ui/layout/landing/site-footer.d.ts +13 -0
  143. package/dist/lib/components/ui/layout/landing/site-footer.types.d.ts +29 -0
  144. package/dist/lib/components/ui/layout/list-details-layout/internal.d.ts +2 -0
  145. package/dist/lib/components/ui/layout/list-details-layout/list-details-layout.d.ts +9 -17
  146. package/dist/lib/components/ui/layout/list-details-layout/partials/history-mark.d.ts +2 -0
  147. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-context.d.ts +17 -1
  148. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-history.d.ts +8 -0
  149. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-inspector.d.ts +21 -0
  150. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-layout.types.d.ts +47 -0
  151. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-resizer.d.ts +9 -0
  152. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-root.d.ts +3 -0
  153. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-trigger.d.ts +13 -4
  154. package/dist/lib/components/ui/layout/list-details-layout/partials/use-inspector-focus.d.ts +8 -0
  155. package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-details-param.d.ts +26 -0
  156. package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-details-state.d.ts +15 -0
  157. package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-width.d.ts +16 -0
  158. package/dist/lib/components/ui/layout/list-details-layout/partials/use-pane-focus.d.ts +6 -4
  159. package/dist/lib/components/ui/layout/navigation-bar/index.d.ts +3 -0
  160. package/dist/lib/components/ui/layout/navigation-bar/internal.d.ts +4 -0
  161. package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.classes.d.ts +14 -0
  162. package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.d.ts +35 -0
  163. package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.utils.d.ts +19 -0
  164. package/dist/lib/components/ui/layout/navigation-bar/partials/bar-badge.d.ts +5 -0
  165. package/dist/lib/components/ui/layout/navigation-bar/partials/bar-entry.d.ts +12 -0
  166. package/dist/lib/components/ui/layout/navigation-bar/partials/navigation-bar-item.d.ts +22 -0
  167. package/dist/lib/components/ui/layout/navigation-bar/partials/navigation-bar-more.d.ts +24 -0
  168. package/dist/lib/components/ui/layout/navigation-bar/use-nav-bar-inset.d.ts +12 -0
  169. package/dist/lib/components/ui/layout/navigation-drawer/index.d.ts +5 -0
  170. package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.classes.d.ts +9 -0
  171. package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.d.ts +45 -0
  172. package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.utils.d.ts +14 -0
  173. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-body.d.ts +3 -0
  174. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-item.d.ts +20 -0
  175. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-modal.d.ts +17 -0
  176. package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-section.d.ts +15 -0
  177. package/dist/lib/components/ui/layout/navigation-rail/index.d.ts +3 -0
  178. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail-panel.d.ts +26 -0
  179. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.classes.d.ts +23 -0
  180. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.d.ts +42 -1
  181. package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.utils.d.ts +4 -0
  182. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-body.d.ts +3 -0
  183. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-item.d.ts +20 -0
  184. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-panel-item.d.ts +7 -0
  185. package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-toggle.d.ts +7 -0
  186. package/dist/lib/components/ui/layout/navigation-rail/use-rail-expanded.d.ts +13 -0
  187. package/dist/lib/components/ui/layout/navigation-toolbar/index.d.ts +2 -0
  188. package/dist/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.classes.d.ts +20 -0
  189. package/dist/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.d.ts +51 -0
  190. package/dist/lib/components/ui/layout/navigation-toolbar/partials/navigation-toolbar-item.d.ts +25 -0
  191. package/dist/lib/components/ui/layout/navigation-toolbar/partials/navigation-toolbar-more.d.ts +3 -0
  192. package/dist/lib/components/ui/layout/pane-layout/internal.d.ts +3 -0
  193. package/dist/lib/components/ui/layout/pane-layout/pane-layout.d.ts +16 -2
  194. package/dist/lib/components/ui/layout/pane-layout/partials/pane-layout-classes.d.ts +7 -0
  195. package/dist/lib/components/ui/layout/pane-layout/partials/pane-layout-context.d.ts +13 -0
  196. package/dist/lib/components/ui/layout/pane-layout/partials/use-pane-layout-state.d.ts +16 -0
  197. package/dist/lib/components/ui/layout/pane-layout/partials/use-pane-narrow.d.ts +6 -0
  198. package/dist/lib/components/ui/layout/responsive-grid/index.d.ts +4 -1
  199. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid-item.d.ts +19 -0
  200. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid-spans.d.ts +19 -0
  201. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid.d.ts +24 -2
  202. package/dist/lib/components/ui/layout/responsive-grid/responsive-grid.utils.d.ts +12 -0
  203. package/dist/lib/components/ui/layout/settings-layout/index.d.ts +2 -0
  204. package/dist/lib/components/ui/layout/settings-layout/partials/settings-link.d.ts +7 -0
  205. package/dist/lib/components/ui/layout/settings-layout/partials/settings-list.d.ts +11 -0
  206. package/dist/lib/components/ui/layout/settings-layout/partials/settings-page.d.ts +5 -0
  207. package/dist/lib/components/ui/layout/settings-layout/settings-layout.d.ts +10 -0
  208. package/dist/lib/components/ui/layout/settings-layout/settings-layout.types.d.ts +33 -0
  209. package/dist/lib/components/ui/layout/settings-layout/settings-layout.utils.d.ts +13 -0
  210. package/dist/lib/components/ui/layout/thread-layout/thread-layout-classes.d.ts +17 -0
  211. package/dist/lib/components/ui/layout/thread-layout/thread-layout-parts.d.ts +14 -0
  212. package/dist/lib/components/ui/layout/thread-layout/thread-layout-stepper.d.ts +11 -0
  213. package/dist/lib/components/ui/layout/thread-layout/thread-layout.d.ts +30 -3
  214. package/dist/lib/components/ui/layout/top-nav/index.d.ts +5 -0
  215. package/dist/lib/components/ui/layout/top-nav/partials/top-nav-item.d.ts +23 -0
  216. package/dist/lib/components/ui/layout/top-nav/partials/top-nav-menu.d.ts +22 -0
  217. package/dist/lib/components/ui/layout/top-nav/top-nav.classes.d.ts +10 -0
  218. package/dist/lib/components/ui/layout/top-nav/top-nav.d.ts +34 -0
  219. package/dist/lib/components/ui/layout/top-nav/top-nav.utils.d.ts +10 -0
  220. package/dist/lib/components/ui/media/galleries/gallery.d.ts +1 -1
  221. package/dist/lib/components/ui/media/galleries/lightbox-gallery.d.ts +1 -1
  222. package/dist/lib/components/ui/media/galleries/mini-gallery.d.ts +1 -1
  223. package/dist/lib/components/ui/overlays/dialog/dialog-parts.d.ts +1 -1
  224. package/dist/lib/components/ui/overlays/sheet/sheet-parts.d.ts +5 -0
  225. package/dist/lib/components/ui/selection/choice-card-group/choice-card-balance.d.ts +4 -0
  226. package/dist/lib/components/ui/selection/choice-card-group/choice-card-group.d.ts +3 -1
  227. package/dist/lib/components/ui/selection/choice-card-group/choice-card-group.types.d.ts +7 -0
  228. package/dist/lib/components/ui/selection/sortable-list/partials/sortable-list-body.d.ts +5 -1
  229. package/dist/lib/components/ui/selection/sortable-list/partials/sortable-list-row-parts.d.ts +2 -1
  230. package/dist/lib/components/ui/selection/sortable-list/partials/sortable-list-row-props.d.ts +8 -5
  231. package/dist/lib/components/ui/selection/sortable-list/partials/use-owed-focus.d.ts +10 -0
  232. package/dist/lib/components/ui/selection/sortable-list/sortable-list-context.d.ts +2 -0
  233. package/dist/lib/components/ui/selection/sortable-list/sortable-list.keyboard.d.ts +1 -1
  234. package/dist/lib/components/ui/widgets/event-calendar/event-calendar-context.d.ts +3 -0
  235. package/dist/lib/components/ui/widgets/event-calendar/event-calendar-shell.d.ts +15 -0
  236. package/dist/lib/components/ui/widgets/event-calendar/event-calendar-template.d.ts +9 -0
  237. package/dist/lib/components/ui/widgets/event-calendar/event-calendar.d.ts +7 -3
  238. package/dist/lib/components/ui/widgets/event-calendar/event-calendar.template.d.ts +41 -0
  239. package/dist/lib/components/ui/widgets/event-calendar/index.d.ts +1 -0
  240. package/dist/lib/components/ui/widgets/event-calendar/partials/calendar-date-nav.d.ts +2 -0
  241. package/dist/lib/components/ui/widgets/event-calendar/partials/calendar-lane-toggle.d.ts +5 -0
  242. package/dist/lib/components/ui/widgets/event-calendar/partials/time-grid-header-template.d.ts +7 -0
  243. package/dist/lib/components/ui/widgets/event-calendar/template.types.d.ts +73 -0
  244. package/dist/lib/components/ui/widgets/event-calendar/types.d.ts +2 -0
  245. package/dist/lib/components/ui/widgets/event-calendar/use-chip-event.d.ts +1 -0
  246. package/dist/lib/components/ui/widgets/event-calendar/use-drawn-events.d.ts +4 -3
  247. package/dist/lib/components/ui/widgets/event-calendar/use-template-calendar.d.ts +18 -0
  248. package/dist/lib/components/ui/widgets/event-calendar/use-template-lane.d.ts +17 -0
  249. package/dist/lib/components/ui/widgets/kanban/index.d.ts +1 -1
  250. package/dist/lib/components/ui/widgets/kanban/kanban-context.d.ts +5 -2
  251. package/dist/lib/components/ui/widgets/kanban/kanban.d.ts +11 -2
  252. package/dist/lib/components/ui/widgets/kanban/kanban.slice.d.ts +32 -0
  253. package/dist/lib/components/ui/widgets/kanban/kanban.utils.d.ts +9 -0
  254. package/dist/lib/components/ui/widgets/kanban/partials/kanban-card-preview.d.ts +3 -1
  255. package/dist/lib/components/ui/widgets/kanban/partials/kanban-column.d.ts +6 -0
  256. package/dist/lib/components/ui/widgets/kanban/partials/kanban-move-to.d.ts +13 -0
  257. package/dist/lib/components/ui/widgets/kanban/partials/kanban-phone-tabs.d.ts +10 -0
  258. package/dist/lib/components/ui/widgets/kanban/types.d.ts +7 -0
  259. package/dist/lib/components/ui/widgets/kanban/use-kanban-board-keys.d.ts +7 -0
  260. package/dist/lib/components/ui/widgets/kanban/use-kanban-item-actions.d.ts +5 -0
  261. package/dist/lib/components/ui/widgets/kanban/use-kanban-phone-column.d.ts +18 -0
  262. package/dist/lib/components/ui/widgets/kanban/use-kanban.d.ts +6 -1
  263. package/dist/lib/hooks/index.d.ts +1 -0
  264. package/dist/lib/i18n/resources/en/en.d.ts +52 -0
  265. package/dist/lib/i18n/resources/en/material.json.d.ts +54 -2
  266. package/dist/lib/i18n/resources/fr/fr.d.ts +52 -0
  267. package/dist/lib/i18n/resources/fr/material.json.d.ts +54 -2
  268. package/dist/lib/i18n/resources/resources.d.ts +104 -0
  269. package/dist/lib/i18n/translator.d.ts +1 -1
  270. package/dist/lib.js +2 -2
  271. package/dist/main.js +53 -52
  272. package/dist/map.js +7 -7
  273. package/dist/material.css +1 -1
  274. package/dist/pdf-reader.js +1 -1
  275. package/dist/{percent-field--WIXV5dX.js → percent-field-QwU1l2Q4.js} +1 -1
  276. package/dist/{picker-surface-CV09H7Nb.js → picker-surface-CiTycWgV.js} +4 -4
  277. package/dist/{popover-Cd7DkND4.js → popover-YmbzbKQG.js} +1 -1
  278. package/dist/{pos-types-DKCkOTYy.js → pos-types-BFrapNmx.js} +1 -1
  279. package/dist/{pos-variant-GrUfbTTP.js → pos-variant-CctfqieO.js} +4 -4
  280. package/dist/print.js +1 -1
  281. package/dist/{programmer-variant-eKJNKENL.js → programmer-variant-Dd0YOixn.js} +2 -2
  282. package/dist/{public-y6g4ddxd.js → public-CshR_aW7.js} +10 -10
  283. package/dist/{rich-code-block-CRQ0iyLb.js → rich-code-block-BuJLDoBu.js} +5 -5
  284. package/dist/{scientific-variant-2y3UxAAU.js → scientific-variant-CjErQxuZ.js} +2 -2
  285. package/dist/{sortable-provider-DdiI3Fwk.js → sortable-provider-DU2nvpFc.js} +3 -3
  286. package/dist/{spinner-C1QIewWv.js → spinner-DH1mm8hH.js} +2 -2
  287. package/dist/{tabs-KGKvve3y.js → tabs-Um0SFyf1.js} +1 -1
  288. package/dist/theme-picker.js +2 -2
  289. package/dist/{theme-toggle-C_VeiiCm.js → theme-toggle-C-Ih4uQU.js} +1 -1
  290. package/dist/{toolbar-items-D310xDuM.js → toolbar-items-BoEY5bkt.js} +4 -4
  291. package/dist/{translate-material-BypJJ1l5.js → translate-material-D4rn5UaQ.js} +1 -1
  292. package/dist/{translator-DJkf4J7t.js → translator-CcEgQ-H7.js} +112 -4
  293. package/dist/{use-chat-composer-BFhRMHcX.js → use-chat-composer-BBF1BI_s.js} +47 -43
  294. package/dist/{use-click-lock-BZYtTmVt.js → use-click-lock-Bwg_caHO.js} +14 -14
  295. package/dist/{use-heading-spy-DJR8YYm6.js → use-heading-spy-BgyA6SJl.js} +19 -19
  296. package/dist/{use-material-translation-CD6QoVal.js → use-material-translation-DYrfV_JJ.js} +1 -1
  297. package/dist/{use-return-focus-Cevw_6yq.js → use-return-focus-C_Qz_yTk.js} +1 -1
  298. package/docs/README.md +1 -0
  299. package/docs/components/data-display.md +40 -8
  300. package/docs/components/data-table-filter-and-lists.md +7 -3
  301. package/docs/components/form-fields.md +1 -0
  302. package/docs/components/media-and-files.md +1 -0
  303. package/docs/components/navigation-and-layout.md +946 -28
  304. package/docs/components/overlays-and-menus.md +11 -5
  305. package/docs/components/rich-widgets.md +111 -1
  306. package/docs/components/selection-and-choice.md +49 -10
  307. package/docs/guides/app-shell.md +641 -2
  308. package/docs/guides/forms.md +7 -0
  309. package/docs/guides/helpers.md +23 -0
  310. package/docs/guides/i18n.md +13 -1
  311. package/docs/guides/layouts.md +215 -0
  312. package/docs/guides/ssr.md +1 -1
  313. package/docs/guides/theming.md +7 -7
  314. package/docs/previews/data-display-tubecap.webp +0 -0
  315. package/docs/previews/navigation-layout-appshell-page-ground.webp +0 -0
  316. package/docs/previews/navigation-layout-appshell.webp +0 -0
  317. package/docs/previews/navigation-layout-authcard-split.webp +0 -0
  318. package/docs/previews/navigation-layout-authcard.webp +0 -0
  319. package/docs/previews/navigation-layout-dashboardgrid.webp +0 -0
  320. package/docs/previews/navigation-layout-editorlayout.webp +0 -0
  321. package/docs/previews/navigation-layout-landinglayout.webp +0 -0
  322. package/docs/previews/navigation-layout-panelayout.webp +0 -0
  323. package/docs/previews/navigation-layout-settingslayout.webp +0 -0
  324. package/docs/previews/navigation-layout-threadlayout-pages.webp +0 -0
  325. package/docs/previews/navigation-layout-threadlayout.webp +0 -0
  326. package/docs/previews/selection-choice-sortablelist.webp +0 -0
  327. package/docs/roadmap.md +12 -2
  328. package/docs/troubleshooting.md +50 -2
  329. package/lib/components/base-content.css +11 -0
  330. package/lib/components/components.css +5 -0
  331. package/lib/components/ui/actions/fab/fab-dock.css +19 -6
  332. package/lib/components/ui/collections/data-table/data-table-items-tiles.css +27 -1
  333. package/lib/components/ui/display/tube-cap/tube-cap.css +87 -0
  334. package/lib/components/ui/layout/app-search/app-search.css +62 -0
  335. package/lib/components/ui/layout/app-shell/activity-backdrop.css +10 -2
  336. package/lib/components/ui/layout/app-shell/app-header.css +108 -0
  337. package/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.css +43 -0
  338. package/lib/themes/ambre.css +1 -1
  339. package/lib/themes/ardoise.css +1 -1
  340. package/lib/themes/bleumono.css +1 -1
  341. package/lib/themes/bluemoon.css +1 -1
  342. package/lib/themes/corail.css +2 -2
  343. package/lib/themes/foret.css +1 -1
  344. package/lib/themes/lavande.css +1 -1
  345. package/lib/themes/menthe.css +2 -2
  346. package/lib/themes/ocean.css +1 -1
  347. package/lib/themes/pink.css +2 -2
  348. package/lib/themes/prune.css +1 -1
  349. package/lib/themes/sable.css +1 -1
  350. package/lib/themes/slate.css +1 -1
  351. package/lib/themes/teal.css +2 -2
  352. package/package.json +2 -2
@@ -262,6 +262,13 @@ in `[data-slot="form-actions"]`) and put each group of fields in a
262
262
  </form>
263
263
  ```
264
264
 
265
+ - The form grid insets its fields and its actions by 16px. In a container that
266
+ already pads its content (a settings page, a card, a sheet), set
267
+ `data-padding="none"` on the `.form-grid-layout`: the fields lose their
268
+ padding on all sides and the actions lose it left and right, so both sit
269
+ flush with that container's content edge:
270
+ `<form className="form-grid-layout" data-padding="none">`. The default is
271
+ unchanged.
265
272
  - Each section's title is an `h2` (pass `titleAs="h3"` when the form sits
266
273
  under an `h2` of your own), so a screen reader moves from section to
267
274
  section, and each section is a group named by its title.
@@ -126,6 +126,7 @@ Vue: the Redux helpers are Pinia store factories: `defineLocalStore`
126
126
  | `useIsClient()` | `false` on the server and first render, `true` after mount: a hydration guard. |
127
127
  | `useCspNonce()` | The nonce of the nearest `NonceProvider`, for a `<style>` of your own (`<style nonce={useCspNonce()}>`); `undefined` outside one, on the server and on the client alike. See [CSP](csp.md#nonceprovider). |
128
128
  | `useIsMobile()` | `true` below 768 px (`ResponsiveButton` no longer uses it: it collapses with CSS). `false` on the server and while hydrating, so SSR HTML is the desktop layout; a phone switches right after. |
129
+ | `useSsrMediaQuery(query, serverValue)` | Whether a media query matches, for a breakpoint `useIsMobile` (768 px) does not cover. The server and the hydrating client both render `serverValue` (`serverValue` is the answer the query gives on a desktop screen: `true` for `(min-width: …)`, `false` for `(max-width: …)`), and the client switches right after hydrating, so there is no hydration mismatch; a client-only render (SPA, client-side navigation) reads the real answer at once. Without `matchMedia` (jsdom) it answers `serverValue`. See [below](#usessrmediaquery). |
129
130
  | `useHeadingSpy(ids, onActive, options?)` | IntersectionObserver over heading ids; reports the topmost visible one. |
130
131
  | `useLocalizedDate()` | `{ language, locale, format }`: `DATE_UTILS.format` bound to the `I18nProvider` language (`en` without a provider). |
131
132
  | `useNumberFormatter()` | `{ formatNumber, formatCurrency }`: `Intl.NumberFormat` with the options you pass, bound to the `I18nProvider` language (`en-US` without a provider). For what `formatAmount` does not cover: percentages, units, compact notation. |
@@ -207,6 +208,28 @@ export function Sent({ email }: { email: string }) {
207
208
  `useFocusOnMount(open)` focuses again whenever `open` turns true, for content
208
209
  that stays mounted and is only shown. Storybook: `Guides/Hooks/useFocusOnMount`.
209
210
 
211
+ ### `useSsrMediaQuery`
212
+
213
+ ```tsx
214
+ import { useSsrMediaQuery } from '@nxgt/material/hooks';
215
+
216
+ // A panel that is open from 1280 px (xl, 80rem) and folded below.
217
+ function Inspector({ children }: { children: React.ReactNode }) {
218
+ const isXl = useSsrMediaQuery('(min-width: 80rem)', true);
219
+ return isXl ? <aside>{children}</aside> : null;
220
+ }
221
+ ```
222
+
223
+ The second argument is what the server renders, and what a hydrating client
224
+ renders on its first pass: it is the answer the query gives on a desktop
225
+ screen (`true` for `(min-width: …)`, `false` for `(max-width: …)`). On an SSR
226
+ page a narrower screen therefore paints the desktop markup first and switches right
227
+ after hydrating (one flash, and no hydration mismatch). A client-only render
228
+ (an SPA, a client-side navigation) reads the real answer from its first
229
+ render, with no flash. Where `matchMedia` does not exist (jsdom) the hook
230
+ answers `serverValue` and never subscribes. When CSS alone can do it
231
+ (`hidden xl:block`), prefer CSS: it has no flash at all.
232
+
210
233
  ### `useCountdown`
211
234
 
212
235
  The clock behind [`CountdownTimer`](../components/feedback-and-status.md#countdowntimer),
@@ -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, a landing page and a search dialog with its
208
+ results page. Start from the closest one and 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) |
@@ -68,7 +68,7 @@ at the top are needed is in [getting started](../getting-started.md#styles).
68
68
  | `--accent`, `--accent-foreground` | `bg-accent`, … | hover surfaces |
69
69
  | `--nxgt-accent` | `[--nxgt-accent:…]` | the mark colour of the selection controls: the fill, handle, state layer and stop dots of `Slider`, the on state of `Switch`, the box and dot of `Checkbox` and `Radio`. It defaults to `--primary` (`--primary-text` in dark) and is set per control, so override it on the control itself, not on `:root` |
70
70
  | `--error`, `--success`, `--info`, `--warning` (+ `-foreground`) | `bg-error`, `text-success`, … | the status colours of `Button`, `Alert`, `Badge`, toasts |
71
- | `--primary-text` | `text-primary-text` | primary drawn as text or an icon on a page, card or popover surface: `Typography tone="primary"`, links, the `Alert` primary icon, selected labels. In light, `--primary` mixed toward black: 96 % at most, solved lower on a tinted page so a tonal Button label on a striped row reaches 4.6:1 (94 % on teal, 89 % on corail, 94 % on pink); in dark, `--primary` mixed 60 % with white (`color-mix(in oklab, var(--primary) 40%, white)`), well over 4.5:1 on `--background` and `--card` |
71
+ | `--primary-text` | `text-primary-text` | primary drawn as text or an icon on a page, card or popover surface: `Typography tone="primary"`, links, the `Alert` primary icon, selected labels. In light, `--primary` mixed toward black: 96 % at most, solved lower on a tinted page so a tonal Button label on a striped row, or straight on the page ground, reaches 4.6:1 (92 % on teal, 88 % on corail, 92 % on pink, 95 % on menthe); in dark, `--primary` mixed 60 % with white (`color-mix(in oklab, var(--primary) 40%, white)`), well over 4.5:1 on `--background` and `--card` |
72
72
  | `--primary-indicator` | `bg-primary-indicator`, `border-primary-indicator`, `ring-primary-indicator`, `stroke-primary-indicator` | primary drawn as a non-text mark that carries a state (WCAG 1.4.11, 3:1): an active bar or dot, a selected or focused border, a ring, a spinner arc. Equal to `--primary` in light; in dark, `--primary` mixed 25 % with white (`color-mix(in oklab, var(--primary) 75%, white)`), 4.8:1 on `--background`, 4.5:1 on `--card`, 4.2:1 on `--muted` (`--primary` itself gives 2.7, 2.5 and 2.3:1) |
73
73
  | `--error-text` | `text-error-text` | error drawn as text: field messages, `HelperText` in its error state, form and dialog errors, `variant="error"` menu items |
74
74
  | `--destructive` | `bg-destructive`, `text-destructive` | deprecated alias of `--error`: the light theme sets it to `var(--error)`, the dark theme keeps its own value; use `--error` |
@@ -936,14 +936,14 @@ ones also take 10 % on focus, as on hover, so their label keeps 4.5:1 over it
936
936
 
937
937
  The `tonal`, `outlined` and `link` variants of `Button` and `IconButton` draw
938
938
  their text and icon in one tone per colour, read on `--background`, on
939
- `--card` and on the variant's own tint (15 % at most, at rest or focused). In
940
- the light theme `primary`, `secondary`, `info` and `success` use the token
941
- itself (5.8, 5.2, 5.2 and 5.0:1 at their lowest) and `warning` and `error` the
942
- token mixed with 15 % black (6.4 and 5.4:1). In the dark theme `primary` is
939
+ `--card`, on the page ground (`--ground`, a tinted page) and on the variant's own tint over each (15 % at most, at rest or focused). In
940
+ the light theme `primary` uses `--primary-text` (solved per theme), `secondary`, `info` and `success`
941
+ are mixed with 10 % black, `warning` with 15 % black and `error` with 20 % black (4.6:1 or more
942
+ on the page ground in every preset). In the dark theme `primary` is
943
943
  mixed with 60 % white, the `--primary-text` token (8.5:1 at its lowest: the token itself is a dark indigo,
944
944
  2.3:1), `success` and `warning` with 15 % white (5.3 and 6.5:1), `error` with
945
945
  30 % white (6.0:1), and `secondary` and `info` use the token (5.1 and 5.6:1).
946
- The tones are mixed from the tokens (`color-mix(in oklab, var(--color-error)
946
+ The tones are mixed from the tokens (`color-mix(in oklab, var(--color-warning)
947
947
  85%, black)`), so an override of a token moves its tone with it; a text colour
948
948
  of your own on one of those buttons (`className="text-primary-text"`) replaces the tone
949
949
  and is yours to check.
@@ -1012,7 +1012,7 @@ override on the root, or use a [theme zone](#themes), which re-declares them.
1012
1012
  for the same reason: the brand colour is a dark fill (it keeps near-white text
1013
1013
  readable on a button) and reads at only about 2:1 as text on the dark surfaces.
1014
1014
  The light value is `color-mix(in oklab, var(--primary) 96%, black)` at most (primary
1015
- 4 % toward black, 7.9:1 on the white page; the share is solved per theme and drops when a tinted page would leave a tonal Button label under 4.6:1 on a striped row, to 94 % on teal); the dark one is
1015
+ 4 % toward black, 7.9:1 on the white page; the share is solved per theme and drops when a tinted page would leave a tonal Button label under 4.6:1 on a striped row or on the page ground, to 92 % on teal); the dark one is
1016
1016
  `color-mix(in oklab, var(--primary) 40%, white)` (primary mixed 60 % with
1017
1017
  white, the recipe of the tonal `Button` labels). `Typography tone="primary"`,
1018
1018
  the `Alert` primary icon, links, selected labels and the other primary text of
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,10 @@ version they shipped in, and planned entries may name the major they target.
377
383
 
378
384
  ## Shipped
379
385
 
386
+ - **Search dialog and results page recipe (next patch)** — a command dialog (Ctrl/Cmd+K and a header button), debounced grouped suggestions, type chips, a conditional filter and highlighted result cards, with its code in the plugin's `screen-recipes` skill ([#2333](https://github.com/softistx/nxgt-material/issues/2333)).
387
+
388
+ - **Layouts: adaptive navigation, headers and page layouts (3.80.0)** — `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.
389
+
380
390
  - **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
391
  - **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
392
  - **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)).
@@ -78,6 +78,8 @@ words in your error.
78
78
  - [`ActivityLayout`'s `backdrop` shows nothing, or the blobs are still there](#activitylayouts-backdrop-shows-nothing-or-the-blobs-are-still-there)
79
79
  - [Shapes of an `ActivityLayout` `backdrop` run behind the text of the chrome or a list](#shapes-of-an-activitylayout-backdrop-run-behind-the-text-of-the-chrome-or-a-list)
80
80
  - [Shaped Gallery tiles are plain rounded squares](#shaped-gallery-tiles-are-plain-rounded-squares)
81
+ - [ChoiceCardGroup shows 2+2 instead of 3+1](#choicecardgroup-shows-22-instead-of-31)
82
+ - [A `ChoiceCardGroup` collapses to nothing in an inline-flex or centred parent](#a-choicecardgroup-collapses-to-nothing-in-an-inline-flex-or-centred-parent)
81
83
  - [A component with my own tone (Shape, Fab, Avatar, StatCard, a metric card) shows no colour, or `tone` is a type error](#a-component-with-my-own-tone-shape-fab-avatar-statcard-a-metric-card-shows-no-colour-or-tone-is-a-type-error)
82
84
  - [A test expects the old `bg-muted` Avatar fallback, or a filled fallback shows a grey ring](#a-test-expects-the-old-bg-muted-avatar-fallback-or-a-filled-fallback-shows-a-grey-ring)
83
85
 
@@ -341,6 +343,8 @@ words in your error.
341
343
  - [An `Autocomplete` list covers its helper text, or a chip test no longer finds its markup](#an-autocomplete-list-covers-its-helper-text-or-a-chip-test-no-longer-finds-its-markup)
342
344
  - [A `CountryField` lost its chip, or its `renderOption` or `filter` does nothing](#a-countryfield-lost-its-chip-or-its-renderoption-or-filter-does-nothing)
343
345
  - [A `CountryField` or `TimezoneField` test no longer finds its field or its options](#a-countryfield-or-timezonefield-test-no-longer-finds-its-field-or-its-options)
346
+ - [A test that queries a `SortableList` by `listbox` or `option` finds nothing](#a-test-that-queries-a-sortablelist-by-listbox-or-option-finds-nothing)
347
+ - [axe reports `nested-interactive` on a list whose rows hold buttons](#axe-reports-nested-interactive-on-a-list-whose-rows-hold-buttons)
344
348
  - [A `SearchField` lost the height, radius or fill set through `[&_input]`](#a-searchfield-lost-the-height-radius-or-fill-set-through-_input)
345
349
  - [`ComboboxEmpty`'s text shows under the options of a `Combobox`](#comboboxemptys-text-shows-under-the-options-of-a-combobox)
346
350
  - [`ConfirmDialog` buttons stay in English](#confirmdialog-buttons-stay-in-english)
@@ -1744,6 +1748,23 @@ page.locator('[data-slot=chip]').getByRole('button', { name: 'Remove Design' });
1744
1748
  **Why:** the shapes live in an opt-in stylesheet, `@nxgt/material/galleries.css`, which `styles.css` does not import. Without it a shaped tile keeps the `xl` corner (`--nxgt-shape-corner-xl`, 28px). The same fallback shows in a browser without CSS [`shape()`](https://developer.mozilla.org/en-US/docs/Web/CSS/basic-shape/shape) (Chromium-based and Safari today), which drops the `clip-path`. Under `prefers-reduced-motion` the shapes show but do not morph, by design. Also check that nothing overrides `clip-path` on `[data-slot=gallery-tile-media]`.
1745
1749
  **Fix:** import it once, next to `styles.css`: `@import "@nxgt/material/galleries.css";` (or `import '@nxgt/material/galleries.css'`). For a browser without `shape()`, accept the rounded fallback, or use a non-shaped preset and pass `shape` only where you want it.
1746
1750
 
1751
+
1752
+ ### ChoiceCardGroup shows 2+2 instead of 3+1
1753
+
1754
+ **When:** a `ChoiceCardGroup` with `columns={3}` (or 4) and 4 cards (or any count that leaves one card alone on the last row) draws two rows of two, where it used to draw three and one.
1755
+ **Why:** rows are balanced by default (`balance`, `true`): when the last row would hold one orphan card and fewer columns avoid it, the group draws fewer columns. It is decided by CSS container queries on the group's own width, so the server and the client print the same markup.
1756
+ **Fix:** keep it, or restore the old fill with `balance={false}`:
1757
+
1758
+ ```tsx
1759
+ <ChoiceCardGroup label="Size" columns={3} balance={false} options={options} />
1760
+ ```
1761
+
1762
+ ### A `ChoiceCardGroup` collapses to nothing in an inline-flex or centred parent
1763
+
1764
+ **When:** the group sits in an `inline-flex` box, a float or a `w-fit` column and its cards are squeezed to zero width or the label shows alone.
1765
+ **Why:** a balanced group (the default, horizontal) is an inline-size container (`@container`), so that it can balance its rows; a container's width does not come from its content, so a shrink-to-fit parent gives it none. With `balance={false}`, or `orientation="vertical"`, there is no container.
1766
+ **Fix:** give the parent a width (`w-full`, a `max-w-*` or a fixed width), centring it with margins rather than shrink-to-fit, or pass `balance={false}` to restore the previous layout.
1767
+
1747
1768
  ### A component with my own tone (Shape, Fab, Avatar, StatCard, a metric card) shows no colour, or `tone` is a type error
1748
1769
 
1749
1770
  **When:** `<Shape tone="maths" />`, `<Fab tone="maths" />`, an `Avatar`, a `StatCard` or a metric card with `tone="maths"` draws no colour, or TypeScript reports:
@@ -3272,6 +3293,9 @@ only in the browser reads the real answer from its first render, as before.
3272
3293
  `Stepper` logged this line until 2.2.0, and a desktop hydrating its server
3273
3294
  HTML showed the mismatch (it asks whether the screen is wide); upgrade and
3274
3295
  drop any `clientOnly(Stepper)` you added for it.
3296
+ For a breakpoint of your own, use
3297
+ [`useSsrMediaQuery(query, serverValue)`](guides/helpers.md#usessrmediaquery)
3298
+ instead of `useMedia` or a hand-written `useSyncExternalStore`.
3275
3299
 
3276
3300
  ### `useMatches must be used within a data router`
3277
3301
 
@@ -5105,7 +5129,7 @@ append({ name: '' }, { shouldFocus: false });
5105
5129
  `aria-disabled`, still focusable, and does nothing by design; the reason, if
5106
5130
  `removeDisabledReason` gave one, is its tooltip, shown on hover, focus, tap and
5107
5131
  click, and its description), or `min` is
5108
- reached (the button is `disabled`).
5132
+ reached (the button is `disabled`, or absent with `removeAtMin="hide"`).
5109
5133
  **Fix:** return `true` from `removable` for a row that may go, and say why for
5110
5134
  the others, so a user is told instead of left guessing:
5111
5135
 
@@ -5202,7 +5226,8 @@ The `*` is now drawn by a CSS pseudo-element with an empty `content`
5202
5226
  field's own `required` / `aria-required` says it is required, and every field
5203
5227
  of this library sets it on the element a screen reader lands on (the input, the
5204
5228
  picker's combobox, the select's trigger, the slider thumbs, the rating's
5205
- radiogroup, the editor's textbox, the list's listbox, or, for a file picker,
5229
+ radiogroup, the editor's textbox, the `TransferList`'s listbox (a `SortableList` is a `list`
5230
+ and only draws the asterisk, with no `aria-required`), or, for a file picker,
5206
5231
  a group described as "This field is required."). A `SelectField`'s trigger is
5207
5232
  now named by its label (`aria-labelledby`), so `getByRole('combobox', { name:
5208
5233
  'Framework' })` finds it.
@@ -6353,6 +6378,29 @@ expect(screen.getByRole('combobox', { name: 'Time zone' })).toHaveValue('Paris')
6353
6378
  screen.getByRole('option', { name: 'Paris GMT+2' });
6354
6379
  ```
6355
6380
 
6381
+ ### A test that queries a `SortableList` by `listbox` or `option` finds nothing
6382
+
6383
+ **When:** a test queries a `SortableList` by `listbox`, `option` or `aria-selected`, after upgrading.
6384
+ **Why:** a row holds buttons of its own (grip, move, remove), which an `option`
6385
+ may not, so axe reported `nested-interactive`. The list is now a `role="list"`
6386
+ of `listitem` rows; `aria-selected`, `aria-activedescendant` and `aria-required`
6387
+ are gone (`aria-disabled` stays on a disabled row).
6388
+ **Fix:**
6389
+
6390
+ ```ts
6391
+ const list = screen.getByRole('list', { name: 'Ranking' });
6392
+ const rows = within(list).getAllByRole('listitem');
6393
+ ```
6394
+
6395
+ ### axe reports `nested-interactive` on a list whose rows hold buttons
6396
+
6397
+ **When:** axe flags a list whose rows hold buttons or other controls.
6398
+ **Why:** a row with `role="option"` (or `button`, `tab`...) may not contain
6399
+ focusable controls: assistive technology reads its children as text.
6400
+ **Fix:** make the row a `listitem` of a `list` (a roving tab stop on the row,
6401
+ the buttons keep their own names), as `SortableList` does. Do not exclude the
6402
+ list from the axe run.
6403
+
6356
6404
  ### An input inside an `InputGroup` lost a class or a style of `Input`
6357
6405
 
6358
6406
  **When:** a test or a style relies on a class of `Input` or `Textarea`
@@ -162,6 +162,17 @@
162
162
  [data-slot="form-actions"] {
163
163
  @apply sticky bottom-0 z-10 flex w-full justify-end gap-2 bg-background/80 border-t-8 border-transparent px-4 pb-[max(1rem,env(safe-area-inset-bottom))] backdrop-blur-sm max-sm:*:flex-1;
164
164
  }
165
+ /* `data-padding="none"`: the form sits flush in a container that
166
+ already pads it (a page, a card, a sheet): no inset on the fields or
167
+ the actions, so both align with the container's content edge. */
168
+ &[data-padding="none"] {
169
+ [data-slot="form-fields"] {
170
+ @apply p-0;
171
+ }
172
+ [data-slot="form-actions"] {
173
+ @apply px-0;
174
+ }
175
+ }
165
176
  }
166
177
 
167
178
  /* No height cap and no scroll of its own: the page (or the overlay) is
@@ -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";
@@ -142,6 +144,8 @@
142
144
  @import "./ui/display/seat-ring/seat-ring-ring.css";
143
145
  /* VoteTally: ranked bars with counts, shares and voters. */
144
146
  @import "./ui/display/vote-tally/vote-tally.css";
147
+ /* TubeCap: a specimen tube chip, cap colours fixed by the tube convention. */
148
+ @import "./ui/display/tube-cap/tube-cap.css";
145
149
  /* SecretCard: a face that is not rendered until it is revealed. */
146
150
  @import "./ui/display/secret-card/secret-card.css";
147
151
  /* Alert and Banner span the row in the form grids (#1497). */
@@ -206,6 +210,7 @@
206
210
  @import "./ui/fields/attributes/attributes.css";
207
211
  /* Background: the gradient preset's CSS, shared (lib/backgrounds/css); the other presets are opt-in: backgrounds.css. */
208
212
  @import "./background-shared.css";
213
+ @import "./ui/layout/app-search/app-search.css"; /* AppSearchBar, SearchView */
209
214
  @import "./ui/widgets/drawing/drawing.css"; /* @nxgt/material/draw: role colours, focus ring */
210
215
  @import "./ui/widgets/drawing/drawing-animate.css";
211
216
  @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) {