@nxgt/material 3.12.1 → 3.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +15 -13
  3. package/dist/{async-slice-4qbER86I.js → async-slice-ChtlTP8W.js} +2 -2
  4. package/dist/{background-cEqcZQ3v.js → background-Ce7M5V42.js} +2 -1
  5. package/dist/backgrounds/css-react/icons-quiet.css +43 -0
  6. package/dist/backgrounds/css-react/icons.css +2 -0
  7. package/dist/backgrounds.js +1 -1
  8. package/dist/{button-BNjw-pnE.js → button-BrgyWw7T.js} +1 -1
  9. package/dist/charts.js +3 -3
  10. package/dist/{chip-DLgQTJBZ.js → chip-BZu-bvAJ.js} +1 -1
  11. package/dist/{code-editor-BZbaYLvo.js → code-editor-DjY7_8TH.js} +4 -4
  12. package/dist/code-editor.js +4 -4
  13. package/dist/{code-language-items-BT5BO5w6.js → code-language-items-D1lpNQ6J.js} +2 -2
  14. package/dist/components/components.css +2 -0
  15. package/dist/components/ui/display/avatar/avatar.css +17 -0
  16. package/dist/components/ui/feedback/alert/alert.css +16 -0
  17. package/dist/{components-yx1t_5_P.js → components-BhGc4Bj7.js} +15147 -14990
  18. package/dist/components.js +26 -26
  19. package/dist/{dialog-BQp5IdFl.js → dialog-rOMjlKJ7.js} +1 -1
  20. package/dist/dnd.js +1 -1
  21. package/dist/draw-animate.js +1 -1
  22. package/dist/draw.js +1 -1
  23. package/dist/{drawing-B8VuG7nx.js → drawing-iP1SDjdL.js} +60 -54
  24. package/dist/{dropdown-menu-BsH9W_3C.js → dropdown-menu-BEyP-A0J.js} +1 -1
  25. package/dist/editor.js +527 -527
  26. package/dist/{empty-state-WaU4-T2c.js → empty-state-ZtqqpX0S.js} +1 -1
  27. package/dist/hooks.js +2 -2
  28. package/dist/{i18n-provider-C6HhBw34.js → i18n-provider-GV4Ukoe2.js} +1 -1
  29. package/dist/i18n.js +5 -5
  30. package/dist/{icon-badge-DUAq9f7H.js → icon-badge-_tY1MwU9.js} +1 -1
  31. package/dist/lib/backgrounds/background/types.d.ts +2 -1
  32. package/dist/lib/backgrounds/index.d.ts +1 -1
  33. package/dist/lib/components/ui/collections/data-table/numeric-class.d.ts +2 -0
  34. package/dist/lib/components/ui/collections/data-table/table-meta.d.ts +8 -3
  35. package/dist/lib/components/ui/display/entity-header/entity-header.d.ts +8 -2
  36. package/dist/lib/components/ui/display/entity-header/entity-stats.d.ts +1 -1
  37. package/dist/lib/components/ui/display/entity-header/partials/entity-header-body.d.ts +2 -1
  38. package/dist/lib/components/ui/display/list-tile/list-tile.d.ts +43 -8
  39. package/dist/lib/components/ui/display/list-tile/partials/list-tile-body.d.ts +4 -1
  40. package/dist/lib/components/ui/display/list-tile/partials/list-tile-line.d.ts +3 -0
  41. package/dist/lib/components/ui/display/list-tile/partials/list-tile-toggle.d.ts +20 -0
  42. package/dist/lib/components/ui/display/stat-card/index.d.ts +2 -0
  43. package/dist/lib/components/ui/display/stat-card/stat-card-group.d.ts +12 -0
  44. package/dist/lib/components/ui/feedback/alert/alert-tone-icon.d.ts +9 -0
  45. package/dist/lib/components/ui/feedback/alert/alert.d.ts +4 -0
  46. package/dist/lib/components/ui/fields/form-section/form-section-heading-classes.d.ts +4 -0
  47. package/dist/lib/components/ui/fields/form-section/form-section.d.ts +9 -1
  48. package/dist/lib/components/ui/layout/app-shell/use-truncated-title.d.ts +11 -1
  49. package/dist/lib/components/ui/layout/list-details-layout/list-details-layout.d.ts +12 -2
  50. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-back.d.ts +16 -0
  51. package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-details.d.ts +11 -3
  52. package/dist/lib/components/ui/layout/list-details-layout/partials/pane-opener.d.ts +15 -0
  53. package/dist/lib/components/ui/layout/list-details-layout/partials/use-container-narrow.d.ts +7 -0
  54. package/dist/lib/components/ui/layout/list-details-layout/partials/use-pane-focus.d.ts +13 -0
  55. package/dist/lib/components/ui/widgets/drawing/drawing-types.d.ts +6 -0
  56. package/dist/lib/components/ui/widgets/drawing/partials/drawing-root.d.ts +5 -1
  57. package/dist/lib/draw-animate/morph-drawing.d.ts +2 -8
  58. package/dist/lib/i18n/resources/en/en.d.ts +3 -0
  59. package/dist/lib/i18n/resources/en/material.json.d.ts +3 -0
  60. package/dist/lib/i18n/resources/fr/fr.d.ts +3 -0
  61. package/dist/lib/i18n/resources/fr/material.json.d.ts +3 -0
  62. package/dist/lib/i18n/resources/resources.d.ts +6 -0
  63. package/dist/lib/i18n/translator.d.ts +1 -1
  64. package/dist/lib/print/components/print-document/print-document.d.ts +12 -2
  65. package/dist/lib/print/index.d.ts +2 -1
  66. package/dist/lib.js +1 -1
  67. package/dist/main.js +43 -43
  68. package/dist/map.js +4 -4
  69. package/dist/material.css +1 -1
  70. package/dist/pdf-reader.js +1 -1
  71. package/dist/print.js +101 -98
  72. package/dist/{public-B0Nq_yYV.js → public-D_Gz7wgr.js} +6 -6
  73. package/dist/{rich-code-block-v7WmeZp9.js → rich-code-block-RN-EpeTA.js} +4 -4
  74. package/dist/{sortable-provider-CgDTolQR.js → sortable-provider-Iej7IS4n.js} +1 -1
  75. package/dist/{spinner-BtSIYVrC.js → spinner-BwWDXIbg.js} +1 -1
  76. package/dist/{stored-language-BeIKw3-K.js → stored-language-BAAP7qS3.js} +4 -2
  77. package/dist/theme-picker.js +2 -2
  78. package/dist/{theme-toggle-B2Pehdhn.js → theme-toggle-8zHeXSD1.js} +1 -1
  79. package/dist/{toolbar-items-rUHdVqAq.js → toolbar-items-CVQBYp4K.js} +2 -2
  80. package/dist/{translate-material-Bd_KgfB8.js → translate-material-C0aOnHpZ.js} +2 -2
  81. package/dist/{translator-Dje8HrNz.js → translator-BU07gNva.js} +1 -1
  82. package/dist/{use-chat-composer-B0_STpQN.js → use-chat-composer-P4GxmCHa.js} +14 -14
  83. package/dist/{use-heading-spy-DXo6IOX9.js → use-heading-spy-DETdqnB6.js} +1 -1
  84. package/dist/{use-material-translation-B3V_bz-5.js → use-material-translation-DGeVp-qP.js} +2 -2
  85. package/docs/components/data-display.md +60 -8
  86. package/docs/components/data-table-filter-and-lists.md +1 -1
  87. package/docs/components/feedback-and-status.md +22 -4
  88. package/docs/components/form-fields.md +14 -3
  89. package/docs/components/navigation-and-layout.md +8 -3
  90. package/docs/guides/backgrounds.md +35 -2
  91. package/docs/guides/drawing.md +15 -0
  92. package/docs/guides/printing.md +113 -2
  93. package/docs/guides/server-lists-url.md +3 -0
  94. package/docs/previews/feedback-status-alert.webp +0 -0
  95. package/docs/roadmap.md +5 -3
  96. package/docs/troubleshooting.md +59 -0
  97. package/lib/backgrounds/css-react/icons-quiet.css +43 -0
  98. package/lib/backgrounds/css-react/icons.css +2 -0
  99. package/lib/components/components.css +2 -0
  100. package/lib/components/ui/display/avatar/avatar.css +17 -0
  101. package/lib/components/ui/feedback/alert/alert.css +16 -0
  102. package/package.json +6 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # @nxgt/material
