@nxgt/material 3.85.0 → 3.86.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 (143) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +39 -5
  3. package/dist/{alert-dialog-1t6ULy5i.js → alert-dialog-DZnt8PYE.js} +1 -1
  4. package/dist/{async-slice-xyA9Uzct.js → async-slice-D3OdV2BS.js} +1 -1
  5. package/dist/{button-DhiNGrdT.js → button-MAL5an7L.js} +1 -1
  6. package/dist/{calculator-BcgxxScL.js → calculator-CyBjPONf.js} +10 -10
  7. package/dist/calculator-field.js +6 -6
  8. package/dist/{calculator-segment-C4WQAHcN.js → calculator-segment-BigMpjhn.js} +1 -1
  9. package/dist/calculator.js +1 -1
  10. package/dist/charts.js +3 -3
  11. package/dist/{chip-m0_usuzd.js → chip-DKAKoNxq.js} +2 -2
  12. package/dist/{code-editor-BgKFrcld.js → code-editor-B6dFQSUJ.js} +4 -4
  13. package/dist/code-editor.js +4 -4
  14. package/dist/{code-language-items-BWw17W9s.js → code-language-items-CXEMiWoF.js} +2 -2
  15. package/dist/components/components.css +2 -0
  16. package/dist/components/theme-tokens.css +18 -0
  17. package/dist/components/ui/layout/app-bar/top-app-bar/top-app-bar-collapse.css +60 -0
  18. package/dist/components/ui/layout/app-bar/top-app-bar/top-app-bar.css +205 -0
  19. package/dist/components/ui/layout/app-shell/app-header.css +70 -63
  20. package/dist/{components-cgUDvVTe.js → components-BVHbzzju.js} +17330 -16928
  21. package/dist/components.js +24 -24
  22. package/dist/{conversion-variant-DultZZQm.js → conversion-variant-BT5n4-jm.js} +3 -3
  23. package/dist/{currency-field-CPbaM7ay.js → currency-field-t41sFYg_.js} +4 -4
  24. package/dist/{dialog-DmlG9opW.js → dialog-BjKiRXJg.js} +3 -3
  25. package/dist/dnd.js +1 -1
  26. package/dist/{dropdown-menu-CDKev8dk.js → dropdown-menu-IRFp4CH9.js} +1 -1
  27. package/dist/editor.js +7 -7
  28. package/dist/{empty-state-C56000TB.js → empty-state-C70prDDr.js} +1 -1
  29. package/dist/{financial-variant-BYjQ690K.js → financial-variant-DqW4HJ_v.js} +5 -5
  30. package/dist/{hooks-BTwLAy_A.js → hooks-CjO11MS7.js} +2 -2
  31. package/dist/hooks.js +2 -2
  32. package/dist/{hover-card-CDtW6utN.js → hover-card-cU_aJa18.js} +1 -1
  33. package/dist/i18n.js +3 -3
  34. package/dist/{icon-badge-ec7MmUGA.js → icon-badge-D3KO6uEQ.js} +1 -1
  35. package/dist/{icon-button-CG4aO8Gh.js → icon-button-DrqNk1Ww.js} +1 -1
  36. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  37. package/dist/lib/components/ui/layout/app-bar/index.d.ts +1 -1
  38. package/dist/lib/components/ui/layout/app-bar/top-app-bar/index.d.ts +1 -0
  39. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-actions.d.ts +15 -0
  40. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-headline.d.ts +4 -0
  41. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-link.d.ts +9 -0
  42. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-menu-section.d.ts +14 -0
  43. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-primary-action.d.ts +12 -0
  44. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-row.d.ts +23 -0
  45. package/dist/lib/components/ui/layout/app-bar/top-app-bar/partials/top-app-bar-title-block.d.ts +18 -0
  46. package/dist/lib/components/ui/layout/app-bar/top-app-bar/top-app-bar.actions.d.ts +43 -0
  47. package/dist/lib/components/ui/layout/app-bar/top-app-bar/top-app-bar.d.ts +9 -0
  48. package/dist/lib/components/ui/layout/app-bar/top-app-bar/top-app-bar.types.d.ts +120 -0
  49. package/dist/lib/components/ui/layout/app-bar/top-app-bar/top-app-bar.utils.d.ts +43 -0
  50. package/dist/lib/components/ui/layout/app-shell/activity-app-bar.d.ts +6 -6
  51. package/dist/lib/components/ui/layout/app-shell/activity-chrome.d.ts +6 -3
  52. package/dist/lib/components/ui/layout/app-shell/activity-column-props.d.ts +1 -1
  53. package/dist/lib/components/ui/layout/app-shell/activity-column.d.ts +2 -2
  54. package/dist/lib/components/ui/layout/app-shell/activity-layout-navigation.types.d.ts +32 -4
  55. package/dist/lib/components/ui/layout/app-shell/activity-layout.types.d.ts +12 -2
  56. package/dist/lib/components/ui/layout/app-shell/app-header.d.ts +9 -3
  57. package/dist/lib/components/ui/layout/app-shell/header-look.d.ts +14 -0
  58. package/dist/lib/components/ui/layout/app-shell/header-title.d.ts +9 -36
  59. package/dist/lib/components/ui/layout/app-shell/header.utils.d.ts +13 -3
  60. package/dist/lib/components/ui/layout/app-shell/index.d.ts +1 -1
  61. package/dist/lib/components/ui/layout/app-shell/navigation.utils.d.ts +7 -2
  62. package/dist/lib/components/ui/layout/app-shell/shell-scroll.d.ts +23 -1
  63. package/dist/lib/components/ui/layout/app-shell/shell-top-app-bar.d.ts +10 -0
  64. package/dist/lib/components/ui/layout/app-shell/shell-top-app-bar.parts.d.ts +58 -0
  65. package/dist/lib/components/ui/layout/app-shell/shell-top-app-bar.types.d.ts +26 -0
  66. package/dist/lib/components/ui/layout/app-shell/use-header-scroll.d.ts +16 -9
  67. package/dist/lib/components/ui/layout/app-shell/use-shell-header.d.ts +1 -1
  68. package/dist/lib/i18n/resources/en/en.d.ts +4 -0
  69. package/dist/lib/i18n/resources/en/material.json.d.ts +4 -0
  70. package/dist/lib/i18n/resources/fr/fr.d.ts +4 -0
  71. package/dist/lib/i18n/resources/fr/material.json.d.ts +4 -0
  72. package/dist/lib/i18n/resources/resources.d.ts +8 -0
  73. package/dist/lib/i18n/translator.d.ts +1 -1
  74. package/dist/lib.js +1 -1
  75. package/dist/main.js +28 -28
  76. package/dist/map.js +7 -7
  77. package/dist/material.css +1 -1
  78. package/dist/pdf-reader.js +1 -1
  79. package/dist/{percent-field-8_pILs15.js → percent-field-D47IlaPF.js} +1 -1
  80. package/dist/{picker-surface-pyGv-Qh9.js → picker-surface-Cg4V4-E0.js} +4 -4
  81. package/dist/{popover-3EF4q2CT.js → popover-Dzk4-l9U.js} +1 -1
  82. package/dist/{pos-types-Dv2UxKSN.js → pos-types-JOXMY4Y2.js} +1 -1
  83. package/dist/{pos-variant-DJvtN9N8.js → pos-variant-B2mS8bMB.js} +4 -4
  84. package/dist/print.js +1 -1
  85. package/dist/{programmer-variant-Bmcq2KzC.js → programmer-variant-C_Tl0P4_.js} +2 -2
  86. package/dist/{public-BNebh4z0.js → public-ByAsqBOf.js} +9 -9
  87. package/dist/{rich-code-block-DmX7d58S.js → rich-code-block-CJAfqk6b.js} +5 -5
  88. package/dist/{scientific-variant-DijUrpP8.js → scientific-variant-CskM4MLV.js} +2 -2
  89. package/dist/{sortable-provider-Cnmt_gWu.js → sortable-provider-ICS_vkLA.js} +2 -2
  90. package/dist/{spinner-C6LP2Rw8.js → spinner-CweqX5A9.js} +1 -1
  91. package/dist/styles.css +2 -0
  92. package/dist/{tabs-Bj1zOe7-.js → tabs-BOT9B4le.js} +1 -1
  93. package/dist/theme-picker.js +2 -2
  94. package/dist/{theme-toggle-Cxku5iBP.js → theme-toggle-WAFkncYx.js} +1 -1
  95. package/dist/{toolbar-items-CEIuSxU_.js → toolbar-items-BsgzHSNf.js} +4 -4
  96. package/dist/{translate-material-DI3nmQ6I.js → translate-material-DTIAPmlU.js} +1 -1
  97. package/dist/{translator-BstxG_hN.js → translator-BRZNhsy5.js} +8 -0
  98. package/dist/{use-chat-composer-BqLkk_iH.js → use-chat-composer-67MgWAHz.js} +15 -15
  99. package/dist/{use-heading-spy-nFyb9_KE.js → use-heading-spy-D8WbHJuK.js} +4 -4
  100. package/dist/{use-material-translation-1kCHtB0p.js → use-material-translation-CCy1Me0h.js} +1 -1
  101. package/dist/{use-return-focus-Hv8rn55-.js → use-return-focus-BA8G1qVU.js} +1 -1
  102. package/docs/README.md +1 -0
  103. package/docs/components/navigation-and-layout.md +85 -32
  104. package/docs/guides/app-shell.md +158 -63
  105. package/docs/guides/drawing.md +2 -0
  106. package/docs/guides/layouts.md +3 -3
  107. package/docs/guides/migrating-to-top-app-bar.md +156 -0
  108. package/docs/guides/theming.md +5 -0
  109. package/docs/previews/navigation-layout-appshell-blue-moon.webp +0 -0
  110. package/docs/previews/navigation-layout-appshell-footer-icon.webp +0 -0
  111. package/docs/previews/navigation-layout-appshell-menu-badge.webp +0 -0
  112. package/docs/previews/navigation-layout-appshell-page-ground.webp +0 -0
  113. package/docs/previews/navigation-layout-appshell-themes.webp +0 -0
  114. package/docs/previews/navigation-layout-appshell.webp +0 -0
  115. package/docs/previews/navigation-layout-topappbar.webp +0 -0
  116. package/docs/roadmap.md +17 -6
  117. package/docs/troubleshooting.md +80 -0
  118. package/lib/components/components.css +2 -0
  119. package/lib/components/theme-tokens.css +18 -0
  120. package/lib/components/ui/layout/app-bar/top-app-bar/top-app-bar-collapse.css +60 -0
  121. package/lib/components/ui/layout/app-bar/top-app-bar/top-app-bar.css +205 -0
  122. package/lib/components/ui/layout/app-shell/app-header.css +70 -63
  123. package/lib/styles.css +2 -0
  124. package/lib/themes/ambre.css +5 -1
  125. package/lib/themes/ardoise.css +5 -1
  126. package/lib/themes/bleumono.css +5 -1
  127. package/lib/themes/bluemoon.css +5 -1
  128. package/lib/themes/corail.css +5 -1
  129. package/lib/themes/foret.css +5 -1
  130. package/lib/themes/lavande.css +5 -1
  131. package/lib/themes/menthe.css +5 -1
  132. package/lib/themes/ocean.css +5 -1
  133. package/lib/themes/pink.css +5 -1
  134. package/lib/themes/prune.css +5 -1
  135. package/lib/themes/sable.css +5 -1
  136. package/lib/themes/slate.css +5 -1
  137. package/lib/themes/teal.css +5 -1
  138. package/package.json +2 -2
  139. package/dist/lib/components/ui/layout/app-bar/top-app-bar.d.ts +0 -18
  140. package/dist/lib/components/ui/layout/app-shell/app-header-row.d.ts +0 -3
  141. package/dist/lib/components/ui/layout/app-shell/header-context.d.ts +0 -10
  142. package/dist/lib/components/ui/layout/app-shell/page-title.d.ts +0 -27
  143. /package/dist/lib/components/ui/layout/{app-shell → app-bar/top-app-bar}/use-truncated-title.d.ts +0 -0
