@nxgt/material 3.82.0 → 3.84.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 (107) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +4 -3
  3. package/dist/{alert-dialog-DXLJ4AZP.js → alert-dialog-1t6ULy5i.js} +1 -1
  4. package/dist/{async-slice-BfVokA46.js → async-slice-xyA9Uzct.js} +1 -1
  5. package/dist/{button-CSKUtMI3.js → button-DhiNGrdT.js} +1 -1
  6. package/dist/{calculator-Cv00UQgR.js → calculator-BcgxxScL.js} +10 -10
  7. package/dist/calculator-field.js +6 -6
  8. package/dist/{calculator-segment-CwnC2cV_.js → calculator-segment-C4WQAHcN.js} +1 -1
  9. package/dist/calculator.js +1 -1
  10. package/dist/charts.js +3 -3
  11. package/dist/{chip-BGn0V6Pt.js → chip-m0_usuzd.js} +2 -2
  12. package/dist/{code-editor-B25-mWhb.js → code-editor-BgKFrcld.js} +4 -4
  13. package/dist/code-editor.js +4 -4
  14. package/dist/{code-language-items-oRjtO3qV.js → code-language-items-BWw17W9s.js} +2 -2
  15. package/dist/components/theme-tokens.css +3 -3
  16. package/dist/components/ui/collections/server-table/server-table-phone-row.css +12 -0
  17. package/dist/{components-BmZk-git.js → components-JPnObL9i.js} +8914 -8812
  18. package/dist/components.js +37 -37
  19. package/dist/{conversion-variant-wZd-G6xR.js → conversion-variant-DultZZQm.js} +3 -3
  20. package/dist/{currency-field-DizBTAat.js → currency-field-CPbaM7ay.js} +4 -4
  21. package/dist/{dialog-B-3s-oXt.js → dialog-DmlG9opW.js} +3 -3
  22. package/dist/dnd.js +1 -1
  23. package/dist/{dropdown-menu-C6rcYGB9.js → dropdown-menu-CDKev8dk.js} +1 -1
  24. package/dist/editor.js +7 -7
  25. package/dist/{empty-state-CSkghnD9.js → empty-state-C56000TB.js} +1 -1
  26. package/dist/{financial-variant-igpGRbGw.js → financial-variant-BYjQ690K.js} +5 -5
  27. package/dist/{hooks-k8_f3B0k.js → hooks-BTwLAy_A.js} +119 -83
  28. package/dist/hooks.js +3 -3
  29. package/dist/{hover-card-DuaVVKMb.js → hover-card-CDtW6utN.js} +1 -1
  30. package/dist/i18n.js +3 -3
  31. package/dist/{icon-badge-3ThP6EOl.js → icon-badge-ec7MmUGA.js} +1 -1
  32. package/dist/{icon-button-4PKlaI1g.js → icon-button-CG4aO8Gh.js} +1 -1
  33. package/dist/lib/components/ui/display/index.d.ts +1 -0
  34. package/dist/lib/components/ui/display/totals-list/index.d.ts +2 -0
  35. package/dist/lib/components/ui/display/totals-list/totals-list.d.ts +43 -0
  36. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  37. package/dist/lib/components/ui/media/galleries/types.d.ts +8 -0
  38. package/dist/lib/components/ui/media/galleries/use-gallery.d.ts +1 -0
  39. package/dist/lib/components/ui/widgets/event-calendar/event-calendar-context.d.ts +6 -1
  40. package/dist/lib/components/ui/widgets/event-calendar/event-calendar-shell.d.ts +1 -1
  41. package/dist/lib/components/ui/widgets/event-calendar/index.d.ts +1 -1
  42. package/dist/lib/components/ui/widgets/event-calendar/partials/event-preview-title.d.ts +6 -2
  43. package/dist/lib/components/ui/widgets/event-calendar/partials/event-preview.d.ts +3 -1
  44. package/dist/lib/components/ui/widgets/event-calendar/template.types.d.ts +5 -1
  45. package/dist/lib/components/ui/widgets/event-calendar/types.d.ts +20 -0
  46. package/dist/lib/components/ui/widgets/event-calendar/use-template-calendar.d.ts +3 -1
  47. package/dist/lib/hooks/index.d.ts +1 -0
  48. package/dist/lib/hooks/poll.d.ts +26 -0
  49. package/dist/lib/hooks/use-poll.d.ts +30 -0
  50. package/dist/lib/i18n/resources/en/en.d.ts +1 -0
  51. package/dist/lib/i18n/resources/en/material.json.d.ts +1 -0
  52. package/dist/lib/i18n/resources/fr/fr.d.ts +1 -0
  53. package/dist/lib/i18n/resources/fr/material.json.d.ts +1 -0
  54. package/dist/lib/i18n/resources/resources.d.ts +2 -0
  55. package/dist/lib/i18n/translator.d.ts +1 -1
  56. package/dist/lib.js +1 -1
  57. package/dist/main.js +53 -53
  58. package/dist/map.js +7 -7
  59. package/dist/material.css +1 -1
  60. package/dist/pdf-reader.js +1 -1
  61. package/dist/{percent-field-QwU1l2Q4.js → percent-field-8_pILs15.js} +1 -1
  62. package/dist/{picker-surface-CiTycWgV.js → picker-surface-pyGv-Qh9.js} +4 -4
  63. package/dist/{popover-YmbzbKQG.js → popover-3EF4q2CT.js} +1 -1
  64. package/dist/{pos-types-BFrapNmx.js → pos-types-Dv2UxKSN.js} +1 -1
  65. package/dist/{pos-variant-CctfqieO.js → pos-variant-DJvtN9N8.js} +4 -4
  66. package/dist/print.js +1 -1
  67. package/dist/{programmer-variant-Dd0YOixn.js → programmer-variant-Bmcq2KzC.js} +2 -2
  68. package/dist/{public-CshR_aW7.js → public-BNebh4z0.js} +9 -9
  69. package/dist/{rich-code-block-BuJLDoBu.js → rich-code-block-DmX7d58S.js} +5 -5
  70. package/dist/{scientific-variant-CjErQxuZ.js → scientific-variant-DijUrpP8.js} +2 -2
  71. package/dist/{sortable-provider-DU2nvpFc.js → sortable-provider-Cnmt_gWu.js} +2 -2
  72. package/dist/{spinner-DH1mm8hH.js → spinner-C6LP2Rw8.js} +1 -1
  73. package/dist/{tabs-Um0SFyf1.js → tabs-Bj1zOe7-.js} +1 -1
  74. package/dist/theme-picker.js +2 -2
  75. package/dist/{theme-toggle-C-Ih4uQU.js → theme-toggle-Cxku5iBP.js} +1 -1
  76. package/dist/{toolbar-items-BoEY5bkt.js → toolbar-items-CEIuSxU_.js} +4 -4
  77. package/dist/{translate-material-D4rn5UaQ.js → translate-material-DI3nmQ6I.js} +1 -1
  78. package/dist/{translator-CcEgQ-H7.js → translator-BstxG_hN.js} +177 -163
  79. package/dist/{use-chat-composer-BfFcmDua.js → use-chat-composer-BqLkk_iH.js} +71 -66
  80. package/dist/{use-heading-spy-gDNtK1sU.js → use-heading-spy-nFyb9_KE.js} +4 -4
  81. package/dist/{use-material-translation-DYrfV_JJ.js → use-material-translation-1kCHtB0p.js} +1 -1
  82. package/dist/{use-return-focus-C_Qz_yTk.js → use-return-focus-Hv8rn55-.js} +1 -1
  83. package/docs/components/data-display.md +38 -8
  84. package/docs/components/media-and-files.md +11 -0
  85. package/docs/components/rich-widgets.md +22 -1
  86. package/docs/guides/helpers.md +40 -0
  87. package/docs/guides/layouts.md +5 -2
  88. package/docs/guides/theming.md +2 -2
  89. package/docs/roadmap.md +9 -4
  90. package/docs/troubleshooting.md +2 -2
  91. package/lib/components/theme-tokens.css +3 -3
  92. package/lib/components/ui/collections/server-table/server-table-phone-row.css +12 -0
  93. package/lib/themes/ambre.css +2 -2
  94. package/lib/themes/ardoise.css +2 -2
  95. package/lib/themes/bleumono.css +2 -2
  96. package/lib/themes/bluemoon.css +2 -2
  97. package/lib/themes/corail.css +2 -2
  98. package/lib/themes/foret.css +2 -2
  99. package/lib/themes/lavande.css +2 -2
  100. package/lib/themes/menthe.css +2 -2
  101. package/lib/themes/ocean.css +2 -2
  102. package/lib/themes/pink.css +2 -2
  103. package/lib/themes/prune.css +1 -1
  104. package/lib/themes/sable.css +2 -2
  105. package/lib/themes/slate.css +1 -1
  106. package/lib/themes/teal.css +2 -2
  107. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @nxgt/material
