@nxgt/material 3.65.0 → 3.67.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 (118) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +6 -2
  3. package/dist/{alert-dialog-C0nGUSCP.js → alert-dialog-BgQDxcYh.js} +1 -1
  4. package/dist/{async-slice-CyansBvD.js → async-slice-BCZyWgGr.js} +48 -25
  5. package/dist/{background-qdnet2A5.js → background-D1gC4m2R.js} +1 -1
  6. package/dist/backgrounds.js +1 -1
  7. package/dist/{button-D5k3K-gM.js → button-2de_lrix.js} +1 -1
  8. package/dist/charts.js +3 -3
  9. package/dist/{chip-lWXIJkqo.js → chip-Cs0uEjpu.js} +2 -2
  10. package/dist/{code-editor-aXG4CdY-.js → code-editor-BYhBAfcc.js} +5 -5
  11. package/dist/code-editor.js +5 -5
  12. package/dist/{code-language-items-CsaXyApg.js → code-language-items-xhmbF6wA.js} +2 -2
  13. package/dist/components/components.css +2 -0
  14. package/dist/components/ui/layout/app-shell/activity-backdrop.css +4 -3
  15. package/dist/components/ui/primitives/tabs/tabs-nav-forced.css +27 -0
  16. package/dist/components/ui/primitives/toggle-group/toggle-group-segmented.css +10 -2
  17. package/dist/components/ui/primitives/toggle-group/toggle-group.css +5 -1
  18. package/dist/{components-DNcTvjlv.js → components-BRWaX4Xk.js} +17477 -17205
  19. package/dist/components.js +28 -28
  20. package/dist/{compose-refs-DZ0iIVF-.js → compose-refs-G4J4kaUA.js} +1 -1
  21. package/dist/{dialog-DWNaxpa-.js → dialog-Co5oksU1.js} +4 -4
  22. package/dist/dnd.js +2 -2
  23. package/dist/{dropdown-menu-ChvAIQIW.js → dropdown-menu-DdzyvN76.js} +1 -1
  24. package/dist/editor.js +365 -365
  25. package/dist/{empty-state-CFLcVzKL.js → empty-state-CQ0CV0kA.js} +2 -2
  26. package/dist/{field-blur-CV9orzdJ.js → field-blur-B2y-bNYi.js} +1 -1
  27. package/dist/{field-blur-context-C8BX8IBy.js → field-blur-context-BZtwcPUV.js} +1 -1
  28. package/dist/{hooks-DilW-3jc.js → hooks-DjuYsY-j.js} +2 -2
  29. package/dist/hooks.js +2 -2
  30. package/dist/{hover-card-IeS_1RPH.js → hover-card-BeBVy6tB.js} +1 -1
  31. package/dist/i18n.js +3 -3
  32. package/dist/{icon-badge-Bf4SoA2i.js → icon-badge-DbYsbzwZ.js} +3 -3
  33. package/dist/{icon-button-l3dQTRrC.js → icon-button-Co6ttdv1.js} +1 -1
  34. package/dist/lib/components/ui/actions/back-link/back-link.d.ts +10 -0
  35. package/dist/lib/components/ui/actions/back-link/index.d.ts +1 -0
  36. package/dist/lib/components/ui/actions/index.d.ts +2 -0
  37. package/dist/lib/components/ui/actions/link/link.d.ts +1 -19
  38. package/dist/lib/components/ui/actions/share-button/index.d.ts +3 -0
  39. package/dist/lib/components/ui/actions/share-button/share-button.d.ts +17 -0
  40. package/dist/lib/components/ui/actions/share-button/share-or-copy.d.ts +17 -0
  41. package/dist/lib/components/ui/collections/dnd/index.d.ts +1 -1
  42. package/dist/lib/components/ui/collections/row-menu/index.d.ts +1 -0
  43. package/dist/lib/components/ui/collections/row-menu/row-menu.d.ts +6 -1
  44. package/dist/lib/components/ui/collections/row-menu/use-row-menu-focus.d.ts +30 -0
  45. package/dist/lib/components/ui/display/enrolment-card/use-enrolment-card-labels.d.ts +1 -1
  46. package/dist/lib/components/ui/display/recovery-codes/use-recovery-codes-labels.d.ts +1 -1
  47. package/dist/lib/components/ui/display/recovery-codes-status/use-recovery-codes-status-labels.d.ts +1 -1
  48. package/dist/lib/components/ui/display/stat-card/partials/stat-card-link-parts.d.ts +7 -0
  49. package/dist/lib/components/ui/display/stat-card/stat-card.d.ts +6 -1
  50. package/dist/lib/components/ui/display/stat-card/types.d.ts +14 -0
  51. package/dist/lib/components/ui/feedback/step-up-dialog/use-step-up-labels.d.ts +1 -1
  52. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  53. package/dist/lib/components/ui/fields/number-field/number-control.d.ts +4 -1
  54. package/dist/lib/components/ui/fields/number-field/number-stepper.d.ts +5 -0
  55. package/dist/lib/components/ui/fields/verification-code/use-verification-labels.d.ts +1 -1
  56. package/dist/lib/components/ui/layout/app-shell/route-transition.d.ts +1 -1
  57. package/dist/lib/components/ui/media/media-player-host/use-host-engine.d.ts +1 -1
  58. package/dist/lib/components/ui/primitives/link/link-component-provider.d.ts +1 -1
  59. package/dist/lib/components/ui/primitives/link/nav-current.d.ts +22 -0
  60. package/dist/lib/components/ui/primitives/link/router-link.d.ts +25 -0
  61. package/dist/lib/components/ui/primitives/tabs/index.d.ts +2 -0
  62. package/dist/lib/components/ui/primitives/tabs/internal.d.ts +2 -0
  63. package/dist/lib/components/ui/primitives/tabs/partials/tabs-nav-link.d.ts +22 -0
  64. package/dist/lib/components/ui/primitives/tabs/tab-param-url.d.ts +53 -0
  65. package/dist/lib/components/ui/primitives/tabs/tabs-nav.d.ts +22 -0
  66. package/dist/lib/components/ui/primitives/tabs/tabs-selectors.d.ts +8 -0
  67. package/dist/lib/components/ui/primitives/tabs/use-tab-param.d.ts +35 -0
  68. package/dist/lib/components/ui/primitives/tabs/use-tabs-overflow.d.ts +4 -1
  69. package/dist/lib/components/ui/primitives/toggle-group/index.d.ts +1 -0
  70. package/dist/lib/components/ui/primitives/toggle-group/segmented-nav-item.d.ts +20 -0
  71. package/dist/lib/components/ui/primitives/toggle-group/segmented-nav.d.ts +22 -0
  72. package/dist/lib/components/ui/primitives/toggle-group/toggle-group.d.ts +4 -3
  73. package/dist/lib/i18n/resources/en/en.d.ts +5 -0
  74. package/dist/lib/i18n/resources/en/material.json.d.ts +6 -1
  75. package/dist/lib/i18n/resources/fr/fr.d.ts +5 -0
  76. package/dist/lib/i18n/resources/fr/material.json.d.ts +6 -1
  77. package/dist/lib/i18n/resources/resources.d.ts +10 -0
  78. package/dist/lib/i18n/translator.d.ts +1 -1
  79. package/dist/lib.js +31 -54
  80. package/dist/main.js +42 -42
  81. package/dist/map.js +8 -8
  82. package/dist/material.css +1 -1
  83. package/dist/pdf-reader.js +1 -1
  84. package/dist/print.js +1 -1
  85. package/dist/{public-B-greXGt.js → public-AXwv1h3v.js} +10 -10
  86. package/dist/{rich-code-block-Cv6s59vB.js → rich-code-block-qSvkA5rI.js} +5 -5
  87. package/dist/{sortable-provider-DVmZcglU.js → sortable-provider-DPk-RVEU.js} +3 -3
  88. package/dist/{spinner-OQAweH2r.js → spinner-PdSk7zEs.js} +1 -1
  89. package/dist/theme-picker.js +2 -2
  90. package/dist/{theme-toggle-DPx44p6a.js → theme-toggle-CZQckLDd.js} +2 -2
  91. package/dist/{toggle-group-BkH23Jk4.js → toggle-group-DXXlqid2.js} +1 -1
  92. package/dist/{toolbar-items-CQ3S_XZw.js → toolbar-items-BmNYNaRB.js} +3 -3
  93. package/dist/{translate-material-BHL4g2UB.js → translate-material-BlCQ6AW9.js} +1 -1
  94. package/dist/{translator-BJsjXcAp.js → translator-ChpeKCO3.js} +8 -2
  95. package/dist/{typography-CwhEwPay.js → typography-C4JSRr2B.js} +1 -1
  96. package/dist/{use-chat-composer-R0vng5RU.js → use-chat-composer-OUa9akfM.js} +1725 -1719
  97. package/dist/{use-heading-spy-Brcn0l_J.js → use-heading-spy-K-HUp4o_.js} +4 -4
  98. package/dist/{use-material-translation-mY3U83TV.js → use-material-translation-DkE9J5NE.js} +1 -1
  99. package/dist/{use-return-focus-BQ413TNG.js → use-return-focus-KypnR7vv.js} +1 -1
  100. package/docs/components/README.md +3 -1
  101. package/docs/components/buttons-and-actions.md +50 -0
  102. package/docs/components/data-display.md +14 -1
  103. package/docs/components/data-table-filter-and-lists.md +68 -4
  104. package/docs/components/form-fields.md +9 -1
  105. package/docs/components/primitives.md +209 -0
  106. package/docs/previews/buttons-actions-backlink.webp +0 -0
  107. package/docs/previews/buttons-actions-sharebutton.webp +0 -0
  108. package/docs/previews/primitives-segmentednav.webp +0 -0
  109. package/docs/previews/primitives-tabsnav.webp +0 -0
  110. package/docs/roadmap.md +2 -1
  111. package/docs/troubleshooting.md +42 -3
  112. package/lib/components/components.css +2 -0
  113. package/lib/components/ui/layout/app-shell/activity-backdrop.css +4 -3
  114. package/lib/components/ui/primitives/tabs/tabs-nav-forced.css +27 -0
  115. package/lib/components/ui/primitives/toggle-group/toggle-group-segmented.css +10 -2
  116. package/lib/components/ui/primitives/toggle-group/toggle-group.css +5 -1
  117. package/package.json +1 -1
  118. /package/dist/lib/{components/ui/collections/dnd → lib}/compose-refs.d.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @nxgt/material