@@ -1,3 +1,3 @@
1
- import { t as e } from "./public-BNebh4z0.js";
1
+ import { t as e } from "./public-ByAsqBOf.js";
2
2
  import { configurePdfReader as t } from "@nxgt/material-core/pdf-reader";
3
3
  export { e as PdfReader, t as configurePdfReader };
@@ -1,4 +1,4 @@
1
- import { r as e } from "./currency-field-CPbaM7ay.js";
1
+ import { r as e } from "./currency-field-t41sFYg_.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region lib/components/ui/fields/percent-field/percent-field.tsx
4
4
  function n({ min: n = 0, max: r = 100, step: i = 1, ...a }) {
@@ -1,9 +1,9 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { r as t, t as n } from "./in-dialog-D61Yeaol.js";
3
- import { a as r, c as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "./use-return-focus-Hv8rn55-.js";
4
- import { i as p, o as m, r as h, t as g } from "./popover-3EF4q2CT.js";
5
- import { t as _ } from "./use-material-translation-1kCHtB0p.js";
6
- import { n as v, t as y } from "./icon-button-CG4aO8Gh.js";
3
+ import { a as r, c as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "./use-return-focus-BA8G1qVU.js";
4
+ import { i as p, o as m, r as h, t as g } from "./popover-Dzk4-l9U.js";
5
+ import { t as _ } from "./use-material-translation-CCy1Me0h.js";
6
+ import { n as v, t as y } from "./icon-button-DrqNk1Ww.js";
7
7
  import { t as b } from "./use-ssr-media-query-C6M5m8sf.js";
8
8
  import { i as x } from "./escape-owner-DpaP0lm1.js";
9
9
  import * as S from "react";
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { o as t, r as n } from "./dist-DVRQkaTK.js";
3
3
  import { i as r, r as i, t as a } from "./dist-DWZXlCZR.js";
4
- import { S as o, d as s, f as c, l, p as u, u as d, x as f } from "./spinner-C6LP2Rw8.js";
4
+ import { S as o, d as s, f as c, l, p as u, u as d, x as f } from "./spinner-CweqX5A9.js";
5
5
  import { a as p, i as m, r as h } from "./dist-DHdUUM1w.js";
6
6
  import { a as g, c as _, l as v, o as y, r as b, s as x, t as S } from "./in-dialog-D61Yeaol.js";
7
7
  import { i as C } from "./escape-owner-DpaP0lm1.js";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-1kCHtB0p.js";
1
+ import { t as e } from "./use-material-translation-CCy1Me0h.js";
2
2
  import { n as t } from "./calculator-context-BugcKuVG.js";
3
3
  import { t as n } from "./calculator-announce-DRd2c6Dq.js";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
@@ -1,11 +1,11 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { t } from "./use-material-translation-1kCHtB0p.js";
3
- import { t as n } from "./icon-button-CG4aO8Gh.js";
2
+ import { t } from "./use-material-translation-CCy1Me0h.js";
3
+ import { t as n } from "./icon-button-DrqNk1Ww.js";
4
4
  import { n as r } from "./calculator-context-BugcKuVG.js";
5
- import { a as i, n as a, r as o, t as s } from "./pos-types-Dv2UxKSN.js";
5
+ import { a as i, n as a, r as o, t as s } from "./pos-types-JOXMY4Y2.js";
6
6
  import { i as c, n as l, s as u } from "./key-layout-cR79xfGE.js";
7
7
  import { n as d, t as f } from "./currency-B-r3ig11.js";
8
- import { t as p } from "./calculator-segment-C4WQAHcN.js";
8
+ import { t as p } from "./calculator-segment-BigMpjhn.js";
9
9
  import { useId as m, useState as h } from "react";
10
10
  import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
11
11
  import { ChevronDown as y, X as b } from "lucide-react";
package/dist/print.js CHANGED
@@ -1,4 +1,4 @@
1
- import { i as e, t } from "./translate-material-DI3nmQ6I.js";
1
+ import { i as e, t } from "./translate-material-DTIAPmlU.js";
2
2
  import { Children as n, createContext as r, isValidElement as i, useCallback as a, useContext as o, useEffect as s, useMemo as c, useState as l } from "react";
3
3
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
4
4
  import { resolvePdfFileName as f } from "@nxgt/material-core/pdf-file-name";
@@ -1,9 +1,9 @@
1
- import { t as e } from "./use-material-translation-1kCHtB0p.js";
1
+ import { t as e } from "./use-material-translation-CCy1Me0h.js";
2
2
  import { t } from "./toggle-FeCCJqbg.js";
3
3
  import { n } from "./calculator-context-BugcKuVG.js";
4
4
  import { i as r, n as i, s as a } from "./key-layout-cR79xfGE.js";
5
5
  import { t as o } from "./programmer-word-CNCF7DJF.js";
6
- import { t as s } from "./calculator-segment-C4WQAHcN.js";
6
+ import { t as s } from "./calculator-segment-BigMpjhn.js";
7
7
  import { useId as c, useState as l } from "react";
8
8
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
9
  import { calculate as f, formatExpression as p, sessionOptions as m, toCanonical as h, tokenize as g } from "@nxgt/material-core/calculator";
@@ -3,25 +3,25 @@ import { n as t } from "./ui.utils-CAnKTCw5.js";
3
3
  import { t as n } from "./utils-BLfntITJ.js";
4
4
  import { o as r } from "./dist-DVRQkaTK.js";
5
5
  import { i, n as a, r as o } from "./dist-DWZXlCZR.js";
6
- import { o as s } from "./spinner-C6LP2Rw8.js";
6
+ import { o as s } from "./spinner-CweqX5A9.js";
7
7
  import { a as c, i as l, n as u } from "./dist-DHdUUM1w.js";
8
8
  import { i as d } from "./dist-DOK3zo5C.js";
9
9
  import { r as f, t as p } from "./in-dialog-D61Yeaol.js";
10
- import { a as m, c as h, i as g, l as _, n as v, o as ee, r as y, s as b, t as te, u as ne } from "./use-return-focus-Hv8rn55-.js";
11
- import { c as x, d as S, f as C, i as w, l as T, n as E, o as D, t as re, u as O } from "./dropdown-menu-CDKev8dk.js";
12
- import { a as k, b as ie, d as ae, f as oe, i as se, n as A, o as ce, r as le, s as j, t as M, u as ue, v as de } from "./toolbar-items-CEIuSxU_.js";
10
+ import { a as m, c as h, i as g, l as _, n as v, o as ee, r as y, s as b, t as te, u as ne } from "./use-return-focus-BA8G1qVU.js";
11
+ import { c as x, d as S, f as C, i as w, l as T, n as E, o as D, t as re, u as O } from "./dropdown-menu-IRFp4CH9.js";
12
+ import { a as k, b as ie, d as ae, f as oe, i as se, n as A, o as ce, r as le, s as j, t as M, u as ue, v as de } from "./toolbar-items-BsgzHSNf.js";
13
13
  import { t as fe } from "./dist-DkQbkF9T.js";
14
- import { t as pe } from "./button-DhiNGrdT.js";
15
- import { t as N } from "./use-material-translation-1kCHtB0p.js";
16
- import { n as me, t as he } from "./icon-button-CG4aO8Gh.js";
14
+ import { t as pe } from "./button-MAL5an7L.js";
15
+ import { t as N } from "./use-material-translation-CCy1Me0h.js";
16
+ import { n as me, t as he } from "./icon-button-DrqNk1Ww.js";
17
17
  import { t as ge } from "./useEvent-2fKq-6w8.js";
18
18
  import { n as _e, t as ve } from "./toggle-group-CVMxEpWi.js";
19
19
  import { i as ye } from "./escape-owner-DpaP0lm1.js";
20
20
  import { n as be } from "./use-slice-reducer-BGkeGtML.js";
21
21
  import { t as xe } from "./input-CC2joTjB.js";
22
22
  import { r as Se } from "./use-csp-nonce-ZKs9k-ov.js";
23
- import { n as Ce, t as we } from "./empty-state-C56000TB.js";
24
- import { r as Te, t as Ee, u as De } from "./dialog-DmlG9opW.js";
23
+ import { n as Ce, t as we } from "./empty-state-C70prDDr.js";
24
+ import { r as Te, t as Ee, u as De } from "./dialog-BjKiRXJg.js";
25
25
  import { t as Oe } from "./client-only.utils-3nHNzCki.js";
26
26
  import { t as ke } from "./use-scroll-away-PQRFZkT2.js";
27
27
  import * as P from "react";
@@ -1,7 +1,7 @@
1
- import { n as e } from "./spinner-C6LP2Rw8.js";
2
- import { c as t, n, t as r } from "./dropdown-menu-CDKev8dk.js";
3
- import { t as i } from "./use-material-translation-1kCHtB0p.js";
4
- import { a, i as o, n as s, o as c, t as l } from "./code-language-items-BWw17W9s.js";
1
+ import { n as e } from "./spinner-CweqX5A9.js";
2
+ import { c as t, n, t as r } from "./dropdown-menu-IRFp4CH9.js";
3
+ import { t as i } from "./use-material-translation-CCy1Me0h.js";
4
+ import { a, i as o, n as s, o as c, t as l } from "./code-language-items-CXEMiWoF.js";
5
5
  import { i as u, n as d, r as f, s as p } from "./dist-C3GR7kJd.js";
6
6
  import { t as m } from "./code-block-spec-CGLKRhwD.js";
7
7
  import { Suspense as h, lazy as g, useEffect as _, useRef as v, useState as y } from "react";
@@ -143,7 +143,7 @@ function M({ node: e, editor: t, updateAttributes: n, editable: r, wrap: a, onWr
143
143
  }
144
144
  //#endregion
145
145
  //#region lib/components/ui/widgets/editor/extensions/code/code-block-open.tsx
146
- var N = g(() => import("./code-editor-BgKFrcld.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
146
+ var N = g(() => import("./code-editor-B6dFQSUJ.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
147
147
  function P() {
148
148
  let { t: e } = i();
149
149
  return /* @__PURE__ */ b("div", {
@@ -1,9 +1,9 @@
1
- import { t as e } from "./use-material-translation-1kCHtB0p.js";
1
+ import { t as e } from "./use-material-translation-CCy1Me0h.js";
2
2
  import { t } from "./toggle-FeCCJqbg.js";
3
3
  import { n } from "./calculator-context-BugcKuVG.js";
4
4
  import { i as r, o as i } from "./key-layout-cR79xfGE.js";
5
5
  import { t as a } from "./standard-layout-BuSRr3TY.js";
6
- import { t as o } from "./calculator-segment-C4WQAHcN.js";
6
+ import { t as o } from "./calculator-segment-BigMpjhn.js";
7
7
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
8
8
  import { scientificOptions as l } from "@nxgt/material-core/calculator/scientific";
9
9
  //#region lib/components/ui/widgets/calculator/variants/scientific/scientific-layout.ts
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DVRQkaTK.js";
3
- import { t as n } from "./use-material-translation-1kCHtB0p.js";
4
- import { t as r } from "./icon-button-CG4aO8Gh.js";
3
+ import { t as n } from "./use-material-translation-CCy1Me0h.js";
4
+ import { t as r } from "./icon-button-DrqNk1Ww.js";
5
5
  import { t as i } from "./compose-refs-G4J4kaUA.js";
6
6
  import a, { cloneElement as o, createContext as s, forwardRef as c, memo as l, useCallback as u, useContext as d, useEffect as f, useId as p, useLayoutEffect as m, useMemo as h, useReducer as g, useRef as _, useState as v } from "react";
7
7
  import { jsx as y } from "react/jsx-runtime";
@@ -5,7 +5,7 @@ import { a as i, i as a, n as o, r as s, t as c } from "./dist-DWZXlCZR.js";
5
5
  import { a as l, i as u, n as d, r as f, t as p } from "./dist-DHdUUM1w.js";
6
6
  import { a as m, c as h, d as g, i as _, l as v, o as y, r as b, t as x, u as S } from "./floating-ui.dom-KkZSW8_E.js";
7
7
  import { t as C } from "./dist-DkQbkF9T.js";
8
- import { t as w } from "./use-material-translation-1kCHtB0p.js";
8
+ import { t as w } from "./use-material-translation-CCy1Me0h.js";
9
9
  import * as T from "react";
10
10
  import { useLayoutEffect as E, useRef as D, useSyncExternalStore as O } from "react";
11
11
  import { jsx as k, jsxs as A } from "react/jsx-runtime";
package/dist/styles.css CHANGED
@@ -53,6 +53,8 @@
53
53
  --color-strix: var(--strix);
54
54
  --color-background: var(--background);
55
55
  --color-ground: var(--ground);
56
+ --color-surface-container: var(--surface-container);
57
+ --color-surface-container-high: var(--surface-container-high);
56
58
  --color-background-paper: --alpha(var(--primary) / 5%);
57
59
  --color-background-light: --alpha(var(--background) / 30%);
58
60
  --color-foreground: var(--foreground);
@@ -3,7 +3,7 @@ import { n as t } from "./dist-DVRQkaTK.js";
3
3
  import { i as n, r, t as i } from "./dist-DWZXlCZR.js";
4
4
  import { a, i as o, r as s } from "./dist-DHdUUM1w.js";
5
5
  import { i as c, n as l, r as u, t as d } from "./dist-DOK3zo5C.js";
6
- import { t as f } from "./use-material-translation-1kCHtB0p.js";
6
+ import { t as f } from "./use-material-translation-CCy1Me0h.js";
7
7
  import * as p from "react";
8
8
  import { createContext as m, useCallback as h, useContext as g, useEffect as ee, useLayoutEffect as _, useRef as v, useState as te } from "react";
9
9
  import { Fragment as ne, jsx as y, jsxs as b } from "react/jsx-runtime";
@@ -1,10 +1,10 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { a as t, i as n, n as r, o as i, r as a, t as o } from "./bubble-input-CQwVSoU3.js";
3
3
  import { a as s, r as c } from "./icon-sprites-CaYXzOL4.js";
4
- import { t as l } from "./use-material-translation-1kCHtB0p.js";
4
+ import { t as l } from "./use-material-translation-CCy1Me0h.js";
5
5
  import { t as u } from "./use-theme-BCLireTd.js";
6
6
  import { a as d, r as f } from "./theme-context-Cofk6vgs.js";
7
- import { t as p } from "./theme-toggle-Cxku5iBP.js";
7
+ import { t as p } from "./theme-toggle-WAFkncYx.js";
8
8
  import { n as m, t as h } from "./nxgt-theme-DA1IQe0O.js";
9
9
  import { useContext as g } from "react";
10
10
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-1kCHtB0p.js";
1
+ import { t as e } from "./use-material-translation-CCy1Me0h.js";
2
2
  import { i as t } from "./theme-store-BdPp43cV.js";
3
3
  import { n, t as r } from "./use-theme-BCLireTd.js";
4
4
  import { r as i } from "./theme-context-Cofk6vgs.js";
@@ -1,15 +1,15 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { o as t, t as n } from "./dist-DVRQkaTK.js";
3
3
  import { i as r, r as i } from "./dist-DWZXlCZR.js";
4
- import { n as a } from "./spinner-C6LP2Rw8.js";
4
+ import { n as a } from "./spinner-CweqX5A9.js";
5
5
  import { a as o } from "./dist-DHdUUM1w.js";
6
6
  import { i as s, n as c, r as l, t as u } from "./dist-DOK3zo5C.js";
7
7
  import { t as d } from "./in-dialog-D61Yeaol.js";
8
- import { A as f, M as p, N as m, b as h, d as g, f as _, i as v, j as y, l as b, n as x, o as S, r as C, t as w, u as T, y as ee } from "./dropdown-menu-CDKev8dk.js";
9
- import { a as te, n as ne } from "./popover-3EF4q2CT.js";
8
+ import { A as f, M as p, N as m, b as h, d as g, f as _, i as v, j as y, l as b, n as x, o as S, r as C, t as w, u as T, y as ee } from "./dropdown-menu-IRFp4CH9.js";
9
+ import { a as te, n as ne } from "./popover-Dzk4-l9U.js";
10
10
  import { i as re, n as ie, r as ae, t as oe } from "./dist-BZe2evxL.js";
11
11
  import { t as se } from "./warn-once-C_e47JM8.js";
12
- import { t as ce } from "./use-material-translation-1kCHtB0p.js";
12
+ import { t as ce } from "./use-material-translation-CCy1Me0h.js";
13
13
  import * as E from "react";
14
14
  import { createContext as D, useCallback as le, useContext as O, useEffect as k, useId as ue, useLayoutEffect as A, useMemo as j, useReducer as de, useRef as M, useState as N } from "react";
15
15
  import { Fragment as P, jsx as F, jsxs as I } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { a as e, l as t, r as n, s as r, t as i, u as a } from "./translator-BstxG_hN.js";
1
+ import { a as e, l as t, r as n, s as r, t as i, u as a } from "./translator-BRZNhsy5.js";
2
2
  import { createContext as o, useCallback as s, useContext as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
3
3
  import { jsx as p } from "react/jsx-runtime";
4
4
  //#region lib/i18n/material-resources-registry.ts
@@ -1481,6 +1481,10 @@ var r = {
1481
1481
  badge: "{count} new",
1482
1482
  "badge-dot": "new activity"
1483
1483
  },
1484
+ "top-app-bar": {
1485
+ account: "Account menu",
1486
+ more: "More"
1487
+ },
1484
1488
  "app-header": {
1485
1489
  back: "Back",
1486
1490
  "back-to": "Back to {label}",
@@ -4926,6 +4930,10 @@ var r = {
4926
4930
  badge: "{count, plural, one {# nouveauté} other {# nouveautés}}",
4927
4931
  "badge-dot": "nouveauté"
4928
4932
  },
4933
+ "top-app-bar": {
4934
+ account: "Menu du compte",
4935
+ more: "Plus"
4936
+ },
4929
4937
  "app-header": {
4930
4938
  back: "Retour",
4931
4939
  "back-to": "Retour à {label}",
@@ -4,28 +4,28 @@ import { t as n } from "./utils-BLfntITJ.js";
4
4
  import { n as r } from "./use-shape-morph-BKA_R5P5.js";
5
5
  import { n as i, o as a, t as o } from "./dist-DVRQkaTK.js";
6
6
  import { i as s, n as c, r as l, t as u } from "./dist-DWZXlCZR.js";
7
- import { _ as d, a as f, b as p, g as m, h, i as g, m as _, n as v, o as y, r as b, s as x, t as S, v as C, y as w } from "./spinner-C6LP2Rw8.js";
7
+ import { _ as d, a as f, b as p, g as m, h, i as g, m as _, n as v, o as y, r as b, s as x, t as S, v as C, y as w } from "./spinner-CweqX5A9.js";
8
8
  import { a as T, i as E, n as D, r as O, t as k } from "./dist-DHdUUM1w.js";
9
9
  import { a as A, i as ee } from "./dist-DOK3zo5C.js";
10
10
  import { i as j, n as M } from "./in-dialog-D61Yeaol.js";
11
- import { c as N, l as P, n as te, r as F, t as ne } from "./alert-dialog-1t6ULy5i.js";
11
+ import { c as N, l as P, n as te, r as F, t as ne } from "./alert-dialog-DZnt8PYE.js";
12
12
  import { A as re, C as ie, D as ae, E as oe, O as se, S as I, T as ce, _ as le, a as ue, b as de, d as fe, f as pe, g as me, h as he, i as ge, k as _e, l as ve, m as ye, n as be, o as xe, p as Se, r as Ce, s as we, t as Te, u as Ee, v as De, w as Oe, x as ke, y as Ae } from "./floating-ui.dom-KkZSW8_E.js";
13
- import { D as je, E as Me, N as Ne, O as Pe, c as Fe, d as Ie, f as Le, i as Re, k as ze, m as Be, n as Ve, o as He, p as Ue, t as We, u as Ge } from "./dropdown-menu-CDKev8dk.js";
13
+ import { D as je, E as Me, N as Ne, O as Pe, c as Fe, d as Ie, f as Le, i as Re, k as ze, m as Be, n as Ve, o as He, p as Ue, t as We, u as Ge } from "./dropdown-menu-IRFp4CH9.js";
14
14
  import { a as Ke, i as qe, n as Je } from "./field-blur-context-BLGgf_3z.js";
15
- import { i as Ye, n as Xe, r as Ze, t as Qe } from "./popover-3EF4q2CT.js";
15
+ import { i as Ye, n as Xe, r as Ze, t as Qe } from "./popover-Dzk4-l9U.js";
16
16
  import { a as $e, i as et, n as tt, o as nt, t as rt } from "./bubble-input-CQwVSoU3.js";
17
- import { n as it, r as at, t as ot, u as st } from "./tabs-Bj1zOe7-.js";
18
- import { a as ct, n as lt, o as ut, s as dt, v as ft, y as pt } from "./toolbar-items-CEIuSxU_.js";
17
+ import { n as it, r as at, t as ot, u as st } from "./tabs-BOT9B4le.js";
18
+ import { a as ct, n as lt, o as ut, s as dt, v as ft, y as pt } from "./toolbar-items-BsgzHSNf.js";
19
19
  import { t as mt } from "./dist-DkQbkF9T.js";
20
20
  import { o as ht, s as gt, t as _t } from "./use-click-lock-Bwg_caHO.js";
21
21
  import { a as vt, r as yt } from "./icon-sprites-CaYXzOL4.js";
22
22
  import { t as bt } from "./warn-once-C_e47JM8.js";
23
- import { r as xt, t as St } from "./button-DhiNGrdT.js";
24
- import { a as Ct } from "./translator-BstxG_hN.js";
23
+ import { r as xt, t as St } from "./button-MAL5an7L.js";
24
+ import { a as Ct } from "./translator-BRZNhsy5.js";
25
25
  import { h as wt } from "./get-CTzJAwfc.js";
26
26
  import { t as Tt } from "./isEmpty-F_g3jLf8.js";
27
- import { t as L } from "./use-material-translation-1kCHtB0p.js";
28
- import { t as R } from "./icon-button-CG4aO8Gh.js";
27
+ import { t as L } from "./use-material-translation-CCy1Me0h.js";
28
+ import { t as R } from "./icon-button-DrqNk1Ww.js";
29
29
  import { t as Et } from "./use-ssr-media-query-C6M5m8sf.js";
30
30
  import { n as Dt, t as Ot } from "./typography-CYEquVeb.js";
31
31
  import { n as kt, t as At } from "./util-4heV2LPI.js";
@@ -36,14 +36,14 @@ import { a as Bt } from "./toggle-group-CVMxEpWi.js";
36
36
  import { n as Vt } from "./use-slice-reducer-BGkeGtML.js";
37
37
  import { t as Ht } from "./browser-only-DQ94lWF8.js";
38
38
  import { t as Ut } from "./compose-refs-G4J4kaUA.js";
39
- import { n as Wt, r as Gt, t as Kt } from "./chip-m0_usuzd.js";
39
+ import { n as Wt, r as Gt, t as Kt } from "./chip-DKAKoNxq.js";
40
40
  import { a as qt, c as Jt, o as Yt, r as Xt, s as Zt, t as Qt } from "./input-CC2joTjB.js";
41
41
  import { t as $t } from "./text-field-BAdY-kpO.js";
42
42
  import { r as en } from "./use-csp-nonce-ZKs9k-ov.js";
43
- import { t as tn } from "./empty-state-C56000TB.js";
43
+ import { t as tn } from "./empty-state-C70prDDr.js";
44
44
  import { t as nn } from "./skeleton-DSdtr2qc.js";
45
- import { l as rn, n as an, o as on, r as sn, s as cn, t as ln, u as un } from "./dialog-DmlG9opW.js";
46
- import { t as dn } from "./icon-badge-ec7MmUGA.js";
45
+ import { l as rn, n as an, o as on, r as sn, s as cn, t as ln, u as un } from "./dialog-BjKiRXJg.js";
46
+ import { t as dn } from "./icon-badge-D3KO6uEQ.js";
47
47
  import { H as fn, V as pn, X as mn, bt as hn, it as gn, lt as _n, n as vn, t as yn, xt as bn, yt as xn } from "./dist-moutbfbd.js";
48
48
  import { t as Sn } from "./markdown-Dw_uH7j7.js";
49
49
  import { r as Cn, t as wn } from "./create-store-Dqp-PLLn.js";
@@ -11229,7 +11229,7 @@ var aS = (e = {}) => Cn({
11229
11229
  let [{ default: t }, { lowlight: n }, { richCodeBlock: r }] = await Promise.all([
11230
11230
  import("./dist-CRMFGjng.js"),
11231
11231
  import("./lowlight-OtcjU2Sa.js"),
11232
- import("./rich-code-block-DmX7d58S.js")
11232
+ import("./rich-code-block-CJAfqk6b.js")
11233
11233
  ]);
11234
11234
  return [r(t, {
11235
11235
  lowlight: n,
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { a as t, c as n, d as r, i, n as a, r as o, t as s, u as c } from "./alert-dialog-1t6ULy5i.js";
3
- import { a as l } from "./button-DhiNGrdT.js";
4
- import { i as u } from "./translate-material-DI3nmQ6I.js";
5
- import { t as d } from "./use-material-translation-1kCHtB0p.js";
2
+ import { a as t, c as n, d as r, i, n as a, r as o, t as s, u as c } from "./alert-dialog-DZnt8PYE.js";
3
+ import { a as l } from "./button-MAL5an7L.js";
4
+ import { i as u } from "./translate-material-DTIAPmlU.js";
5
+ import { t as d } from "./use-material-translation-CCy1Me0h.js";
6
6
  import { _ as f, g as p, h as m, t as h, v as g, y as _ } from "./date.utils-JTEIo3mM.js";
7
7
  import { useCallback as v, useEffect as y, useMemo as b, useRef as x, useState as S } from "react";
8
8
  import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { i as e, t } from "./translate-material-DI3nmQ6I.js";
1
+ import { i as e, t } from "./translate-material-DTIAPmlU.js";
2
2
  import { useCallback as n } from "react";
3
3
  //#region lib/i18n/use-material-translation.ts
4
4
  function r() {
@@ -1,6 +1,6 @@
1
1
  import { o as e, r as t } from "./dist-DVRQkaTK.js";
2
2
  import { i as n, n as r, r as i, t as a } from "./dist-DWZXlCZR.js";
3
- import { C as o, S as s, x as c } from "./spinner-C6LP2Rw8.js";
3
+ import { C as o, S as s, x as c } from "./spinner-CweqX5A9.js";
4
4
  import { a as l, i as u, r as d } from "./dist-DHdUUM1w.js";
5
5
  import { c as f, i as p, l as m, o as h, r as g, s as ee } from "./in-dialog-D61Yeaol.js";
6
6
  import { r as te } from "./escape-owner-DpaP0lm1.js";
package/docs/README.md CHANGED
@@ -32,6 +32,7 @@ detail: every option, the second example, and the traps.
32
32
  | [SSR](guides/ssr.md) | Your app renders on a server and bundles this package |
33
33
  | [Content Security Policy](guides/csp.md) | Your app sends a strict CSP: the directives to use, the components that still inject a `<style>`, the zod and KaTeX settings, self-hosting a font, the per-request nonce |
34
34
  | [The Vite plugin](guides/vite-plugin.md) | You are adding `nxgtMaterial()` to `vite.config.ts`: the CSP by hash or nonce, fonts, the styles check, PDFs on a bundled server, and each option's opt-out |
35
+ | [Moving to TopAppBar](guides/migrating-to-top-app-bar.md) | Your app uses `AppHeader`, `TopAppBar`'s `variant` / `headline`, the shell's `'center'` / `'medium'` / `'large'` header values or the `app-header*` slots: each old spelling and its replacement, the visual changes, the slot rename planned for the next major |
35
36
  | [Migrating to 3.0](guides/migrating-to-3.md) | You are upgrading from 2.x: the React 19.3 and React Router 8.5 peers, `ActivityLayout`'s default route transition, `use(browser())` in server HTML, and each API removed in 3.0 with what replaces it |
36
37
  | [Date and time fields: from 2.x](guides/date-time-fields-2-x.md) | Your app used `DateField`, `DateRangeField`, `TimeField` or `TimePicker` before their redesign: each change in look and behaviour, the 2.x ways back that 3.0 removed, and what to change in tests |
37
38
  | [The field look (2.x)](guides/field-look-2-x.md) | Your fields or pickers look different after an upgrade (8px corners, the focus halo, a dashed read-only, a 44px `NativeSelect`, a list connected to its trigger, a `CountryField` with no chip, new group headers, the date and time fields' boxes) and you want to know what changed or get the earlier look back |
@@ -7,11 +7,11 @@ documentation-site shell. Everything is imported from
7
7
 
8
8
  | | Component | What it does |
9
9
  | --- | --- | --- |
10
- | <img src="../previews/navigation-layout-appshell.webp" width="96" alt=""> | [ActivityLayout](#activitylayout) | App shell: sidebar, header, breadcrumbs, titled page; `header` sets the app bar (small, center, medium or large collapsing on scroll, hide on scroll, a route's `handle.header`, tabs under it, a route's `handle.back` arrow); a route's `handle.title` is the page's `h1` in the app bar (it labels `main`; `usePageTitleFocus()` focuses it after a navigation), `handle.titleAfter` / `titleAfter` a node right after it, outside the `h1` (a record's `Switcher`, or `<Switcher size="compact">` for an icon-only one), `headerContext` a small tenant line after it from md up, `breadcrumbRoot` a text root crumb or (`icon: true`) the home icon with its own target and name, `breadcrumb={false}` no trail, `context` the tenant line atop the phone's menu sheet; `menuOpen` / `onMenuOpenChange` control the phone's menu sheet, which closes itself on a followed link or any location change |
10
+ | <img src="../previews/navigation-layout-appshell.webp" width="96" alt=""> | [ActivityLayout](#activitylayout) | App shell: sidebar, header, breadcrumbs, titled page; `header` sets the app bar, a `TopAppBar` (small, medium-flexible, large-flexible or search, collapsing on scroll, hide on scroll, a route's `handle.header`, tabs under it, a route's `handle.back` arrow); a route's `handle.title` is the page's `h1` in the app bar (it labels `main`; `usePageTitleFocus()` focuses it after a navigation), `handle.titleAfter` / `titleAfter` a node right after it, outside the `h1` (a record's `Switcher`, or `<Switcher size="compact">` for an icon-only one), `headerContext` a small tenant line after it from md up, `breadcrumbRoot` a text root crumb or (`icon: true`) the home icon with its own target and name, `breadcrumb={false}` no trail, `context` the tenant line atop the phone's menu sheet; `menuOpen` / `onMenuOpenChange` control the phone's menu sheet, which closes itself on a followed link or any location change |
11
11
  | <img src="../previews/navigation-layout-accountmenu.webp" width="96" alt=""> | [AccountMenu](#accountmenu) | The app bar's avatar menu: the account, the app's links, Sign out |
12
12
  | <img src="../previews/navigation-layout-authcard.webp" width="96" alt=""> | [AuthCard](#authcard) | Signed-out page frame: one `main`, a centred card, its title the `h1` |
13
13
  | <img src="../previews/navigation-layout-sidebar.webp" width="96" alt=""> | [Sidebar](#sidebar) | Collapsible navigation sidebar |
14
- | <img src="../previews/navigation-layout-topappbar.webp" width="96" alt=""> | [TopAppBar, BottomAppBar](#topappbar) | Top (small, center, medium, large) and bottom bars |
14
+ | <img src="../previews/navigation-layout-topappbar.webp" width="96" alt=""> | [TopAppBar, BottomAppBar](#topappbar) | The top app bar (small, medium-flexible, large-flexible, search; collapse, icon actions as data, account menu, primary action) and a bottom bar |
15
15
  | | [AppSearchBar, SearchView](#appsearchbar) | The app bar's search: a pill with a docked results panel from 768px, a full-screen search view on a phone |
16
16
  | <img src="../previews/navigation-layout-stickyactionbar.webp" width="96" alt=""> | [StickyActionBar](#stickyactionbar) | A page's main decision, stuck to the bottom on a phone, inline from `md` |
17
17
  | <img src="../previews/navigation-layout-breadcrumb.webp" width="96" alt=""> | [Breadcrumb](#breadcrumb) | Breadcrumb primitives |
@@ -68,7 +68,7 @@ const items: MenuItem[] = [
68
68
  ```
69
69
 
70
70
  Parts: `ActivityLayout` (the chrome), `ActivityContent` (one screen),
71
- `AppSidebar`, `AppHeader` and `AppBreadcrumb`, which the layout composes and
71
+ `AppSidebar`, `AppHeader` (deprecated, use `TopAppBar`) and `AppBreadcrumb`, which the layout composes and
72
72
  which work alone. `AppHeader` also takes `tabs` (`ReactNode`, default none: a
73
73
  `TabsNav` as a row at the foot of the bar, pinned when the bar hides) and `back`
74
74
  (`ShellBack`, default none: the back arrow, named "Back" or "Back to <label>"
@@ -90,10 +90,11 @@ phone's menu sheet pad clear of `env(safe-area-inset-*)`, as classes; see the
90
90
  | `headerTitle` | `ReactNode` | — | the header's leading title (the context: an organisation's name), after the phone's menu button, truncated when long; when it is cut off, its full text is the `title` tooltip (#629) |
91
91
  | `handle.title` | `ReactNode \| (match: UIMatch) => ReactNode` | — | on a route: the page's title in the app bar, its one `h1`, in the first server HTML; `ActivityContent` leaves its own title out while it is set (see the [app shell guide](../guides/app-shell.md#the-pages-title-in-the-app-bar)) |
92
92
  | `titleAfter` / `handle.titleAfter` | `ReactNode \| (match: UIMatch) => ReactNode` | — | a node right after the page's title in the app bar, outside its `h1` (a record's `Switcher`); stays on screen on a phone, the title truncates first; the prop wins over the handle (see the [app shell guide](../guides/app-shell.md#a-slot-after-the-title)) |
93
- | `headerContext` | `ReactNode` | — | a small muted context line (the tenant) after the page's title and its slot, from `md` up, outside the `h1`, truncated with its full text as the tooltip; hidden on a phone, where `context` fills the menu sheet (see the [app shell guide](../guides/app-shell.md#a-context-line-after-the-title)) |
93
+ | `headerContext` | `ReactNode` | — | the bar's `subtitle`: a small muted context line (the tenant) under the page's title and its slot, from `md` up, outside the `h1`, truncated with its full text as the tooltip; hidden on a phone, where `context` fills the menu sheet (see the [app shell guide](../guides/app-shell.md#a-context-line-after-the-title)) |
94
94
  | `breadcrumb` | `boolean` | `true` | `false` hides the breadcrumb trail (an error page); it is also hidden when every matched `handle.breadcrumb` renders `null`; see the [app shell guide](../guides/app-shell.md#breadcrumbs) |
95
95
  | `breadcrumbRoot` | `{ label: ReactNode; to: string }` or `{ label: string; to: string; icon: true }` | — | the breadcrumb's first crumb: a text link in place of the home icon, or with `icon: true` the home icon alone linked to `to`, named and tooltipped `label` (`AppBreadcrumb`'s `root`); see the [app shell guide](../guides/app-shell.md#breadcrumbs) |
96
- | `headerActions` | `ReactNode` | — | header, before the avatar |
96
+ | `headerActions` | `ReactNode \| TopAppBarAction[]` | — | header, before the avatar; data (`TopAppBarAction`: `label`, `icon`, `onClick` / `href`, `placement` `'bar'` or `'account'`, `group`, `selected`, `disabled`; see [TopAppBar](#topappbar)) draws free icon buttons and an account menu |
97
+ | `headerPrimaryAction` | `TopAppBarPrimaryAction` (`{ label, icon, onClick?, disabled? }`) | — | the bar's `primaryAction`, the screen's main action: a `Button` from 768 px, a `Fab` on a phone |
97
98
  | `title`, `subtitle`, `actions` | `ReactNode` | — | `ActivityContent`'s header card; `title` is left out while a route's `handle.title` puts the page's title in the app bar |
98
99
  | `header` / `hideHeader` | `ReactNode` / `boolean` | — | `ActivityContent`: replace or drop the header card |
99
100
  | `contentAs` / `scroll` | `'main' \| 'div'` / `'document' \| 'container'` | `'main'` / `'document'` | the content region is the page's `<main>`; the document scrolls (see the [app shell guide](../guides/app-shell.md#landmarks-headings-and-scrolling)) |
@@ -107,7 +108,7 @@ phone's menu sheet pad clear of `env(safe-area-inset-*)`, as classes; see the
107
108
  | `navigation` | `ShellNavigation \| { phone?, tablet?, desktop?, hideOnScroll?, persistKey? }` | `{ phone: 'modal-drawer', tablet: 'rail', desktop: 'rail' }` | `ActivityLayout`: the navigation per window size (phone below 768px, tablet to 1279px, desktop from 1280px). Every `ShellNavigation` name is drawn: `'modal-drawer'`, `'rail'`, `'rail-expanded'`, `'drawer'`, `'sidebar'`, `'top'`, `'two-level'`, `'floating'`, `'bar'` and `'none'`. `hideOnScroll` (a field of this object, `false` by default) slides the `'floating'` toolbar away on scroll; no other preset reads it. `persistKey` (a field of this object) remembers the `'rail-expanded'` rail's, the `'sidebar'`'s and the `'two-level'` panel's state. A name alone (`navigation="sidebar"`, `"drawer"`, `"top"`, `"two-level"`) leaves a phone its default navigation; `{ phone: 'sidebar' }` draws it there. A phone never draws `'rail'` or `'rail-expanded'`: it keeps its menu sheet. `navigation="bar"` alone is phone-only (hidden from 768px, where the default rail shows; `{ tablet: 'bar' }` keeps it there). `'floating'` is drawn at every size, the phone included. See [`navigation` and `header`](../guides/app-shell.md#navigation-and-header) |
108
109
  | `navigationFab` | `ReactNode \| ({ expanded }) => ReactNode` | — | `ActivityLayout`: the screen's primary action, at the top of the `'rail-expanded'` rail (a `Fab`; the function form receives the rail's state). The other presets do not draw it |
109
110
  | `sidebarExpanded` / `defaultSidebarExpanded` / `onSidebarExpandedChange` | `boolean` / `boolean` / `(expanded: boolean) => void` | — / `false` / — | `ActivityLayout`: the `'sidebar'`'s expanded state (labels beside the icons; it starts collapsed), controlled or not; with `navigation.persistKey` the last choice is kept and read after hydration |
110
- | `header` | `'small' \| 'center' \| 'medium' \| 'large' \| 'none' \| { variant, collapse?, hideOnScroll?, tabs?, search? }` | `'small'` | `ActivityLayout`: the app bar's size. The five variants and `hideOnScroll` are drawn; `search` draws an `AppSearchBar` (see [AppSearchBar](#appsearchbar)); `tabs` (a `TabsNav`) draws a row stuck under the bar, which stays pinned when the bar hides (see [Tabs under the app bar](../guides/app-shell.md#tabs-under-the-app-bar)); a route's `handle.back` (`ShellBack`: `{ to, label? }` or `true`) draws a back arrow before the title, the phone's menu button following it while the phone has the menu sheet (see [The back arrow](../guides/app-shell.md#the-back-arrow)). A route's `handle.header` overrides it; a `'medium'` or `'large'` header needs a `handle.title`, else it stays small; `'none'` also drops the phone's menu button, so pair it with `navigation="bar"`. See [The app bar variants](../guides/app-shell.md#the-app-bar-variants), [Scroll direction](../guides/app-shell.md#scroll-direction) and [Room at the bottom](../guides/app-shell.md#room-at-the-bottom) |
111
+ | `header` | `'small' \| 'medium-flexible' \| 'large-flexible' \| 'search' \| 'none' \| { size?, align?, collapse?, hideOnScroll?, tabs?, search? }` | `'small'` | `ActivityLayout`: the app bar, drawn with `TopAppBar`. `size` and `align` pick its look (the old `'center'`, `'medium'`, `'large'` and `variant` still work, deprecated); `collapse` (default on for medium and large) and `hideOnScroll` follow the scroll; `search` draws an `AppSearchBar` (see [AppSearchBar](#appsearchbar)); `tabs` (a `TabsNav`) draws a row stuck under the bar, which stays pinned when the bar hides (see [Tabs under the app bar](../guides/app-shell.md#tabs-under-the-app-bar)); a route's `handle.back` (`ShellBack`: `{ to, label? }` or `true`) draws a back arrow before the title, the phone's menu button following it while the phone has the menu sheet (see [The back arrow](../guides/app-shell.md#the-back-arrow)). A route's `handle.header` overrides it; a medium or large header needs a `handle.title`, else it stays small; `'none'` also drops the phone's menu button, so pair it with `navigation="bar"`. See [Top app bar sizes](../guides/app-shell.md#top-app-bar-sizes), [Scroll direction](../guides/app-shell.md#scroll-direction) and [Room at the bottom](../guides/app-shell.md#room-at-the-bottom) |
111
112
  | `align` | `'start' \| 'center'` | `'start'` | `ActivityLayout`, `AppSidebar`: the collapsed rail's entries sit right under the brand, or `'center'` for centred in the height below it |
112
113
  | `backdrop` | `ReactNode \| false` | — | `ActivityLayout`: an exception to the theme's background (drawn by default; Lavande's is the built-in gradient and blobs); `false` draws a plain page. A node is a decorative background behind the frame: a `Background` preset from `@nxgt/material/backgrounds`. Rendered in an `inert`, `aria-hidden` layer as wide as the content column and one viewport high, fixed in the viewport while the content scrolls; the chrome (app bar, breadcrumb, tabs strip) is lightly translucent and frosted over it (80%, 87% for the sidebar, breadcrumb and tabs strip, 92% and no blur under `prefers-reduced-transparency` or without `backdrop-filter`), and the lists, tables and cards stay opaque; `--nxgt-backdrop-chrome` sets the chrome's fill and `--nxgt-backdrop-surface` the lists'. See [Use a background preset behind the shell](../guides/app-shell.md#use-a-background-preset-behind-the-shell) |
113
114
  | `routeTransition` | `boolean \| Omit<ViewTransitionProps, 'children' \| 'ref'>` | `true` | `ActivityLayout`: React's `<ViewTransition>` around the content region, so a navigation cross-fades it (by default only when the pathname changes, not on a search change, a fetcher or a revalidation). `false` renders none (your app has its own boundary); an object passes `default` / `update` classes, `name`, callbacks through. `ROUTE_TRANSITION_CLASS` (`'nxgt-route'`) is exported for nested boundaries. See [Route transitions](../guides/app-shell.md#route-transitions) |
@@ -128,7 +129,7 @@ pads its bottom and shortens its sidebar by the bar's height
128
129
  footer stay above it. Another layout adds `pb-(--nxgt-media-dock)` to what
129
130
  scrolls.
130
131
 
131
- **Storybook:** `Navigation & layout/AppShell` · **Vue:** `ActivityLayout`, `ActivityContent`, `AppSidebar`, `AppHeader`, `AppBreadcrumb`
132
+ **Storybook:** `Navigation & layout/AppShell` · **Vue:** `ActivityLayout`, `ActivityContent`, `AppSidebar`, `AppHeader` (deprecated, use `TopAppBar`), `AppBreadcrumb`
132
133
 
133
134
  ---
134
135
 
@@ -360,19 +361,79 @@ recolour the rail. See [Theming](../guides/theming.md#the-active-entry-of-the-si
360
361
 
361
362
  ![TopAppBar](../previews/navigation-layout-topappbar.webp)
362
363
 
363
- Top bar surface, and a bottom bar of icon actions with an active state.
364
+ The top app bar: the bar `ActivityLayout` draws, for a layout of your own. A
365
+ `title` that is the page's one `<h1>`, a `subtitle` under it, four sizes, a
366
+ collapse on scroll, free icon actions with an account menu, and a main action.
367
+ Flat on the page ground; once the page scrolls it takes a soft tint and a hairline.
368
+
369
+ ```tsx
370
+ import { Bell, Languages, Plus } from 'lucide-react';
371
+ import { Avatar, TopAppBar } from '@nxgt/material/components';
372
+
373
+ <TopAppBar
374
+ as="header"
375
+ size="large-flexible"
376
+ collapse
377
+ title="Orders"
378
+ subtitle="Acme workspace"
379
+ actions={[
380
+ { label: 'Notifications', icon: <Bell />, onClick: openInbox },
381
+ { label: 'English', icon: <Languages />, group: 'Language', selected: true, placement: 'account' },
382
+ { label: 'Français', group: 'Language', placement: 'account', onClick: () => setLocale('fr') },
383
+ ]}
384
+ trailing={<Avatar alt="Ada Lovelace" fallback="AL" />}
385
+ primaryAction={{ label: 'New order', icon: <Plus />, onClick: createOrder }}
386
+ />
387
+ ```
388
+
389
+ `collapse` and `hideOnScroll` only mark the bar (`data-collapse`,
390
+ `data-hide-on-scroll`): the scroll is followed by the shell, so in `ActivityLayout`
391
+ use `header` instead (see [Top app bar sizes](../guides/app-shell.md#top-app-bar-sizes)).
392
+
393
+ | Prop | Type | Default | Effect |
394
+ | --- | --- | --- | --- |
395
+ | `size` | `'small' \| 'medium-flexible' \| 'large-flexible' \| 'search'` | `'small'` | `small`: one row. `medium-flexible` and `large-flexible`: the `title` on a second row (28 px, and 40 px or 36 px on a phone; up to two lines in large), collapsing into the small row. `search`: the `search` field is the bar's centre. Without a `title` a medium or large bar draws as small |
396
+ | `align` | `'start' \| 'center'` | `'start'` | `center` centres a small bar's title |
397
+ | `title` / `titleId` | `ReactNode` / `string` | — | the bar renders `title` as the page's one `<h1>`; `titleId` is its `id`, to name a region |
398
+ | `subtitle` | `ReactNode` | — | a muted `<p>` right after the `<h1>`, one line, truncated |
399
+ | `titleAfter` | `ReactNode` | — | beside the title: a badge, a status |
400
+ | `leading` / `trailing` | `ReactNode` | — | start of the row (menu or back button) / its end (the avatar) |
401
+ | `actions` | `ReactNode \| TopAppBarAction[]` | — | a node is drawn as given. An array of data (every item a plain object with a string `label`) draws free ghost icon buttons (one on a phone, two from 768 px) and gathers the rest, and every `'account'` action, in a menu opened by `trailing` (named "Account menu") or by a More button when there is no `trailing` |
402
+ | `primaryAction` | `TopAppBarPrimaryAction` | — | `{ label, icon, onClick?, disabled? }`: a `Button` from 768 px; on a phone a `Fab` above `--nxgt-bottom-chrome`, portalled to `document.body` after mount |
403
+ | `search` | `ReactNode` | — | the field of a `'search'` bar; the title stays in the page as an `sr-only` `<h1>` |
404
+ | `tabs` | `ReactNode` | — | a row under the bar: a `Tabs` list |
405
+ | `collapse` / `hideOnScroll` | `boolean` | `false` | mark the bar as collapsing its second row, or hiding on scroll down |
406
+ | `linkComponent` | `LinkComponent` | nearest `LinkComponentProvider`'s, else `<a>` | draws an action with an `href` |
407
+ | `as` | `'div' \| 'header'` | `'div'` | the element drawn; use `'header'` for the page's banner |
408
+ | `variant` | `'small' \| 'center' \| 'medium' \| 'large'` | — | deprecated for `size` and `align`: warns once in development |
409
+ | `headline` | `ReactNode` | — | deprecated for `title`: renders in a non-heading element; warns once in development |
410
+
411
+ `TopAppBarAction` (the items of `actions`):
412
+
413
+ | Field | Type | Effect |
414
+ | --- | --- | --- |
415
+ | `label` | `string` | required: the icon button's accessible name and the menu entry's text |
416
+ | `icon` | `ReactNode` | decorative; the action is named by `label` |
417
+ | `onClick` | `() => void` | the action was chosen |
418
+ | `href` | `string` | makes the action a link, drawn with `linkComponent` |
419
+ | `placement` | `'bar' \| 'account'` | `'bar'` (default): a bar icon while there is room. `'account'`: always in the account menu |
420
+ | `group` | `string` | the menu section ("Language", "Theme"): entries sit under that label, inline (never a submenu, which overflows at 360 px); entries without one come first |
421
+ | `selected` | `boolean` | the current choice of its group: a group of non-link entries where one sets `selected` is a radio group (`menuitemradio`, `aria-checked`); a link entry with `selected` is the current page (`aria-current="page"`) |
422
+ | `disabled` | `boolean` | the action cannot be chosen |
423
+ | `id` | `string` | the key; defaults to `label` |
424
+
425
+ The `trailing` avatar becomes the menu's trigger (a `<button>`), so it must hold no
426
+ link, button or input (a warning in development). New message keys:
427
+ `material.top-app-bar.account` and `material.top-app-bar.more` (en, fr).
428
+
429
+ `BottomAppBar` is a row of icon actions that spaces its children and styles the
430
+ one with `data-state="active"`; it takes a `div`'s props.
364
431
 
365
432
  <img src="../previews/navigation-layout-bottomappbar.webp" height="56" alt="BottomAppBar">
366
433
 
367
434
  ```tsx
368
- import { Book, Camera, Menu, Search } from 'lucide-react';
369
- import { BottomAppBar, IconButton, TopAppBar, Typography } from '@nxgt/material/components';
370
-
371
- <TopAppBar>
372
- <IconButton variant="ghost" aria-label="Open menu"><Menu /></IconButton>
373
- <Typography variant="title-md" emphasized className="flex-1">Inbox</Typography>
374
- <IconButton variant="ghost" aria-label="Search"><Search /></IconButton>
375
- </TopAppBar>
435
+ import { Book, Camera } from 'lucide-react';
436
+ import { BottomAppBar, IconButton } from '@nxgt/material/components';
376
437
 
377
438
  <BottomAppBar>
378
439
  <IconButton data-state="active" aria-label="Camera"><Camera /></IconButton>
@@ -380,22 +441,14 @@ import { BottomAppBar, IconButton, TopAppBar, Typography } from '@nxgt/material/
380
441
  </BottomAppBar>
381
442
  ```
382
443
 
383
- `BottomAppBar` spaces its children and styles the one with
384
- `data-state="active"`; both take a `div`'s props. `TopAppBar` is a bordered row
385
- with a `variant`: `'small'` (the default), `'center'` (the row's content
386
- centred), and `'medium'` or `'large'`, which draw the `headline` on a second
387
- row in display type (without a `headline` they are small). It does not scroll
388
- by itself: `ActivityLayout`'s `header` does that for the shell's own bar (see
389
- the [app shell guide](../guides/app-shell.md#the-app-bar-variants)).
444
+ The root is a column (`flex-col`) whose children sit in a
445
+ `[data-slot="top-app-bar-row"]`: a `justify-between`, `gap-*` or `items-*` in the
446
+ root's `className` does not reach them (aim it at the row), and `title` is the
447
+ bar's `<h1>`, no longer the HTML `title` attribute. A `className` background,
448
+ radius or shadow wins at rest; once scrolled the tint replaces the background.
449
+ The shell's bar takes its height from `--nxgt-header-height`.
390
450
 
391
- ```tsx
392
- import { Menu } from 'lucide-react';
393
- import { IconButton, TopAppBar } from '@nxgt/material/components';
394
-
395
- <TopAppBar variant="large" headline={<h1>Projects</h1>}>
396
- <IconButton variant="ghost" aria-label="Open menu"><Menu /></IconButton>
397
- </TopAppBar>
398
- ```
451
+ Moving from `AppHeader` or the old props: [Moving to TopAppBar](../guides/migrating-to-top-app-bar.md).
399
452
 
400
453
  **Storybook:** `Navigation & layout/TopAppBar`, `Navigation & layout/BottomAppBar` · **Vue:** `TopAppBar`, `BottomAppBar`
401
454
 
@@ -422,7 +475,7 @@ function Shell() {
422
475
  <ActivityLayout
423
476
  items={items}
424
477
  header={{
425
- variant: 'small',
478
+ size: 'small',
426
479
  search: {
427
480
  value: query,
428
481
  onValueChange: setQuery,