@nxgt/material 3.53.0 → 3.55.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 (102) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +1 -0
  3. package/dist/{async-slice-DDSsekfm.js → async-slice-yhXT9cml.js} +2 -2
  4. package/dist/{button-Ct8DSLVv.js → button-CD7f4KFL.js} +1 -1
  5. package/dist/charts.js +3 -3
  6. package/dist/{chip-BzoNsd-W.js → chip-Cl7Wm8Pn.js} +2 -2
  7. package/dist/{code-editor-DsLQeiZc.js → code-editor-tOhXy6Qo.js} +6 -6
  8. package/dist/code-editor.js +5 -5
  9. package/dist/{code-language-items-4zXlIEZ0.js → code-language-items-BxlY6onk.js} +2 -2
  10. package/dist/components/components.css +4 -0
  11. package/dist/components/theme-tokens.css +19 -15
  12. package/dist/components/ui/display/seat-ring/seat-ring-index.css +125 -0
  13. package/dist/components/ui/display/seat-ring/seat-ring-ring.css +87 -0
  14. package/dist/components/ui/display/seat-ring/seat-ring.css +139 -0
  15. package/dist/components/ui/overlays/dialog/dialog.css +2 -1
  16. package/dist/components/ui/overlays/popover/popover.css +3 -2
  17. package/dist/{components-DZPMvc1w.js → components-B58ZWZYR.js} +15361 -15154
  18. package/dist/components.js +26 -26
  19. package/dist/{dialog-DwPmwmA3.js → dialog-BzfHcRo6.js} +4 -4
  20. package/dist/dnd.js +1 -1
  21. package/dist/{dropdown-menu-CDN6Nqx6.js → dropdown-menu-DUZF4xAJ.js} +1 -1
  22. package/dist/editor.js +9 -9
  23. package/dist/{empty-state-Bb9W9did.js → empty-state-D9o2id1p.js} +2 -2
  24. package/dist/{escape-owner-DI_lg2ID.js → escape-owner-BYs2_7T5.js} +1 -1
  25. package/dist/{field-blur-context-Dg1nwWOV.js → field-blur-context-ZsK8OTNg.js} +1 -1
  26. package/dist/{field-blur-BcJH8H9B.js → field-blur-r1tHwqdF.js} +1 -1
  27. package/dist/hooks.js +2 -2
  28. package/dist/{hover-card-Qse4gnop.js → hover-card-NfF8taLj.js} +2 -2
  29. package/dist/{i18n-provider-DlVPS58N.js → i18n-provider-TQAEPlJ5.js} +1 -1
  30. package/dist/i18n.js +5 -5
  31. package/dist/{icon-badge-DVPBQOKe.js → icon-badge-BlaY_a-P.js} +3 -3
  32. package/dist/{icon-button-C3wDxsh6.js → icon-button-B8tdlP6R.js} +1 -1
  33. package/dist/lib/components/ui/collections/data-grid/columns/row-meta.d.ts +2 -0
  34. package/dist/lib/components/ui/collections/data-grid/grid-meta.d.ts +10 -4
  35. package/dist/lib/components/ui/display/index.d.ts +1 -0
  36. package/dist/lib/components/ui/display/seat-ring/index.d.ts +2 -0
  37. package/dist/lib/components/ui/display/seat-ring/partials/empty-seat.d.ts +5 -0
  38. package/dist/lib/components/ui/display/seat-ring/partials/seat-body.d.ts +9 -0
  39. package/dist/lib/components/ui/display/seat-ring/partials/seat-item.d.ts +17 -0
  40. package/dist/lib/components/ui/display/seat-ring/seat-ring.d.ts +9 -0
  41. package/dist/lib/components/ui/display/seat-ring/seat-ring.utils.d.ts +9 -0
  42. package/dist/lib/components/ui/display/seat-ring/types.d.ts +67 -0
  43. package/dist/lib/components/ui/display/seat-ring/use-seat-ring.d.ts +12 -0
  44. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  45. package/dist/lib/components/ui/selection/switcher/partials/switcher-tooltip.d.ts +10 -2
  46. package/dist/lib/i18n/resources/en/en.d.ts +3 -0
  47. package/dist/lib/i18n/resources/en/material.json.d.ts +3 -0
  48. package/dist/lib/i18n/resources/fr/fr.d.ts +3 -0
  49. package/dist/lib/i18n/resources/fr/material.json.d.ts +3 -0
  50. package/dist/lib/i18n/resources/resources.d.ts +6 -0
  51. package/dist/lib/i18n/translator.d.ts +1 -1
  52. package/dist/lib.js +1 -1
  53. package/dist/main.js +43 -43
  54. package/dist/map.js +8 -8
  55. package/dist/material.css +1 -1
  56. package/dist/pdf-reader.js +1 -1
  57. package/dist/print.js +2 -2
  58. package/dist/{public-BoVE0ffh.js → public-tWgM204K.js} +9 -9
  59. package/dist/{rich-code-block-DAUM7Yh_.js → rich-code-block-0OcsqURY.js} +5 -5
  60. package/dist/{sortable-provider-BLXsGE_0.js → sortable-provider-DzFAlPU_.js} +2 -2
  61. package/dist/{spinner-Rg4PnBPH.js → spinner-GKZcQmrR.js} +1 -1
  62. package/dist/{stored-language-B1lJMPbR.js → stored-language-B39mABN7.js} +2 -0
  63. package/dist/styles.css +1 -0
  64. package/dist/theme-picker.js +2 -2
  65. package/dist/{theme-toggle-jVdxF_mc.js → theme-toggle-C8idk_jQ.js} +1 -1
  66. package/dist/{toolbar-items-BFY_hns5.js → toolbar-items-BrJI-BCs.js} +4 -4
  67. package/dist/{translate-material-q-JNxP1m.js → translate-material-hUA-UAP6.js} +2 -2
  68. package/dist/{translator-BU1o3_l9.js → translator-1ql2sxrx.js} +1 -1
  69. package/dist/{use-chat-composer-DGbDuIUa.js → use-chat-composer-DQpb8ZXV.js} +16 -16
  70. package/dist/{use-heading-spy-CP63sAcS.js → use-heading-spy-vlPOI1Aj.js} +1 -1
  71. package/dist/{use-material-translation-nNF8fUXz.js → use-material-translation-B1p5y3s9.js} +2 -2
  72. package/docs/components/data-display.md +65 -0
  73. package/docs/components/navigation-and-layout.md +1 -1
  74. package/docs/components/selection-and-choice.md +1 -1
  75. package/docs/guides/data-grid.md +39 -2
  76. package/docs/guides/theming.md +8 -0
  77. package/docs/previews/data-display-seatring.webp +0 -0
  78. package/docs/roadmap.md +3 -2
  79. package/docs/troubleshooting.md +15 -0
  80. package/lib/components/components.css +4 -0
  81. package/lib/components/theme-tokens.css +19 -15
  82. package/lib/components/ui/display/seat-ring/seat-ring-index.css +125 -0
  83. package/lib/components/ui/display/seat-ring/seat-ring-ring.css +87 -0
  84. package/lib/components/ui/display/seat-ring/seat-ring.css +139 -0
  85. package/lib/components/ui/overlays/dialog/dialog.css +2 -1
  86. package/lib/components/ui/overlays/popover/popover.css +3 -2
  87. package/lib/styles.css +1 -0
  88. package/lib/themes/ambre.css +8 -6
  89. package/lib/themes/ardoise.css +8 -6
  90. package/lib/themes/bleumono.css +8 -6
  91. package/lib/themes/bluemoon.css +8 -6
  92. package/lib/themes/corail.css +8 -6
  93. package/lib/themes/foret.css +8 -6
  94. package/lib/themes/lavande.css +8 -6
  95. package/lib/themes/menthe.css +8 -6
  96. package/lib/themes/ocean.css +8 -6
  97. package/lib/themes/pink.css +8 -6
  98. package/lib/themes/prune.css +8 -6
  99. package/lib/themes/sable.css +8 -6
  100. package/lib/themes/slate.css +8 -6
  101. package/lib/themes/teal.css +8 -6
  102. package/package.json +4 -4
