@nxgt/material 3.62.0 → 3.64.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 (103) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +1 -1
  3. package/dist/alert-dialog-RHm6WtQj.js +189 -0
  4. package/dist/{async-slice-HJY_VJjD.js → async-slice-DmX59NyA.js} +3 -4
  5. package/dist/{button-7BuUCGRm.js → button-DfS_amfQ.js} +1 -1
  6. package/dist/charts.js +3 -3
  7. package/dist/{chip-kQOrHlDX.js → chip-Cbndukko.js} +2 -2
  8. package/dist/{code-editor-Ckc9TTCM.js → code-editor-B0tN8Ha_.js} +11 -11
  9. package/dist/code-editor.js +5 -5
  10. package/dist/{code-language-items-rCPB0Xee.js → code-language-items-andgHKrM.js} +2 -2
  11. package/dist/components/ui/layout/sidebar/sidebar-tokens.css +13 -1
  12. package/dist/{components-TDDUQ1Y0.js → components-2kTVPsMg.js} +15801 -15541
  13. package/dist/components.js +28 -26
  14. package/dist/dialog-Bd7Hid2L.js +219 -0
  15. package/dist/dnd.js +1 -1
  16. package/dist/{dropdown-menu-CiobN1wi.js → dropdown-menu-_SyVmSuy.js} +1 -1
  17. package/dist/editor.js +707 -706
  18. package/dist/{empty-state-DA517HAb.js → empty-state-D-2ZMXXJ.js} +2 -2
  19. package/dist/escape-owner-DpaP0lm1.js +19 -0
  20. package/dist/{field-blur-DdvY0NQQ.js → field-blur-DyOByjzw.js} +1 -1
  21. package/dist/{field-blur-context-DbJQZkEB.js → field-blur-context-DPe5_Nv5.js} +1 -1
  22. package/dist/hooks-a7_exKWS.js +329 -0
  23. package/dist/hooks.js +3 -3
  24. package/dist/{hover-card-DPs9huSs.js → hover-card-D_0smKBQ.js} +2 -2
  25. package/dist/i18n.js +8 -10
  26. package/dist/{icon-badge-C646JTOI.js → icon-badge-CBCU3ySF.js} +14 -14
  27. package/dist/{icon-button-DvP0Gy3j.js → icon-button-hKHsWTAt.js} +1 -1
  28. package/dist/lib/components/ui/actions/load-more-footer/load-more-footer.d.ts +11 -2
  29. package/dist/lib/components/ui/actions/load-more-footer/use-footer-focus.d.ts +15 -0
  30. package/dist/lib/components/ui/actions/load-more-footer/use-last-page.d.ts +9 -0
  31. package/dist/lib/components/ui/collections/filter/bar/partials/filter-inline-chips.d.ts +11 -0
  32. package/dist/lib/components/ui/collections/filter/bar/partials/filter-inline-list.d.ts +6 -0
  33. package/dist/lib/components/ui/collections/server-table/partials/server-table-grid-paging.d.ts +9 -0
  34. package/dist/lib/components/ui/collections/server-table/partials/server-table-load-more.d.ts +17 -0
  35. package/dist/lib/components/ui/collections/server-table/types-paging.d.ts +10 -0
  36. package/dist/lib/components/ui/feedback/index.d.ts +1 -0
  37. package/dist/lib/components/ui/feedback/unsaved-dialog/index.d.ts +1 -0
  38. package/dist/lib/components/ui/feedback/unsaved-dialog/unsaved-dialog.d.ts +20 -0
  39. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  40. package/dist/lib/components/ui/fields/textarea-field/textarea-footer.d.ts +2 -1
  41. package/dist/lib/components/ui/widgets/education/questions/index.d.ts +3 -1
  42. package/dist/lib/components/ui/widgets/education/questions/partials/question-content.d.ts +1 -1
  43. package/dist/lib/components/ui/widgets/education/questions/partials/question-top.d.ts +6 -0
  44. package/dist/lib/components/ui/widgets/education/questions/question-long-text.d.ts +5 -0
  45. package/dist/lib/components/ui/widgets/education/questions/question-media-content.d.ts +24 -0
  46. package/dist/lib/components/ui/widgets/education/questions/question-media-helpers.d.ts +11 -0
  47. package/dist/lib/components/ui/widgets/education/questions/question-media-view.d.ts +18 -0
  48. package/dist/lib/components/ui/widgets/education/questions/question-media-view.types.d.ts +32 -0
  49. package/dist/lib/components/ui/widgets/education/questions/question-options.d.ts +2 -2
  50. package/dist/lib/components/ui/widgets/education/questions/question-text.d.ts +1 -1
  51. package/dist/lib/components/ui/widgets/education/questions/question.d.ts +1 -1
  52. package/dist/lib/components/ui/widgets/education/questions/types.d.ts +52 -1
  53. package/dist/lib/components/ui/widgets/education/questions/use-reload-focus.d.ts +13 -0
  54. package/dist/lib/hooks/index.d.ts +3 -0
  55. package/dist/lib/hooks/unsaved-guard-rules.d.ts +30 -0
  56. package/dist/lib/hooks/use-react-router-block.d.ts +11 -0
  57. package/dist/lib/hooks/use-unsaved-guard/guard-core.d.ts +30 -0
  58. package/dist/lib/hooks/use-unsaved-guard/index.d.ts +3 -0
  59. package/dist/lib/hooks/use-unsaved-guard/types.d.ts +63 -0
  60. package/dist/lib/hooks/use-unsaved-guard/use-discard-guard.d.ts +15 -0
  61. package/dist/lib/hooks/use-unsaved-guard/use-unsaved-guard.d.ts +19 -0
  62. package/dist/lib/i18n/resources/en/en.d.ts +20 -0
  63. package/dist/lib/i18n/resources/en/material.json.d.ts +21 -1
  64. package/dist/lib/i18n/resources/fr/fr.d.ts +20 -0
  65. package/dist/lib/i18n/resources/fr/material.json.d.ts +21 -1
  66. package/dist/lib/i18n/resources/resources.d.ts +40 -0
  67. package/dist/lib/i18n/translator.d.ts +1 -1
  68. package/dist/lib.js +1 -1
  69. package/dist/main.js +42 -43
  70. package/dist/map.js +63 -63
  71. package/dist/material.css +1 -1
  72. package/dist/pdf-reader.js +1 -1
  73. package/dist/print.js +1 -2
  74. package/dist/{public-BYsrhyPW.js → public-D8JGp3PH.js} +823 -822
  75. package/dist/{rich-code-block-WJxDWPPY.js → rich-code-block-0R3bidsM.js} +5 -5
  76. package/dist/{sortable-provider-oPjlhlZo.js → sortable-provider-B75v53sB.js} +2 -2
  77. package/dist/{spinner-C5lObWXT.js → spinner-CAnpF3RK.js} +1 -1
  78. package/dist/theme-picker.js +2 -2
  79. package/dist/{theme-toggle-CPEq5JG-.js → theme-toggle-pQ5F602V.js} +1 -1
  80. package/dist/{toolbar-items-ByvXcMHm.js → toolbar-items-_ezD5B0r.js} +4 -4
  81. package/dist/translate-material-CvZK8_S6.js +96 -0
  82. package/dist/{stored-language-B-tiWZU2.js → translator-Caf-d96e.js} +2497 -8
  83. package/dist/{escape-owner-r57kuPjn.js → typography-CEK19bj8.js} +17 -34
  84. package/dist/{use-chat-composer-CzOVaIed.js → use-chat-composer-Dpvi_-CR.js} +5164 -5338
  85. package/dist/{use-heading-spy-BOtygPFu.js → use-heading-spy-mmcyEGmm.js} +186 -71
  86. package/dist/{use-material-translation-B5j3jZs7.js → use-material-translation-C_1cWRzW.js} +1 -2
  87. package/dist/use-return-focus-1ZIchrBM.js +269 -0
  88. package/docs/components/buttons-and-actions.md +2 -2
  89. package/docs/components/data-table-filter-and-lists.md +96 -0
  90. package/docs/components/feedback-and-status.md +23 -0
  91. package/docs/components/navigation-and-layout.md +4 -3
  92. package/docs/components/rich-widgets.md +75 -1
  93. package/docs/guides/helpers.md +63 -0
  94. package/docs/guides/theming.md +13 -3
  95. package/docs/previews/feedback-status-unsaveddialog.webp +0 -0
  96. package/docs/roadmap.md +4 -0
  97. package/lib/components/ui/layout/sidebar/sidebar-tokens.css +13 -1
  98. package/package.json +2 -2
  99. package/dist/dialog-yfPkLqUQ.js +0 -482
  100. package/dist/hooks-CGnqFngB.js +0 -187
  101. package/dist/i18n-provider-BehR6cU7.js +0 -79
  102. package/dist/translate-material-tUaLZUmT.js +0 -20
  103. package/dist/translator-B9XjUDRu.js +0 -2451
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @nxgt/material
2
2
 