2
2
 
3
+ ## 3.84.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#2487](https://github.com/softistx/nxgt-material/pull/2487) [`f06e9e8`](https://github.com/softistx/nxgt-material/commit/f06e9e8fc87a28e27bca3db093f781e858be0f31) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `EventCalendar`: a click on an event now runs `onEventClick` and opens the preview even when `onSlotClick` is set. Pressing on an event in a time grid used to start a slot gesture, whose pointer capture sent the click to the column: only `onSlotClick` ran, with the slot under the event. The preview popover can now be routed to the app, in the dated and the `mode="template"` calendar alike (additive, nothing to migrate): `onEventEdit(event)` adds an Edit button, `onEventDelete(event)` replaces the built-in confirmation and removal (the app confirms and deletes; neither button shows for a disabled calendar or event), `previewFields` (`'title' | 'color' | 'description'`, `[]` for none) hides the built-in inline fields, and `eventPreview={false}` skips the popover so `onEventClick` alone handles the click. New message key `material.event-calendar.edit` (en, fr). Fixes [#2486](https://github.com/softistx/nxgt-material/issues/2486).
8
+
9
+ - [#2499](https://github.com/softistx/nxgt-material/pull/2499) [`37b6fbe`](https://github.com/softistx/nxgt-material/commit/37b6fbecc51005a635f8ece3687d33fd816b5d6a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add `usePoll({ ms, enabled?, read, onError? })` to `@nxgt/material/hooks`: reads again every `ms` while `enabled` and `document.visibilityState` is `visible`, never two reads at once (a tick during a running read or a hidden page is skipped), and clears its timer on unmount or when `enabled` turns false. The latest `read` is used without restarting the interval. `startPoll({ ms, read, active?, visible?, onError? })`, the framework-free loop behind it, is exported too and returns its stop.
10
+
11
+ ### Patch Changes
12
+
13
+ - [#2505](https://github.com/softistx/nxgt-material/pull/2505) [`58b74e0`](https://github.com/softistx/nxgt-material/commit/58b74e0c59c2f1ff87e66d591d852129bfbfaaea) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The app shell's phone menu button is a ghost icon button (no frame).
14
+
15
+ - [#2494](https://github.com/softistx/nxgt-material/pull/2494) [`2461b9b`](https://github.com/softistx/nxgt-material/commit/2461b9b9912ab554f63d5e2ad38abd0e323f533b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: the `Guides/Recipes/Gallery` screen puts its bulk Delete in the "n selected" bar through `Gallery`'s `selectionActions`, in the story and in the plugin's `screen-recipes` code.
16
+
17
+ - [#2519](https://github.com/softistx/nxgt-material/pull/2519) [`def1980`](https://github.com/softistx/nxgt-material/commit/def1980378f6f2369d15ddbcbbdaa7349fe77902) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Move `intl-messageformat` to `^12.1.4` and `@tanstack/react-virtual` to `3.14.24`. The message formatting API the libraries use (`new IntlMessageFormat(message, locale).format(values)`) is unchanged.
18
+
19
+ - [#2504](https://github.com/softistx/nxgt-material/pull/2504) [`44601b1`](https://github.com/softistx/nxgt-material/commit/44601b14a2667f82d78873d3fea6cb3e1e5a5cd9) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: roadmap lists the header refresh.
20
+
21
+ - [#2500](https://github.com/softistx/nxgt-material/pull/2500) [`d9aa282`](https://github.com/softistx/nxgt-material/commit/d9aa2829fe2233dc78854fadc5a00941f9594b6e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ServerTable` on a phone no longer leaves an empty 40px row under the filter bar when a list in cards or tiles has no select column, no sort, no `actions` and no "Filters" trigger to put there: the row is not displayed while both of its slots are empty, and comes back as soon as any control is present. Fixes [#2497](https://github.com/softistx/nxgt-material/issues/2497).
22
+
23
+ - [#2502](https://github.com/softistx/nxgt-material/pull/2502) [`896b90c`](https://github.com/softistx/nxgt-material/commit/896b90c56fc4c948bdc394fa4100f75c0e8ca283) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A tonal Button label now reaches 4.5:1 on a selected table row (`data-state="selected"`, a 15 % primary tint) and on a table header or footer (10 %, with the row over it), not only on the page, the ground and a striped row, in every preset. The light `--primary-text` share is solved against those two surfaces too, and two contrast pairs, `primary-text / primary@selrow15` and `primary-text / primary@head15`, guard them. Nothing to adapt: regenerate a theme file to take the new shares. Fixes [#2495](https://github.com/softistx/nxgt-material/issues/2495).
24
+ - Updated dependencies [[`def1980`](https://github.com/softistx/nxgt-material/commit/def1980378f6f2369d15ddbcbbdaa7349fe77902), [`896b90c`](https://github.com/softistx/nxgt-material/commit/896b90c56fc4c948bdc394fa4100f75c0e8ca283)]:
25
+ - @nxgt/material-core@0.50.1
26
+
27
+ ## 3.83.0
28
+
29
+ ### Minor Changes
30
+
31
+ - [#2485](https://github.com/softistx/nxgt-material/pull/2485) [`407ed60`](https://github.com/softistx/nxgt-material/commit/407ed60325b7e9c8adaf7d19adc4551930899358) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Gallery` takes `selectionActions`, a node or a render function `(selectedIds) => ReactNode`, shown at the end of the "n selected" bar of a `selectable` gallery for bulk actions such as download, move or delete. The bar, and so the actions, stay hidden while nothing is selected, and they wrap under the count on a phone. Fixes [#2446](https://github.com/softistx/nxgt-material/issues/2446).
32
+
33
+ - [#2491](https://github.com/softistx/nxgt-material/pull/2491) [`db927b8`](https://github.com/softistx/nxgt-material/commit/db927b83eafadce14e49129b42d4087dc817d7dc) Thanks [@SteveGT96](https://github.com/SteveGT96)! - New `TotalsList`, the on-screen counterpart of `PrintTotals`: a `dl` of labelled figures with labels at the start, right-aligned tabular amounts, an emphasised and ruled `last` row for the grand total, a `tone` per amount (a due or negative figure), an accessible `label` and a `card` or `plain` variant. Its rows have the shape of `PrintTotalRow`, so a screen and its print share data. Fixes [#2490](https://github.com/softistx/nxgt-material/issues/2490).
34
+
35
+ ### Patch Changes
36
+
37
+ - [#2483](https://github.com/softistx/nxgt-material/pull/2483) [`15d76f5`](https://github.com/softistx/nxgt-material/commit/15d76f5ecb0c18f6f4c9e282b0c3321376cebb40) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ChoiceCardGroup` and `CheckCardField` no longer collapse to 0 width in a parent that fits its content (`inline-flex`, a table cell): the balanced group is a size container, which has no intrinsic width, so it now keeps a floor of one card (13.5rem). Fixes [#2482](https://github.com/softistx/nxgt-material/issues/2482).
38
+
39
+ - [#2480](https://github.com/softistx/nxgt-material/pull/2480) [`91f879b`](https://github.com/softistx/nxgt-material/commit/91f879b85f46f89c645255df6502fbcf57edecfc) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The data-display docs page no longer shows a stray `Vue: not yet ([#2470](https://github.com/softistx/nxgt-material/issues/2470))` note on SeatRing, SecretCard, ChangeHistory, ZonedTime, VoteTally, EnrolmentCard and RecoveryCodesStatus (it belongs to TubeCap only), and the TubeCap section names the exported `TubeCapKind` type beside `TUBE_CAP_KINDS`.
40
+
41
+ - [#2481](https://github.com/softistx/nxgt-material/pull/2481) [`5fec9f4`](https://github.com/softistx/nxgt-material/commit/5fec9f434401235c74cb02927010e937410913a9) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: new `Guides/Recipes` screens on the shipped layouts — feed, gallery, sign-in, conversation thread, settings, dashboard and editor — each a tested story with its code in the plugin's `screen-recipes` skill.
42
+
3
43
  ## 3.82.0
4
44
 
5
45
  ### Minor Changes
package/README.md CHANGED
@@ -222,7 +222,7 @@ reads `duotone.svg`, the file that exists (it used to ask for the missing
222
222
  | `@nxgt/material/draw/png` | `drawingToPng(sceneOrSvg, { scale?, background?, colorsFrom? })` and `downloadDrawingPng(source, fileName)` — a drawing (a scene, or a live `<svg>` such as `svgRef.current` of a `<Drawing ref={svgRef}>`) as a PNG `Blob` in the browser, with the page's theme colours resolved, `data:` images inlined and CORS errors named; its own entry, DOM only when called ([drawing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/drawing.md#png), [reference](https://cdn.jsdelivr.net/npm/@nxgt/material-core@0/docs/draw.md#png-nxgtmaterial-coredrawpng)) |
223
223
  | `@nxgt/material/vite` | build-time helpers for consumers: `nxgtMaterial()` (a strict CSP by hash or nonce, self-hosted fonts, a styles check, serves the pdf.js worker on the Vite 5–7 dev server, generates your app themes' stylesheets with `nxgtMaterial({ themes })` and the `nxgt-theme` bin: [Themes guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/themes.md), a reduced backdrop icon sprite from your Font Awesome install with `nxgtMaterial({ backdropSprite })` and the `nxgt-backdrop-sprite` bin, PDFs on a bundled server with `nxgtMaterial({ pdf: { bundle: true } })`: [Vite plugin guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/vite-plugin.md)), `pdfkitStandardFonts()` ([printing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/printing.md)), `cspAssetsInlineLimit`, a `build.assetsInlineLimit` that never inlines a font ([CSP guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/csp.md#katex-fonts)) |
224
224
  | `@nxgt/material/next` | `withNxgtPrint(nextConfig)`: the `next.config.ts` a Next.js route handler that imports `/print` needs, `output: 'standalone'` included. Node only, no dependency on `next` ([printing guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/printing.md#nextjs-serverexternalpackages-and-output-standalone)) |
225
- | `@nxgt/material/hooks` | `useTheme`, `useIsClient`, `useIsMobile`, `useLocalizedDate`, `useCspNonce`, `useFocusOnMount`, `useCountdown`, `useSubmitOnce`, `useDrafts`, `useUnsavedGuard`, … ([helpers](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/helpers.md#nxgtmaterialhooks)) |
225
+ | `@nxgt/material/hooks` | `useTheme`, `useIsClient`, `useIsMobile`, `useLocalizedDate`, `useCspNonce`, `useFocusOnMount`, `useCountdown`, `useSubmitOnce`, `useDrafts`, `usePoll`, `useUnsavedGuard`, … ([helpers](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/helpers.md#nxgtmaterialhooks)) |
226
226
  | `@nxgt/material/dnd` | `@dnd-kit` primitives ([helpers](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/helpers.md#nxgtmaterialdnd)) |
227
227
  | `@nxgt/material/i18n` | `I18nProvider`, `mergeResources`, `createTranslator`, `translateMaterial`, `formatMessage` ([i18n guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/i18n.md)) |
228
228
  | `@nxgt/material/lib` | `cn`, `clientOnly`, date, number and storage utilities, `useSliceReducer`, `getCspNonce` / `setCspNonce`, the server-side CSP helpers (`createCspNonce`, `cspPolicy`, `cspHash`, `applyCspNonce`, `CSP_NONCE_PLACEHOLDER`, `ZOD_JITLESS_SCRIPT`, `zodJitlessTag`: [CSP, SSR](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/csp.md#ssr)) ([helpers](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/helpers.md#nxgtmateriallib)) |
@@ -711,6 +711,7 @@ Not components: what the stylesheet gives any element.
711
711
  | <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). | — |
712
712
  | <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` |
713
713
  | <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`); `href` (and `linkComponent`) makes the whole card one link with a trailing chevron; `StatCardGroup` lays compact tiles 2×2 on a phone and in a row beside, holds its width in a flex row, and `align="end"` sets them against its end edge. | `StatCard` |
714
+ | | [`TotalsList`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-display.md#totalslist) | On-screen `PrintTotals`: a `dl` of labelled figures, labels at the start, right-aligned tabular amounts, a ruled `last` row for the grand total, a `tone` per amount, an accessible `label`; rows share the shape of `PrintTotalRow`. | — (later, #2492) |
714
715
  | <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` |
715
716
  | <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` |
716
717
  | <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` |
@@ -871,7 +872,7 @@ Not components: what the stylesheet gives any element.
871
872
  | --- | --- | --- | --- |
872
873
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-chat-overview.webp" width="120" alt="ChatInbox"> | [`ChatInbox`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#chat-kit), `ChatThread`, `ChatMessageList`, `ChatMessage`, `ChatComposer`, `ChatThreadHeader`, `ChatWidget`, `ChatConversationItem`, `ChatActionProposal`, `ChatToolActivity`… | Chat kit: inbox (list + thread, container queries from `@md`), bubbles grouped by sender or flat rows, read receipts, replies, reactions and a message toolbar, a pill composer with quick replies, attachments and stop, a floating chat widget, an approval card for an assistant's proposed action and a compact tool-step row; 320 px to desktop, light and dark. | `ChatInbox`, `ChatThread`, `ChatMessageList`, `ChatMessage`, `ChatComposer` (same parts; `ChatActionProposal` and `ChatToolActivity` not yet, [#2145](https://github.com/softistx/nxgt-material/issues/2145)) |
873
874
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-kanban.webp" width="120" alt="Kanban"> | [`Kanban`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#kanban) | Board with columns, swimlanes, WIP limits, search, and drag-and-drop cards and columns. | `Kanban` |
874
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-eventcalendar.webp" width="120" alt="EventCalendar"> | [`EventCalendar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#eventcalendar) | Month / week / day / agenda calendar with drag, resize and slot creation, a day view split by resource, a named time zone, a recurring template week (`mode="template"`), a now line, a mini-month side panel and a phone layout. | `EventCalendar` |
875
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-eventcalendar.webp" width="120" alt="EventCalendar"> | [`EventCalendar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#eventcalendar) | Month / week / day / agenda calendar with drag, resize and slot creation, a day view split by resource, a named time zone, a recurring template week (`mode="template"`), an event preview you can route to your own edit and delete (`onEventEdit`, `onEventDelete`, `eventPreview`, `previewFields`), a now line, a mini-month side panel and a phone layout. | `EventCalendar` |
875
876
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-native-charts-linechart.webp" width="120" alt="LineChart"> | [`LineChart`, `AreaChart`, `BarChart`, `PieChart`, `DonutChart`, `Gauge`, `RadialBarChart`, `FunnelChart`, `HeatmapChart`, `RadarChart`, `ScatterChart`, `ComboChart`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#charts) from `@nxgt/material/charts` | Native SVG charts with keyboard point navigation, a screen-reader summary, a "View data" table, `patterns`, a hide/isolate legend, zoom and phone scroll (client-only entry; [guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/charts.md)). | [not yet](https://github.com/softistx/nxgt-material/issues/1255) (#1255) |
876
877
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-emojipicker.webp" width="120" alt="EmojiPicker"> | [`EmojiPicker`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#emojipicker), `EmojiList` | Shared picker. `ChatComposer` takes `emojis`; `Markdown` expands `:shortcode:`; the RTE toolbar uses the same picker. | `EmojiPicker`, `EmojiList` |
877
878
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/rich-widgets-mentionlist.webp" width="120" alt="MentionList"> | [`MentionList`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/rich-widgets.md#mentionlist) | `@` mention list from an `items` prop (local search). ChatComposer and the RTE suggestion list use it. | `MentionList` |
@@ -932,7 +933,7 @@ which is private: adding it needs a GitHub account with access to it.
932
933
  | --- | --- |
933
934
  | skill `use-nxgt-material` | an index that picks the component by need and wires imports and `styles.css`; its references cover the tokens and themes, forms, i18n, tests by role, SSR and the other subpaths, read from these docs in `node_modules/@nxgt/material/docs/` |
934
935
  | skill `design-screens` | the library's visual language for a screen (hierarchy, rhythm, tones, surfaces, states, phone, dark, motion) and a 12-criteria grid to score a screen out of 5 |
935
- | skill `screen-recipes` | whole screens to start from (a home dashboard, a list with a detail sheet, forms and dialogs, tables and settings, a dense record page, a status board, an occupancy board, a landing page and a search dialog with its results page), each the code of a tested `Guides/Recipes/<Name>` story |
936
+ | skill `screen-recipes` | whole screens to start from (a home dashboard, a list with a detail sheet, forms and dialogs, tables and settings, a dense record page, a status board, an occupancy board, a landing page, a search dialog with its results page, a team feed, the sign-in, sign-up and forgotten-password screens, a gallery of pictures, settings with sections, a messages thread, an overview of rearrangeable widgets and a document editor), each the code of a tested `Guides/Recipes/<Name>` story |
936
937
  | agent `screen-builder` | builds a page or a form from the catalogue, with tests by role and name and an accessibility check, then looks at 360 and 1440 px screenshots in light and dark and fixes until the grid reads 4 everywhere |
937
938
  | agent `design-reviewer` | read-only: scores a screen's screenshots on the same 12 criteria and returns the fixes ranked, each with the component and prop |
938
939
  | skill `build-a-theme` + agent `theme-builder` | the app's own theme with `defineTheme`: seeds, tones, background and icon motif, generation, provider and picker; checks the AA contrast of the generated tokens in light and dark and looks at key screens |
@@ -4,7 +4,7 @@ import { o as n } from "./dist-DVRQkaTK.js";
4
4
  import { r } from "./dist-DWZXlCZR.js";
5
5
  import { a as i } from "./dist-DHdUUM1w.js";
6
6
  import { t as a } from "./in-dialog-D61Yeaol.js";
7
- import { a as o, c as s, d as c, i as l, l as u, n as d, o as f, r as p, s as m, t as h, u as g } from "./use-return-focus-C_Qz_yTk.js";
7
+ import { a as o, c as s, d as c, i as l, l as u, n as d, o as f, r as p, s as m, t as h, u as g } from "./use-return-focus-Hv8rn55-.js";
8
8
  import { i as _ } from "./escape-owner-DpaP0lm1.js";
9
9
  import * as v from "react";
10
10
  import { Fragment as y, isValidElement as b } from "react";
@@ -1,4 +1,4 @@
1
- import { l as e, r as t, s as n, u as r } from "./translator-CcEgQ-H7.js";
1
+ import { l as e, r as t, s as n, u as r } from "./translator-BstxG_hN.js";
2
2
  import { t as i } from "./_baseIsEqual-C6ksIHya.js";
3
3
  import { useMemo as a } from "react";
4
4
  import { asyncThunkCreator as o, buildCreateSlice as s } from "@reduxjs/toolkit";
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { n as t, t as n } from "./dist-DVRQkaTK.js";
3
- import { n as r, t as i } from "./spinner-DH1mm8hH.js";
3
+ import { n as r, t as i } from "./spinner-C6LP2Rw8.js";
4
4
  import { t as a } from "./dist-DkQbkF9T.js";
5
5
  import { a as o, i as s, n as c, o as l, s as u, t as d } from "./use-click-lock-Bwg_caHO.js";
6
6
  import { t as f } from "./is-production-GLw59WU8.js";
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { n as t, r as n, t as r, u as i } from "./tabs-Um0SFyf1.js";
3
- import { t as a } from "./button-CSKUtMI3.js";
4
- import { t as o } from "./use-material-translation-DYrfV_JJ.js";
5
- import { t as s } from "./icon-button-4PKlaI1g.js";
2
+ import { n as t, r as n, t as r, u as i } from "./tabs-Bj1zOe7-.js";
3
+ import { t as a } from "./button-DhiNGrdT.js";
4
+ import { t as o } from "./use-material-translation-1kCHtB0p.js";
5
+ import { t as s } from "./icon-button-CG4aO8Gh.js";
6
6
  import { t as c } from "./copy-to-clipboard-Be5Ffvs_.js";
7
7
  import { t as l } from "./useEvent-2fKq-6w8.js";
8
8
  import { t as u } from "./useLatest-C2PnQEeD.js";
@@ -11,7 +11,7 @@ import { t as f } from "./skeleton-DSdtr2qc.js";
11
11
  import { t as p } from "./live-status-BGPaN8r8.js";
12
12
  import { n as m, t as h } from "./calculator-context-BugcKuVG.js";
13
13
  import { a as g, c as _, i as v, l as y, n as b, o as ee, r as te, s as ne } from "./calculator-announce-DRd2c6Dq.js";
14
- import { i as re, t as ie } from "./pos-types-BFrapNmx.js";
14
+ import { i as re, t as ie } from "./pos-types-Dv2UxKSN.js";
15
15
  import { a as ae, r as oe } from "./key-layout-cR79xfGE.js";
16
16
  import { n as x, r as se, t as ce } from "./programmer-word-CNCF7DJF.js";
17
17
  import { t as le } from "./standard-layout-BuSRr3TY.js";
@@ -279,11 +279,11 @@ function Le({ helpId: e }) {
279
279
  //#endregion
280
280
  //#region lib/components/ui/widgets/calculator/variants/variant-loader.ts
281
281
  var Re = {
282
- scientific: () => import("./scientific-variant-CjErQxuZ.js"),
283
- pos: () => import("./pos-variant-CctfqieO.js"),
284
- programmer: () => import("./programmer-variant-Dd0YOixn.js"),
285
- financial: () => import("./financial-variant-igpGRbGw.js"),
286
- conversion: () => import("./conversion-variant-wZd-G6xR.js")
282
+ scientific: () => import("./scientific-variant-DijUrpP8.js"),
283
+ pos: () => import("./pos-variant-DJvtN9N8.js"),
284
+ programmer: () => import("./programmer-variant-Bmcq2KzC.js"),
285
+ financial: () => import("./financial-variant-BYjQ690K.js"),
286
+ conversion: () => import("./conversion-variant-DultZZQm.js")
287
287
  }, B = "failed", V = /* @__PURE__ */ new Map(), H = /* @__PURE__ */ new Map(), U = /* @__PURE__ */ new Set(), W = () => {
288
288
  for (let e of U) e();
289
289
  };
@@ -1,11 +1,11 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { t } from "./button-CSKUtMI3.js";
3
- import { t as n } from "./use-material-translation-DYrfV_JJ.js";
4
- import { t as r } from "./icon-button-4PKlaI1g.js";
5
- import { a as i, i as a, n as o, r as s, t as c } from "./picker-surface-CiTycWgV.js";
6
- import { r as l, t as u } from "./currency-field-DizBTAat.js";
2
+ import { t } from "./button-DhiNGrdT.js";
3
+ import { t as n } from "./use-material-translation-1kCHtB0p.js";
4
+ import { t as r } from "./icon-button-CG4aO8Gh.js";
5
+ import { a as i, i as a, n as o, r as s, t as c } from "./picker-surface-pyGv-Qh9.js";
6
+ import { r as l, t as u } from "./currency-field-CPbaM7ay.js";
7
7
  import { r as d, t as f } from "./field-blur-DkiZOVNV.js";
8
- import { t as p } from "./calculator-Cv00UQgR.js";
8
+ import { t as p } from "./calculator-BcgxxScL.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 { Calculator as y } from "lucide-react";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-DYrfV_JJ.js";
1
+ import { t as e } from "./use-material-translation-1kCHtB0p.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region lib/components/ui/widgets/calculator/partials/calculator-segment.tsx
4
4
  function n({ label: n, choices: r, value: i, nameKey: a, onChange: o }) {
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./calculator-Cv00UQgR.js";
1
+ import { n as e, t } from "./calculator-BcgxxScL.js";
2
2
  export { e as CALCULATOR_VARIANTS, t as Calculator };
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
3
  import { t as n } from "./warn-once-C_e47JM8.js";
4
- import { t as r } from "./button-CSKUtMI3.js";
5
- import { t as i } from "./use-material-translation-DYrfV_JJ.js";
4
+ import { t as r } from "./button-DhiNGrdT.js";
5
+ import { t as i } from "./use-material-translation-1kCHtB0p.js";
6
6
  import { t as a } from "./use-ssr-media-query-C6M5m8sf.js";
7
7
  import { i as o, n as s, r as c, t as l } from "./util-4heV2LPI.js";
8
8
  import { t as u } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
9
- import { t as d } from "./chip-BGn0V6Pt.js";
9
+ import { t as d } from "./chip-m0_usuzd.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,7 +1,7 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { n as t } from "./spinner-DH1mm8hH.js";
2
+ import { n as t } from "./spinner-C6LP2Rw8.js";
3
3
  import { s as n } from "./use-click-lock-Bwg_caHO.js";
4
- import { t as r } from "./use-material-translation-DYrfV_JJ.js";
4
+ import { t as r } from "./use-material-translation-1kCHtB0p.js";
5
5
  import { t as i } from "./react-node-text-Crkpfpco.js";
6
6
  import { cloneElement as a, isValidElement as o } from "react";
7
7
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
@@ -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 { t as n } from "./dist-DWZXlCZR.js";
4
- import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-C6rcYGB9.js";
4
+ import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-CDKev8dk.js";
5
5
  import { a as c, i as l, n as u } from "./field-blur-context-BLGgf_3z.js";
6
- import { a as d, o as f, r as p, s as m, t as h } from "./toolbar-items-BoEY5bkt.js";
6
+ import { a as d, o as f, r as p, s as m, t as h } from "./toolbar-items-CEIuSxU_.js";
7
7
  import { t as g } from "./is-production-GLw59WU8.js";
8
- import { t as _ } from "./use-material-translation-DYrfV_JJ.js";
9
- import { i as v, n as y, o as b, t as x } from "./code-language-items-oRjtO3qV.js";
8
+ import { t as _ } from "./use-material-translation-1kCHtB0p.js";
9
+ import { i as v, n as y, o as b, t as x } from "./code-language-items-BWw17W9s.js";
10
10
  import { t as S } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
11
11
  import { n as C, t as w } from "./escape-owner-DpaP0lm1.js";
12
12
  import { t as T } from "./skeleton-DSdtr2qc.js";
@@ -1,13 +1,13 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DWZXlCZR.js";
3
- import { o as n, r, s as i, t as a } from "./toolbar-items-BoEY5bkt.js";
4
- import { t as o } from "./use-material-translation-DYrfV_JJ.js";
5
- import { i as s, n as c, o as l } from "./code-language-items-oRjtO3qV.js";
3
+ import { o as n, r, s as i, t as a } from "./toolbar-items-CEIuSxU_.js";
4
+ import { t as o } from "./use-material-translation-1kCHtB0p.js";
5
+ import { i as s, n as c, o as l } from "./code-language-items-BWw17W9s.js";
6
6
  import { t as u } from "./skeleton-DSdtr2qc.js";
7
7
  import { t as d } from "./live-status-BGPaN8r8.js";
8
8
  import { t as f } from "./use-mobile-BDro060N.js";
9
9
  import { t as p } from "./react-node-text-Crkpfpco.js";
10
- import { a as m, c as h, d as g, f as _, i as v, l as y, m as b, o as x, p as S, r as C, s as w, t as T, u as E } from "./code-editor-B25-mWhb.js";
10
+ import { a as m, c as h, d as g, f as _, i as v, l as y, m as b, o as x, p as S, r as C, s as w, t as T, u as E } from "./code-editor-BgKFrcld.js";
11
11
  import { r as D, t as O } from "./field-blur-DkiZOVNV.js";
12
12
  import { useEffect as k, useRef as A, useState as j } from "react";
13
13
  import { Fragment as M, jsx as N, jsxs as P } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- import { d as e, f as t } from "./dropdown-menu-C6rcYGB9.js";
2
- import { t as n } from "./use-material-translation-DYrfV_JJ.js";
1
+ import { d as e, f as t } from "./dropdown-menu-CDKev8dk.js";
2
+ import { t as n } from "./use-material-translation-1kCHtB0p.js";
3
3
  import { t as r } from "./copy-to-clipboard-Be5Ffvs_.js";
4
4
  import { t as i } from "./live-status-BGPaN8r8.js";
5
5
  import { useEffect as a, useRef as o, useState as s } from "react";
@@ -21,9 +21,9 @@
21
21
  --primary: oklch(46% 0.1135 276.35);
22
22
  --primary-foreground: oklch(0.984 0.003 247.858);
23
23
  /* Primary drawn as text or an icon on a normal surface (`text-primary-text`):
24
- the colour mixed 4 % toward black in light, which keeps it 7.9:1 on
25
- the white page and on a Card (the colour itself gives 7.3:1); the dark theme lifts it. */
26
- --primary-text: color-mix(in oklab, var(--primary) 96%, black);
24
+ the colour mixed 10 % toward black in light, which keeps it above 4.5:1 on
25
+ the page, a Card and the tinted row, header and ground surfaces a tonal Button label sits on; the dark theme lifts it. */
26
+ --primary-text: color-mix(in oklab, var(--primary) 90%, black);
27
27
  /* Primary drawn as a non-text mark (WCAG 1.4.11, 3:1): an indicator bar or dot,
28
28
  a selected or focused border, a ring, a spinner arc, a progress fill
29
29
  (`bg-primary-indicator`, `border-primary-indicator`...). Light is --primary;
@@ -184,6 +184,18 @@
184
184
  min-height: 2.75rem;
185
185
  }
186
186
  }
187
+ /* Nothing to show (#2497): no select-all, no sort, no "Filters" trigger, no
188
+ * actions and no bulk bar leave both slots empty, and the row would be an
189
+ * empty 40px gap under the filter bar. Any control fills a slot, and the row
190
+ * is back. */
191
+ [data-slot="server-table-phone-row"]:has(
192
+ > [data-slot="server-table-phone-row-start"]:empty
193
+ ):has(
194
+ > [data-slot="server-table-phone-row-end"]
195
+ > [data-slot="server-table-phone-sort"]:only-child:empty
196
+ ) {
197
+ display: none;
198
+ }
187
199
  @media (pointer: coarse) {
188
200
  /* The 32px bulk buttons reach 44px with an invisible 6px margin: a gap of
189
201
  * 12px keeps neighbours from taking each other's edge. */