@@ -1,3 +1,3 @@
1
- import { t as e } from "./public-BoVE0ffh.js";
1
+ import { t as e } from "./public-tWgM204K.js";
2
2
  import { configurePdfReader as t } from "@nxgt/material-core/pdf-reader";
3
3
  export { e as PdfReader, t as configurePdfReader };
package/dist/print.js CHANGED
@@ -1,5 +1,5 @@
1
- import { r as e } from "./i18n-provider-DlVPS58N.js";
2
- import { t } from "./translate-material-q-JNxP1m.js";
1
+ import { r as e } from "./i18n-provider-TQAEPlJ5.js";
2
+ import { t } from "./translate-material-hUA-UAP6.js";
3
3
  import { Children as n, createContext as r, isValidElement as i, useCallback as a, useContext as o, useEffect as s, useMemo as c, useState as l } from "react";
4
4
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
5
  import { resolvePdfFileName as f } from "@nxgt/material-core/pdf-file-name";
@@ -3,21 +3,21 @@ import { n as t } from "./ui.utils-CAnKTCw5.js";
3
3
  import { t as n } from "./utils-BLfntITJ.js";
4
4
  import { o as r } from "./dist-DVRQkaTK.js";
5
5
  import { c as i, i as a, l as o, n as s, o as c, s as l } from "./dist-lmHmz_bu.js";
6
- import { n as u, s as d } from "./spinner-Rg4PnBPH.js";
6
+ import { n as u, s as d } from "./spinner-GKZcQmrR.js";
7
7
  import { i as f } from "./dist-C4wtXCjf.js";
8
8
  import { r as p, t as m } from "./in-dialog-Vwkyp-M5.js";
9
- import { C as h, D as g, E as _, O as v, S as y, T as b, _ as x, f as S, g as ee, k as te, r as ne, t as C, u as re, w } from "./dialog-DwPmwmA3.js";
10
- import { c as T, d as ie, f as E, i as ae, l as oe, n as se, o as D, t as ce, u as O } from "./dropdown-menu-CDN6Nqx6.js";
11
- import { S as le, a as k, d as A, g as ue, h as de, i as fe, m as pe, n as j, r as me, t as M, u as he, w as ge } from "./toolbar-items-BFY_hns5.js";
12
- import { t as N } from "./use-material-translation-nNF8fUXz.js";
13
- import { t as _e } from "./button-Ct8DSLVv.js";
14
- import { n as ve, t as ye } from "./icon-button-C3wDxsh6.js";
9
+ import { C as h, D as g, E as _, O as v, S as y, T as b, _ as x, f as S, g as ee, k as te, r as ne, t as C, u as re, w } from "./dialog-BzfHcRo6.js";
10
+ import { c as T, d as ie, f as E, i as ae, l as oe, n as se, o as D, t as ce, u as O } from "./dropdown-menu-DUZF4xAJ.js";
11
+ import { S as le, a as k, d as A, g as ue, h as de, i as fe, m as pe, n as j, r as me, t as M, u as he, w as ge } from "./toolbar-items-BrJI-BCs.js";
12
+ import { t as N } from "./use-material-translation-B1p5y3s9.js";
13
+ import { t as _e } from "./button-CD7f4KFL.js";
14
+ import { n as ve, t as ye } from "./icon-button-B8tdlP6R.js";
15
15
  import { t as be } from "./useEvent-2fKq-6w8.js";
16
16
  import { n as xe, t as Se } from "./toggle-group-BkH23Jk4.js";
17
- import { o as Ce } from "./escape-owner-DI_lg2ID.js";
17
+ import { o as Ce } from "./escape-owner-BYs2_7T5.js";
18
18
  import { n as we } from "./use-slice-reducer-BGkeGtML.js";
19
19
  import { r as Te } from "./use-csp-nonce-ZKs9k-ov.js";
20
- import { n as Ee, t as De } from "./empty-state-Bb9W9did.js";
20
+ import { n as Ee, t as De } from "./empty-state-D9o2id1p.js";
21
21
  import { t as Oe } from "./client-only.utils-3nHNzCki.js";
22
22
  import { t as ke } from "./use-scroll-away-PQRFZkT2.js";
23
23
  import * as P from "react";
@@ -1,7 +1,7 @@
1
- import { r as e } from "./spinner-Rg4PnBPH.js";
2
- import { c as t, n, t as r } from "./dropdown-menu-CDN6Nqx6.js";
3
- import { t as i } from "./use-material-translation-nNF8fUXz.js";
4
- import { a, i as o, n as s, o as c, t as l } from "./code-language-items-4zXlIEZ0.js";
1
+ import { r as e } from "./spinner-GKZcQmrR.js";
2
+ import { c as t, n, t as r } from "./dropdown-menu-DUZF4xAJ.js";
3
+ import { t as i } from "./use-material-translation-B1p5y3s9.js";
4
+ import { a, i as o, n as s, o as c, t as l } from "./code-language-items-BxlY6onk.js";
5
5
  import { i as u, n as d, r as f, s as p } from "./dist-C3GR7kJd.js";
6
6
  import { t as m } from "./code-block-spec-CGLKRhwD.js";
7
7
  import { Suspense as h, lazy as g, useEffect as _, useRef as v, useState as y } from "react";