2
2
 
3
+ ## 3.13.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1534](https://github.com/softistx/nxgt-material/pull/1534) [`3375ebb`](https://github.com/softistx/nxgt-material/commit/3375ebbd0b4b2d2d32ddd5379be326b8ca136d0b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fix the app header page title missing its `title` when a web font widens it after mount (it is re-measured when fonts finish loading), and read a `flag` filter alias at `0` (`?archived=0`) as off instead of an active condition; `f=archived:is:0` still filters on "No". Behaviour change: a link `?archived=0` used to filter on "No" and now shows every row; rewrite it as `f=archived:is:0` (the serializer already writes that form).
8
+ - Updated dependencies [[`3375ebb`](https://github.com/softistx/nxgt-material/commit/3375ebbd0b4b2d2d32ddd5379be326b8ca136d0b)]:
9
+ - @nxgt/material-core@0.30.1
10
+
11
+ ## 3.13.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#1501](https://github.com/softistx/nxgt-material/pull/1501) [`b08f9f7`](https://github.com/softistx/nxgt-material/commit/b08f9f732757126a42bea5e6f6d0e5f2f3e3f386) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Display and form polish: `Alert` shows its tone icon, `Avatar` initials scale, a `StatCardGroup`, `FormSection variant="heading"`, and `Alert` / `Banner` span the row in form grids.
16
+
17
+ - **Visual change: `Alert` shows its tone's icon by default** (the same icons as `Banner`, now one shared map). `icon={null}` (or `false`) opts out, and an explicit `icon` still wins. An `Alert` rendered without `icon` (also the ones inside `AuthCard` notices and `RecoveryCodes`) now gains an icon; search for `<Alert` without `icon=` and add `icon={null}` to keep the old look.
18
+ - `Avatar` ([#1492](https://github.com/softistx/nxgt-material/issues/1492)): the initials are 40 % of the avatar's diameter (never under 10 px) at every size, round and shaped, with the tone's AA colours unchanged. `--avatar-text-share` changes the share.
19
+ - `StatCardGroup` ([#1493](https://github.com/softistx/nxgt-material/issues/1493)), new: wrap `StatCard size="sm"` tiles for an even layout, 2×2 while the group is narrower than 28 rem, one row of hugging tiles beyond. `EntityHeader`'s `stats` use it. New type `StatCardGroupProps`.
20
+ - `FormSection` takes `variant` ([#1495](https://github.com/softistx/nxgt-material/issues/1495)): `'label'` (default, unchanged) or `'heading'`, which draws the title as `title-md` emphasized and the description as `body-md`, muted.
21
+ - `Alert` and `Banner` placed directly in `.form-grid-layout`'s `[data-slot="form-fields"]` or a `FormSection`'s fields span the whole row ([#1497](https://github.com/softistx/nxgt-material/issues/1497)), with no `col-span-full w-full` from the app; a utility class of the app still wins.
22
+
23
+ - [#1503](https://github.com/softistx/nxgt-material/pull/1503) [`2b14b95`](https://github.com/softistx/nxgt-material/commit/2b14b950e5461cccab09cf35505c2d3e09360176) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Print and draw gaps of the 3.13 effort: embedded fonts, an outline, tabular figures, a drawing `description` and a quiet band for the icons background. Nothing breaks: every addition is opt-in, and a document or a drawing that uses none renders as before.
24
+
25
+ - **PDF: embed a font** ([#1469](https://github.com/softistx/nxgt-material/issues/1469)). `registerPdfFont({ family, regular, bold?, italic?, boldItalic? })` (from `@nxgt/material/print`, `@nxgt/material-core/pdf/render`) registers a static font family and returns its name for `theme: { fonts: { sans } }`; the file embeds the glyphs it uses. `PrintDocument` takes `theme`, and the document model and `PrintDocument` take `conformance` (`'PDF/A-2b'`, …), the archive marker. The library bundles no font: the package sizes do not change. A variable font has one weight in a PDF; give static files.
26
+ - **PDF: what is tagged** ([#1468](https://github.com/softistx/nxgt-material/issues/1468)). `@react-pdf/renderer` 4.9 writes no structure tree, so a PDF made here is **not a tagged PDF** and claims no PDF/UA. What is written, and now documented: the language, the title shown as the window title, the reading order, and, new, `outline: true` on a document model: the bookmarks panel, one entry per heading (a level 2 under the level 1 before it). The `image` node has no `alt`: an untagged file has nowhere to write it.
27
+ - **PDF and print: tabular figures** ([#1470](https://github.com/softistx/nxgt-material/issues/1470)). A table column takes `numeric` (tabular digits, flush right); the amount, number and percent columns of `dataTable` and `PrintDataTable` are `numeric` unless `numeric: false`, which drops the tabular digits only (an amount column stays flush right, `align` moves it), `totals` and `metric` values print tabular, and a style takes `tabularNums`. It uses the OpenType `tnum` feature of an embedded font such as Inter; the standard fonts' digits are fixed-width already, so their output is the same. `PrintColumn` takes `numeric`. On screen, a `DataTable` column takes `meta: { numeric: true }` (`text-end tabular-nums` on its header and cells); `DataGrid` cells were `tabular-nums` already.
28
+ - **Drawing: a long description** ([#1471](https://github.com/softistx/nxgt-material/issues/1471)). `Drawing` takes `description` beside `title`, written as a `<desc>` the root names in `aria-describedby` (role `img`, `aria-label`, `<desc>`). It is for a titled drawing: the `Drawing` type refuses it on a `decorative` one. `toSVG` takes it too (see its own entry). `MorphDrawing` takes it too.
29
+ - **Background icons: a quiet band** ([#1488](https://github.com/softistx/nxgt-material/issues/1488)). `iconMotif.quiet` is `'start'`, `'end'` or `'center'`: the icons fade out over a band (a CSS mask, `--background-quiet` wide, 42% by default), so a greeting can sit on the motif with AA contrast. `start` and `end` follow the reading direction. The scene's icons do not change; a theme's `iconMotif` takes it. New type `IconQuiet`.
30
+
31
+ `@nxgt/material-vue` is frozen and gets none of the React additions: its `Drawing`, `DataTable` and `Background` have no `description`, `meta.numeric` or `quiet`, and its `/pdf` entry does not re-export `registerPdfFont`; a document model it renders with the shared core already honours `outline`, `conformance`, `numeric` and `tabularNums`.
32
+
33
+ - [#1508](https://github.com/softistx/nxgt-material/pull/1508) [`52b63fc`](https://github.com/softistx/nxgt-material/commit/52b63fc713b8f9bfeb04ff805b6e7e8a29158d1d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `toSVG` takes a `description`, like `Drawing` and `MorphDrawing`. `toSVG(scene, { title, description })` writes a `<desc id="<idPrefix>-desc">` (the text escaped) as the root's first child and names it in the root's `aria-describedby`, so an exported file or an e-mail is read name, role, then description. It needs a `title` and throws without one, which also refuses it on a `decorative` drawing; the types refuse both (`title` or `decorative`, as `Drawing`'s). The default id prefix hashes the description too. Without `description` the output is byte for byte what it was. The `toSVG` size budget rises from 7168 to 7232 bytes gzipped (the option costs about 60 B).
34
+
35
+ - [#1502](https://github.com/softistx/nxgt-material/pull/1502) [`a316d2e`](https://github.com/softistx/nxgt-material/commit/a316d2e1049745af03ef416286725fc29c605848) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Layout rows: `EntityHeader`, `ListDetailsLayout` and `ListTile` close four gaps. Refs [#1489](https://github.com/softistx/nxgt-material/issues/1489), [#1490](https://github.com/softistx/nxgt-material/issues/1490), [#1491](https://github.com/softistx/nxgt-material/issues/1491), [#1496](https://github.com/softistx/nxgt-material/issues/1496).
36
+
37
+ - `EntityHeader` takes `headingLevel` (`1 | 2 | 3`, default `1`) so a page that already has its `h1` keeps an outline in order ([#1489](https://github.com/softistx/nxgt-material/issues/1489)).
38
+ - `ListDetailsLayout.Details` takes `back`: on a phone, a bar with a labelled "Back to the list" button (`ListDetailsLayout.Back`, translated under `material['list-details'].back`), and the layout moves the focus to the details, then back to the row that opened them. `ListDetailsLayout` fills its box (`flex-1 min-h-0`, no `h-dvh`) and takes `breakpoint="container"` to follow its own width instead of the window's. The breakpoint and the first render are unchanged ([#1490](https://github.com/softistx/nxgt-material/issues/1490)).
39
+ - A `ListTile` link with `selected` is `aria-current="page"` and drawn selected, and a caller's own `aria-current` wins, for list-detail navigation by URL ([#1491](https://github.com/softistx/nxgt-material/issues/1491)).
40
+ - `ListTile` takes `toggle`, a switch row: the tile is a label for a Switch, the whole row toggles it, the title names it and the subtitle describes it, `disabled` disables it, and `href`, `onClick`, `actions`, `chevron` and `linkComponent` are refused beside `toggle` by type ([#1496](https://github.com/softistx/nxgt-material/issues/1496)).
41
+
42
+ ### Patch Changes
43
+
44
+ - [#1509](https://github.com/softistx/nxgt-material/pull/1509) [`fb6596e`](https://github.com/softistx/nxgt-material/commit/fb6596ed54c89c3f76db9b619978ef81a3ebd940) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The `Guides/Recipes` stories use the 3.13 additions: the list and detail recipe drops `h-dvh` and the hand-made back trigger for `Details back`, the settings rows use `ListTile toggle`, the stat tiles sit in a `StatCardGroup`, the gradebook scores are `numeric` columns, and the form recipe's `Alert` takes the tone icon and spans the grid row on its own. Stories only; no change to the library.
45
+ - Updated dependencies [[`2b14b95`](https://github.com/softistx/nxgt-material/commit/2b14b950e5461cccab09cf35505c2d3e09360176), [`52b63fc`](https://github.com/softistx/nxgt-material/commit/52b63fc713b8f9bfeb04ff805b6e7e8a29158d1d)]:
46
+ - @nxgt/material-core@0.30.0
47
+
3
48
  ## 3.12.1
4
49
 
5
50
  ### Patch Changes
package/README.md CHANGED
@@ -191,10 +191,10 @@ reads `duotone.svg`, the file that exists (it used to ask for the missing
191
191
  | --- | --- |
192
192
  | `@nxgt/material` | Everything below in one barrel, plus the compiled `style` condition (`dist/material.css`, for apps without Tailwind) |
193
193
  | `@nxgt/material/components` | UI components, `*FormField` wrappers and `useCodeResolver` ([Components](#components)) |
194
- | `@nxgt/material/print` | PDF documents over `@react-pdf/renderer`: the `PrintDocument` page shell, the print blocks, `PrintDrawing` and the `drawing(scene)` node (a vector drawing from `@nxgt/material-core/draw` printed as vectors), and `PrintDataTable`, `PrintKeyValue` and `PrintMetric` from column definitions and plain rows; documents as plain data (`pdfDocument` and its builders); `downloadPdf`, `openPdf`, `usePdfFile` and `pdfResponse` to get the file in one call — **its own entry, and not in the barrel above** ([printing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/printing.md)) |
194
+ | `@nxgt/material/print` | PDF documents over `@react-pdf/renderer`: the `PrintDocument` page shell, the print blocks, `PrintDrawing` and the `drawing(scene)` node (a vector drawing from `@nxgt/material-core/draw` printed as vectors), and `PrintDataTable`, `PrintKeyValue` and `PrintMetric` from column definitions and plain rows; documents as plain data (`pdfDocument` and its builders, with `outline` and `conformance`); `registerPdfFont` (with the `PdfFontFaces` type) to embed a font, and the `PdfConformance` type for the PDF/A marker; a `numeric` column and `tabularNums` for figures that line up; `downloadPdf`, `openPdf`, `usePdfFile` and `pdfResponse` to get the file in one call — **its own entry, and not in the barrel above** ([printing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/printing.md)) |
195
195
  | `@nxgt/material/pdf-reader` | `PdfReader`, the redesigned PDF reader (header, floating page pill, rail and panel; `embedded`, `dialog`, `page` and `fullscreen` modes; single page and two-page layouts; `look="expressive"` by default, `"classic"` to opt out, type `PdfReaderLook`) and `configurePdfReader` for pdf.js's worker and assets. **Its own entry, browser-only** (pdf.js loads on first render); also exported as `PdfReader` from `/components` since 3.0 ([guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/pdf-reader.md)) |
196
196
  | `@nxgt/material/charts` | Native SVG charts (d3-scale and d3-shape for the maths only) with keyboard point navigation, a screen-reader summary, a "View data" table and `patterns`: `LineChart` and `AreaChart` (`LineChartProps`, `AreaChartProps`, `ChartCurve`), `BarChart` (`BarChartProps`, `BarLayout`, `BarOrientation`), `PieChart` (`PieChartProps`), `DonutChart` (`DonutChartProps`), `Gauge` (`GaugeProps`, `GaugeSize`), `RadialBarChart` (`RadialBarChartProps`), `FunnelChart` (`FunnelChartProps`), `HeatmapChart` (`HeatmapChartProps`, `HeatColumn`), `RadarChart` (`RadarChartProps`), `ScatterChart` (`ScatterChartProps`, `ScatterSeries`, `ScatterPoint`), `ComboChart` (`ComboChartProps`, `ComboSeries`: bars, areas and lines, each on a left or a right axis), `zoom` (a mini overview with a window and two slider handles that picks the rows shown; `range`, `defaultRange`, `onRangeChange`) and `scroll` (a dense plot scrolls sideways on a phone, the value axis pinned) on the line, area, bar and combo charts (`ChartRangeProps`, `ChartZoomOptions`, `ChartScrollOptions`, `ChartRange`), `onPointClick` on every chart but `Gauge`, `palette` (`'soft'`: the soft palette, or `data-chart-palette="soft"` on an ancestor; `ChartPalette`) on every chart, and the shared types (`ChartSlice`, `ChartRow`, `ChartValue`, `ChartColor`, `ChartShape`, `ChartSeries`, `ChartAxis`, `ChartXAxis`, `ChartPoint`, `ChartBaseProps`). `categoryLabel` names the "View data" table's category column: on Line, Area, Bar and Combo it defaults to the x axis label, on Radar and Heatmap it is always "Category" unless set. **Its own entry, client-only** (import it from a `'use client'` file), not in the barrel above; replaces the Nivo charts (removed in 3.0) of `/components` ([guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/charts.md)) |
197
- | `@nxgt/material/draw` | Vector drawing: a scene of plain data or JSX primitives drawn as accessible, themeable SVG that is safe under a strict CSP and identical on the server and in the browser. `Drawing` (`DrawingProps`, `NodeHandlers`; `scene` or `w`/`h` with children; a `title` or `decorative`, enforced by the type), the primitives `Rect`, `Ellipse`, `Circle`, `Line`, `Polygon`, `Path` (takes `node`), `Text`, `Group` and `Image`, and the builders of `@nxgt/material-core/draw` re-exported by name (`scene`, `rect`, `ellipse`, `circle`, `line`, `polygon`, `path`, `text`, `group`, `image`, `linear`, `radial`, `pattern`, `hatch`, `tone`, `toSVG`, `compileScene`, `ROLES`, `DRAW_PALETTE`, and the types `Scene`, `DrawNode`, `Paint`, `Role`, `ToneRef`), plus Material 3 Expressive's shapes (`shape`, `morph`, `SHAPE_NAMES`, `toCubics`) and the layout helpers (`bbox`, `stack`, `grid`, `align`, `distribute`) re-exported by name. Colours are theme roles (`primary-container`, `on-surface`...) mapped to classes in `styles.css`, so import it. Interactive nodes are focusable `button`s with a focus ring; wrapped text is re-measured by the browser once mounted. **Its own entry, client-only** (render `Drawing` from a `'use client'` file; the builders and `toSVG` run anywhere), not in the barrel above ([drawing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/drawing.md)) |
197
+ | `@nxgt/material/draw` | Vector drawing: a scene of plain data or JSX primitives drawn as accessible, themeable SVG that is safe under a strict CSP and identical on the server and in the browser. `Drawing` (`DrawingProps`, `NodeHandlers`; `scene` or `w`/`h` with children; a `title` (with an optional long `description`, written as a `<desc>`) or `decorative`, enforced by the type), the primitives `Rect`, `Ellipse`, `Circle`, `Line`, `Polygon`, `Path` (takes `node`), `Text`, `Group` and `Image`, and the builders of `@nxgt/material-core/draw` re-exported by name (`scene`, `rect`, `ellipse`, `circle`, `line`, `polygon`, `path`, `text`, `group`, `image`, `linear`, `radial`, `pattern`, `hatch`, `tone`, `toSVG`, `compileScene`, `ROLES`, `DRAW_PALETTE`, and the types `Scene`, `DrawNode`, `Paint`, `Role`, `ToneRef`), plus Material 3 Expressive's shapes (`shape`, `morph`, `SHAPE_NAMES`, `toCubics`) and the layout helpers (`bbox`, `stack`, `grid`, `align`, `distribute`) re-exported by name. Colours are theme roles (`primary-container`, `on-surface`...) mapped to classes in `styles.css`, so import it. Interactive nodes are focusable `button`s with a focus ring; wrapped text is re-measured by the browser once mounted. **Its own entry, client-only** (render `Drawing` from a `'use client'` file; the builders and `toSVG` run anywhere), not in the barrel above ([drawing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/drawing.md)) |
198
198
  | `@nxgt/material/draw/sketch` | The sketchy, hand-drawn style for a drawing: `Sketch` (`seed`, `roughness`, `bowing`, `fill`: `hachure`, `cross-hatch`, `solid` or `none`, `hachureAngle`, `hachureGap`, `strokeWidth`) wraps a `Drawing`, or primitives inside one, and draws shapes as double wobbling strokes with hatched fills; `sketch(sceneOrNode, options)` does it to plain data for `toSVG`. Seeded, so the server and the client draw the same lines; ids, labels, focus rings and events keep working. **Its own entry, client-only** (render `Sketch` from a `'use client'` file), not in the barrel above ([drawing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/drawing.md#sketch)) |
199
199
  | `@nxgt/material/map` | Leaflet maps, markers, a location field — **its own entry, not in the barrel, and browser-only** ([maps guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/maps.md)) |
200
200
  | `@nxgt/material/themes` | `NxgtThemeProvider` (the registry, the persisted theme name, `<html data-nxgt-theme>`, `defaultMode`; renders no element; `useTheme({ defaultMode })` takes the first-visit mode too), `NxgtTheme` (a zone in another theme, `mode`, `asChild`), `useThemeContext`, `defineTheme`, `ThemeDefinitionError`, `themeBootScript` and `THEME_BOOT_SCRIPT` (with `ThemeBootOptions`), the 14 presets and `THEME_PRESETS`, `ThemeName` and `NxgtThemes` (augmentable), with the `NxgtThemeProps`, `NxgtThemeProviderProps`, `ThemeContextValue`, `Theme`, `ThemeDefinition` and `ThemeBackground` types ([guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/theming.md#the-provider-and-zones)). `Background` and `ActivityLayout` take their background from the nearest theme |
@@ -202,7 +202,7 @@ reads `duotone.svg`, the file that exists (it used to ask for the missing
202
202
  | `@nxgt/material/illustrations` | State illustrations: `Illustration` (`scene`: `empty`, `no-results`, `not-found`, `error`, `offline`, `success`, `welcome`, `forbidden`, `maintenance`, `invitation`, `sign-in`, `empty-inbox`, or an id of the `scenes` table it is given; `size`, `title`, `animated`, `hero`, `satellites`, `iconStyle`, `tone`, `duotone`) draws a hero icon on a Material 3 Expressive plate with satellites, from the Font Awesome sprites your app serves (no icon artwork ships); `IllustrationDefaults` (`icons`: `'suggested'` or a table, `iconStyle`, `sets`) opts a subtree's `EmptyState` and `ErrorState` into them; `ILLUSTRATION_SCENES`, `SUGGESTED_ICONS` and the types re-exported from `@nxgt/material-core/illustrations` (`SceneRow`, `SceneTable`), plus `IconStyleInput` and `IconStyleRef` (the `iconStyle` types: `{ family?, type? }` or one of the 37 sprite file names), `SceneId`, `RegisteredScene` and `IllustrationSceneRegistry`, the scene id type that an imported set's ids widen. `unauthorized` and `maintenance` states draw the `forbidden` and `maintenance` scenes. `EmptyState`, `ErrorState` and the `DataTable` empty row (`emptyIllustration`) also take `illustration` as a scene id or `true`. Colours are theme tones in `styles.css`; its own entry ([illustrations guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/illustrations.md)) |
203
203
  | `@nxgt/material/illustrations/health` | The health scenes: `HEALTH_SCENES` (`patient-record`, `consultation`, `appointment`, `lab-sample`, `prescription`, `vaccination`, `hospitalisation`, `emergency`, `no-patients`, `lab-results`), `HEALTH_SCENE_IDS`, `HEALTH_SUGGESTED_ICONS`, `HealthScene`; register it with `<IllustrationDefaults sets={[HEALTH_SCENES]}>` so `<Illustration scene="patient-record" />` and `<EmptyState illustration="no-patients" />` work (or pass `scenes={HEALTH_SCENES}` to one `Illustration`); importing it adds the ids to `SceneId`. An app that does not import it does not carry it |
204
204
  | `@nxgt/material/illustrations/education` | The education scenes: `EDUCATION_SCENES` (`classroom`, `homework`, `exam-grades`, `timetable`, `attendance`, `enrolment`, `library`, `graduation`, `no-students`, `report-card`), `EDUCATION_SCENE_IDS`, `EDUCATION_SUGGESTED_ICONS`, `EducationScene`; register it with `<IllustrationDefaults sets={[EDUCATION_SCENES]}>` so `<Illustration scene="classroom" />` and `<EmptyState illustration="no-students" />` work (or pass `scenes={EDUCATION_SCENES}` to one `Illustration`); importing it adds the ids to `SceneId`. An app that does not import it does not carry it |
205
- | `@nxgt/material/backgrounds` | Background presets: `Background` (a superset of the `/components` one: `preset`, `animated`, `grain`, `seed`, `fill`, `motif`, and for `preset="icons"` `icons`, `iconStyle` and `iconMotif`), `AVAILABLE_BACKGROUND_PRESETS` and `AvailableBackgroundPreset` (the 50 ids `Background` draws), `MoonOptions` (the `moon` prop), `IconMotifOptions` (`iconMotif`), `IconLayout`, `SkyPreset` and `CelestialPreset` (the `sky` ids), `IconsInput` (`icons`), `IconStyleInput` and `IconStyleRef` (`iconStyle`: `{ family?, type? }` or one of the 37 sprite file names, completed by the editor, any other string is a type error), `sky` (`'moon'` or a celestial preset over any preset, also read from the theme's `background.sky`; the four celestial presets and `sky` share the opt-in `@nxgt/material/backgrounds/celestial.css`, also in `backgrounds.css`), `MOTIF_SHAPES_ALL` (the 22 motif shapes), the types and tables (`BACKGROUND_PRESETS`, `BACKGROUND_TONES`, ...) re-exported from `@nxgt/material-core/backgrounds`; its own entry, with an opt-in stylesheet ([backgrounds guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/backgrounds.md)) |
205
+ | `@nxgt/material/backgrounds` | Background presets: `Background` (a superset of the `/components` one: `preset`, `animated`, `grain`, `seed`, `fill`, `motif`, and for `preset="icons"` `icons`, `iconStyle` and `iconMotif`), `AVAILABLE_BACKGROUND_PRESETS` and `AvailableBackgroundPreset` (the 50 ids `Background` draws), `MoonOptions` (the `moon` prop), `IconMotifOptions` (`iconMotif`, with `quiet`: a band the icons fade out of for text), `IconLayout`, `IconQuiet`, `SkyPreset` and `CelestialPreset` (the `sky` ids), `IconsInput` (`icons`), `IconStyleInput` and `IconStyleRef` (`iconStyle`: `{ family?, type? }` or one of the 37 sprite file names, completed by the editor, any other string is a type error), `sky` (`'moon'` or a celestial preset over any preset, also read from the theme's `background.sky`; the four celestial presets and `sky` share the opt-in `@nxgt/material/backgrounds/celestial.css`, also in `backgrounds.css`), `MOTIF_SHAPES_ALL` (the 22 motif shapes), the types and tables (`BACKGROUND_PRESETS`, `BACKGROUND_TONES`, ...) re-exported from `@nxgt/material-core/backgrounds`; its own entry, with an opt-in stylesheet ([backgrounds guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/backgrounds.md)) |
206
206
  | `@nxgt/material/editor` | The rich text editor: `DocumentEditor` and `DocumentEditorFormField` (with an `outline`, a block handle, focus mode, find and replace, `onUpload`, `onAssist` and `comments`), `CompactEditor` and `CompactEditorFormField`, `RichChatComposer`, `EditorRoot` and the parts (`EditorToolbar`, `EditorContent`, `EditorFooter`, `EditorAssistantPanel`, ...), `useEditor`, the kits (`documentKit`, `compactKit`, `chatKit`, `formNodesKit`), `withFeatures` / `withoutFeatures` and `defineFeature`, and the converters `toHtml`, `toJson`, `toMarkdown`, `fromMarkdown` and `looksLikeMarkdown` — **its own entry, and not in the barrel above**. **Client-only**: import it from a `'use client'` file; `/editor/viewer` is the server-safe one. The `.nxgt-prose` page styles ship in `styles.css` with the component CSS ([DocumentEditor](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#documenteditor)) |
207
207
  | `@nxgt/material/editor/viewer` | `RichTextViewer`: shows a saved document (HTML, JSON or Markdown) read-only, **server-safe**, with no editor instance and no `'use client'` ([RichTextViewer](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#richtextviewer)) |
208
208
  | `@nxgt/material/code-editor` | `CodeEditor`, `CodeEditorFormField` and `CodeDiff` on Monaco, their theme presets (`theme`: `'app'`, `'moonlight'`, `'soft'`, `CODE_THEMES`), `defineCodeTheme` for your own, the `CodeMarker` and `CodeMarkerSeverity` types of the `markers` prop, `CodeEditorHandle` (its `ref`), `CodeFile` (its `files`), and `configureMonaco` to bundle Monaco instead of loading it from the CDN. **Client-only**: import it from a `'use client'` file. They are no longer exported from the barrels (removed in 3.0; [guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/code-editor.md)) |
@@ -222,7 +222,7 @@ reads `duotone.svg`, the file that exists (it used to ask for the missing
222
222
  | `@nxgt/material/styles.css` | source Tailwind v4 tokens. **This** is the file the app imports |
223
223
  | `@nxgt/material/map.css` | leaflet's stylesheet, for the apps that use `./map`. Not part of `styles.css` |
224
224
  | `@nxgt/material/galleries.css` | the Gallery's shaped tiles (`shape`, `preset="shaped"`): `clip-path: shape()` for twelve shapes, about 9 KB gzipped. Opt-in, not part of `styles.css`; without it a shaped tile keeps a rounded corner |
225
- | `@nxgt/material/backgrounds.css` | every background preset's CSS, for the apps that use `./backgrounds`; `@nxgt/material/backgrounds/<preset>.css` loads one (`icons.css` for `preset="icons"`, `celestial.css` for the sky) (the illustrated scenes share `backgrounds/illustrated.css`). Not part of `styles.css` |
225
+ | `@nxgt/material/backgrounds.css` | every background preset's CSS, for the apps that use `./backgrounds`; `@nxgt/material/backgrounds/<preset>.css` loads one (`icons.css` for `preset="icons"`, which pulls in `icons-quiet.css` for `iconMotif.quiet`, also importable alone; `celestial.css` for the sky) (the illustrated scenes share `backgrounds/illustrated.css`). Not part of `styles.css` |
226
226
  | `@nxgt/material/theme-picker.css` | the tiles of `ThemePicker` (the mini backgrounds included), for the apps that use `@nxgt/material/theme-picker`. Import it after `styles.css`. Not part of `styles.css` |
227
227
  | `@nxgt/material/themes/<name>.css` | one shipped theme (`lavande`, `ocean`, `foret`, `ambre`, `ardoise`, `corail`, `menthe`, `prune`, `sable`, `slate`, `pink`, `bleumono`, `bluemoon`, `teal`) under `[data-nxgt-theme="<name>"]`, on `<html>` or on a zone. Import it after `styles.css`. Not part of `styles.css`: the default Lavande stays in `:root` ([guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/theming.md#themes)) |
228
228
 
@@ -356,7 +356,9 @@ metadata, a header and footer on every page, translated page numbers, a
356
356
  watermark. Its `language` is a prop, because the PDF renders outside your
357
357
  `I18nProvider`. `openPdf` opens a new tab, `usePdfFile` keeps a preview
358
358
  current, and a document can also be plain data built with `pdfDocument`
359
- (experimental). More: [Printing](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/printing.md#rendering-the-document).
359
+ (experimental). The PDFs are untagged (the renderer writes no structure tree):
360
+ they carry the language, the title and, with `outline`, the bookmarks, and
361
+ `registerPdfFont` embeds a font instead of the viewer's Helvetica. More: [Printing](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/printing.md#rendering-the-document).
360
362
 
361
363
  In Next.js, a route handler that calls `pdfResponse` needs its
362
364
  `next.config.ts` wrapped:
@@ -522,7 +524,7 @@ Not components: what the stylesheet gives any element.
522
524
  | Preview | Component | What it does | @nxgt/material-vue |
523
525
  | --- | --- | --- | --- |
524
526
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-field.webp" width="120" alt="Field"> | [`Field`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#field) · `FormField` | Renders the field matching a config `type` (text, select, date, upload, otp…). | `Field` |
525
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-formsection.webp" width="120" alt="FormSection"> | [`FormSection`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#formsection) | A titled section of a form (an `h2` by default) with an optional description and actions, its fields in the form grid's columns, one column on a phone. | `FormSection` |
527
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-formsection.webp" width="120" alt="FormSection"> | [`FormSection`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#formsection) | A titled section of a form (an `h2` by default) with an optional description and actions (`variant="heading"` puts the title on the type scale), its fields in the form grid's columns, one column on a phone. | `FormSection` |
526
528
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-repeatablegroup.webp" width="120" alt="RepeatableGroup"> | [`RepeatableGroup`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#repeatablegroup) · `RepeatableGroupFormField` | Rows of fields a user adds, removes and reorders (`useFieldArray`), a list for assistive tech, focus that follows each change, one column on a phone. | `RepeatableGroup`, `RepeatableGroupFormField` |
527
529
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-textfield.webp" width="120" alt="TextField"> | [`TextField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#textfield) · `TextFormField` | Labelled input with leading / trailing adornments and helper text. | `TextField`, `TextFormField` |
528
530
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-textareafield.webp" width="120" alt="TextareaField"> | [`TextareaField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#textareafield) · `TextareaFormField` | Labelled textarea with row sizing and a `maxLength` counter. | `TextareaField`, `TextareaFormField` |
@@ -590,7 +592,7 @@ Not components: what the stylesheet gives any element.
590
592
 
591
593
  | Preview | Component | What it does | @nxgt/material-vue |
592
594
  | --- | --- | --- | --- |
593
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-avatar.webp" width="120" alt="Avatar"> | [`Avatar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#avatar), `AvatarImage`, `AvatarFallback`, `AvatarBase` | Image with a fallback and an optional online / offline dot; `shape` clips it to an expressive shape; `tone` colours the fallback. | `Avatar`, `AvatarImage`, `AvatarFallback` |
595
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-avatar.webp" width="120" alt="Avatar"> | [`Avatar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#avatar), `AvatarImage`, `AvatarFallback`, `AvatarBase` | Image with a fallback and an optional online / offline dot; `shape` clips it to an expressive shape; the initials scale with the size (40 % of the diameter); `tone` colours the fallback. | `Avatar`, `AvatarImage`, `AvatarFallback` |
594
596
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-avatargroup.webp" width="120" alt="AvatarGroup"> | [`AvatarGroup`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#avatargroup) | Overlapping avatars with a `+N` overflow. | `AvatarGroup` |
595
597
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-shape.webp" width="120" alt="Shape"> | [`Shape`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#shape) | Material 3 Expressive's 35 shapes and a squircle as a backdrop, an icon container or a mask for a photo, with a morph; eight tones or an app tone. | — |
596
598
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-badge.webp" width="120" alt="Badge"> | [`Badge`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#badge) | Status pill, 20 px: default, secondary, error, success, info, warning, `soft` (tonal, for states), outlined. | `Badge` |
@@ -598,14 +600,14 @@ Not components: what the stylesheet gives any element.
598
600
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-dayseparator.webp" width="120" alt="DaySeparator"> | [`DaySeparator`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#dayseparator), `isNewDay`, `formatDayLabel` | "Today", "Yesterday", the weekday or the date between two hairlines, in the provider's language; sticky if asked. | — |
599
601
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-periodcards.webp" width="120" alt="PeriodCards"> | [`PeriodCards`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#periodcards) | Consecutive date ranges (terms, sprints) as cards: a "Current" marker with `aria-current`, a link over each card, as many 14rem columns as fit (one on a phone). | — |
600
602
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-chip.webp" width="120" alt="Chip"> | [`Chip`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#chip) | Compact pill in three looks (hairline, soft, tag) and a dashed add pill, with leading, avatar and trailing slots, a selected state and a dismiss button; a coloured soft chip reads as a status (the tone's container, its text colour on it). | `Chip` |
601
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-statcard.webp" width="120" alt="StatCard"> | [`StatCard`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#statcard) | KPI tile with value, hint, icon, toned delta and a loading skeleton; `tone` and `variant` (`outlined`, `tonal`, `filled`) colour it, `valueSize` enlarges the value, `size="sm"` makes a compact tile (it ignores `hint`, `delta` and `valueSize`). | `StatCard` |
603
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-statcard.webp" width="120" alt="StatCard"> | [`StatCard`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#statcard) | KPI tile with value, hint, icon, toned delta and a loading skeleton; `tone` and `variant` (`outlined`, `tonal`, `filled`) colour it, `valueSize` enlarges the value, `size="sm"` makes a compact tile (it ignores `hint`, `delta` and `valueSize`); `StatCardGroup` lays compact tiles 2×2 on a phone and in a row beside. | `StatCard` |
602
604
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-metric-cards.webp" width="120" alt="TrendCard"> | [`TrendCard`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#metric-cards), `GoalCard`, `BreakdownCard`, `RankCard`, `CompareCard`, `HeatweekCard`, `FunnelCard`, `GaugeCard`, `SparkbarCard`, `DeltaListCard`, `BandCard`, `LatencyCard`, `RatioCard`, `ThresholdCard`, `PaceCard`, `HistogramCard`, `Sparkline` | Dashboard tiles including compare, heat, funnel, gauge, spark bars, delta list, range band, latency, ratio, threshold, pace and labelled histogram. Container queries. A `tone` (named, or your app's) draws the accent in it; deltas and breaches stay semantic. | `TrendCard`, `GoalCard`, `BreakdownCard`, `RankCard`, `CompareCard`, `HeatweekCard`, `FunnelCard`, `GaugeCard`, `SparkbarCard`, `DeltaListCard`, `BandCard`, `LatencyCard`, `RatioCard`, `ThresholdCard`, `PaceCard`, `HistogramCard` |
603
605
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-card-presets.webp" width="120" alt="FeatureCard"> | [`FeatureCard`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#card-presets), `MediaCard`, `PricingCard`, `ProfileCard`, `QuoteCard`, `OverlayCard`, `SpotlightCard`, `CrewCard`, `SplitCard`, `TicketCard`, `NoticeCard`, `TimelineCard`, `MessageCard`, `EventCard`, `StackCard`, `LinkCard`, `AlbumCard`, `TagCard`, `ReceiptCard`, `ReviewCard`, `OfferCard`, `PlaceCard`, `FileCard`, `StatusCard`, `ScoreCard`, `ShortcutCard`, `ChecklistCard` | Card presets including overlay, ticket, inbox, event, stack, link, album, tags, receipt, review, offer, place, file, status, score, shortcuts and checklist. Container queries. | `FeatureCard`, `MediaCard`, `PricingCard`, `ProfileCard`, `QuoteCard`, `OverlayCard`, `SpotlightCard`, `CrewCard`, `SplitCard`, `TicketCard`, `NoticeCard`, `TimelineCard`, `MessageCard`, `EventCard`, `StackCard`, `LinkCard`, `AlbumCard`, `TagCard`, `ReceiptCard`, `ReviewCard`, `OfferCard`, `PlaceCard`, `FileCard`, `StatusCard`, `ScoreCard`, `ShortcutCard`, `ChecklistCard` |
604
606
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-statusindicator.webp" width="120" alt="StatusIndicator"> | [`StatusIndicator`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#statusindicator) | Coloured status dot with an optional pulse and label. | `StatusIndicator` |
605
607
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-summarydata.webp" width="120" alt="SummaryData"> | [`SummaryData`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#summarydata) | Label / value pairs as a grid or inline; hides empty values. | `SummaryData` |
606
608
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-description.webp" width="120" alt="Description"> | [`Description`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#description) | Read-only label / value pair that renders nothing when empty. | `Description` |
607
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-entityheader.webp" width="120" alt="EntityHeader"> | [`EntityHeader`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#entityheader) | Page header with icon, title, status, metadata, `stats` (figures as compact `size="sm"` StatCard tiles) and actions. | `EntityHeader` |
608
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-listtile.webp" width="120" alt="ListTile"> | [`ListTile`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#listtile) | Row with leading / trailing slots, title and subtitle; becomes a link (with a decorative chevron) or button when interactive. `size="sm"` is the dense row. | `ListTile` |
609
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-entityheader.webp" width="120" alt="EntityHeader"> | [`EntityHeader`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#entityheader) | Page header with icon, title (`headingLevel` 1 to 3), status, metadata, `stats` (figures as compact `size="sm"` StatCard tiles, 2×2 on a phone) and actions. | `EntityHeader` |
610
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-listtile.webp" width="120" alt="ListTile"> | [`ListTile`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#listtile) | Row with leading / trailing slots, title and subtitle; becomes a link (with a decorative chevron; `selected` sets `aria-current="page"`), a button, or with `toggle` a switch row where the whole row toggles. `size="sm"` is the dense row. | `ListTile` |
609
611
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-accordioncard.webp" width="120" alt="AccordionCard"> | [`AccordionCard`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#accordioncard) | Renders `items` (title, content) as a styled accordion. | `AccordionCard` |
610
612
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-timeline.webp" width="120" alt="Timeline"> | [`Timeline`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#timeline), `TimelineItem`, `RelativeTime` | Vertical event timeline with toned icons and relative times. | `Timeline`, `TimelineItem`, `RelativeTime` |
611
613
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-display-eventchip.webp" width="120" alt="EventChip"> | [`EventChip`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#eventchip) | Calendar event pill — soft, solid or outlined — with its times, all-day and continuation edges. | `EventChip` |
@@ -647,7 +649,7 @@ Not components: what the stylesheet gives any element.
647
649
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-sidebar.webp" width="120" alt="Sidebar"> | [`Sidebar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#sidebar), `SidebarHeader`, `SidebarContent`, `SidebarFooter`, `SidebarMenuItem`, `SidebarMenuLabel` | Collapsible navigation sidebar with icons, tooltips and active items. | `Sidebar` (same parts) |
648
650
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-topappbar.webp" width="120" alt="TopAppBar"> | [`TopAppBar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#topappbar), `BottomAppBar` | Top bar surface, and a bottom bar of icon actions with an active state. | `TopAppBar`, `BottomAppBar` |
649
651
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-breadcrumb.webp" width="120" alt="Breadcrumb"> | [`Breadcrumb`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#breadcrumb), `BreadcrumbList`, `BreadcrumbItem`, `BreadcrumbLink`, `BreadcrumbPage`, `BreadcrumbSeparator`, `BreadcrumbEllipsis` | Breadcrumb primitives. | `Breadcrumb` (same parts) |
650
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-listdetailslayout.webp" width="120" alt="ListDetailsLayout"> | [`ListDetailsLayout`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#listdetailslayout), `PaneLayout`, `ThreadLayout` | List / details that collapses to one view on mobile, a side pane that becomes a sheet, and a centred column. | `ListDetailsLayout`, `PaneLayout`, `ThreadLayout` |
652
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-listdetailslayout.webp" width="120" alt="ListDetailsLayout"> | [`ListDetailsLayout`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#listdetailslayout), `PaneLayout`, `ThreadLayout` | List / details that collapses to one view on mobile (a `back` bar and focus moves on the details, `breakpoint="container"` to follow its own width), a side pane that becomes a sheet, and a centred column. | `ListDetailsLayout`, `PaneLayout`, `ThreadLayout` |
651
653
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-responsivegrid.webp" width="120" alt="ResponsiveGrid"> | [`ResponsiveGrid`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#responsivegrid) | Container-query grid that grows from 1 to 5 columns. | `ResponsiveGrid` |
652
654
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-resizable.webp" width="120" alt="ResizableGroup"> | [`ResizableGroup`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#resizablegroup), `ResizablePanel`, `ResizableSeparator` | Resizable panels with an optional grip handle. | `ResizablePanelGroup`, `ResizablePanel`, `ResizableHandle` |
653
655
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/navigation-layout-skiplink.webp" width="120" alt="SkipLink"> | [`SkipLink`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/navigation-and-layout.md#skiplink) | Skip-to-content control, visible on focus. `DocSkipLink` composes it with `#doc-content`. | `SkipLink` |
@@ -680,8 +682,8 @@ Not components: what the stylesheet gives any element.
680
682
 
681
683
  | Preview | Component | What it does | @nxgt/material-vue |
682
684
  | --- | --- | --- | --- |
683
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-alert.webp" width="120" alt="Alert"> | [`Alert`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#alert) | Callout with icon, title and description in seven tones. | `Alert` |
684
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-banner.webp" width="120" alt="Banner"> | [`Banner`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#banner) | Dismissible info / success / warning / error banner with an action, in the look of `Alert` (light surface, start bar). | `Banner` |
685
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-alert.webp" width="120" alt="Alert"> | [`Alert`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#alert) | Callout with the tone's icon (or yours, or none with `icon={null}`), title and description in seven tones; it spans the row in a form grid. | `Alert` |
686
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-banner.webp" width="120" alt="Banner"> | [`Banner`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#banner) | Dismissible info / success / warning / error banner with an action, in the look of `Alert` (light surface, start bar); it spans the row in a form grid. | `Banner` |
685
687
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-alertdialog.webp" width="120" alt="AlertDialog"> | [`AlertDialog`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#alertdialog), `AlertDialogContent`, `AlertDialogAction`, `AlertDialogCancel`… | Parts for a blocking confirmation dialog. | `AlertDialog` (same parts) |
686
688
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-confirmdialog.webp" width="120" alt="ConfirmDialog"> | [`ConfirmDialog`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#confirmdialog), `ConfirmationDialog`, `CustomAlertDialog` | Confirm / cancel dialog with async loading. `ConfirmationDialog` adds a trigger and an optional Zod form. | `ConfirmDialog`, `ConfirmationDialog`, `CustomAlertDialog` |
687
689
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/feedback-status-customdialog.webp" width="120" alt="CustomDialog"> | [`CustomDialog`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/feedback-and-status.md#customdialog) | Ready-made dialog with trigger, icon, title, body and footer. | `CustomDialog` |
@@ -1,5 +1,5 @@
1
- import { i as e, r as t, t as n } from "./stored-language-BeIKw3-K.js";
2
- import { r } from "./translator-Dje8HrNz.js";
1
+ import { i as e, r as t, t as n } from "./stored-language-BAAP7qS3.js";
2
+ import { r } from "./translator-BU07gNva.js";
3
3
  import { t as i } from "./_baseIsEqual-C6ksIHya.js";
4
4
  import { useMemo as a } from "react";
5
5
  import { asyncThunkCreator as o, buildCreateSlice as s } from "@reduxjs/toolkit";
@@ -145,7 +145,8 @@ var z = Object.keys({
145
145
  rotation: 1,
146
146
  duotone: 1,
147
147
  secondaryOpacity: 1,
148
- calm: 1
148
+ calm: 1,
149
+ quiet: 1
149
150
  });
150
151
  function B(e) {
151
152
  return JSON.stringify(Object.fromEntries(z.flatMap((t) => e?.[t] === void 0 ? [] : [[t, e[t]]])));
@@ -0,0 +1,43 @@
1
+ /* `iconMotif.quiet` of the `icons` preset (React only). */
2
+ @layer components {
3
+ /* `quiet`: the icons fade out over a band, so text can sit on the motif. The
4
+ * band is `--background-quiet` wide (42%), then the icons fade back in over
5
+ * 30%. `start` and `end` follow the reading direction. A mask, not a colour:
6
+ * the text underneath keeps the wash's own contrast. */
7
+ [data-background="icons"] > [data-scene] > :is(.ic-q-start, .ic-q-end) {
8
+ --nxgt-quiet-to: to right;
9
+ -webkit-mask-image: linear-gradient(
10
+ var(--nxgt-quiet-to),
11
+ transparent var(--background-quiet, 42%),
12
+ #000 calc(var(--background-quiet, 42%) + 30%)
13
+ );
14
+ mask-image: linear-gradient(
15
+ var(--nxgt-quiet-to),
16
+ transparent var(--background-quiet, 42%),
17
+ #000 calc(var(--background-quiet, 42%) + 30%)
18
+ );
19
+ }
20
+ [data-background="icons"] > [data-scene] > .ic-q-end,
21
+ [data-background="icons"] > [data-scene]:dir(rtl) > .ic-q-start {
22
+ --nxgt-quiet-to: to left;
23
+ }
24
+ [data-background="icons"] > [data-scene]:dir(rtl) > .ic-q-end {
25
+ --nxgt-quiet-to: to right;
26
+ }
27
+ [data-background="icons"] > [data-scene] > .ic-q-center {
28
+ -webkit-mask-image: linear-gradient(
29
+ to right,
30
+ #000 calc(50% - var(--background-quiet, 42%) / 2 - 30%),
31
+ transparent calc(50% - var(--background-quiet, 42%) / 2),
32
+ transparent calc(50% + var(--background-quiet, 42%) / 2),
33
+ #000 calc(50% + var(--background-quiet, 42%) / 2 + 30%)
34
+ );
35
+ mask-image: linear-gradient(
36
+ to right,
37
+ #000 calc(50% - var(--background-quiet, 42%) / 2 - 30%),
38
+ transparent calc(50% - var(--background-quiet, 42%) / 2),
39
+ transparent calc(50% + var(--background-quiet, 42%) / 2),
40
+ #000 calc(50% + var(--background-quiet, 42%) / 2 + 30%)
41
+ );
42
+ }
43
+ }
@@ -16,6 +16,8 @@
16
16
  * its place. React only: nothing in the shared `css/` folder. */
17
17
  @import "../css/motifs.css";
18
18
 
19
+ @import "./icons-quiet.css";
20
+
19
21
  @layer components {
20
22
  [data-background="icons"] > [data-layer="wash"] {
21
23
  position: absolute;
@@ -1,3 +1,3 @@
1
- import { r as e, t } from "./background-cEqcZQ3v.js";
1
+ import { r as e, t } from "./background-Ce7M5V42.js";
2
2
  import { BACKGROUND_INTENSITIES as n, BACKGROUND_PRESETS as r, BACKGROUND_TONES as i, MOTIF_SHAPES as a, MOTIF_SHAPES_ALL as o, SHIPPED_BACKGROUND_PRESETS as s } from "@nxgt/material-core/backgrounds";
3
3
  export { e as AVAILABLE_BACKGROUND_PRESETS, n as BACKGROUND_INTENSITIES, r as BACKGROUND_PRESETS, i as BACKGROUND_TONES, t as Background, a as MOTIF_SHAPES, o as MOTIF_SHAPES_ALL, s as SHIPPED_BACKGROUND_PRESETS };
@@ -2,7 +2,7 @@ import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { n as t, t as n } from "./dist-DVRQkaTK.js";
3
3
  import { o as r, t as i } from "./tooltip-CkttDIab.js";
4
4
  import { t as a } from "./is-production-GLw59WU8.js";
5
- import { t as o } from "./spinner-BtSIYVrC.js";
5
+ import { t as o } from "./spinner-BwWDXIbg.js";
6
6
  import { a as s, i as c, r as l, t as u } from "./button-tones-BwuVvAmd.js";
7
7
  import { t as d } from "./button-group-context-CaP0X5p_.js";
8
8
  import { t as f } from "./has-text-content-Ds2dkHX_.js";
package/dist/charts.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { t as e } from "./ui.utils-CAnKTCw5.js";
2
2
  import { t } from "./utils-BLfntITJ.js";
3
- import { t as n } from "./use-material-translation-B3V_bz-5.js";
4
- import { t as r } from "./button-BNjw-pnE.js";
3
+ import { t as n } from "./use-material-translation-DGeVp-qP.js";
4
+ import { t as r } from "./button-BrgyWw7T.js";
5
5
  import { t as i } from "./use-ssr-media-query-C6M5m8sf.js";
6
6
  import { i as a, n as o, r as s, t as c } from "./util-4heV2LPI.js";
7
7
  import { t as l } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
8
8
  import { t as u } from "./warn-once-C_e47JM8.js";
9
- import { t as d } from "./chip-DLgQTJBZ.js";
9
+ import { t as d } from "./chip-BZu-bvAJ.js";
10
10
  import { c as f, d as p, f as m, i as h, o as g, p as _, s as v, t as y } from "./line-path-C5pZGC49.js";
11
11
  import { t as b } from "./live-status-BGPaN8r8.js";
12
12
  import { t as x } from "./linear-G97mfnKF.js";
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./tooltip-CkttDIab.js";
3
- import { t as n } from "./use-material-translation-B3V_bz-5.js";
3
+ import { t as n } from "./use-material-translation-DGeVp-qP.js";
4
4
  import { a as r } from "./button-tones-BwuVvAmd.js";
5
5
  import { t as i } from "./react-node-text-Crkpfpco.js";
6
6
  import { Check as a, X as o } from "lucide-react";
@@ -1,12 +1,12 @@
1
1
  import { r as e } from "./rolldown-runtime-BFFgcFxR.js";
2
2
  import { t } from "./utils-BLfntITJ.js";
3
3
  import { a as n } from "./dist-lmHmz_bu.js";
4
- import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-BsH9W_3C.js";
4
+ import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-BEyP-A0J.js";
5
5
  import { a as c, i as l, n as u } from "./field-blur-context-Cft9s7Hg.js";
6
- import { a as d, d as f, r as p, t as m, u as h } from "./toolbar-items-rUHdVqAq.js";
6
+ import { a as d, d as f, r as p, t as m, u as h } from "./toolbar-items-CVQBYp4K.js";
7
7
  import { t as g } from "./is-production-GLw59WU8.js";
8
- import { t as _ } from "./use-material-translation-B3V_bz-5.js";
9
- import { i as v, n as y, o as b, t as x } from "./code-language-items-BT5BO5w6.js";
8
+ import { t as _ } from "./use-material-translation-DGeVp-qP.js";
9
+ import { i as v, n as y, o as b, t as x } from "./code-language-items-D1lpNQ6J.js";
10
10
  import { t as S } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
11
11
  import { n as C, t as w } from "./escape-owner-C4W_sOAU.js";
12
12
  import { t as T } from "./skeleton-DSdtr2qc.js";
@@ -1,14 +1,14 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { a as t } from "./dist-lmHmz_bu.js";
3
- import { d as n, r, t as i, u as a } from "./toolbar-items-rUHdVqAq.js";
4
- import { t as o } from "./use-material-translation-B3V_bz-5.js";
5
- import { i as s, n as c, o as l } from "./code-language-items-BT5BO5w6.js";
3
+ import { d as n, r, t as i, u as a } from "./toolbar-items-CVQBYp4K.js";
4
+ import { t as o } from "./use-material-translation-DGeVp-qP.js";
5
+ import { i as s, n as c, o as l } from "./code-language-items-D1lpNQ6J.js";
6
6
  import { r as u, t as d } from "./field-blur-CJHzVSh9.js";
7
7
  import { t as f } from "./skeleton-DSdtr2qc.js";
8
8
  import { t as p } from "./live-status-BGPaN8r8.js";
9
9
  import { t as m } from "./use-mobile-BDro060N.js";
10
10
  import { t as h } from "./react-node-text-Crkpfpco.js";
11
- import { a as g, c as _, d as v, f as y, i as b, l as x, m as S, o as C, p as w, r as T, s as E, t as D, u as O } from "./code-editor-BZbaYLvo.js";
11
+ import { a as g, c as _, d as v, f as y, i as b, l as x, m as S, o as C, p as w, r as T, s as E, t as D, u as O } from "./code-editor-DjY7_8TH.js";
12
12
  import { ChevronDown as k, ChevronUp as A, Columns2 as j } from "lucide-react";
13
13
  import { useEffect as M, useRef as N, useState as P } from "react";
14
14
  import { Fragment as F, jsx as I, jsxs as L } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- import { d as e, f as t } from "./dropdown-menu-BsH9W_3C.js";
2
- import { t as n } from "./use-material-translation-B3V_bz-5.js";
1
+ import { d as e, f as t } from "./dropdown-menu-BEyP-A0J.js";
2
+ import { t as n } from "./use-material-translation-DGeVp-qP.js";
3
3
  import { t as r } from "./live-status-BGPaN8r8.js";
4
4
  import { useEffect as i, useRef as a, useState as o } from "react";
5
5
  import { jsx as s } from "react/jsx-runtime";
@@ -135,6 +135,8 @@
135
135
  @import "./ui/display/period-cards/period-cards.css";
136
136
  @import "./ui/layout/sidebar/sidebar-tokens.css";
137
137
  @import "./ui/display/avatar/avatar.css";
138
+ /* Alert and Banner span the row in the form grids (#1497). */
139
+ @import "./ui/feedback/alert/alert.css";
138
140
  @import "./ui/display/stat-card/stat-card.css";
139
141
  /* The native charts (@nxgt/material/charts): held series colours, grid, marks;
140
142
  * then the frame, legend keys, tooltip (float and phone bottom card), table. */
@@ -10,3 +10,20 @@
10
10
  --nxgt-tone-ring-share-own: var(--avatar-ring-share);
11
11
  }
12
12
  }
13
+
14
+ /* The initials scale with the avatar (#1492): the avatar is a size container,
15
+ * and its fallback text is 40 % of the diameter (`cqw`), never under 10 px, so
16
+ * two letters keep clear of the edge at 32 px and the text grows with a
17
+ * larger avatar. The share is `--avatar-text-share` (a unitless percentage,
18
+ * 40 by default). The rule reads the avatar's own size, so it only applies to
19
+ * a fallback inside an `avatar` (a bare `AvatarFallback` keeps inheriting).
20
+ * Colours are the tone's, unchanged: the text stays AA on its container. */
21
+ @layer components {
22
+ [data-slot="avatar"] {
23
+ container-type: inline-size;
24
+ }
25
+ [data-slot="avatar"] [data-slot="avatar-fallback"] {
26
+ font-size: max(0.625rem, calc(var(--avatar-text-share, 40) * 1cqw));
27
+ line-height: 1;
28
+ }
29
+ }
@@ -0,0 +1,16 @@
1
+ /* An Alert or a Banner placed in a form's grid takes the whole row (#1497),
2
+ * like a FormSection: no `col-span-full w-full` from the app. Direct children
3
+ * of the form grid's `[data-slot="form-fields"]` (inside `.form-grid-layout`)
4
+ * or of a FormSection's `[data-slot="form-section-fields"]`, so an alert deeper
5
+ * in a field is untouched. In the components layer: a utility class of the
6
+ * app on the alert (`col-span-1`, `w-fit`) still wins. */
7
+ @layer components {
8
+ :is(
9
+ .form-grid-layout [data-slot="form-fields"],
10
+ [data-slot="form-section-fields"]
11
+ )
12
+ > :is([data-slot="alert"], [data-slot="banner"]) {
13
+ grid-column: 1 / -1;
14
+ width: 100%;
15
+ }
16
+ }