3
+ ## 3.64.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#2034](https://github.com/softistx/nxgt-material/pull/2034) [`fb176de`](https://github.com/softistx/nxgt-material/commit/fb176de3620b5b067e01274bfe8b8c9504027a52) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `QuestionCard`: a persistent description and an exposed prompt id. `Question.description` renders a static helper line inside the card, under the answer field of an `open` or `code` question ("A person will mark this answer"), linked to the textarea by `aria-describedby` and kept once the card is revealed; `hint` (the reveal button) is unchanged. `QuestionCodeField` gains `describedBy`, the id of that line, for `renderCode` to add to the editor's `aria-describedby`. `QuestionProps.promptId` sets the id of the prompt (a generated one by default) so a wrapper can use `aria-labelledby`; the description's id is `${promptId}-description`. Additive ([#2027](https://github.com/softistx/nxgt-material/issues/2027)).
8
+
9
+ - [#2026](https://github.com/softistx/nxgt-material/pull/2026) [`3f0e769`](https://github.com/softistx/nxgt-material/commit/3f0e76915a8bd4d77662db218afa1a112edd5eec) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ServerTable`: a chip-group filter and a load-more footer for lists that load more instead of paging ([#2008](https://github.com/softistx/nxgt-material/issues/2008)).
10
+
11
+ - A `chips-single` or `chips-multiple` filter field declared `inline: true` is shown as a chip group in the filter band at every width, in place of a quick pill that opens an editor: pressing a chip sets the condition, pressing the chosen one clears it. It is a plain filter (counted, in the URL, cleared by "Clear all") with no chip of its own (a condition the group cannot draw, such as another operator set by code, keeps its normal chip), and is not offered in "Add filter". `defineFilterModel` rejects `inline` without options, on another type, with a `default`, a `scope` or `addable: false`. `@nxgt/material-core/filter` exports `isInline` and `inlineShows(field, condition)`, the rule that keeps a condition the group cannot draw as a normal chip.
12
+ - `footer="load-more"` renders `LoadMoreFooter` ("Showing N of M", the load button, a failed alert with a retry) in place of Previous / Next, with `onLoadMore`, `isLoadingMore`, `loadMoreFailed` and `loadMoreLabel`. The page keeps the loaded rows in `rows`: reset them whenever `params` change and append only the next page in `onLoadMore`, with `isLoadingMore` while it loads and `loadMoreFailed` when it fails (the docs have a worked example). Without `onLoadMore` it warns in development. The selection count stays. Without it the footer is unchanged. No new `material.*` string: the footer's keys exist already.
13
+
14
+ `LoadMoreFooter` (behaviour change for existing consumers): after the last page the footer now keeps a polite "Showing N of N" status line instead of vanishing, and takes the focus if its button had it as it went away (the footer is `tabIndex={-1}`, `outline-none`). A list that never had a next page still renders nothing, and a list that restarts smaller drops the line (a heuristic: give a standalone footer a `key` naming the query for a restart at the same size or larger; `ServerTable` does so by itself on a `params` change). Opt out of the line with `showCount={false}`. Props still spread after `data-slot` and `className` as before; `ref` and `tabIndex` are now fixed, and `onFocus` / `onBlur` are chained.
15
+
16
+ ### Patch Changes
17
+
18
+ - [#2035](https://github.com/softistx/nxgt-material/pull/2035) [`2591bb7`](https://github.com/softistx/nxgt-material/commit/2591bb76716e618e95e74884fd30dffba9b0e2f1) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Roadmap: Link navigation, RecordActionsMenu and Cursor trail cap planned under Next.
19
+ - Updated dependencies [[`2591bb7`](https://github.com/softistx/nxgt-material/commit/2591bb76716e618e95e74884fd30dffba9b0e2f1), [`3f0e769`](https://github.com/softistx/nxgt-material/commit/3f0e76915a8bd4d77662db218afa1a112edd5eec)]:
20
+ - @nxgt/material-core@0.45.0
21
+
22
+ ## 3.63.0
23
+
24
+ ### Minor Changes
25
+
26
+ - [#2016](https://github.com/softistx/nxgt-material/pull/2016) [`ee0f79a`](https://github.com/softistx/nxgt-material/commit/ee0f79ae125d4154c043c1700276de57fee0a7df) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `QuestionCard`: open and code answers. `Question.kind` gains `'open'` (a multi-line answer in a textarea, with a counter when `question.maxLength` is set) and `'code'` (source code). The card keeps its prompt, number, media, hint and verdict frame, and the field is named by the prompt. New props: `readOnly` (an answer already submitted, shown without the revealed marks), `busy` (read-only and `aria-busy` while saving), both honoured by every kind (choice, multi, boolean, text, number too, locked without the revealed marks) and `renderCode`, a slot that draws the `code` field from a `QuestionCodeField` (`value`, `onChange`, `label`, `labelledBy`, `language`, `maxLength`, `readOnly`, `disabled`), for example with `CodeEditor` from `@nxgt/material/code-editor`; Monaco stays out of the `QuestionCard` bundle, and without `renderCode` the field is a monospace textarea. `Question` gains `maxLength` and `language`. `open` and `code` have no `correct`: pass the grader's `verdict`. New strings: `material.education.kind-open`, `kind-code`, `code-placeholder` (English and French). Additive ([#2000](https://github.com/softistx/nxgt-material/issues/2000)).
27
+
28
+ `TextareaField`: the character count now has an id joined into the textarea's `aria-describedby`, and is announced politely (`role="status"`) only within 10% of `maxLength`.
29
+
30
+ - [#2018](https://github.com/softistx/nxgt-material/pull/2018) [`41931d0`](https://github.com/softistx/nxgt-material/commit/41931d061b05d17c8da907516d016cbd24262191) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `QuestionMediaView`: a question's file, picked by its content type. `media` has the shape of `Question.media` plus `size?` (`src`, `type`, `alt?`, `name?`, `kind?`), so `question.media` goes straight in: an image with its `alt` (else a generic name), an `AudioPlayer`, a `<video controls>` (with optional `captions` tracks), and any other type (a PDF) as an open-in-a-new-tab link showing the file type and size, which fetches nothing (no `connect-src` or bucket CORS needed); `documents="preview"` draws a `FilePreview` instead. When the file fails to load (an expired presigned link) an alert says so, with a Reload button when `onReload` is passed (`reloading` shows it busy); a new `src` is a new chance. Named `QuestionMediaView` because `QuestionMedia` is already the type of `Question.media`. After a Reload that works, focus moves to the file when it was on the button. New strings: `material.question-media.*` (English and French). Additive ([#2001](https://github.com/softistx/nxgt-material/issues/2001)).
31
+
32
+ - [#2024](https://github.com/softistx/nxgt-material/pull/2024) [`62c6a40`](https://github.com/softistx/nxgt-material/commit/62c6a4017c929de5b5da374ce03348729658f893) Thanks [@SteveGT96](https://github.com/SteveGT96)! - feat(sidebar): add `--sidebar-active-edge`, the colour of the active entry's start bar (`bg-sidebar-active-edge`). It defaults to `--sidebar-active-foreground`, so nothing changes unless a theme sets it, and then only the bar changes.
33
+
34
+ - [#2022](https://github.com/softistx/nxgt-material/pull/2022) [`7eb67b3`](https://github.com/softistx/nxgt-material/commit/7eb67b30ee88516e33649b2101d278554ac90625) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add the unsaved-changes guard ([#1658](https://github.com/softistx/nxgt-material/issues/1658)). `useUnsavedGuard(dirty, { block, leaves?, ignoreSearch?, onBlock? })` in `@nxgt/material/hooks` blocks in-app navigation while a form is dirty and guards `beforeunload`; it returns `{ release, dialog }` (`release()` is synchronous and one-shot: the next navigation that really leaves passes, then the guard re-arms, and a release no navigation used expires when the current task ends; call it before the navigation that follows a save). The router is injected through a `block` adapter, `useReactRouterBlock` being the ready one for React Router. By default a pathname or query-string change is a leave; `ignoreSearch` or a `leaves(current, next)` predicate changes that, and `onBlock()` can flush pending saves and let the navigation through silently. `dirty` may be a function read at block time. `useDiscardGuard(dirty)` returns `{ close(action), dialog }` for a form in a dialog or sheet. New `UnsavedDialog` component (`material.unsaved.*` keys, en and fr). No Vue twin yet ([#2019](https://github.com/softistx/nxgt-material/issues/2019)).
35
+
3
36
  ## 3.62.0
4
37
 
5
38
  ### Minor Changes
package/README.md CHANGED
@@ -220,7 +220,7 @@ reads `duotone.svg`, the file that exists (it used to ask for the missing
220
220
  | `@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)) |
221
221
  | `@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)) |
222
222
  | `@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)) |
223
- | `@nxgt/material/hooks` | `useTheme`, `useIsClient`, `useIsMobile`, `useLocalizedDate`, `useCspNonce`, `useFocusOnMount`, `useCountdown`, `useSubmitOnce`, `useDrafts`, … ([helpers](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/helpers.md#nxgtmaterialhooks)) |
223
+ | `@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)) |
224
224
  | `@nxgt/material/dnd` | `@dnd-kit` primitives ([helpers](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/helpers.md#nxgtmaterialdnd)) |
225
225
  | `@nxgt/material/i18n` | `I18nProvider`, `mergeResources`, `createTranslator`, `translateMaterial`, `formatMessage` ([i18n guide](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/i18n.md)) |
226
226
  | `@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)) |
@@ -0,0 +1,189 @@
1
+ import { r as e } from "./rolldown-runtime-BFFgcFxR.js";
2
+ import { t } from "./utils-BLfntITJ.js";
3
+ import { o as n } from "./dist-DVRQkaTK.js";
4
+ import { c as r, s as i } from "./dist-lmHmz_bu.js";
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-1ZIchrBM.js";
7
+ import { i as _ } from "./escape-owner-DpaP0lm1.js";
8
+ import * as v from "react";
9
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
10
+ //#region ../../node_modules/@radix-ui/react-alert-dialog/dist/index.mjs
11
+ var x = /* @__PURE__ */ e({
12
+ Action: () => W,
13
+ AlertDialog: () => D,
14
+ AlertDialogAction: () => I,
15
+ AlertDialogCancel: () => R,
16
+ AlertDialogContent: () => N,
17
+ AlertDialogDescription: () => F,
18
+ AlertDialogOverlay: () => A,
19
+ AlertDialogPortal: () => k,
20
+ AlertDialogTitle: () => P,
21
+ AlertDialogTrigger: () => O,
22
+ Cancel: () => G,
23
+ Content: () => U,
24
+ Description: () => q,
25
+ Overlay: () => H,
26
+ Portal: () => V,
27
+ Root: () => z,
28
+ Title: () => K,
29
+ Trigger: () => B,
30
+ createAlertDialogScope: () => T
31
+ }), S = Object.defineProperty, C = (e, t) => S(e, "name", {
32
+ value: t,
33
+ configurable: !0
34
+ }), [w, T] = r("AlertDialog", [c]), E = c(), D = /* @__PURE__ */ C((e) => {
35
+ let { __scopeAlertDialog: t, ...n } = e;
36
+ return /* @__PURE__ */ y(p, {
37
+ ...E(t),
38
+ ...n,
39
+ modal: !0
40
+ });
41
+ }, "AlertDialog"), O = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
42
+ let { __scopeAlertDialog: n, ...r } = e;
43
+ return /* @__PURE__ */ y(g, {
44
+ ...E(n),
45
+ ...r,
46
+ ref: t
47
+ });
48
+ }, "AlertDialogTrigger")), k = /* @__PURE__ */ C((e) => {
49
+ let { __scopeAlertDialog: t, ...n } = e;
50
+ return /* @__PURE__ */ y(s, {
51
+ ...E(t),
52
+ ...n
53
+ });
54
+ }, "AlertDialogPortal"), A = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
55
+ let { __scopeAlertDialog: n, ...r } = e;
56
+ return /* @__PURE__ */ y(m, {
57
+ ...E(n),
58
+ ...r,
59
+ ref: t
60
+ });
61
+ }, "AlertDialogOverlay")), [j, M] = w("AlertDialogContent"), N = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
62
+ let { __scopeAlertDialog: r, children: a, ...s } = e, c = E(r), l = n(t, v.useRef(null)), u = v.useRef(null);
63
+ return /* @__PURE__ */ y(j, {
64
+ scope: r,
65
+ cancelRef: u,
66
+ children: /* @__PURE__ */ y(o, {
67
+ role: "alertdialog",
68
+ ...c,
69
+ ...s,
70
+ ref: l,
71
+ onOpenAutoFocus: i(s.onOpenAutoFocus, (e) => {
72
+ e.preventDefault(), u.current?.focus({ preventScroll: !0 });
73
+ }),
74
+ onPointerDownOutside: (e) => e.preventDefault(),
75
+ onInteractOutside: (e) => e.preventDefault(),
76
+ children: a
77
+ })
78
+ });
79
+ }, "AlertDialogContent")), P = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
80
+ let { __scopeAlertDialog: n, ...r } = e;
81
+ return /* @__PURE__ */ y(u, {
82
+ ...E(n),
83
+ ...r,
84
+ ref: t
85
+ });
86
+ }, "AlertDialogTitle")), F = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
87
+ let { __scopeAlertDialog: n, ...r } = e;
88
+ return /* @__PURE__ */ y(f, {
89
+ ...E(n),
90
+ ...r,
91
+ ref: t
92
+ });
93
+ }, "AlertDialogDescription")), I = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
94
+ let { __scopeAlertDialog: n, ...r } = e;
95
+ return /* @__PURE__ */ y(l, {
96
+ ...E(n),
97
+ ...r,
98
+ ref: t
99
+ });
100
+ }, "AlertDialogAction")), L = "AlertDialogCancel", R = v.forwardRef(/* @__PURE__ */ C(function(e, t) {
101
+ let { __scopeAlertDialog: r, ...i } = e, { cancelRef: a } = M(L, r), o = E(r), s = n(t, a);
102
+ return /* @__PURE__ */ y(l, {
103
+ ...o,
104
+ ...i,
105
+ ref: s
106
+ });
107
+ }, "AlertDialogCancel")), z = D, B = O, V = k, H = A, U = N, W = I, G = R, K = P, q = F;
108
+ //#endregion
109
+ //#region lib/components/ui/feedback/alert-dialog/alert-dialog.tsx
110
+ function J({ ...e }) {
111
+ return /* @__PURE__ */ y(z, {
112
+ "data-slot": "alert-dialog",
113
+ ...e
114
+ });
115
+ }
116
+ function Y({ children: e, asChild: t = !0, ...n }) {
117
+ return /* @__PURE__ */ y(B, {
118
+ "data-slot": "alert-dialog-trigger",
119
+ asChild: t,
120
+ ...n,
121
+ children: /* @__PURE__ */ y("div", { children: e })
122
+ });
123
+ }
124
+ function X({ ...e }) {
125
+ return /* @__PURE__ */ y(V, {
126
+ "data-slot": "alert-dialog-portal",
127
+ ...e
128
+ });
129
+ }
130
+ function Z({ className: e, ...n }) {
131
+ return /* @__PURE__ */ y(H, {
132
+ "data-slot": "alert-dialog-overlay",
133
+ className: t("nxgt-scrim fixed inset-0 z-50", e),
134
+ ...n
135
+ });
136
+ }
137
+ function Q({ className: e, onOpenAutoFocus: n, onCloseAutoFocus: r, onEscapeKeyDown: i, ref: o, ...s }) {
138
+ let c = h({
139
+ onOpenAutoFocus: n,
140
+ onCloseAutoFocus: r
141
+ }, { focusFallback: !0 }), l = d({
142
+ ref: o,
143
+ onEscapeKeyDown: i,
144
+ ...s
145
+ }, !0);
146
+ return /* @__PURE__ */ y(_, { children: /* @__PURE__ */ y(a, {
147
+ value: !0,
148
+ children: /* @__PURE__ */ b(X, { children: [/* @__PURE__ */ y(Z, { ref: l.overlayRef }), /* @__PURE__ */ y(U, {
149
+ ref: l.ref,
150
+ "data-slot": "alert-dialog-content",
151
+ className: t("nxgt-dialog fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 p-6 sm:max-w-lg max-h-[calc(100dvh-2rem)] supports-[not(height:100dvh)]:max-h-[calc(100vh-2rem)] overflow-y-auto", e),
152
+ onOpenAutoFocus: c.onOpenAutoFocus,
153
+ onCloseAutoFocus: c.onCloseAutoFocus,
154
+ onEscapeKeyDown: l.onEscapeKeyDown,
155
+ ...s,
156
+ onFocusOutside: l.outside.onFocusOutside
157
+ })] })
158
+ }) });
159
+ }
160
+ function $({ className: e, ...n }) {
161
+ return /* @__PURE__ */ y("div", {
162
+ "data-slot": "alert-dialog-header",
163
+ className: t("flex flex-col gap-2 text-center sm:text-left", e),
164
+ ...n
165
+ });
166
+ }
167
+ function ee({ className: e, ...n }) {
168
+ return /* @__PURE__ */ y("div", {
169
+ "data-slot": "alert-dialog-footer",
170
+ className: t("flex flex-col-reverse gap-2 pt-2 max-sm:*:w-full sm:flex-row sm:justify-end", e),
171
+ ...n
172
+ });
173
+ }
174
+ function te({ className: e, ...n }) {
175
+ return /* @__PURE__ */ y(K, {
176
+ "data-slot": "alert-dialog-title",
177
+ className: t("text-2xl/8 font-medium tracking-tight text-foreground", e),
178
+ ...n
179
+ });
180
+ }
181
+ function ne({ className: e, ...n }) {
182
+ return /* @__PURE__ */ y(q, {
183
+ "data-slot": "alert-dialog-description",
184
+ className: t("text-muted-foreground text-sm/6", e),
185
+ ...n
186
+ });
187
+ }
188
+ //#endregion
189
+ export { $ as a, te as c, G as d, x as f, ee as i, Y as l, Q as n, Z as o, ne as r, X as s, J as t, W as u };
@@ -1,5 +1,4 @@
1
- import { i as e, r as t, t as n } from "./stored-language-B-tiWZU2.js";
2
- import { r } from "./translator-B9XjUDRu.js";
1
+ import { l as e, r as t, s as n, u as r } from "./translator-Caf-d96e.js";
3
2
  import { t as i } from "./_baseIsEqual-C6ksIHya.js";
4
3
  import { useMemo as a } from "react";
5
4
  import { asyncThunkCreator as o, buildCreateSlice as s } from "@reduxjs/toolkit";
@@ -84,8 +83,8 @@ var S = (e) => {
84
83
  if (Object.getPrototypeOf(e) !== Object.prototype && e.constructor) return e.constructor.name;
85
84
  }
86
85
  return t;
87
- }, C = ({ storageKey: i = t, language: a, translate: o = r } = {}) => {
88
- let s = () => typeof a == "function" ? a() : a ?? n(i, "en", e);
86
+ }, C = ({ storageKey: i = e, language: a, translate: o = t } = {}) => {
87
+ let s = () => typeof a == "function" ? a() : a ?? n(i, "en", r);
89
88
  return (e) => {
90
89
  let t = s(), n = (e, n) => o(e, n, t), r = (e, t) => {
91
90
  let r = n(e, t);
@@ -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-C5lObWXT.js";
3
+ import { n as r, r as i, t as a } from "./spinner-CAnpF3RK.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-7BuUCGRm.js";
5
- import { t as i } from "./use-material-translation-B5j3jZs7.js";
4
+ import { t as r } from "./button-DfS_amfQ.js";
5
+ import { t as i } from "./use-material-translation-C_1cWRzW.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-kQOrHlDX.js";
9
+ import { t as d } from "./chip-Cbndukko.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-C5lObWXT.js";
2
+ import { r as t } from "./spinner-CAnpF3RK.js";
3
3
  import { s as n } from "./use-click-lock-BZYtTmVt.js";
4
- import { t as r } from "./use-material-translation-B5j3jZs7.js";
4
+ import { t as r } from "./use-material-translation-C_1cWRzW.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,14 +1,14 @@
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-CiobN1wi.js";
5
- import { a as c, i as l, n as u } from "./field-blur-context-DbJQZkEB.js";
6
- import { a as d, d as f, r as p, t as m, u as h } from "./toolbar-items-ByvXcMHm.js";
4
+ import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-_SyVmSuy.js";
5
+ import { a as c, i as l, n as u } from "./field-blur-context-DPe5_Nv5.js";
6
+ import { a as d, d as f, r as p, t as m, u as h } from "./toolbar-items-_ezD5B0r.js";
7
7
  import { t as g } from "./is-production-GLw59WU8.js";
8
- import { t as _ } from "./use-material-translation-B5j3jZs7.js";
9
- import { i as v, n as y, o as b, t as x } from "./code-language-items-rCPB0Xee.js";
10
- import { n as S, t as C } from "./escape-owner-r57kuPjn.js";
11
- import { t as w } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
8
+ import { t as _ } from "./use-material-translation-C_1cWRzW.js";
9
+ import { i as v, n as y, o as b, t as x } from "./code-language-items-andgHKrM.js";
10
+ import { t as S } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
11
+ import { n as C, t as w } from "./escape-owner-DpaP0lm1.js";
12
12
  import { t as T } from "./skeleton-DSdtr2qc.js";
13
13
  import { t as E } from "./react-node-text-Crkpfpco.js";
14
14
  import D, { memo as O, useCallback as ee, useEffect as k, useId as A, useImperativeHandle as j, useMemo as M, useRef as N, useState as P } from "react";
@@ -975,7 +975,7 @@ function sn(e, t, r) {
975
975
  t
976
976
  ]);
977
977
  let o = (t) => {
978
- let n = e.current, r = t.nativeEvent.defaultPrevented && !S(t.nativeEvent);
978
+ let n = e.current, r = t.nativeEvent.defaultPrevented && !C(t.nativeEvent);
979
979
  !i || !n || r || n.contains(t.target) && (t.key === "Escape" ? (t.preventDefault(), a(!1)) : t.key === "Tab" && on(t, n));
980
980
  };
981
981
  return {
@@ -989,7 +989,7 @@ function sn(e, t, r) {
989
989
  tabIndex: -1
990
990
  },
991
991
  "data-fullscreen": i || void 0,
992
- [C]: i || void 0,
992
+ [w]: i || void 0,
993
993
  onKeyDown: o
994
994
  })
995
995
  };
@@ -1327,10 +1327,10 @@ function Pn() {
1327
1327
  }
1328
1328
  function Fn(e, t) {
1329
1329
  let n = M(() => jn(e, t), [e, t]), r = N(null), [i] = P(() => typeof document > "u" ? void 0 : Pn()), a = N(void 0);
1330
- return w(() => {
1330
+ return S(() => {
1331
1331
  let e = r.current;
1332
1332
  e && Mn(e, n, a.current), i && Nn(i, n, a.current), a.current = n;
1333
- }, [n, i]), w(() => {
1333
+ }, [n, i]), S(() => {
1334
1334
  if (i) return (r.current?.parentElement?.closest("[role=\"dialog\"]") ?? document.body).appendChild(i), () => i.remove();
1335
1335
  }, [i]), {
1336
1336
  scope: n,
@@ -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-ByvXcMHm.js";
4
- import { t as o } from "./use-material-translation-B5j3jZs7.js";
5
- import { i as s, n as c, o as l } from "./code-language-items-rCPB0Xee.js";
6
- import { r as u, t as d } from "./field-blur-DdvY0NQQ.js";
3
+ import { d as n, r, t as i, u as a } from "./toolbar-items-_ezD5B0r.js";
4
+ import { t as o } from "./use-material-translation-C_1cWRzW.js";
5
+ import { i as s, n as c, o as l } from "./code-language-items-andgHKrM.js";
6
+ import { r as u, t as d } from "./field-blur-DyOByjzw.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-Ckc9TTCM.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-B0tN8Ha_.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-CiobN1wi.js";
2
- import { t as n } from "./use-material-translation-B5j3jZs7.js";
1
+ import { d as e, f as t } from "./dropdown-menu-_SyVmSuy.js";
2
+ import { t as n } from "./use-material-translation-C_1cWRzW.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";
@@ -8,7 +8,9 @@
8
8
  * follow a `--primary` set below :root. To theme the rail set
9
9
  * `--sidebar-active`, `--sidebar-active-hover` and
10
10
  * `--sidebar-active-foreground` (all three, or the first two and the
11
- * foreground); the derived colours are not declared here, on purpose. */
11
+ * foreground); the derived colours are not declared here, on purpose.
12
+ * `--sidebar-active-edge` recolours the start bar alone; unset, the bar is
13
+ * the foreground (`--sidebar-active-edge: gold` changes nothing else). */
12
14
  --nxgt-sidebar-active-share: 15%;
13
15
  /* Light: primary itself reads 4.5:1 on the page but not on its own 15 % pill
14
16
  * for every preset (corail 3.7:1), so the label is primary darkened to 85 %
@@ -71,4 +73,14 @@
71
73
  var(--nxgt-sidebar-active-c, c) h
72
74
  )
73
75
  );
76
+ --color-sidebar-active-edge: var(
77
+ --sidebar-active-edge,
78
+ var(
79
+ --sidebar-active-foreground,
80
+ oklch(
81
+ from var(--primary) var(--nxgt-sidebar-active-l, l)
82
+ var(--nxgt-sidebar-active-c, c) h
83
+ )
84
+ )
85
+ );
74
86
  }