@@ -143,7 +143,7 @@ function M({ node: e, editor: t, updateAttributes: n, editable: r, wrap: a, onWr
143
143
  }
144
144
  //#endregion
145
145
  //#region lib/components/ui/widgets/editor/extensions/code/code-block-open.tsx
146
- var N = g(() => import("./code-editor-DsLQeiZc.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
146
+ var N = g(() => import("./code-editor-tOhXy6Qo.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
147
147
  function P() {
148
148
  let { t: e } = i();
149
149
  return /* @__PURE__ */ b("div", {
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DVRQkaTK.js";
3
- import { t as n } from "./use-material-translation-nNF8fUXz.js";
4
- import { t as r } from "./icon-button-C3wDxsh6.js";
3
+ import { t as n } from "./use-material-translation-B1p5y3s9.js";
4
+ import { t as r } from "./icon-button-B8tdlP6R.js";
5
5
  import { t as i } from "./compose-refs-DZ0iIVF-.js";
6
6
  import a, { cloneElement as o, createContext as s, forwardRef as c, memo as l, useCallback as u, useContext as d, useEffect as f, useId as p, useLayoutEffect as m, useMemo as h, useReducer as g, useRef as _, useState as v } from "react";
7
7
  import { jsx as y } from "react/jsx-runtime";
@@ -3,7 +3,7 @@ import { n as t, t as n } from "./utils-BLfntITJ.js";
3
3
  import { i as r, o as i } from "./dist-DVRQkaTK.js";
4
4
  import { a, c as o, i as s, l as c, n as l, o as u, r as d, s as f, t as p, u as m } from "./dist-lmHmz_bu.js";
5
5
  import { a as h, c as g, d as _, i as v, l as y, o as b, r as x, t as S, u as C } from "./floating-ui.dom-KkZSW8_E.js";
6
- import { t as w } from "./use-material-translation-nNF8fUXz.js";
6
+ import { t as w } from "./use-material-translation-B1p5y3s9.js";
7
7
  import * as T from "react";
8
8
  import { useLayoutEffect as E, useRef as D, useSyncExternalStore as O } from "react";
9
9
  import { jsx as k, jsxs as A } from "react/jsx-runtime";
@@ -1334,6 +1334,7 @@ var t = {
1334
1334
  busy: "Busy",
1335
1335
  active: "Active"
1336
1336
  },
1337
+ "seat-ring": { empty: "Empty seat" },
1337
1338
  "country-field": { placeholder: "Country" },
1338
1339
  "duration-field": {
1339
1340
  hours: "h",
@@ -4174,6 +4175,7 @@ var t = {
4174
4175
  busy: "Occupé",
4175
4176
  active: "Actif"
4176
4177
  },
4178
+ "seat-ring": { empty: "Place libre" },
4177
4179
  "country-field": { placeholder: "Pays" },
4178
4180
  "duration-field": {
4179
4181
  hours: "h",
package/dist/styles.css CHANGED
@@ -57,6 +57,7 @@
57
57
  --color-background-light: --alpha(var(--background) / 30%);
58
58
  --color-foreground: var(--foreground);
59
59
  --color-card: var(--card);
60
+ --color-card-edge: var(--card-edge);
60
61
  --color-card-foreground: var(--card-foreground);
61
62
  --color-popover: var(--popover);
62
63
  --color-popover-foreground: var(--popover-foreground);
@@ -1,10 +1,10 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { a as t, i as n, n as r, o as i, r as a, t as o } from "./bubble-input-B7BVd9fX.js";
3
3
  import { a as s, r as c } from "./icon-sprites-CaYXzOL4.js";
4
- import { t as l } from "./use-material-translation-nNF8fUXz.js";
4
+ import { t as l } from "./use-material-translation-B1p5y3s9.js";
5
5
  import { t as u } from "./use-theme-BCLireTd.js";
6
6
  import { a as d, r as f } from "./theme-context-Cofk6vgs.js";
7
- import { t as p } from "./theme-toggle-jVdxF_mc.js";
7
+ import { t as p } from "./theme-toggle-C8idk_jQ.js";
8
8
  import { n as m, t as h } from "./nxgt-theme-ivgNca3z.js";
9
9
  import { useContext as g } from "react";
10
10
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-nNF8fUXz.js";
1
+ import { t as e } from "./use-material-translation-B1p5y3s9.js";
2
2
  import { i as t } from "./theme-store-BdPp43cV.js";
3
3
  import { n, t as r } from "./use-theme-BCLireTd.js";
4
4
  import { r as i } from "./theme-context-Cofk6vgs.js";
@@ -2,13 +2,13 @@ import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./warn-once-C_e47JM8.js";
3
3
  import { o as n, r, t as i } from "./dist-DVRQkaTK.js";
4
4
  import { a, c as o, i as s, l as c, r as l, s as u } from "./dist-lmHmz_bu.js";
5
- import { C as d, S as f, d as p, f as m, m as h, p as g, r as _, u as v } from "./spinner-Rg4PnBPH.js";
5
+ import { C as d, S as f, d as p, f as m, m as h, p as g, r as _, u as v } from "./spinner-GKZcQmrR.js";
6
6
  import { i as y, n as b, r as x, t as S } from "./dist-C4wtXCjf.js";
7
7
  import { a as C, c as w, l as T, o as E, r as ee, s as te, t as ne } from "./in-dialog-Vwkyp-M5.js";
8
- import { A as re, M as ie, N as ae, b as oe, d as se, f as ce, i as le, j as ue, l as de, n as fe, o as pe, r as me, t as he, u as ge, y as _e } from "./dropdown-menu-CDN6Nqx6.js";
8
+ import { A as re, M as ie, N as ae, b as oe, d as se, f as ce, i as le, j as ue, l as de, n as fe, o as pe, r as me, t as he, u as ge, y as _e } from "./dropdown-menu-DUZF4xAJ.js";
9
9
  import { a as ve, n as ye, r as be, t as xe } from "./dist-B7RjY7SL.js";
10
- import { t as Se } from "./use-material-translation-nNF8fUXz.js";
11
- import { o as Ce } from "./escape-owner-DI_lg2ID.js";
10
+ import { t as Se } from "./use-material-translation-B1p5y3s9.js";
11
+ import { o as Ce } from "./escape-owner-BYs2_7T5.js";
12
12
  import * as D from "react";
13
13
  import { createContext as O, useCallback as we, useContext as k, useEffect as A, useId as Te, useLayoutEffect as j, useMemo as M, useReducer as Ee, useRef as N, useState as P } from "react";
14
14
  import { Fragment as F, jsx as I, jsxs as L } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- import "./stored-language-B1lJMPbR.js";
2
- import { a as e, r as t, t as n } from "./translator-BU1o3_l9.js";
1
+ import "./stored-language-B39mABN7.js";
2
+ import { a as e, r as t, t as n } from "./translator-1ql2sxrx.js";
3
3
  //#region lib/i18n/translate-material.ts
4
4
  var r = /* @__PURE__ */ new WeakMap();
5
5
  function i(e) {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./is-production-GLw59WU8.js";
2
- import { a as t, i as n, r, t as i } from "./stored-language-B1lJMPbR.js";
2
+ import { a as t, i as n, r, t as i } from "./stored-language-B39mABN7.js";
3
3
  import { t as a } from "./get-CTzJAwfc.js";
4
4
  //#region ../../node_modules/@formatjs/fast-memoize/index.js
5
5
  function o(e, t) {
@@ -5,39 +5,39 @@ import { t as r } from "./warn-once-C_e47JM8.js";
5
5
  import { n as i } from "./use-shape-morph-DXdy2X5g.js";
6
6
  import { n as a, o, t as s } from "./dist-DVRQkaTK.js";
7
7
  import { a as c, c as l, i as u, l as d, n as f, o as p, r as m, s as h, t as g } from "./dist-lmHmz_bu.js";
8
- import { _, a as v, b as y, c as b, g as x, h as S, i as C, n as w, o as T, r as E, s as D, t as O, v as k, x as A, y as ee } from "./spinner-Rg4PnBPH.js";
8
+ import { _, a as v, b as y, c as b, g as x, h as S, i as C, n as w, o as T, r as E, s as D, t as O, v as k, x as A, y as ee } from "./spinner-GKZcQmrR.js";
9
9
  import { a as j, i as M, n as N, r as te, t as ne } from "./dist-C4wtXCjf.js";
10
10
  import { i as P, n as re, t as ie } from "./in-dialog-Vwkyp-M5.js";
11
- import { A as F, C as ae, D as oe, E as se, O as I, S as ce, T as le, _ as ue, b as de, f as fe, g as pe, k as me, l as he, m as ge, n as _e, o as ve, r as ye, s as be, t as xe, u as Se, v as Ce, w as we, x as Te, y as Ee } from "./dialog-DwPmwmA3.js";
11
+ import { A as F, C as ae, D as oe, E as se, O as I, S as ce, T as le, _ as ue, b as de, f as fe, g as pe, k as me, l as he, m as ge, n as _e, o as ve, r as ye, s as be, t as xe, u as Se, v as Ce, w as we, x as Te, y as Ee } from "./dialog-BzfHcRo6.js";
12
12
  import { A as De, C as Oe, D as ke, E as Ae, O as je, S as Me, T as Ne, _ as Pe, a as Fe, b as Ie, d as Le, f as Re, g as ze, h as Be, i as Ve, k as He, l as Ue, m as We, n as Ge, o as Ke, p as qe, r as Je, s as Ye, t as Xe, u as Ze, v as Qe, w as $e, x as et, y as tt } from "./floating-ui.dom-KkZSW8_E.js";
13
- import { D as nt, E as rt, N as it, O as at, c as L, d as ot, f as st, i as ct, k as lt, m as ut, n as dt, o as ft, p as pt, t as mt, u as ht } from "./dropdown-menu-CDN6Nqx6.js";
14
- import { a as gt, i as _t, n as vt } from "./field-blur-context-Dg1nwWOV.js";
15
- import { C as yt, S as bt, a as xt, c as St, d as Ct, l as wt, n as Tt, o as Et, s as Dt, u as Ot } from "./toolbar-items-BFY_hns5.js";
13
+ import { D as nt, E as rt, N as it, O as at, c as L, d as ot, f as st, i as ct, k as lt, m as ut, n as dt, o as ft, p as pt, t as mt, u as ht } from "./dropdown-menu-DUZF4xAJ.js";
14
+ import { a as gt, i as _t, n as vt } from "./field-blur-context-ZsK8OTNg.js";
15
+ import { C as yt, S as bt, a as xt, c as St, d as Ct, l as wt, n as Tt, o as Et, s as Dt, u as Ot } from "./toolbar-items-BrJI-BCs.js";
16
16
  import { a as kt, i as At, n as jt, o as Mt, t as Nt } from "./bubble-input-B7BVd9fX.js";
17
17
  import { i as Pt } from "./dist-B7RjY7SL.js";
18
18
  import { o as Ft, s as It, t as Lt } from "./use-click-lock-BZYtTmVt.js";
19
19
  import { a as Rt, r as zt } from "./icon-sprites-CaYXzOL4.js";
20
- import "./stored-language-B1lJMPbR.js";
21
- import { a as Bt } from "./translator-BU1o3_l9.js";
20
+ import "./stored-language-B39mABN7.js";
21
+ import { a as Bt } from "./translator-1ql2sxrx.js";
22
22
  import { h as Vt } from "./get-CTzJAwfc.js";
23
23
  import { t as Ht } from "./isEmpty-F_g3jLf8.js";
24
- import { t as R } from "./use-material-translation-nNF8fUXz.js";
25
- import { i as Ut, r as Wt, t as Gt } from "./button-Ct8DSLVv.js";
26
- import { t as z } from "./icon-button-C3wDxsh6.js";
24
+ import { t as R } from "./use-material-translation-B1p5y3s9.js";
25
+ import { i as Ut, r as Wt, t as Gt } from "./button-CD7f4KFL.js";
26
+ import { t as z } from "./icon-button-B8tdlP6R.js";
27
27
  import { t as Kt } from "./use-ssr-media-query-C6M5m8sf.js";
28
28
  import { n as qt, t as Jt } from "./util-4heV2LPI.js";
29
29
  import { t as Yt } from "./useEvent-2fKq-6w8.js";
30
- import { f as Xt } from "./field-blur-BcJH8H9B.js";
30
+ import { f as Xt } from "./field-blur-r1tHwqdF.js";
31
31
  import { c as Zt, i as Qt, l as $t, o as en, r as tn, s as nn, t as rn } from "./dist-C3GR7kJd.js";
32
32
  import { i as an } from "./toggle-group-BkH23Jk4.js";
33
- import { a as on, i as sn, o as cn } from "./escape-owner-DI_lg2ID.js";
33
+ import { a as on, i as sn, o as cn } from "./escape-owner-BYs2_7T5.js";
34
34
  import { n as ln } from "./use-slice-reducer-BGkeGtML.js";
35
35
  import { t as un } from "./browser-only-DQ94lWF8.js";
36
36
  import { t as dn } from "./compose-refs-DZ0iIVF-.js";
37
- import { n as fn, r as pn, t as mn } from "./chip-BzoNsd-W.js";
38
- import { n as hn, t as gn } from "./icon-badge-DVPBQOKe.js";
37
+ import { n as fn, r as pn, t as mn } from "./chip-Cl7Wm8Pn.js";
38
+ import { n as hn, t as gn } from "./icon-badge-BlaY_a-P.js";
39
39
  import { r as _n } from "./use-csp-nonce-ZKs9k-ov.js";
40
- import { t as vn } from "./empty-state-Bb9W9did.js";
40
+ import { t as vn } from "./empty-state-D9o2id1p.js";
41
41
  import { t as yn } from "./skeleton-DSdtr2qc.js";
42
42
  import { H as bn, V as xn, X as Sn, bt as Cn, it as wn, lt as Tn, n as En, t as Dn, xt as On, yt as kn } from "./dist-moutbfbd.js";
43
43
  import { t as An } from "./markdown-Dw_uH7j7.js";
@@ -11353,7 +11353,7 @@ var tC = (e = {}) => jn({
11353
11353
  let [{ default: t }, { lowlight: n }, { richCodeBlock: r }] = await Promise.all([
11354
11354
  import("./dist-CRMFGjng.js"),
11355
11355
  import("./lowlight-OtcjU2Sa.js"),
11356
- import("./rich-code-block-DAUM7Yh_.js")
11356
+ import("./rich-code-block-0OcsqURY.js")
11357
11357
  ]);
11358
11358
  return [r(t, {
11359
11359
  lowlight: n,
@@ -1,4 +1,4 @@
1
- import { r as e } from "./i18n-provider-DlVPS58N.js";
1
+ import { r as e } from "./i18n-provider-TQAEPlJ5.js";
2
2
  import { _ as t, g as n, h as r, n as i, v as a, y as o } from "./number.utils-BG_eEt5g.js";
3
3
  import { useCallback as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
4
4
  import { busySettler as f, busySettler as p, createSubmitGuard as m, createSubmitGuard as h } from "@nxgt/material-core/submit-guard";
@@ -1,5 +1,5 @@
1
- import { r as e } from "./i18n-provider-DlVPS58N.js";
2
- import { t } from "./translate-material-q-JNxP1m.js";
1
+ import { r as e } from "./i18n-provider-TQAEPlJ5.js";
2
+ import { t } from "./translate-material-hUA-UAP6.js";
3
3
  import { useCallback as n } from "react";
4
4
  //#region lib/i18n/use-material-translation.ts
5
5
  function r() {
@@ -8,6 +8,7 @@ from `@nxgt/material/components`.
8
8
  | --- | --- | --- |
9
9
  | <img src="../previews/data-display-avatar.webp" width="96" alt=""> | [Avatar](#avatar) | Image with a fallback and an optional online / offline dot |
10
10
  | <img src="../previews/data-display-avatargroup.webp" width="96" alt=""> | [AvatarGroup](#avatargroup) | Overlapping avatars with a `+N` overflow |
11
+ | <img src="../previews/data-display-seatring.webp" width="96" alt=""> | [SeatRing](#seatring) | Participants as seats around a circle or in a grid, optionally pickable |
11
12
  | <img src="../previews/data-display-shape.webp" width="96" alt=""> | [Shape](#shape) | Material 3 Expressive's shapes as a backdrop, an icon container or a mask for a photo |
12
13
  | <img src="../previews/data-display-badge.webp" width="96" alt=""> | [Badge](#badge) | Status pill, 20 px, in seven tones, soft or outlined, with an optional decorative `icon` before the words |
13
14
  | <img src="../previews/data-display-countbadge.webp" width="96" alt=""> | [CountBadge](#countbadge) | Count in the corner of its children |
@@ -127,6 +128,70 @@ array (`people.map(...)`); a single wrapper component or fragment counts as one.
127
128
 
128
129
  ---
129
130
 
131
+ ## SeatRing
132
+
133
+ ![SeatRing](../previews/data-display-seatring.webp)
134
+
135
+ Participants as seats: around a circle when there is room, in a grid on a
136
+ phone. A seating plan, a round-table meeting, a party-game lobby. Each seat has
137
+ an avatar, a name, a status written in words and a badge; with `selectionMode`
138
+ it is a listbox to pick one or several seats from.
139
+
140
+ ```tsx
141
+ import { SeatRing } from '@nxgt/material/components';
142
+
143
+ <SeatRing
144
+ aria-label="Players"
145
+ seats={[
146
+ { id: 'ada', label: 'Ada Example', status: { label: 'Ready', tone: 'success' }, badge: 'Host' },
147
+ { id: 'bo', label: 'Bo Sample', status: { label: 'Away', tone: 'warning' } },
148
+ { id: 'free', label: 'Free', empty: true },
149
+ ]}
150
+ highlightedId="ada"
151
+ centerSlot={<p>Round 2</p>}
152
+ selectionMode="single"
153
+ value={target}
154
+ onValueChange={setTarget}
155
+ />
156
+ ```
157
+
158
+ | Prop | Type | Default | Notes |
159
+ | --- | --- | --- | --- |
160
+ | `seats` | `Seat[]` | required | `{ id, label, avatar?: { src?, fallback? }, status?: { label, tone? }, badge?, disabled?, empty? }`; clockwise from the top |
161
+ | `layout` | `'ring' \| 'grid'` | `'ring'` | `ring` falls back to the grid in a narrow box and past the seat limit (10 seats) |
162
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | seat width 4.75, 6 or 8rem; ring from a box of 32, 38 or 46rem; at most 10 seats on the circle |
163
+ | `selectionMode` | `'none' \| 'single' \| 'multiple'` | `'none'` | `none`: a list; otherwise a listbox |
164
+ | `value`, `defaultValue`, `onValueChange` | `string \| null` (single), `string[]` (multiple) | — | controlled or not |
165
+ | `highlightedId` | `string` | — | emphasised seat (whose turn it is); `aria-current="true"` on it, in a list and in a listbox |
166
+ | `renderAvatar`, `renderStatus`, `renderBadge` | `(seat) => ReactNode` | — | replace the default avatar, status line or badge |
167
+ | `renderEmptySeat` | `(seat) => ReactNode` | dashed circle and "Empty seat" | content of an empty seat |
168
+ | `centerSlot` | `ReactNode` | — | middle of the ring (a timer, a title); above the seats in the grid |
169
+ | `aria-label` / `aria-labelledby` | `string` | — | names the list or the listbox: always give one |
170
+
171
+ The layout follows the component's own width (a container query), not the
172
+ window, so it also collapses in a narrow column or a dialog. The grid is two columns
173
+ at 30rem or less and auto-fill above it, with a 44px minimum seat height. The circle is CSS only, so server markup has
174
+ no `style` attribute and a strict CSP is fine.
175
+
176
+ **Accessibility**
177
+
178
+ - Not selectable: a `list` of `listitem`s. Selectable: a `listbox` of `option`s
179
+ (`aria-multiselectable` in `multiple`).
180
+ - A roving tab stop sits on the chosen seat, else the first taken one. Arrow
181
+ keys, Home and End move the focus (an empty seat is skipped); Space or Enter
182
+ picks, and pressing the chosen seat again clears it.
183
+ - A seat is named by its label and its status text, never by colour alone.
184
+ - In a listbox, empty and `disabled` seats are `aria-disabled`, and a disabled
185
+ seat can be reached but not picked (in a list, `disabled` only dims the seat).
186
+ - Put no button in a selectable seat: interactive content (an "Invite" action
187
+ in `renderEmptySeat`) belongs to a non-selectable ring.
188
+ - Seat changes are not animated beyond a colour fade, which stops under
189
+ `prefers-reduced-motion`.
190
+
191
+ **Storybook:** `Data display/SeatRing` · **Vue:** not yet (#1931)
192
+
193
+ ---
194
+
130
195
  ## Shape
131
196
 
132
197
  ![Shape](../previews/data-display-shape.webp)
@@ -7,7 +7,7 @@ documentation-site shell. Everything is imported from
7
7
 
8
8
  | | Component | What it does |
9
9
  | --- | --- | --- |
10
- | <img src="../previews/navigation-layout-appshell.webp" width="96" alt=""> | [ActivityLayout](#activitylayout) | App shell: sidebar, header, breadcrumbs, titled page; a route's `handle.title` is the page's `h1` in the app bar (it labels `main`; `usePageTitleFocus()` focuses it after a navigation), `handle.titleAfter` / `titleAfter` a node right after it, outside the `h1` (a record's `Switcher`), `headerContext` a small tenant line after it from md up, `breadcrumbRoot` a text root crumb or (`icon: true`) the home icon with its own target and name, `breadcrumb={false}` no trail, `context` the tenant line atop the phone's menu sheet; `menuOpen` / `onMenuOpenChange` control the phone's menu sheet, which closes itself on a followed link or any location change |
10
+ | <img src="../previews/navigation-layout-appshell.webp" width="96" alt=""> | [ActivityLayout](#activitylayout) | App shell: sidebar, header, breadcrumbs, titled page; a route's `handle.title` is the page's `h1` in the app bar (it labels `main`; `usePageTitleFocus()` focuses it after a navigation), `handle.titleAfter` / `titleAfter` a node right after it, outside the `h1` (a record's `Switcher`, or `<Switcher size="compact">` for an icon-only one), `headerContext` a small tenant line after it from md up, `breadcrumbRoot` a text root crumb or (`icon: true`) the home icon with its own target and name, `breadcrumb={false}` no trail, `context` the tenant line atop the phone's menu sheet; `menuOpen` / `onMenuOpenChange` control the phone's menu sheet, which closes itself on a followed link or any location change |
11
11
  | <img src="../previews/navigation-layout-accountmenu.webp" width="96" alt=""> | [AccountMenu](#accountmenu) | The app bar's avatar menu: the account, the app's links, Sign out |
12
12
  | <img src="../previews/navigation-layout-authcard.webp" width="96" alt=""> | [AuthCard](#authcard) | Signed-out page frame: one `main`, a centred card, its title the `h1` |
13
13
  | <img src="../previews/navigation-layout-sidebar.webp" width="96" alt=""> | [Sidebar](#sidebar) | Collapsible navigation sidebar |
@@ -28,7 +28,7 @@ value type each one writes. Everything is imported from
28
28
  | <img src="../previews/selection-choice-transferlist.webp" width="96" alt=""> | [TransferList](#transferlist) | Two-pane picker: search, counts, select-all, drag between panes |
29
29
  | <img src="../previews/selection-choice-sortablelist.webp" width="96" alt=""> | [SortableList](#sortablelist) | Reorderable list: drag or keyboard, announced |
30
30
  | <img src="../previews/selection-choice-treeselectfield.webp" width="96" alt=""> | [TreeSelectField](#treeselectfield) | Pick from a tree, single or multiple |
31
- | <img src="../previews/selection-choice-switcher.webp" width="96" alt=""> | [Switcher](#switcher) | Workspace, establishment or class switcher: menu, search, groups, links |
31
+ | <img src="../previews/selection-choice-switcher.webp" width="96" alt=""> | [Switcher](#switcher) | Workspace, establishment or class switcher: menu, search, groups, links; `size="compact"` an icon-only round trigger for the app bar's `titleAfter` slot |
32
32
 
33
33
  ## Select
34
34
 
@@ -44,12 +44,12 @@ Columns are DataTable's TanStack v9 column definitions. A column with no
44
44
  | `lockPosition` | `'start'` or `'end'`: the column keeps its edge when columns are reordered ([columns](#columns-resize-hide-and-reorder)) |
45
45
  | `editor` | `'text'`, `'number'`, `'select'`, `'date'`, `'checkbox'`, or your own component ([custom editor](#a-custom-editor)) |
46
46
  | `rowEditor(row)` | The built-in editor (`'text'`, `'number'`, `'select'`, `'date'`, `'checkbox'`) a row's cell has, for a column that mixes kinds ([one column, several kinds of row](#one-column-several-kinds-of-row)). It wins over `editor` |
47
- | `number` | `{ min, max, decimals }` for the number editor; `min`, `max` and `decimals` may be functions of the row. A value outside them, or with too many decimals, is an error: it is never rounded or clamped |
47
+ | `number` | `{ min, max, decimals }` for the number editor; `min`, `max` and `decimals` may be functions of the row. A value outside them, or with too many decimals, is an error: it is never rounded or clamped. A `decimals` given as a function of the row is also what the cell shows: exactly that many fraction digits (`2,50`), where a plain number shows up to that many |
48
48
  | `codes` | Symbolic values the number editor also takes ("abs", "exempt"), with the label each language shows and the aliases it accepts |
49
49
  | `options` | The select editor's `{ value, label }` list, or a function of the row returning it. The cell shows and copies the label; a typed or pasted text matches a label or a value, in any case and without accents |
50
50
  | `date` | `{ min, max }` as ISO dates (`'2026-09-01'`). The value is an ISO date, shown and read in the page's locale |
51
51
  | `parse(text, ctx)` | Text to value, replacing the editor's own: `{ value }` or `{ error }`. `ctx` has `lang`, `locale` and `row`. `{ value: null }` clears the cell, whatever the column's value type |
52
- | `format(value, ctx)` | Value to text, shown in the cell and in the editor |
52
+ | `format(value, ctx)` | Value to text, shown in the cell and in the editor. `ctx` has `lang`, `locale` and, for a cell, its `row`, optional because a total has none: guard it (`ctx.row?.scale ?? 0`) |
53
53
  | `validate(value, row)` | A message (a string) flags the cell in error; nothing means valid |
54
54
  | `schema` | Any Standard Schema (zod, valibot, ArkType), run after `validate`. An asynchronous one that has not answered after the grid's `checkTimeout` (10 s by default) flags the cell "Check timed out" ([below](#checks-that-never-answer)) |
55
55
  | `value(row, cell)` | A computed column: never editable, it follows the unsaved edits. `cell(columnId)` reads what any column's cell shows |
@@ -115,6 +115,43 @@ the same instant, and `null` with `undefined`. Any other object equals only
115
115
  itself, so a `parse` that builds a new object on every call reads as a change
116
116
  each time. Return primitives or `Date`s, or keep the object's identity.
117
117
 
118
+ ### A cell that renders a component
119
+
120
+ A column's `cell` is the TanStack renderer and returns any node: a `Badge`, a
121
+ chip, an icon with a word. It draws the cells of a **read-only column** (no
122
+ `meta.editor`) and of a **computed column** (`meta.value`), where `getValue()`
123
+ is the computed value and follows the unsaved edits. The cell stays read-only
124
+ and is never an editor.
125
+
126
+ ```tsx
127
+ import { Badge } from '@nxgt/material/components';
128
+
129
+ type Result = { id: string; value: number; high: number };
130
+
131
+ const helper = createColumnHelper<DataTableFeatures, Result>();
132
+
133
+ // `meta.value` makes the column computed; `cell` draws what it returns.
134
+ helper.accessor((row) => (row.value > row.high ? 'high' : 'normal'), {
135
+ id: 'interpretation',
136
+ header: 'Interpretation',
137
+ meta: { value: (row) => (row.value > row.high ? 'high' : 'normal') },
138
+ cell: ({ getValue }) => (
139
+ <Badge variant="soft" tone={getValue() === 'high' ? 'error' : 'success'}>
140
+ {getValue() === 'high' ? 'High' : 'Normal'}
141
+ </Badge>
142
+ ),
143
+ });
144
+ ```
145
+
146
+ Keep a word in the node: a tone alone never carries the meaning.
147
+
148
+ **Some columns replace `cell` with text**: those with `meta.format` (computed
149
+ ones included), `meta.codes`, or a built-in `editor` of `'number'`, `'select'`
150
+ or `'date'`, whose value the grid writes itself, in the cell, the editor and the
151
+ clipboard. A `'checkbox'` editor draws a checkbox, and a cell holding an invalid
152
+ unsaved edit shows that text with its error icon. A column that must draw a component leaves both out; a column that
153
+ is edited keeps its editor and its text.
154
+
118
155
  ### Checks that never answer
119
156
 
120
157
  `validate` and `schema` may return a Promise. A commit waits for it, and so
@@ -74,6 +74,7 @@ at the top are needed is in [getting started](../getting-started.md#styles).
74
74
  | `--destructive` | `bg-destructive`, `text-destructive` | deprecated alias of `--error`: the light theme sets it to `var(--error)`, the dark theme keeps its own value; use `--error` |
75
75
  | `--ground` | `bg-ground` | the page's ground under `ActivityLayout`: the tinted colour the cards stand on (see [Page ground](#page-ground)) |
76
76
  | `--card`, `--popover`, `--tooltip` (+ `-foreground`) | `bg-card`, `bg-popover`, `bg-tooltip` | surfaces |
77
+ | `--card-edge` | `border-card-edge` | the edge of a `Card`, a `Popover` and a `Dialog`: `var(--border)` in light, `color-mix(in oklab, white 8%, var(--card))` in dark, a hairline lighter than the surface so it lifts off `--ground` |
77
78
  | `--border`, `--input`, `--ring` | `border-border`, `border-input`, `ring-ring` | outlines |
78
79
  | `--chart-1` … `--chart-5` | `bg-chart-1`, … | chart series (the charts read them at runtime) |
79
80
  | `--chart-soft-1` … `--chart-soft-5`, `--chart-soft-1-ink` … `--chart-soft-5-ink` | (none) | the native charts' soft palette (`palette="soft"`, `data-chart-palette="soft"`): a pale fill per series and its ink, 3:1 or more on `--card`, for outlines, lines and points ([charts guide](charts.md#soft-palette)) |
@@ -115,6 +116,13 @@ the token (light block and dark block), written from the theme's own
115
116
  AA: foreground, muted foreground and primary text are measured on the ground in
116
117
  both modes.
117
118
 
119
+ In dark, `--card`, `--popover`, `--muted`, `--accent`, `--border` and `--input`
120
+ sit 0.03 of lightness above the former values (same hue and chroma; Lavande's
121
+ card is `oklch(0.22 0.019 289.4)`, it was `0.19`; the sidebar and
122
+ `--sidebar-border` keep their values), and a card, a popover and a dialog
123
+ draw the `--card-edge` hairline plus a faint top highlight, so a card reads
124
+ against the ground. Light is unchanged.
125
+
118
126
  The sidebar and the app bar do **not** take the tint: they stay on
119
127
  `--background` (near-white in light), flat, with no radius and no shadow, so
120
128
  only the content ground carries the colour. The cards keep `bg-card`, their
package/docs/roadmap.md CHANGED
@@ -150,8 +150,6 @@ version they shipped in, and planned entries may name the major they target.
150
150
 
151
151
  ## Next
152
152
 
153
- - **Dark cards that separate from the page ground** — in dark mode, cards
154
- stand out from the page instead of blending into it ([#1676](https://github.com/softistx/nxgt-material/issues/1676)).
155
153
  - **FilterBar "Add a filter" stays on its row** — the button no longer wraps
156
154
  alone onto a second row on a desktop screen ([#1752](https://github.com/softistx/nxgt-material/issues/1752)).
157
155
 
@@ -350,6 +348,9 @@ version they shipped in, and planned entries may name the major they target.
350
348
 
351
349
  ## Shipped
352
350
 
351
+ - **Dark cards that separate from the page ground (3.54.0)** — in dark mode, cards,
352
+ popovers and dialogs lift off the page ground (lighter surfaces and a `--card-edge`
353
+ hairline), light unchanged ([#1676](https://github.com/softistx/nxgt-material/issues/1676)).
353
354
  - **Compact `ServerTable` tiles** — `renderTile` shows a compact `ListTile`
354
355
  record row (`size="sm"` with chips) through `item.Row` ([#1766](https://github.com/softistx/nxgt-material/issues/1766)).
355
356
  - **A compact `Switcher` trigger, `size="compact"`** — an icon-only round
@@ -25,6 +25,7 @@ words in your error.
25
25
 
26
26
  **Styles & assets**
27
27
 
28
+ - [In dark, my cards are lighter, or my own card colour has no edge](#in-dark-my-cards-are-lighter-or-my-own-card-colour-has-no-edge)
28
29
  - [The page and the cards look the same](#the-page-and-the-cards-look-the-same)
29
30
  - [Components render unstyled, with no error](#components-render-unstyled-with-no-error)
30
31
  - [A link is blue and underlined on hover and focus](#a-link-of-mine-or-of-a-component-is-blue-and-underlined-on-hover-and-focus)
@@ -745,6 +746,20 @@ import { Background } from '@nxgt/material/backgrounds';
745
746
  </ActivityLayout>
746
747
  ```
747
748
 
749
+ ### In dark, my cards are lighter, or my own card colour has no edge
750
+
751
+ Since 3.54 the dark `--card`, `--popover`, `--muted`, `--accent`, `--border` and
752
+ `--input` are 0.03 of lightness higher, and `Card`, `Popover` and `Dialog` draw their edge with
753
+ `--card-edge` (a hairline 8 % lighter than `--card`; in light it is
754
+ `var(--border)`). An app that overrides `--card` under `.dark` keeps its
755
+ colour; the edge follows it only when the override is on the same selector as
756
+ the theme (`.dark` or the theme block). An override on a nested element sets
757
+ `--card-edge` beside `--card`. An app that set its own dark card to
758
+ lift it off the page can drop that override, and one that sets `--card-edge`
759
+ (or `border-color` on a card) keeps it. A theme made with `defineTheme` and
760
+ generated before 3.54 has the former values and no `--card-edge`: regenerate
761
+ it (`nxgt-theme`, or the Vite plugin on the next build).
762
+
748
763
  ### The page and the cards look the same
749
764
 
750
765
  **When:** a screen under `ActivityLayout`, after the 3.24 upgrade or on an older
@@ -134,6 +134,10 @@
134
134
  @import "./ui/display/period-cards/period-cards.css";
135
135
  @import "./ui/layout/sidebar/sidebar-tokens.css";
136
136
  @import "./ui/display/avatar/avatar.css";
137
+ /* SeatRing: seats as a grid or on a circle by its own width. */
138
+ @import "./ui/display/seat-ring/seat-ring.css";
139
+ @import "./ui/display/seat-ring/seat-ring-index.css";
140
+ @import "./ui/display/seat-ring/seat-ring-ring.css";
137
141
  /* Alert and Banner span the row in the form grids (#1497). */
138
142
  @import "./ui/feedback/alert/alert.css";
139
143
  @import "./ui/display/stat-card/stat-card.css";
@@ -11,6 +11,9 @@
11
11
  keeps the flat look with `--ground: var(--background)`. */
12
12
  --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
13
13
  --card: oklch(1 0 0);
14
+ /* The card's edge (Card, Popover, Dialog): the border in light; dark draws it a
15
+ hairline lighter than the card. */
16
+ --card-edge: var(--border);
14
17
  --card-foreground: oklch(0.227 0.017 290);
15
18
  --strix: oklch(45.91% 0.1864 310.75);
16
19
  --popover: oklch(1 0 0);
@@ -111,38 +114,39 @@
111
114
  var(--primary) 6%,
112
115
  color-mix(in oklab, var(--background) 55%, black)
113
116
  );
114
- --card: oklch(0.19 0.019 289.4);
117
+ --card: oklch(0.22 0.019 289.4);
118
+ --card-edge: color-mix(in oklab, white 8%, var(--card));
115
119
  --card-foreground: oklch(0.943 0.012 291.3);
116
- --popover: oklch(0.19 0.019 289.4);
120
+ --popover: oklch(0.22 0.019 289.4);
117
121
  --popover-foreground: oklch(0.943 0.012 291.3);
118
122
  --primary: oklch(46% 0.1135 276.35);
119
123
  --primary-foreground: oklch(0.995 0.002 291.3);
120
124
  /* Mixed 60 % toward white (the tonal Button labels' recipe): readable as text
121
125
  on --background and --card. */
122
126
  --primary-text: color-mix(in oklab, var(--primary) 40%, white);
123
- /* --primary itself is 2.7:1 on --background, 2.5:1 on --card and 2.3:1 on
124
- --muted. Mixed 25 % toward white: 4.8:1, 4.5:1 and 4.2:1. */
127
+ /* --primary itself is 2.7:1 on --background, 2.4:1 on --card and 2.1:1 on
128
+ --muted. Mixed 25 % toward white: 4.8:1, 4.2:1 and 3.8:1. */
125
129
  --primary-indicator: color-mix(in oklab, var(--primary) 75%, white);
126
130
  /* Brighter than the light one: it is read as text on the dark surfaces (6.8:1
127
- on --background, 6.4:1 on --card; 5.1:1 on its own 15 % tonal tint over a
131
+ on --background, 6.0:1 on --card; 4.8:1 on its own 15 % tonal tint over a
128
132
  Card). A filled secondary surface mixes it toward --background (the opaque
129
133
  70 % mix) to keep 5.4:1 under its near-white text (4.9:1 over a Card). */
130
134
  --secondary: oklch(0.675 0.1135 245.65);
131
135
  --secondary-foreground: oklch(0.995 0.002 291.3);
132
- --muted: oklch(0.228 0.022 290);
136
+ --muted: oklch(0.258 0.022 290);
133
137
  --muted-foreground: oklch(0.725 0.03 292.2);
134
- /* 3.7:1 on --background, 3.5:1 on --card; the fill 3.3:1 on the track. */
138
+ /* 3.7:1 on --background, 3.3:1 on --card; the fill 3.3:1 on the track. */
135
139
  --track: oklch(0.53 0.03 290);
136
140
  --track-fill: oklch(0.85 0.09 276.35);
137
141
  --tooltip: oklch(0.925 0.012 291.3);
138
142
  --tooltip-foreground: oklch(0.446 0.043 291);
139
- --accent: oklch(0.25 0.022 290);
143
+ --accent: oklch(0.28 0.022 290);
140
144
  --accent-foreground: oklch(0.943 0.012 291.3);
141
145
  --error: oklch(0.577 0.245 27.325);
142
146
  --error-foreground: oklch(0.995 0.002 291.3);
143
147
  /* --error stays the fill under near-white text; as text it would give only
144
148
  4.0:1 on --background and 3.8:1 on --card. Lightened (76 % --error), 6.25
145
- and 5.9:1, and 5.2:1 on a focused error menu item (bg-error/20 over the
149
+ and 5.5:1, and 4.9:1 on a focused error menu item (bg-error/20 over the
146
150
  popover; the former 80 % missed 4.5:1 once rendered). */
147
151
  --error-text: color-mix(in oklab, var(--error) 76%, white);
148
152
  /* The light brights: on the dark surfaces they read as text and as the
@@ -152,15 +156,15 @@
152
156
  --success-foreground: oklch(0.995 0.002 291.3);
153
157
  --info: oklch(0.707 0.165 254.624);
154
158
  --info-foreground: oklch(0.995 0.002 291.3);
155
- /* Amber too, as text: 7.2:1 on --background and 6.7:1 on --card, 6.4:1 and
156
- 5.9:1 on its 10% tint; the badge's 60% fill under near-white text is
157
- 6.1:1 on a page and 5.8:1 on a Card. */
159
+ /* Amber too, as text: 7.2:1 on --background and 6.3:1 on --card, 6.4:1 and
160
+ 5.5:1 on its 10% tint; the badge's 60% fill under near-white text is
161
+ 6.1:1 on a page and 5.6:1 on a Card. */
158
162
  --warning: oklch(0.7 0.15 70);
159
163
  --warning-foreground: oklch(0.995 0.002 291.3);
160
164
  --destructive: oklch(0.704 0.191 22.216);
161
- --border: oklch(0.259 0.025 291.4);
162
- --input: oklch(0.298 0.027 291.4);
163
- /* 4.05:1 on --background, 3.80:1 on --card, 3.50:1 on --muted. */
165
+ --border: oklch(0.289 0.025 291.4);
166
+ --input: oklch(0.328 0.027 291.4);
167
+ /* 4.05:1 on --background, 3.57:1 on --card, 3.22:1 on --muted. */
164
168
  --ring: oklch(0.551 0.03 290);
165
169
  --chart-1: oklch(0.488 0.243 264.376);
166
170
  --chart-2: oklch(0.696 0.17 162.48);