2
2
 
3
+ ## 3.67.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#2079](https://github.com/softistx/nxgt-material/pull/2079) [`37b1427`](https://github.com/softistx/nxgt-material/commit/37b1427bfc7bc0438e2367f91b6d71ba117a8c16) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add `BackLink`: a link to the parent page, a ghost `LinkButton` with a leading arrow-left icon hidden from assistive tech and mirrored in right-to-left, named by its label ([#1694](https://github.com/softistx/nxgt-material/issues/1694)).
8
+
9
+ - [#2076](https://github.com/softistx/nxgt-material/pull/2076) [`280a39a`](https://github.com/softistx/nxgt-material/commit/280a39a6ce85a8f638899094dcfa48ea7d901071) Thanks [@SteveGT96](https://github.com/SteveGT96)! - RowMenu: `useRowMenuFocus()` hands the focus back to a given row's trigger once an async action, a toast or a follow-up dialog is over. It returns a `focusRef` for the table and `focusRowMenu(rowId)`, which matches the row by id exactly (`getRowId`'s, written on the trigger by `rowMenuColumn` and by the new `RowMenu` `rowId` prop), never by label. `findRowMenuTrigger(rowId, scope?)` is exported too ([#2075](https://github.com/softistx/nxgt-material/issues/2075)). `focusRowMenu` answers `true` only when the trigger holds the focus, and claims it again for two frames if a dialog or a toast takes it. Vue: [#2077](https://github.com/softistx/nxgt-material/issues/2077).
10
+
11
+ ## 3.66.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#2062](https://github.com/softistx/nxgt-material/pull/2062) [`6d1e6f6`](https://github.com/softistx/nxgt-material/commit/6d1e6f631b738f5e3c7539e2d54b73e36cbaa2e5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `NumberField` and `NumberFormField`: the +/− buttons are named after their field ("Increase Guests", "Diminuer Invités"), through the new `material.number-field.increase-named` and `decrease-named` keys (en, fr), so a form with several number fields no longer gives a screen reader identical buttons ([#1928](https://github.com/softistx/nxgt-material/issues/1928)). The name is the plain-text `label`, else `aria-label`; a field with neither keeps "Increase" / "Decrease". A test that looks the buttons up by the exact name `Increase` now needs `/^Increase/` or the full name. The Vue twin is the `vue` issue [#2060](https://github.com/softistx/nxgt-material/issues/2060).
16
+
17
+ - [#2078](https://github.com/softistx/nxgt-material/pull/2078) [`1c6ca26`](https://github.com/softistx/nxgt-material/commit/1c6ca2674d0cea09a3f728b041cae42d0c1f9ccd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add `SegmentedNav` and `SegmentedNavItem`, segmented route links: the segmented `ToggleGroup` look as a labelled `nav` of links, the current one marked `aria-current="page"` from `value` or `current` and drawn as the selected pill. Tab moves from link to link; on a phone the nav scrolls inside itself with an edge fade. The links render through React Router's `Link` or the `LinkComponentProvider`, with `preventScrollReset` on by default. The segmented and forced-colours `ToggleGroup` styles also follow `aria-current="page"`.
18
+
19
+ - [#2070](https://github.com/softistx/nxgt-material/pull/2070) [`59a0cdc`](https://github.com/softistx/nxgt-material/commit/59a0cdc8642bdca240f3483f743e808a9d2a747b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ShareButton` (Buttons & actions) shares a link, text or title (`url`, `text`, `title`) through `navigator.share` when the browser has it (and `canShare` accepts the data), does nothing when the user closes the sheet (`AbortError`), and otherwise copies the link with `CopyButton`'s "Copied" / "Copy failed" announcement. The accessible name stays "Share" (`SHARE_BUTTON_LABEL`, or `label`) and `onShare` reports `'shared'`, `'cancelled'`, `'copied'` or `'failed'`. `navigator` is read on click, so it server-renders. New text `material.share.share`, in English and French. Additive; React only for now. Fixes [#1945](https://github.com/softistx/nxgt-material/issues/1945).
20
+
21
+ - [#2073](https://github.com/softistx/nxgt-material/pull/2073) [`76c8eac`](https://github.com/softistx/nxgt-material/commit/76c8eac2c26fb38e47e43e317498b3c4a393b4d8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `StatCard` takes `href` (and `linkComponent`, like `LinkButton`; `LinkComponentProvider` applies too): the whole card becomes one link with a trailing chevron (a link without hover, on a phone), the card's hover border and focus-visible ring, named by its label and value ([#2072](https://github.com/softistx/nxgt-material/issues/2072)).
22
+
23
+ - [#2078](https://github.com/softistx/nxgt-material/pull/2078) [`1c6ca26`](https://github.com/softistx/nxgt-material/commit/1c6ca2674d0cea09a3f728b041cae42d0c1f9ccd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add `useTabParam`, `skipTabChange` and `tabIds` for route tabs kept in the URL. `useTabParam({ values })` reads `values` as literal types and returns the current `value` (an unknown param falls back to the default) and `hrefFor(tab)`, a `to` for `TabsNavLink` / `SegmentedNavItem` that keeps the other params, drops the hash (`keepHash` keeps it, since `ScrollRestoration` jumps to a hash) and writes no param for the default tab (`explicitDefault` writes it out). `skipTabChange()` is a `shouldRevalidate` that skips the loaders when only the tab param changed. `tabIds(value, prefix = 'tab')` returns the stable `<prefix>-<value>` / `<prefix>-panel-<value>` ids for the tab and its panel, for tests; the prefix keeps two tab sets on one page apart.
24
+
25
+ - [#2078](https://github.com/softistx/nxgt-material/pull/2078) [`1c6ca26`](https://github.com/softistx/nxgt-material/commit/1c6ca2674d0cea09a3f728b041cae42d0c1f9ccd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add `TabsNav` and `TabsNavLink`, route tabs as links: a labelled `nav` of links in the `Tabs` look (`underline` or `segmented`), the current one marked `aria-current="page"` from `value` or `current`, with the sliding indicator and the phone scroll cue. The links render through React Router's `Link` or the `LinkComponentProvider`, with `preventScrollReset` on by default. The current link stays marked in forced colours, links keep a 44px target on a coarse pointer, and inside an `ActivityLayout` with a `backdrop` the strip is a frosted band like `Tabs`.
26
+
27
+ ### Patch Changes
28
+
29
+ - [#2067](https://github.com/softistx/nxgt-material/pull/2067) [`b60e637`](https://github.com/softistx/nxgt-material/commit/b60e637ce3d9b94e84b1de570281582443628309) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Internal: the label hooks reuse `cleanObject` instead of six local copies ([#1941](https://github.com/softistx/nxgt-material/issues/1941)).
30
+
3
31
  ## 3.65.0
4
32
 
5
33
  ### Minor Changes
package/README.md CHANGED
@@ -526,6 +526,8 @@ Not components: what the stylesheet gives any element.
526
526
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-scrollarea.webp" width="120" alt="ScrollArea"> | [`ScrollArea`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#scrollarea), `ScrollBar` | Scroll container with a thin custom scrollbar that matches the theme. | `ScrollArea`, `ScrollBar` |
527
527
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-table.webp" width="120" alt="Table"> | [`Table`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#table), `TableHeader`, `TableBody`, `TableFooter`, `TableRow`, `TableHead`, `TableCell`, `TableCaption`, `TableEmpty` | Styled semantic table inside a scrollable wrapper; `TableEmpty` is the full-width "nothing here" row. | `Table` (same parts) |
528
528
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-tabs.webp" width="120" alt="Tabs"> | [`Tabs`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#tabs), `TabsList`, `TabsTrigger`, `TabsContent` | Tabs whose triggers can take an icon, in two looks: `underline` (the default) and the `segmented` pill. | `Tabs` (same parts) |
529
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-tabsnav.webp" width="120" alt="TabsNav"> | [`TabsNav`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#tabsnav), `TabsNavLink`, `useTabParam`, `skipTabChange`, `tabIds` | Route tabs as links: a `nav` of links in the `Tabs` look, with `aria-current="page"` on the current one, the sliding indicator and the phone scroll cue; `useTabParam` keeps the tab in the URL. | no equivalent yet |
530
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-segmentednav.webp" width="120" alt="SegmentedNav"> | [`SegmentedNav`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#segmentednav), `SegmentedNavItem` | Segmented links: the segmented `ToggleGroup` look as a `nav` of links, with `aria-current="page"` and the pill on the current one; it scrolls inside itself on a phone. | no equivalent yet |
529
531
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-toggle.webp" width="120" alt="Toggle"> | [`Toggle`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#toggle) | Pressable on / off button: default or outlined, three sizes. | `Toggle` |
530
532
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/primitives-togglegroup.webp" width="120" alt="ToggleGroup"> | [`ToggleGroup`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#togglegroup), `ToggleGroupItem`, `ToggleGroupSeparator` | Toggle group in three looks: connected (pill morph), segmented (sliding pill), separate; sizes sm, md, lg; horizontal or vertical. | `ToggleGroup`, `ToggleGroupItem` |
531
533
  | — | [`Activity`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/primitives.md#activity) | React `<Activity>` switched by a boolean `visible`. | `Activity` |
@@ -545,7 +547,9 @@ Not components: what the stylesheet gives any element.
545
547
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-toolbar.webp" width="120" alt="Toolbar"> | [`Toolbar`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#toolbar), `ToolbarButton`, `ToolbarToggle`, `ToolbarSeparator`, `ToolbarGroup`, `ToolbarToggleGroup`, `ToolbarToggleItem`, `ToolbarItemSlot`, `ToolbarMore`, `useToolbarEntry`, `useToolbarOverflow`, `useToolbarSpilled`, `useToolbarMoreAnchor`, `ToolbarPair` | A row of icon actions (WAI-ARIA toolbar): floating or docked, neutral or primary, comfortable or compact density, quiet, expressive or morph pressed look, rides above the phone keyboard, groups, choices and priorities spilling into More (a row or a column, with submenus, checkboxes and launched popovers and dialogs), `useToolbarOverflow` for a More of your own, your own controls and fields as items, hides on scroll. | — |
546
548
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-responsivebutton.webp" width="120" alt="ResponsiveButton"> | [`ResponsiveButton`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#responsivebutton) | Shows its label on desktop and collapses to icon-only on mobile, keeping the label for screen readers. | `ResponsiveButton` |
547
549
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-linkbutton.webp" width="120" alt="LinkButton"> | [`LinkButton`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#linkbutton), `IconLinkButton`, `ResponsiveLinkButton` | The button styles rendered as `react-router` links. | `LinkButton`, `IconLinkButton`, `ResponsiveLinkButton` |
550
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-backlink.webp" width="120" alt="BackLink"> | [`BackLink`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#backlink) | A ghost link to the parent page with a leading arrow, mirrored in right-to-left. | `BackLink` |
548
551
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-copybutton.webp" width="120" alt="CopyButton"> | [`CopyButton`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#copybutton), `CopyValue` | Copies a value to the clipboard and briefly shows a check mark. `CopyValue` displays the value next to the button. | `CopyButton`, `CopyValue` |
552
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-sharebutton.webp" width="120" alt="ShareButton"> | [`ShareButton`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#sharebutton) | Opens the system share sheet (`navigator.share`) and copies the link where there is none. | not yet |
549
553
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-highlighttext.webp" width="120" alt="HighlightText"> | [`HighlightText`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#highlighttext) | Marks case-insensitive matches of a query inside a string (`splitMatch`). | `HighlightText` |
550
554
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-loadmorebutton.webp" width="120" alt="LoadMoreButton"> | [`LoadMoreButton`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#loadmorebutton) | "Load more" button for cursor pagination; icon-only with a tooltip unless `expanded`. | `LoadMoreButton` |
551
555
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/buttons-actions-loadmorefooter.webp" width="120" alt="LoadMoreFooter"> | [`LoadMoreFooter`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/buttons-and-actions.md#loadmorefooter) | Footer of a paged list: shown-of-total line, load button, and a failed state with retry. | not yet |
@@ -639,7 +643,7 @@ Not components: what the stylesheet gives any element.
639
643
  | <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. | — |
640
644
  | <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). | — |
641
645
  | <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` |
642
- | <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, holds its width in a flex row, and `align="end"` sets them against its end edge. | `StatCard` |
646
+ | <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` |
643
647
  | <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` |
644
648
  | <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` |
645
649
  | <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` |
@@ -673,7 +677,7 @@ Not components: what the stylesheet gives any element.
673
677
  | --- | --- | --- | --- |
674
678
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-datatable.webp" width="120" alt="DataTable"> | [`DataTable`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#datatable), `DataTableColumnHeader`, `DataTablePagination`, `DataTableServerFooter`, `DataTableViewOptions` | TanStack Table v9 with sorting, filtering, selection, expandable rows, pagination or load-more, column visibility, skeleton rows while loading and your own empty state — or one server page at a time, with controlled sorting and selection, cursor Previous / Next links and row links. On a phone it keeps its header row and scrolls sideways in a keyboard-reachable region; the page does not. Or cards and tiles instead of the table (`layout`, `renderCard`, `renderTile`), and `layout={{ phone: 'tiles', wide: 'table' }}` for tiles on a phone ([cards and tiles guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/cards-and-tiles.md)). Long lists render only the rows in view (`virtual`). | `DataTable`, `DataTableColumnHeader`, `DataTablePagination`, `DataTableServerFooter`, `DataTableViewOptions` |
675
679
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-servertable.webp" width="120" alt="ServerTable"> | [`ServerTable`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#servertable), `createSorting`, `tableFilters`, `defineFilterModel`, `parseFilterQuery`, `serializeFilterQuery`, `paramsFromQuery`, `serverPagination`… | A server-mode `DataTable` driven by the URL's search params, for any router: the Filter in its top band with the page's title (optional), description and actions, the sort, forward cursor paging, a selection reset on a new query, the empty page (a scene and an action for "nothing yet", the filters as removable chips), a compact band (`bandDensity`), icon-only Previous / Next (`pageControls`, 44px targets on a touch screen, focus kept while a page loads), actions that stay on the search's row on a phone (`bandActions`), a bulk bar that reserves no row until a selection, bulk actions with `appliesTo` that count and run only the selected rows they apply to (hidden at zero), an accessible `name`, a `max` rows with a notice, and `focusTrigger()` to give the focus back after a dialog, a `filterRef` to focus the Filter, a page past the last (rows deleted) that says so and links back to the first, an error state with Retry for a failed fetch (`error`, `onRetry`), and one count announced. | `ServerTable`, `createSorting`, `tableFilters`, `serverPagination` |
676
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-rowmenu.webp" width="120" alt="RowMenu"> | [`RowMenu`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#rowmenu), `RowMenuTrigger`, `rowMenuColumn` | A row's "..." button named after its row ("Actions for Ada"; 44px on touch, 36px with a mouse from `md`), its menu aligned to the end with the destructive item last and 44px items on touch, and a column helper for `DataTable` and `ServerTable` under a hidden but named "Actions" header; focus returns to the button, also from a dialog an item opened. | — |
680
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-rowmenu.webp" width="120" alt="RowMenu"> | [`RowMenu`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#rowmenu), `RowMenuTrigger`, `rowMenuColumn` | A row's "..." button named after its row ("Actions for Ada"; 44px on touch, 36px with a mouse from `md`), its menu aligned to the end with the destructive item last and 44px items on touch, and a column helper for `DataTable` and `ServerTable` under a hidden but named "Actions" header; focus returns to the button, also from a dialog an item opened; `useRowMenuFocus()` / `focusRowMenu(rowId)` hands it back to one row's button after an async action, a toast or a later dialog. | — |
677
681
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-listempty.webp" width="120" alt="ListEmpty"> | [`ListEmpty`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#listempty) | A list's empty page: nothing yet (a title, or a scene, a line and an action), or nothing matches with what narrows it and a way out (a button or a link); its title is an `h2` (`headingLevel`). | `ListEmpty` |
678
682
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-pagefooter.webp" width="120" alt="PageFooter"> | [`PageFooter`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#pagefooter) | The page footer of a feed that is not a table (a list of cards, a news feed) under a `FilterBar`: the range ("21–40 of 134") and Previous / Next as real links built from the URL's cursor trail (`pageInfo`, `totalCount`, `params`; `totalCount` is optional: a feed with no total shows no range, only Previous / Next; `hideOnSinglePage` renders nothing when there is no previous and no next page), the same footer `ServerTable` draws, icon-only with `pageControls="icon"` (44px targets on a touch screen); an end with no page is a disabled button, `aria-disabled`. | `PageFooter` |
679
683
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/data-table-filter-lists-datagrid.webp" width="120" alt="DataGrid"> | [`DataGrid`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/data-table-filter-and-lists.md#datagrid) | An editable grid over `DataTable`'s columns: spreadsheet keys, a selected range, editors for text, numbers (with codes such as "abs"), options, dates and checkboxes, or your own; paste from Excel or Sheets, a fill handle that continues series, resizable, hideable and reorderable columns, undo, totals, and saving per cell, per row or in a batch with versions and conflicts ([guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/data-grid.md)). Long grids render only what is in view; on a phone it is a list of rows that open a panel. | — (later) |
@@ -3,7 +3,7 @@ import { t } from "./utils-BLfntITJ.js";
3
3
  import { o as n } from "./dist-DVRQkaTK.js";
4
4
  import { c as r, s as i } from "./dist-lmHmz_bu.js";
5
5
  import { t as a } from "./in-dialog-Vwkyp-M5.js";
6
- 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-BQ413TNG.js";
6
+ 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-KypnR7vv.js";
7
7
  import { i as _ } from "./escape-owner-DpaP0lm1.js";
8
8
  import * as v from "react";
9
9
  import { jsx as y, jsxs as b } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { l as e, r as t, s as n, u as r } from "./translator-BJsjXcAp.js";
1
+ import { l as e, r as t, s as n, u as r } from "./translator-ChpeKCO3.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";
@@ -72,8 +72,31 @@ function x(e) {
72
72
  return /^(https?:)?\/\//.test(e) || e.startsWith("mailto:");
73
73
  }
74
74
  //#endregion
75
+ //#region lib/lib/object.utils.ts
76
+ function S(e, t) {
77
+ let n = {};
78
+ if (!Array.isArray(t)) n[t] = e?.[t];
79
+ else for (let r of t) n[r] = e?.[r];
80
+ return n;
81
+ }
82
+ function C(e, t) {
83
+ let n = { ...e };
84
+ if (Array.isArray(t)) for (let e of t) delete n?.[e];
85
+ else delete n?.[t];
86
+ return n ?? {};
87
+ }
88
+ function w(e) {
89
+ return e;
90
+ }
91
+ async function T(e) {
92
+ return await e;
93
+ }
94
+ function E(e, t = !1) {
95
+ return Object.fromEntries(Object.entries(e).filter(([e, n]) => t ? n != null && n !== void 0 : n !== void 0));
96
+ }
97
+ //#endregion
75
98
  //#region lib/lib/zod-error-map.ts
76
- var S = (e) => {
99
+ var D = (e) => {
77
100
  let t = typeof e;
78
101
  switch (t) {
79
102
  case "number": return Number.isNaN(e) ? "NaN" : "number";
@@ -83,7 +106,7 @@ var S = (e) => {
83
106
  if (Object.getPrototypeOf(e) !== Object.prototype && e.constructor) return e.constructor.name;
84
107
  }
85
108
  return t;
86
- }, C = ({ storageKey: i = e, language: a, translate: o = t } = {}) => {
109
+ }, O = ({ storageKey: i = e, language: a, translate: o = t } = {}) => {
87
110
  let s = () => typeof a == "function" ? a() : a ?? n(i, "en", r);
88
111
  return (e) => {
89
112
  let t = s(), n = (e, n) => o(e, n, t), r = (e, t) => {
@@ -94,7 +117,7 @@ var S = (e) => {
94
117
  case "invalid_type": {
95
118
  let t = {
96
119
  expected: e.expected,
97
- received: S(e.input)
120
+ received: D(e.input)
98
121
  };
99
122
  return e.input ? r(`material.zod.invalid_type.${e.expected}`, t) ?? n("material.zod.invalid_type.default", t) : n("material.zod.required", t);
100
123
  }
@@ -119,12 +142,12 @@ var S = (e) => {
119
142
  };
120
143
  //#endregion
121
144
  //#region ../../node_modules/redux/dist/redux.mjs
122
- function w(e) {
145
+ function k(e) {
123
146
  return `Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `;
124
147
  }
125
- var T = () => Math.random().toString(36).substring(7).split("").join(".");
126
- `${/* @__PURE__ */ T()}`, `${/* @__PURE__ */ T()}`;
127
- function E(e) {
148
+ var A = () => Math.random().toString(36).substring(7).split("").join(".");
149
+ `${/* @__PURE__ */ A()}`, `${/* @__PURE__ */ A()}`;
150
+ function j(e) {
128
151
  if (e === void 0) return "undefined";
129
152
  if (e === null) return "null";
130
153
  let t = typeof e;
@@ -136,9 +159,9 @@ function E(e) {
136
159
  case "function": return t;
137
160
  }
138
161
  if (Array.isArray(e)) return "array";
139
- if (k(e)) return "date";
140
- if (O(e)) return "error";
141
- let n = D(e);
162
+ if (P(e)) return "date";
163
+ if (N(e)) return "error";
164
+ let n = M(e);
142
165
  switch (n) {
143
166
  case "Symbol":
144
167
  case "Promise":
@@ -149,42 +172,42 @@ function E(e) {
149
172
  }
150
173
  return Object.prototype.toString.call(e).slice(8, -1).toLowerCase().replace(/\s/g, "");
151
174
  }
152
- function D(e) {
175
+ function M(e) {
153
176
  return typeof e.constructor == "function" ? e.constructor.name : null;
154
177
  }
155
- function O(e) {
178
+ function N(e) {
156
179
  return e instanceof Error || typeof e.message == "string" && e.constructor && typeof e.constructor.stackTraceLimit == "number";
157
180
  }
158
- function k(e) {
181
+ function P(e) {
159
182
  return e instanceof Date || typeof e.toDateString == "function" && typeof e.getDate == "function" && typeof e.setDate == "function";
160
183
  }
161
- function A(e) {
184
+ function F(e) {
162
185
  let t = typeof e;
163
- return process.env.NODE_ENV !== "production" && (t = E(e)), t;
186
+ return process.env.NODE_ENV !== "production" && (t = j(e)), t;
164
187
  }
165
- function j(e, t) {
188
+ function I(e, t) {
166
189
  return function(...n) {
167
190
  return t(e.apply(this, n));
168
191
  };
169
192
  }
170
- function M(e, t) {
171
- if (typeof e == "function") return j(e, t);
172
- if (typeof e != "object" || !e) throw Error(process.env.NODE_ENV === "production" ? w(16) : `bindActionCreators expected an object or a function, but instead received: '${A(e)}'. Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?`);
193
+ function L(e, t) {
194
+ if (typeof e == "function") return I(e, t);
195
+ if (typeof e != "object" || !e) throw Error(process.env.NODE_ENV === "production" ? k(16) : `bindActionCreators expected an object or a function, but instead received: '${F(e)}'. Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?`);
173
196
  let n = {};
174
197
  for (let r in e) {
175
198
  let i = e[r];
176
- typeof i == "function" && (n[r] = j(i, t));
199
+ typeof i == "function" && (n[r] = I(i, t));
177
200
  }
178
201
  return n;
179
202
  }
180
203
  //#endregion
181
204
  //#region lib/lib/redux/use-actions.ts
182
- function N(e, t) {
205
+ function R(e, t) {
183
206
  let n = u();
184
- return a(() => M(e, n), t ? [n, ...t] : [n]);
207
+ return a(() => L(e, n), t ? [n, ...t] : [n]);
185
208
  }
186
209
  //#endregion
187
210
  //#region lib/lib/redux/async-slice.ts
188
- var P = s({ creators: { asyncThunk: o } });
211
+ var z = s({ creators: { asyncThunk: o } });
189
212
  //#endregion
190
- export { x as a, v as c, h as d, p as f, d as h, C as i, _ as l, f as m, N as n, b as o, g as p, S as r, y as s, P as t, m as u };
213
+ export { p as _, w as a, d as b, C as c, b as d, y as f, h as g, m as h, O as i, S as l, _ as m, R as n, T as o, v as p, D as r, E as s, z as t, x as u, g as v, f as y };
@@ -2,7 +2,7 @@ import { r as e } from "./rolldown-runtime-BFFgcFxR.js";
2
2
  import { a as t, i as n, n as r, r as i } from "./icon-sprites-CaYXzOL4.js";
3
3
  import { t as a } from "./is-production-GLw59WU8.js";
4
4
  import { a as o, t as s } from "./theme-context-Cofk6vgs.js";
5
- import { t as c } from "./compose-refs-DZ0iIVF-.js";
5
+ import { t as c } from "./compose-refs-G4J4kaUA.js";
6
6
  import { t as l } from "./use-background-activity-KxQgelFF.js";
7
7
  import { t as u } from "./scene-svg-DJKa5vsg.js";
8
8
  import { n as d, r as f, t as p } from "./scene-options-2zNF3ZkQ.js";
@@ -1,3 +1,3 @@
1
- import { r as e, t } from "./background-qdnet2A5.js";
1
+ import { r as e, t } from "./background-D1gC4m2R.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 };
@@ -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, r as i, t as a } from "./spinner-OQAweH2r.js";
3
+ import { n as r, r as i, t as a } from "./spinner-PdSk7zEs.js";
4
4
  import { a as o, i as s, n as c, o as l, s as u, t as d } from "./use-click-lock-BZYtTmVt.js";
5
5
  import { t as f } from "./is-production-GLw59WU8.js";
6
6
  import { t as p } from "./button-group-context-CaP0X5p_.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
3
  import { t as n } from "./warn-once-C_e47JM8.js";
4
- import { t as r } from "./button-D5k3K-gM.js";
5
- import { t as i } from "./use-material-translation-mY3U83TV.js";
4
+ import { t as r } from "./button-2de_lrix.js";
5
+ import { t as i } from "./use-material-translation-DkE9J5NE.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-lWXIJkqo.js";
9
+ import { t as d } from "./chip-Cs0uEjpu.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 { r as t } from "./spinner-OQAweH2r.js";
2
+ import { r as t } from "./spinner-PdSk7zEs.js";
3
3
  import { s as n } from "./use-click-lock-BZYtTmVt.js";
4
- import { t as r } from "./use-material-translation-mY3U83TV.js";
4
+ import { t as r } from "./use-material-translation-DkE9J5NE.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 { 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-ChvAIQIW.js";
5
- import { a as c, i as l, n as u } from "./field-blur-context-C8BX8IBy.js";
6
- import { a as d, d as f, r as p, t as m, u as h } from "./toolbar-items-CQ3S_XZw.js";
4
+ import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-DdzyvN76.js";
5
+ import { a as c, i as l, n as u } from "./field-blur-context-BZtwcPUV.js";
6
+ import { a as d, d as f, r as p, t as m, u as h } from "./toolbar-items-BmNYNaRB.js";
7
7
  import { t as g } from "./is-production-GLw59WU8.js";
8
- import { t as _ } from "./use-material-translation-mY3U83TV.js";
9
- import { i as v, n as y, o as b, t as x } from "./code-language-items-CsaXyApg.js";
8
+ import { t as _ } from "./use-material-translation-DkE9J5NE.js";
9
+ import { i as v, n as y, o as b, t as x } from "./code-language-items-xhmbF6wA.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,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-CQ3S_XZw.js";
4
- import { t as o } from "./use-material-translation-mY3U83TV.js";
5
- import { i as s, n as c, o as l } from "./code-language-items-CsaXyApg.js";
6
- import { r as u, t as d } from "./field-blur-CV9orzdJ.js";
3
+ import { d as n, r, t as i, u as a } from "./toolbar-items-BmNYNaRB.js";
4
+ import { t as o } from "./use-material-translation-DkE9J5NE.js";
5
+ import { i as s, n as c, o as l } from "./code-language-items-xhmbF6wA.js";
6
+ import { r as u, t as d } from "./field-blur-B2y-bNYi.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-aXG4CdY-.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-BYhBAfcc.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";
14
14
  import { getCspNonce as F } from "@nxgt/material-core/csp-nonce";
@@ -1,5 +1,5 @@
1
- import { d as e, f as t } from "./dropdown-menu-ChvAIQIW.js";
2
- import { t as n } from "./use-material-translation-mY3U83TV.js";
1
+ import { d as e, f as t } from "./dropdown-menu-DdzyvN76.js";
2
+ import { t as n } from "./use-material-translation-DkE9J5NE.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";
@@ -122,6 +122,8 @@
122
122
  @import "./ui/primitives/accordion/accordion.css";
123
123
  @import "./ui/primitives/accordion/accordion-surfaces.css";
124
124
  @import "./ui/primitives/collapsible/collapsible.css";
125
+ /* TabsNav in forced colours (the current link's mark). */
126
+ @import "./ui/primitives/tabs/tabs-nav-forced.css";
125
127
  /* ToggleGroup: shared rules, then one file per variant. */
126
128
  @import "./ui/primitives/toggle-group/toggle-group.css";
127
129
  @import "./ui/primitives/toggle-group/toggle-group-connected.css";
@@ -149,9 +149,10 @@
149
149
  backdrop-filter: blur(var(--nxgt-backdrop-blur));
150
150
  }
151
151
 
152
- /* Tabs: the strip is a band, its top corners rounded. (The segmented look
153
- * has its own track.) */
154
- [data-slot="activity-layout"][data-backdrop] [data-slot="tabs-list"] {
152
+ /* Tabs and route tabs (`TabsNav`): the strip is a band, its top corners
153
+ * rounded. (The segmented look has its own track.) */
154
+ [data-slot="activity-layout"][data-backdrop]
155
+ :is([data-slot="tabs-list"], [data-slot="tabs-nav"]) {
155
156
  border-start-start-radius: var(--radius);
156
157
  border-start-end-radius: var(--radius);
157
158
  background: var(--nxgt-backdrop-fill-nav);
@@ -0,0 +1,27 @@
1
+ /* The indicator hides when no link is current (a `value` that matches none). */
2
+ [data-slot="tabs-nav"]:not(:has([data-state="active"]))
3
+ > [data-slot="tabs-indicator"] {
4
+ visibility: hidden;
5
+ }
6
+
7
+ /* TabsNav in forced colours: the current link keeps a mark. The indicator and
8
+ * the active link's ::after are backgrounds and borders, which the browser
9
+ * flattens; they are painted again with the system Highlight. React only
10
+ * (tabs-classes.ts is shared with Vue, so this is not a class there). */
11
+ @media (forced-colors: active) {
12
+ [data-slot="tabs-nav"][data-variant="underline"]
13
+ > [data-slot="tabs-indicator"],
14
+ [data-slot="tabs-nav"][data-variant="underline"]
15
+ [data-slot="tabs-trigger"][aria-current="page"]::after {
16
+ forced-color-adjust: none;
17
+ background: Highlight;
18
+ }
19
+ [data-slot="tabs-nav"][data-variant="segmented"]
20
+ > [data-slot="tabs-indicator"],
21
+ [data-slot="tabs-nav"][data-variant="segmented"]
22
+ [data-slot="tabs-trigger"][aria-current="page"]::after {
23
+ forced-color-adjust: none;
24
+ border: 2px solid Highlight;
25
+ background: Canvas;
26
+ }
27
+ }
@@ -61,7 +61,8 @@
61
61
  > .nxgt-toggle-group-item:hover:not(
62
62
  :disabled,
63
63
  [aria-checked="true"],
64
- [aria-pressed="true"]
64
+ [aria-pressed="true"],
65
+ [aria-current="page"]
65
66
  ) {
66
67
  background: var(--tg-seg-hover);
67
68
  }
@@ -78,7 +79,11 @@
78
79
  * every chosen state is primary). Forced colours: the pill is hidden and
79
80
  * the SelectedItem rule in toggle-group.css wins (its layer-less rule). */
80
81
  [data-variant="segmented"]
81
- > .nxgt-toggle-group-item:is([aria-checked="true"], [aria-pressed="true"]) {
82
+ > .nxgt-toggle-group-item:is(
83
+ [aria-checked="true"],
84
+ [aria-pressed="true"],
85
+ [aria-current="page"]
86
+ ) {
82
87
  color: var(--primary-text);
83
88
  }
84
89
 
@@ -135,6 +140,9 @@
135
140
  /* Multiple: a pill per pressed item; touching pills join. Also a single
136
141
  * group of 9 or more items, which has no sliding pill. */
137
142
  [data-variant="segmented"] > .nxgt-toggle-group-item[aria-pressed="true"],
143
+ /* SegmentedNav: a scrolling track has no sliding pill, the current link
144
+ * paints its own. */
145
+ [data-variant="segmented"] > .nxgt-toggle-group-item[aria-current="page"],
138
146
  [data-variant="segmented"]:has(> .nxgt-toggle-group-item:nth-of-type(9))
139
147
  > .nxgt-toggle-group-item[aria-checked="true"] {
140
148
  background: var(--tg-pill);
@@ -127,7 +127,11 @@
127
127
  .nxgt-toggle-group-item {
128
128
  border: 1px solid ButtonText;
129
129
  }
130
- .nxgt-toggle-group-item:is([aria-checked="true"], [aria-pressed="true"]) {
130
+ .nxgt-toggle-group-item:is(
131
+ [aria-checked="true"],
132
+ [aria-pressed="true"],
133
+ [aria-current="page"]
134
+ ) {
131
135
  forced-color-adjust: none;
132
136
  background: SelectedItem;
133
137
  color: SelectedItemText;