@nldd/design-system 0.8.84 → 0.8.86

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 (106) hide show
  1. package/custom-elements.json +177 -19
  2. package/dist/components/actions/button/button.styles.d.ts.map +1 -1
  3. package/dist/components/actions/button/button.styles.js +11 -0
  4. package/dist/components/actions/button/button.styles.js.map +1 -1
  5. package/dist/components/components.js +428 -131
  6. package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
  7. package/dist/components/content/icon/icon-gallery-status.js +4 -4
  8. package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
  9. package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
  10. package/dist/components/content/icon/icon-registry.js +3 -1
  11. package/dist/components/content/icon/icon-registry.js.map +1 -1
  12. package/dist/components/content/icon/icon.d.ts +13 -0
  13. package/dist/components/content/icon/icon.d.ts.map +1 -1
  14. package/dist/components/content/icon/icon.js +16 -0
  15. package/dist/components/content/icon/icon.js.map +1 -1
  16. package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
  17. package/dist/components/content/icon/icon.styles.js +29 -1
  18. package/dist/components/content/icon/icon.styles.js.map +1 -1
  19. package/dist/components/content/text/text.d.ts +6 -0
  20. package/dist/components/content/text/text.d.ts.map +1 -1
  21. package/dist/components/content/text/text.js +6 -0
  22. package/dist/components/content/text/text.js.map +1 -1
  23. package/dist/components/content/text/text.styles.d.ts.map +1 -1
  24. package/dist/components/content/text/text.styles.js +2 -0
  25. package/dist/components/content/text/text.styles.js.map +1 -1
  26. package/dist/components/{icon-VTLbdcvZ.js → icon-Cd4BloIM.js} +37 -2
  27. package/dist/components/{icon-button-Sne5TwRG.js → icon-button-CXN0yaVx.js} +1 -1
  28. package/dist/components/layout/collection/collection.d.ts +15 -8
  29. package/dist/components/layout/collection/collection.d.ts.map +1 -1
  30. package/dist/components/layout/collection/collection.js +38 -13
  31. package/dist/components/layout/collection/collection.js.map +1 -1
  32. package/dist/components/layout/collection/collection.styles.d.ts.map +1 -1
  33. package/dist/components/layout/collection/collection.styles.js +36 -23
  34. package/dist/components/layout/collection/collection.styles.js.map +1 -1
  35. package/dist/components/layout/container/container.d.ts +11 -3
  36. package/dist/components/layout/container/container.d.ts.map +1 -1
  37. package/dist/components/layout/container/container.js +30 -17
  38. package/dist/components/layout/container/container.js.map +1 -1
  39. package/dist/components/layout/container/container.styles.d.ts.map +1 -1
  40. package/dist/components/layout/container/container.styles.js +19 -21
  41. package/dist/components/layout/container/container.styles.js.map +1 -1
  42. package/dist/components/layout/page/page.d.ts +23 -2
  43. package/dist/components/layout/page/page.d.ts.map +1 -1
  44. package/dist/components/layout/page/page.js +56 -2
  45. package/dist/components/layout/page/page.js.map +1 -1
  46. package/dist/components/layout/page/page.styles.d.ts.map +1 -1
  47. package/dist/components/layout/page/page.styles.js +33 -8
  48. package/dist/components/layout/page/page.styles.js.map +1 -1
  49. package/dist/components/layout/page-sections/sidebar-section/sidebar-section.styles.d.ts.map +1 -1
  50. package/dist/components/layout/page-sections/sidebar-section/sidebar-section.styles.js +7 -5
  51. package/dist/components/layout/page-sections/sidebar-section/sidebar-section.styles.js.map +1 -1
  52. package/dist/components/layout/sheet/sheet.styles.js +2 -2
  53. package/dist/components/layout/split-views/bar-split-view/bar-split-view.d.ts +1 -1
  54. package/dist/components/layout/split-views/bar-split-view/bar-split-view.d.ts.map +1 -1
  55. package/dist/components/layout/split-views/bar-split-view/bar-split-view.js +13 -13
  56. package/dist/components/layout/split-views/bar-split-view/bar-split-view.js.map +1 -1
  57. package/dist/components/layout/split-views/bar-split-view/bar-split-view.styles.js +1 -1
  58. package/dist/components/lists-and-tables/list/list.d.ts +13 -3
  59. package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
  60. package/dist/components/lists-and-tables/list/list.js +39 -3
  61. package/dist/components/lists-and-tables/list/list.js.map +1 -1
  62. package/dist/components/lists-and-tables/list/list.styles.d.ts.map +1 -1
  63. package/dist/components/lists-and-tables/list/list.styles.js +8 -1
  64. package/dist/components/lists-and-tables/list/list.styles.js.map +1 -1
  65. package/dist/components/lists-and-tables/list/list.template.d.ts +4 -1
  66. package/dist/components/lists-and-tables/list/list.template.d.ts.map +1 -1
  67. package/dist/components/lists-and-tables/list/list.template.js +31 -12
  68. package/dist/components/lists-and-tables/list/list.template.js.map +1 -1
  69. package/dist/components/lists-and-tables/list-item/list-item.d.ts +8 -3
  70. package/dist/components/lists-and-tables/list-item/list-item.d.ts.map +1 -1
  71. package/dist/components/lists-and-tables/list-item/list-item.js +35 -9
  72. package/dist/components/lists-and-tables/list-item/list-item.js.map +1 -1
  73. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts +1 -1
  74. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts.map +1 -1
  75. package/dist/components/lists-and-tables/list-item/list-item.template.js +18 -1
  76. package/dist/components/lists-and-tables/list-item/list-item.template.js.map +1 -1
  77. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.d.ts.map +1 -1
  78. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js +50 -12
  79. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js.map +1 -1
  80. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js +3 -3
  81. package/dist/components/status-and-feedback/progress-circle/progress-circle.styles.d.ts.map +1 -1
  82. package/dist/components/status-and-feedback/progress-circle/progress-circle.styles.js +15 -0
  83. package/dist/components/status-and-feedback/progress-circle/progress-circle.styles.js.map +1 -1
  84. package/dist/components/status-and-feedback/progress-circle/progress-circle.template.d.ts.map +1 -1
  85. package/dist/components/status-and-feedback/progress-circle/progress-circle.template.js +4 -3
  86. package/dist/components/status-and-feedback/progress-circle/progress-circle.template.js.map +1 -1
  87. package/dist/components/visibility-mixin-BU1vIMW7.js +161 -0
  88. package/dist/css/variables.css +5 -0
  89. package/dist/favicon.svg +4 -0
  90. package/dist/nldd.min.js +823 -649
  91. package/dist/touch-icon.png +0 -0
  92. package/dist/types/vue.d.ts +27 -11
  93. package/dist/utilities/spacing-scale.d.ts +26 -0
  94. package/dist/utilities/spacing-scale.d.ts.map +1 -0
  95. package/dist/utilities/spacing-scale.js +54 -0
  96. package/dist/utilities/spacing-scale.js.map +1 -0
  97. package/dist/utilities/visibility-mixin.d.ts +11 -8
  98. package/dist/utilities/visibility-mixin.d.ts.map +1 -1
  99. package/dist/utilities/visibility-mixin.js +58 -45
  100. package/dist/utilities/visibility-mixin.js.map +1 -1
  101. package/dist/utilities/visibility-mixin.styles.d.ts +14 -0
  102. package/dist/utilities/visibility-mixin.styles.d.ts.map +1 -0
  103. package/dist/utilities/visibility-mixin.styles.js +52 -0
  104. package/dist/utilities/visibility-mixin.styles.js.map +1 -0
  105. package/package.json +5 -2
  106. package/dist/components/visibility-mixin-vbfhyo7f.js +0 -104
@@ -3,11 +3,11 @@ import { n as slottedReset, t as inheritedTextReset } from "./shadow-resets-aG-r
3
3
  import { t as __decorate } from "./decorate-lwt_OrAG.js";
4
4
  import { t as withTranslations } from "./with-translations-CqUV9S5g.js";
5
5
  import { t as reflectNonDefault } from "./reflect-non-default-OLaK60rT.js";
6
- import { i as PopupAnchorController, n as NLDDTooltip, r as NLDDActivityIndicator, t as NLDDIconButton } from "./icon-button-Sne5TwRG.js";
7
- import { t as NLDDIcon } from "./icon-VTLbdcvZ.js";
6
+ import { i as PopupAnchorController, n as NLDDTooltip, r as NLDDActivityIndicator, t as NLDDIconButton } from "./icon-button-CXN0yaVx.js";
7
+ import { t as NLDDIcon } from "./icon-Cd4BloIM.js";
8
8
  import { n as isPointerMode, r as isTouchMode, t as isKeyboardMode } from "./input-modality-DhTeUxKi.js";
9
9
  import { t as breakpoints } from "./breakpoints-CkxsiRgH.js";
10
- import { t as VisibilityMixin } from "./visibility-mixin-vbfhyo7f.js";
10
+ import { t as VisibilityMixin } from "./visibility-mixin-BU1vIMW7.js";
11
11
  import { $ as placeholder, A as syntaxTree, B as Tree, C as indentNodeProp, D as matchBrackets, E as languageDataProp, F as NodeProp, G as ViewPlugin, H as Decoration, I as NodeSet, J as dropCursor, K as WidgetType, L as NodeType, M as styleTags, N as tags, S as getIndentation, T as indentUnit, U as Direction, V as parseMixed, W as EditorView, X as keymap, Z as lineNumbers, a as HighlightStyle, at as EditorSelection, b as foldService, bt as findClusterBreak, c as Language, d as ParseContext, f as StreamLanguage, ft as StateEffect, h as defineLanguageFacet, ht as Transaction, it as Compartment, j as Tag, k as syntaxHighlighting, l as LanguageDescription, lt as Prec, mt as Text, nt as ChangeDesc, o as IndentContext, ot as EditorState, pt as StateField, q as drawSelection, rt as ChangeSet, st as Facet, tt as Annotation, u as LanguageSupport, ut as RangeSetBuilder, vt as combineConfig, w as indentString, x as getIndentUnit, y as foldNodeProp, yt as countColumn, z as Parser } from "./dist-C6gnorjP.js";
12
12
  import { i as completionStatus, n as autocompletion, s as startCompletion, t as CompletionContext } from "./dist-B_3OW7pC.js";
13
13
  import { n as html$2, r as htmlCompletionSource } from "./dist-762GHPyH.js";
@@ -623,6 +623,17 @@ var buttonStyles = css`
623
623
  justify-content: center;
624
624
  }
625
625
 
626
+ /* Those spans are only rendered for the attribute; slotted content lands in a
627
+ bare slot. Sizing it here rather than wrapping the slot in the same span,
628
+ because that span has a width and would reserve icon space on every button
629
+ that has no icon at all. */
630
+ ::slotted([slot="start-icon"]),
631
+ ::slotted([slot="end-icon"]) {
632
+ flex-shrink: 0;
633
+ width: var(--_icon-size);
634
+ height: var(--_icon-size);
635
+ }
636
+
626
637
  :host([expandable]) .button {
627
638
  padding-inline-end: calc(var(--_inline-padding) + var(--_gap) + var(--_disclosure-icon-size));
628
639
  }
@@ -7457,10 +7468,10 @@ var containerStyles = css`
7457
7468
  --_justify-content: initial;
7458
7469
  --_justify-items: initial;
7459
7470
  --_align-items: initial;
7460
- --_gap: 0;
7461
- --_sm-gap: var(--_gap);
7462
- --_md-gap: var(--_gap);
7463
- --_lg-gap: var(--_gap);
7471
+ --_sm-gap: 0;
7472
+ --_md-gap: 0;
7473
+ --_lg-gap: 0;
7474
+ --_gap: var(--_sm-gap);
7464
7475
  --_padding-top: 0;
7465
7476
  --_padding-right: 0;
7466
7477
  --_padding-bottom: 0;
@@ -7481,19 +7492,17 @@ var containerStyles = css`
7481
7492
  --_slot-sm-order: var(--_slot-order);
7482
7493
  --_slot-md-order: var(--_slot-order);
7483
7494
  --_slot-lg-order: var(--_slot-order);
7484
- /* One resolved gap for every layout to read. Multicol splits the gap
7485
- over two properties (column-gap plus a margin on the items), so a
7486
- per-breakpoint declaration would have to be repeated in three
7487
- rules; swapping the var keeps that in one place. */
7488
- --_resolved-gap: var(--_gap);
7489
-
7490
- @media (max-width: ${smMax$17}) { --_resolved-gap: var(--_sm-gap); }
7491
- @media (min-width: ${mdMin$20}) and (max-width: ${mdMax$13}) { --_resolved-gap: var(--_md-gap); }
7492
- @media (min-width: ${lgMin$14}) { --_resolved-gap: var(--_lg-gap); }
7493
-
7494
- @container layout-container (max-width: ${smMax$17}) { --_resolved-gap: var(--_sm-gap); }
7495
- @container layout-container (min-width: ${mdMin$20}) and (max-width: ${mdMax$13}) { --_resolved-gap: var(--_md-gap); }
7496
- @container layout-container (min-width: ${lgMin$14}) { --_resolved-gap: var(--_lg-gap); }
7495
+ /* Two sets, because a container inside a layout-container follows that
7496
+ container and anywhere else the viewport. Multicol reads the gap in three
7497
+ rules, so the value is swapped here rather than declared in each. The
7498
+ bare --_gap is what stands when neither set matches. */
7499
+ @media (max-width: ${smMax$17}) { --_gap: var(--_sm-gap); }
7500
+ @media (min-width: ${mdMin$20}) and (max-width: ${mdMax$13}) { --_gap: var(--_md-gap); }
7501
+ @media (min-width: ${lgMin$14}) { --_gap: var(--_lg-gap); }
7502
+
7503
+ @container layout-container (max-width: ${smMax$17}) { --_gap: var(--_sm-gap); }
7504
+ @container layout-container (min-width: ${mdMin$20}) and (max-width: ${mdMax$13}) { --_gap: var(--_md-gap); }
7505
+ @container layout-container (min-width: ${lgMin$14}) { --_gap: var(--_lg-gap); }
7497
7506
 
7498
7507
  display: block;
7499
7508
  width: var(--_width);
@@ -7576,7 +7585,7 @@ var containerStyles = css`
7576
7585
  justify-content: var(--_justify-content);
7577
7586
  justify-items: var(--_justify-items);
7578
7587
  align-items: var(--_align-items);
7579
- gap: var(--_resolved-gap);
7588
+ gap: var(--_gap);
7580
7589
  }
7581
7590
 
7582
7591
  :host([layout="row"]) .container__inner {
@@ -7599,7 +7608,7 @@ var containerStyles = css`
7599
7608
  :host([layout="columns"]) .container__inner {
7600
7609
  display: block;
7601
7610
  columns: var(--_min-column-width);
7602
- column-gap: var(--_resolved-gap);
7611
+ column-gap: var(--_gap);
7603
7612
  }
7604
7613
 
7605
7614
  :host([layout="columns"]) ::slotted(*) {
@@ -7612,14 +7621,14 @@ var containerStyles = css`
7612
7621
  :host([layout="lanes"]) .container__inner {
7613
7622
  display: block;
7614
7623
  columns: var(--_min-column-width);
7615
- column-gap: var(--_resolved-gap);
7624
+ column-gap: var(--_gap);
7616
7625
  }
7617
7626
 
7618
7627
  :host([layout="lanes"]) ::slotted(*) {
7619
7628
  break-inside: avoid;
7620
7629
  /* multicol has no row-gap; item margin supplies the vertical gap. The
7621
7630
  native branch resets this (grid-lanes gap covers both axes). */
7622
- margin-bottom: var(--_resolved-gap);
7631
+ margin-bottom: var(--_gap);
7623
7632
  }
7624
7633
 
7625
7634
  @supports (display: grid-lanes) {
@@ -7743,6 +7752,57 @@ function containerTemplate(component) {
7743
7752
  `;
7744
7753
  }
7745
7754
  //#endregion
7755
+ //#region src/utilities/spacing-scale.ts
7756
+ /**
7757
+ * The spacing scale, for the attributes that take a step of it.
7758
+ *
7759
+ * Spacing is rhythm: the point of a scale is that the space between things is
7760
+ * the same handful of numbers on every page, so a value beside it is not a
7761
+ * finer choice but a break in the pattern. These attributes take a step and
7762
+ * nothing else, and this is the one place that turns a step into its token.
7763
+ *
7764
+ * Which also settles what the attribute means. `gap="16"` in a component that
7765
+ * expected a CSS length wrote `--_gap: 16`, which is not one: the declaration
7766
+ * fell away and the gap became zero with nothing said. Anything this cannot
7767
+ * place is refused and named in dev instead, a length included — writing an
7768
+ * unplaceable value is that same silent zero.
7769
+ */
7770
+ /** Every step there is. `'0'` is a value, not the absence of one. */
7771
+ var SPACING_SCALE = [
7772
+ "0",
7773
+ "2",
7774
+ "4",
7775
+ "6",
7776
+ "8",
7777
+ "10",
7778
+ "12",
7779
+ "16",
7780
+ "20",
7781
+ "24",
7782
+ "28",
7783
+ "32",
7784
+ "40",
7785
+ "44",
7786
+ "48",
7787
+ "56",
7788
+ "64",
7789
+ "80",
7790
+ "96"
7791
+ ];
7792
+ /**
7793
+ * A step of the scale as the token it stands for.
7794
+ *
7795
+ * Returns null when there is nothing to set, so a caller can remove the
7796
+ * property rather than write an empty one. `element` and `attribute` are only
7797
+ * there to name the offender in a dev warning.
7798
+ */
7799
+ function spacingToValue(value, element, attribute) {
7800
+ if (value === void 0 || value === "") return null;
7801
+ const step = String(value).trim();
7802
+ if (SPACING_SCALE.includes(step)) return step === "0" ? "0" : `var(--primitives-space-${step})`;
7803
+ return null;
7804
+ }
7805
+ //#endregion
7746
7806
  //#region src/components/layout/container/container.ts
7747
7807
  /**
7748
7808
  * Nederlandse Digitale Dienst Container Component (Lit + TypeScript)
@@ -7793,8 +7853,11 @@ function containerTemplate(component) {
7793
7853
  * independent of the surrounding page width.
7794
7854
  *
7795
7855
  * `layout="lanes"` packs items into balanced columns using native CSS grid
7796
- * lanes where supported, falling back to CSS multicol (column-order)
7797
- * elsewhere. CSS-only, no JS. Honours `gap` on both axes and `column-count`.
7856
+ * lanes where supported, falling back to CSS multicol (column-order) elsewhere.
7857
+ * CSS-only, no JS. Honours `gap` on both axes and `column-count`. Note that
7858
+ * nldd-collection's lanes falls back to its own grid rather than to multicol:
7859
+ * that component pages, and multicol redistributes the whole set every time
7860
+ * load-more adds to it.
7798
7861
  *
7799
7862
  * @element nldd-container
7800
7863
  *
@@ -7866,10 +7929,11 @@ var ORDER_ATTRS = [
7866
7929
  "md-order",
7867
7930
  "lg-order"
7868
7931
  ];
7869
- function sizeToValue(size) {
7870
- if (size === void 0) return null;
7871
- if (size === "0") return "0";
7872
- return `var(--primitives-space-${size})`;
7932
+ /** A step as its token. `attribute` only names the offender in a dev warning,
7933
+ * so it has to be the attribute the value was written on: with a dozen padding
7934
+ * attributes, "padding/gap is not a step" does not say which one to fix. */
7935
+ function sizeToValue(size, attribute) {
7936
+ return spacingToValue(size, "nldd-container", attribute);
7873
7937
  }
7874
7938
  var NLDDContainer = (_NLDDContainer = class NLDDContainer extends LitElement {
7875
7939
  constructor(..._args) {
@@ -7972,10 +8036,10 @@ var NLDDContainer = (_NLDDContainer = class NLDDContainer extends LitElement {
7972
8036
  setProp("--_align-items", horizontal);
7973
8037
  setProp("--_justify-items", null);
7974
8038
  }
7975
- setProp("--_gap", sizeToValue(this.gap));
7976
- setProp("--_sm-gap", sizeToValue(this.smGap));
7977
- setProp("--_md-gap", sizeToValue(this.mdGap));
7978
- setProp("--_lg-gap", sizeToValue(this.lgGap));
8039
+ const plainGap = sizeToValue(this.gap, "gap");
8040
+ setProp("--_sm-gap", sizeToValue(this.smGap, "sm-gap") ?? plainGap);
8041
+ setProp("--_md-gap", sizeToValue(this.mdGap, "md-gap") ?? plainGap);
8042
+ setProp("--_lg-gap", sizeToValue(this.lgGap, "lg-gap") ?? plainGap);
7979
8043
  for (const scope of [
7980
8044
  "",
7981
8045
  "sm",
@@ -7984,16 +8048,25 @@ var NLDDContainer = (_NLDDContainer = class NLDDContainer extends LitElement {
7984
8048
  ]) {
7985
8049
  const [top, right, bottom, left] = this.resolvePadding(scope);
7986
8050
  const prefix = scope ? `${scope}-` : "";
7987
- setProp(`--_${prefix}padding-top`, sizeToValue(top));
7988
- setProp(`--_${prefix}padding-right`, sizeToValue(right));
7989
- setProp(`--_${prefix}padding-bottom`, sizeToValue(bottom));
7990
- setProp(`--_${prefix}padding-left`, sizeToValue(left));
8051
+ setProp(`--_${prefix}padding-top`, sizeToValue(top?.size, top?.attribute ?? "padding"));
8052
+ setProp(`--_${prefix}padding-right`, sizeToValue(right?.size, right?.attribute ?? "padding"));
8053
+ setProp(`--_${prefix}padding-bottom`, sizeToValue(bottom?.size, bottom?.attribute ?? "padding"));
8054
+ setProp(`--_${prefix}padding-left`, sizeToValue(left?.size, left?.attribute ?? "padding"));
7991
8055
  }
7992
8056
  }
8057
+ /** The four sides, each with the attribute it came from: `padding-top` wins
8058
+ * over `padding-block`, which wins over `padding`, and a warning about a bad
8059
+ * value has to name the one that was actually written. */
7993
8060
  resolvePadding(scope) {
7994
8061
  const get = (key) => {
7995
8062
  const prop = scope ? `${scope}${key}` : key.charAt(0).toLowerCase() + key.slice(1);
7996
- return this[prop];
8063
+ const size = this[prop];
8064
+ if (size === void 0) return void 0;
8065
+ const name = key.replace(/([A-Z])/g, (match, letter, index) => (index ? "-" : "") + letter.toLowerCase());
8066
+ return {
8067
+ size,
8068
+ attribute: scope ? `${scope}-${name}` : name
8069
+ };
7997
8070
  };
7998
8071
  const all = get("Padding");
7999
8072
  const inline = get("PaddingInline");
@@ -8236,7 +8309,10 @@ var listStyles = css`
8236
8309
  box-sizing: border-box;
8237
8310
  }
8238
8311
 
8239
- /* Nothing in it and nothing said about it: not a thing on the page. */
8312
+ /* Nothing in it, nothing said about it and no controls of its own: not a
8313
+ thing on the page, so a parent that spaces its children keeps no room for
8314
+ it either. The surface is already gone with .list__main; this takes the
8315
+ box out of the flow. */
8240
8316
  :host(.is-blank) {
8241
8317
  display: none;
8242
8318
  }
@@ -8319,6 +8395,10 @@ var listStyles = css`
8319
8395
  display: none;
8320
8396
  }
8321
8397
 
8398
+ .list__search-bar[hidden] {
8399
+ display: none;
8400
+ }
8401
+
8322
8402
  .list__main {
8323
8403
  display: flex;
8324
8404
  flex-direction: column;
@@ -8517,18 +8597,22 @@ var listStyles = css`
8517
8597
  `;
8518
8598
  //#endregion
8519
8599
  //#region src/components/lists-and-tables/list/list.template.ts
8520
- var template$14 = ({ itemsLabel, hasToolbar, type, isEmpty, listbox }) => {
8600
+ var template$14 = ({ itemsLabel, hasToolbar, type, isEmpty, hasItems, hasEmptyState, hasNoResultsState, listbox }) => {
8521
8601
  const isNavigation = type === "navigation";
8522
8602
  const isListbox = type === "listbox";
8523
8603
  const skipItemsLabel = isNavigation || isListbox;
8524
- const itemsRole = isListbox ? "listbox" : type === "tree" ? "tree" : "list";
8525
- const showEmpty = isEmpty && !(isListbox && listbox.searchValue === "");
8526
- const showMain = !isEmpty || showEmpty;
8604
+ const itemsRole = isListbox ? "listbox" : type === "tree" ? "tree" : type === "radiogroup" ? "radiogroup" : "list";
8605
+ const isNoResults = isEmpty && hasItems;
8606
+ const noResultsFallsBack = isNoResults && !hasNoResultsState && hasEmptyState;
8607
+ const showNoResults = isNoResults && hasNoResultsState && !(isListbox && listbox.searchValue === "");
8608
+ const showEmpty = !isNoResults && isEmpty && hasEmptyState || noResultsFallsBack && !(isListbox && listbox.searchValue === "");
8609
+ const showMain = !isEmpty || showEmpty || showNoResults;
8610
+ const showControls = hasItems;
8527
8611
  return html`
8528
8612
  <div class="list">
8529
8613
  <div class="list__header">
8530
8614
  ${isListbox ? html`
8531
- <div class="list__search-bar">
8615
+ <div class="list__search-bar" ?hidden=${!showControls}>
8532
8616
  <div class="list__search-field">
8533
8617
  <label class="list__search-field-label">
8534
8618
  <div class="list__search-field-icon"
@@ -8572,7 +8656,7 @@ var template$14 = ({ itemsLabel, hasToolbar, type, isEmpty, listbox }) => {
8572
8656
  </div>
8573
8657
  </div>
8574
8658
  ` : nothing}
8575
- <div class="list__toolbar" ?hidden=${!hasToolbar}>
8659
+ <div class="list__toolbar" ?hidden=${!hasToolbar || !showControls}>
8576
8660
  <slot name="toolbar"></slot>
8577
8661
  </div>
8578
8662
  </div>
@@ -8586,9 +8670,10 @@ var template$14 = ({ itemsLabel, hasToolbar, type, isEmpty, listbox }) => {
8586
8670
  <slot></slot>
8587
8671
  </div>
8588
8672
  <div class="list__empty"
8589
- ?hidden=${!showEmpty}
8673
+ ?hidden=${!showEmpty && !showNoResults}
8590
8674
  >
8591
- <slot name="empty"></slot>
8675
+ <slot name="empty" ?hidden=${!showEmpty}></slot>
8676
+ <slot name="no-results" ?hidden=${!showNoResults}></slot>
8592
8677
  </div>
8593
8678
  </div>
8594
8679
  </div>
@@ -8635,6 +8720,9 @@ var NLDDList = (_NLDDList2 = class NLDDList extends LitElement {
8635
8720
  this._mergedTranslations = { ...nlddListTranslations };
8636
8721
  this._hasToolbar = false;
8637
8722
  this._hasSearchBarEnd = false;
8723
+ this._hasEmptyState = false;
8724
+ this._hasNoResultsState = false;
8725
+ this._hasItems = false;
8638
8726
  this._isEmpty = false;
8639
8727
  this._searchValue = "";
8640
8728
  this._activeId = "";
@@ -8850,6 +8938,8 @@ var NLDDList = (_NLDDList2 = class NLDDList extends LitElement {
8850
8938
  toolbarSlot?.addEventListener("slotchange", () => queueMicrotask(() => {
8851
8939
  this._hasToolbar = toolbarSlot.assignedElements().length > 0;
8852
8940
  }));
8941
+ (this.shadowRoot?.querySelector("slot[name=\"empty\"]"))?.addEventListener("slotchange", () => queueMicrotask(() => this._updateEmpty()));
8942
+ (this.shadowRoot?.querySelector("slot[name=\"no-results\"]"))?.addEventListener("slotchange", () => queueMicrotask(() => this._updateEmpty()));
8853
8943
  this._itemsObserver = new MutationObserver((mutations) => {
8854
8944
  const isRow = (node) => node instanceof Element && node.tagName.toLowerCase() === "nldd-list-item";
8855
8945
  if (!mutations.some((m) => {
@@ -8997,7 +9087,10 @@ var NLDDList = (_NLDDList2 = class NLDDList extends LitElement {
8997
9087
  _updateEmpty() {
8998
9088
  const items = this._getItems();
8999
9089
  this._isEmpty = items.length === 0 || items.every((item) => item.hasAttribute("hidden"));
9000
- this.classList.toggle("is-blank", this._isEmpty && !this.querySelector(":scope > [slot=\"empty\"]"));
9090
+ this._hasItems = items.length > 0;
9091
+ this._hasEmptyState = !!this.querySelector(":scope > [slot=\"empty\"]");
9092
+ this._hasNoResultsState = !!this.querySelector(":scope > [slot=\"no-results\"]");
9093
+ this.classList.toggle("is-blank", this._isEmpty && !this._hasItems && !this._hasEmptyState);
9001
9094
  this._warnSilentEmpty();
9002
9095
  }
9003
9096
  /**
@@ -9420,6 +9513,9 @@ var NLDDList = (_NLDDList2 = class NLDDList extends LitElement {
9420
9513
  hasToolbar: this._hasToolbar,
9421
9514
  type: this.type,
9422
9515
  isEmpty: this._isEmpty,
9516
+ hasItems: this._hasItems,
9517
+ hasEmptyState: this._hasEmptyState,
9518
+ hasNoResultsState: this._hasNoResultsState,
9423
9519
  listbox: {
9424
9520
  listboxId: this._listboxId,
9425
9521
  searchValue: this._searchValue,
@@ -9466,6 +9562,9 @@ __decorate([property({ type: Object })], NLDDList.prototype, "translations", voi
9466
9562
  __decorate([state()], NLDDList.prototype, "_mergedTranslations", void 0);
9467
9563
  __decorate([state()], NLDDList.prototype, "_hasToolbar", void 0);
9468
9564
  __decorate([state()], NLDDList.prototype, "_hasSearchBarEnd", void 0);
9565
+ __decorate([state()], NLDDList.prototype, "_hasEmptyState", void 0);
9566
+ __decorate([state()], NLDDList.prototype, "_hasNoResultsState", void 0);
9567
+ __decorate([state()], NLDDList.prototype, "_hasItems", void 0);
9469
9568
  __decorate([state()], NLDDList.prototype, "_isEmpty", void 0);
9470
9569
  __decorate([state()], NLDDList.prototype, "_searchValue", void 0);
9471
9570
  __decorate([state()], NLDDList.prototype, "_activeId", void 0);
@@ -9894,7 +9993,7 @@ var listItemStyles = css`
9894
9993
  //#region src/components/lists-and-tables/list-item/list-item.template.ts
9895
9994
  var content = html`<slot></slot>`;
9896
9995
  var divider = html`<div class="list-item__divider"></div>`;
9897
- var template$13 = (button, href, target, rel, opensInNewTabLabel, actionTabindex, isHighlighted = false, checkbox = false, checked = false, expanded, showChildren = false, hasCheckedSegment = false, disabled = false) => {
9996
+ var template$13 = (button, href, target, rel, opensInNewTabLabel, actionTabindex, isHighlighted = false, checkbox = false, radio = false, checked = false, expanded, showChildren = false, hasCheckedSegment = false, disabled = false) => {
9898
9997
  const ariaExpanded = expanded === void 0 ? nothing : String(expanded);
9899
9998
  const children = showChildren ? html`<div class="list-item__children"
9900
9999
  role="group"
@@ -9927,6 +10026,16 @@ var template$13 = (button, href, target, rel, opensInNewTabLabel, actionTabindex
9927
10026
  >${content}</button>
9928
10027
  ${divider}
9929
10028
  </div>${children}`;
10029
+ if (radio) return html`<div class=${blockClass}>
10030
+ <button class="list-item__action"
10031
+ type="button"
10032
+ role="radio"
10033
+ ?disabled=${disabled}
10034
+ aria-checked=${String(checked)}
10035
+ tabindex=${actionTabindex ?? nothing}
10036
+ >${content}</button>
10037
+ ${divider}
10038
+ </div>${children}`;
9930
10039
  if (button) return html`<div class=${blockClass}>
9931
10040
  <button class="list-item__action"
9932
10041
  type="button"
@@ -10007,6 +10116,7 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10007
10116
  this.current = false;
10008
10117
  this.button = false;
10009
10118
  this.checkbox = false;
10119
+ this.radio = false;
10010
10120
  this.checked = false;
10011
10121
  this.disabled = false;
10012
10122
  this.reorderable = false;
@@ -10039,6 +10149,14 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10039
10149
  composed: true
10040
10150
  }));
10041
10151
  }
10152
+ if (this.radio && !this.checkbox && !this.href && !this.checked && e.composedPath().includes(this._action)) {
10153
+ this.checked = true;
10154
+ this.dispatchEvent(new CustomEvent("change", {
10155
+ detail: { checked: true },
10156
+ bubbles: true,
10157
+ composed: true
10158
+ }));
10159
+ }
10042
10160
  };
10043
10161
  this._handleFocusIn = () => {
10044
10162
  this._action?.classList.toggle("is-pointer-focus", isPointerMode());
@@ -10160,7 +10278,7 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10160
10278
  */
10161
10279
  get _isRovingStop() {
10162
10280
  if (this.disabled) return false;
10163
- if (this.href || this.button || this.checkbox) return true;
10281
+ if (this.href || this.button || this.checkbox || this.radio) return true;
10164
10282
  if (this._ownDescendants("nldd-list-item-segment:not([disabled])").length > 0) return true;
10165
10283
  return this._rovingControls().some((control) => !control.hasAttribute("disabled"));
10166
10284
  }
@@ -10194,7 +10312,7 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10194
10312
  * inside `:host()`, and the row's own padding is what has to change — a
10195
10313
  * `::slotted()` rule could only reach the segment. */
10196
10314
  _updateInteractive() {
10197
- const interactive = !!this.href || this.button || this.checkbox || this._ownDescendants("nldd-list-item-segment").length > 0;
10315
+ const interactive = !!this.href || this.button || this.checkbox || this.radio || this._ownDescendants("nldd-list-item-segment").length > 0;
10198
10316
  this.classList.toggle("is-interactive", interactive);
10199
10317
  const ownChildren = Array.from(this.children).filter((el) => el.getAttribute("slot") !== "children");
10200
10318
  const isSegment = (el) => el?.tagName.toLowerCase() === "nldd-list-item-segment";
@@ -10251,8 +10369,8 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10251
10369
  });
10252
10370
  }
10253
10371
  updated(changed) {
10254
- if (changed.has("selected") || changed.has("current") || changed.has("button") || changed.has("checkbox") || changed.has("href") || changed.has("_parentType")) this._updateAriaState();
10255
- if (changed.has("button") || changed.has("checkbox") || changed.has("href")) this._updateInteractive();
10372
+ if (changed.has("selected") || changed.has("current") || changed.has("button") || changed.has("checkbox") || changed.has("radio") || changed.has("href") || changed.has("_parentType")) this._updateAriaState();
10373
+ if (changed.has("button") || changed.has("checkbox") || changed.has("radio") || changed.has("href")) this._updateInteractive();
10256
10374
  if (changed.has("expanded")) {
10257
10375
  this._relayExpanded();
10258
10376
  this._warnOnStrayExpanded();
@@ -10323,7 +10441,10 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10323
10441
  this.childRows.forEach(fn);
10324
10442
  }
10325
10443
  _updateAriaState() {
10326
- if (this._parentType === "tree") {
10444
+ if (this._parentType === "radiogroup") {
10445
+ this.setAttribute("role", "none");
10446
+ this.removeAttribute("aria-selected");
10447
+ } else if (this._parentType === "tree") {
10327
10448
  this.setAttribute("role", "treeitem");
10328
10449
  this.removeAttribute("aria-selected");
10329
10450
  } else if (this._isListboxOption) {
@@ -10566,7 +10687,7 @@ var NLDDListItem = (_NLDDListItem2 = class NLDDListItem extends withTranslations
10566
10687
  render() {
10567
10688
  const opensInNewTabLabel = this.href && this.target === "_blank" ? this._t("components.list-item.opens-in-new-tab-label") : void 0;
10568
10689
  const actionTabindex = this._isListboxOption ? "-1" : this._arrowNavigation ? this._rovingActive ? "0" : "-1" : void 0;
10569
- return template$13(this.button, this.href, this.target, this.rel, opensInNewTabLabel, actionTabindex, this._highlighted, this.checkbox, this.checked, this._resolvedExpanded, this._showChildren, this._hasCheckedSegment, this.disabled);
10690
+ return template$13(this.button, this.href, this.target, this.rel, opensInNewTabLabel, actionTabindex, this._highlighted, this.checkbox, this.radio, this.checked, this._resolvedExpanded, this._showChildren, this._hasCheckedSegment, this.disabled);
10570
10691
  }
10571
10692
  }, _NLDDListItem = _NLDDListItem2, _NLDDListItem2.styles = [listItemStyles], _NLDDListItem2.SIZED_CELLS = "nldd-text-cell, nldd-drag-handle-cell", _NLDDListItem2);
10572
10693
  __decorate([property({
@@ -10589,6 +10710,10 @@ __decorate([property({
10589
10710
  type: Boolean,
10590
10711
  reflect: true
10591
10712
  })], NLDDListItem.prototype, "checkbox", void 0);
10713
+ __decorate([property({
10714
+ type: Boolean,
10715
+ reflect: true
10716
+ })], NLDDListItem.prototype, "radio", void 0);
10592
10717
  __decorate([property({
10593
10718
  type: Boolean,
10594
10719
  reflect: true
@@ -13150,10 +13275,12 @@ var textStyles = css`
13150
13275
  --_font-size: var(--primitives-font-size-100);
13151
13276
  --_font-weight: var(--primitives-font-weight-body-regular);
13152
13277
  --_line-height: var(--primitives-line-height-snug);
13278
+ --_max-width: var(--semantics-text-max-width);
13153
13279
  --_color: var(--context-content-color, var(--semantics-content-color));
13154
13280
  --_text-align: left;
13155
13281
 
13156
13282
  display: block;
13283
+ max-width: var(--_max-width);
13157
13284
  color: var(--_color);
13158
13285
  text-align: var(--_text-align);
13159
13286
  font: var(--_font-weight) var(--_font-size) / var(--_line-height) var(--primitives-font-family-body);
@@ -13283,6 +13410,12 @@ function template$10() {
13283
13410
  * content, so text inside a row travels with that row as it is hovered or
13284
13411
  * selected. Standalone that channel is unset and the semantic color answers.
13285
13412
  *
13413
+ * A line stops at `--semantics-text-max-width`, 40em, so it holds the same
13414
+ * number of characters at every size and a wide column does not turn one
13415
+ * sentence into a ruler. Override that variable, or `max-width` on the element,
13416
+ * where a line is meant to run the full width: a label in a table cell, a value
13417
+ * beside its own heading.
13418
+ *
13286
13419
  * @element nldd-text
13287
13420
  * @attr {string} size - Text size on the body scale: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' (default: 'md')
13288
13421
  * @attr {string} weight - Font weight: 'regular' | 'medium' | 'bold' (default: 'regular'). With 'bold' a slotted `<strong>` no longer stands out: there is nothing bolder in the scale.
@@ -35561,7 +35694,7 @@ var barSplitViewStyles = css`
35561
35694
  /* Root-scroll mode: the document scrolls (ScrollModeController /
35562
35695
  --context-scroll-mode). Bars become sticky layers that stay put while the
35563
35696
  main content scrolls under them; their measured heights are published into
35564
- --context-layer-top/bottom (see bar-split-view.ts) so a descendant
35697
+ --context-inset-top/bottom (see bar-split-view.ts) so a descendant
35565
35698
  nldd-page's sticky header/footer stack below/above them. The sticky insets
35566
35699
  and those offsets are set by JS; bars paint above the content. */
35567
35700
  :host([data-scroll="root"]) {
@@ -35857,12 +35990,12 @@ var mdMaxPx = parseInt(breakpoints.mdMax);
35857
35990
  var NLDDBarSplitView = (_NLDDBarSplitView = class NLDDBarSplitView extends LitElement {
35858
35991
  constructor(..._args) {
35859
35992
  super(..._args);
35860
- this._scrollMode = new ScrollModeController(this, () => this._updateLayerOffsets());
35993
+ this._scrollMode = new ScrollModeController(this, () => this._updateInsets());
35861
35994
  this.background = "inherit";
35862
35995
  this._currentBreakpoint = null;
35863
35996
  this._observer = null;
35864
35997
  this._resizeObserver = null;
35865
- this._updateLayerOffsets = () => {
35998
+ this._updateInsets = () => {
35866
35999
  const block = this.shadowRoot?.querySelector(".bar-split-view") ?? null;
35867
36000
  const main = block?.querySelector(".bar-split-view__main") ?? null;
35868
36001
  if (!block || !main) return;
@@ -35873,25 +36006,25 @@ var NLDDBarSplitView = (_NLDDBarSplitView = class NLDDBarSplitView extends LitEl
35873
36006
  el.style.top = "";
35874
36007
  el.style.bottom = "";
35875
36008
  });
35876
- main.style.removeProperty("--context-layer-top");
35877
- main.style.removeProperty("--context-layer-bottom");
36009
+ main.style.removeProperty("--context-inset-top");
36010
+ main.style.removeProperty("--context-inset-bottom");
35878
36011
  return;
35879
36012
  }
35880
36013
  const cs = getComputedStyle(this);
35881
- let top = parseFloat(cs.getPropertyValue("--context-layer-top")) || 0;
36014
+ let top = parseFloat(cs.getPropertyValue("--context-inset-top")) || 0;
35882
36015
  for (let i = 0; i < mainIndex; i++) {
35883
36016
  children[i].style.top = `${top}px`;
35884
36017
  children[i].style.bottom = "";
35885
36018
  top += children[i].offsetHeight;
35886
36019
  }
35887
- main.style.setProperty("--context-layer-top", `${top}px`);
35888
- let bottom = parseFloat(cs.getPropertyValue("--context-layer-bottom")) || 0;
36020
+ main.style.setProperty("--context-inset-top", `${top}px`);
36021
+ let bottom = parseFloat(cs.getPropertyValue("--context-inset-bottom")) || 0;
35889
36022
  for (let i = children.length - 1; i > mainIndex; i--) {
35890
36023
  children[i].style.bottom = `${bottom}px`;
35891
36024
  children[i].style.top = "";
35892
36025
  bottom += children[i].offsetHeight;
35893
36026
  }
35894
- main.style.setProperty("--context-layer-bottom", `${bottom}px`);
36027
+ main.style.setProperty("--context-inset-bottom", `${bottom}px`);
35895
36028
  };
35896
36029
  }
35897
36030
  connectedCallback() {
@@ -35917,7 +36050,7 @@ var NLDDBarSplitView = (_NLDDBarSplitView = class NLDDBarSplitView extends LitEl
35917
36050
  this._currentBreakpoint = bp;
35918
36051
  this.requestUpdate();
35919
36052
  }
35920
- this._updateLayerOffsets();
36053
+ this._updateInsets();
35921
36054
  });
35922
36055
  this._resizeObserver.observe(this);
35923
36056
  }
@@ -35962,7 +36095,7 @@ var NLDDBarSplitView = (_NLDDBarSplitView = class NLDDBarSplitView extends LitEl
35962
36095
  });
35963
36096
  }
35964
36097
  updated() {
35965
- this._updateLayerOffsets();
36098
+ this._updateInsets();
35966
36099
  }
35967
36100
  render() {
35968
36101
  return barSplitViewTemplate(this);
@@ -37351,6 +37484,16 @@ var pageStyles = css`
37351
37484
 
37352
37485
  :host {
37353
37486
  --_background-color: var(--context-parent-background-color, var(--semantics-surfaces-base-background-color));
37487
+ /* The insets this page arrived with, parked before it adds its own:
37488
+ republishing --context-inset-top on the element it reads from would be
37489
+ a cycle. */
37490
+ --_outer-inset-top: var(--context-inset-top, 0px);
37491
+ --_outer-inset-bottom: var(--context-inset-bottom, 0px);
37492
+ --_header-height: 0px;
37493
+ --_footer-height: 0px;
37494
+ /* Set from JS while the page owns the scroller. initial, not a length, so
37495
+ the fallback stands when the document scrolls instead. */
37496
+ --_scroll-height: initial;
37354
37497
 
37355
37498
  display: flex;
37356
37499
  background-color: var(--_background-color);
@@ -37389,9 +37532,8 @@ var pageStyles = css`
37389
37532
 
37390
37533
  /* Root-scroll mode: the DOCUMENT scrolls (see nldd-app-view), not the page.
37391
37534
  The page stops owning an inner scroll container and its sticky-header/footer
37392
- become real position:sticky layers against the document, offset by the
37393
- cumulative layer heights above/below (--context-layer-top/bottom, published
37394
- by any bars sitting outside the page). The mode is derived upstream and
37535
+ stick against the document, offset by the insets above and below
37536
+ (--context-inset-top/bottom, published by any bars outside the page). The mode is derived upstream and
37395
37537
  delivered as --context-scroll-mode; nldd-page reflects it to [data-scroll]
37396
37538
  so these (higher-specificity, later) rules win over the nested ones. */
37397
37539
  :host([data-scroll="root"]) {
@@ -37427,7 +37569,7 @@ var pageStyles = css`
37427
37569
  :host([data-scroll="root"]) .page {
37428
37570
  overflow: visible;
37429
37571
  flex-shrink: 0;
37430
- min-height: calc(100dvh - var(--context-layer-top, 0px) - var(--context-layer-bottom, 0px));
37572
+ min-height: calc(100dvh - var(--context-inset-top, 0px) - var(--context-inset-bottom, 0px));
37431
37573
  }
37432
37574
 
37433
37575
 
@@ -37462,7 +37604,7 @@ var pageStyles = css`
37462
37604
  opacity: 0;
37463
37605
  background: linear-gradient(to bottom, color-mix(in srgb, var(--_background-color) 95%, transparent), transparent);
37464
37606
  pointer-events: none;
37465
- height: var(--primitives-space-32);
37607
+ height: var(--primitives-space-24);
37466
37608
  transition: opacity var(--primitives-transition-duration-medium) var(--primitives-transition-easing-default);
37467
37609
  }
37468
37610
 
@@ -37476,18 +37618,34 @@ var pageStyles = css`
37476
37618
  only mattered for the absolute overlay. */
37477
37619
  :host([data-scroll="root"][sticky-header]) .page__header {
37478
37620
  position: sticky;
37479
- top: var(--context-layer-top, 0px);
37621
+ top: var(--context-inset-top, 0px);
37480
37622
  left: auto;
37481
37623
  right: auto;
37482
37624
  }
37483
37625
 
37626
+ /* The page adds its own bars to the insets it inherited, so sticky content
37627
+ inside clears them without knowing a number. The header sits outside this
37628
+ element and keeps the value without itself in it. */
37484
37629
  .page__scroll {
37630
+ --context-inset-top: calc(var(--_outer-inset-top) + var(--_header-height));
37631
+ --context-inset-bottom: calc(var(--_outer-inset-bottom) + var(--_footer-height));
37632
+ /* The height sticky content can cap itself on. Unset while the document
37633
+ scrolls, where the viewport is the whole story. */
37634
+ --context-scroller-height: var(--_scroll-height, 100dvh);
37635
+
37485
37636
  display: flex;
37486
37637
  min-height: 0;
37487
37638
  flex-direction: column;
37488
37639
  flex-grow: 1;
37489
37640
  }
37490
37641
 
37642
+ /* Nested scrolling: a sticky child is measured against this element, so the
37643
+ bars above the page fall outside it and only its own header counts. */
37644
+ :host(:not([data-scroll="root"])) .page__scroll {
37645
+ --context-inset-top: var(--_header-height);
37646
+ --context-inset-bottom: var(--_footer-height);
37647
+ }
37648
+
37491
37649
  :host([sticky-header]) .page__scroll {
37492
37650
  overflow-y: auto;
37493
37651
  overflow-x: hidden;
@@ -37526,12 +37684,12 @@ var pageStyles = css`
37526
37684
  right: 0;
37527
37685
  background: linear-gradient(to top, color-mix(in srgb, var(--_background-color) 95%, transparent), transparent);
37528
37686
  pointer-events: none;
37529
- height: var(--primitives-space-32);
37687
+ height: var(--primitives-space-24);
37530
37688
  }
37531
37689
 
37532
37690
  /* Root-scroll mode: footer sticks to the document bottom, above any bottom bars. */
37533
37691
  :host([data-scroll="root"][sticky-footer]) .page__footer {
37534
- bottom: var(--context-layer-bottom, 0px);
37692
+ bottom: var(--context-inset-bottom, 0px);
37535
37693
  }
37536
37694
  `;
37537
37695
  //#endregion
@@ -37566,10 +37724,18 @@ function pageTemplate(component) {
37566
37724
  *
37567
37725
  * In root-scroll mode (--context-scroll-mode: root, derived upstream by
37568
37726
  * nldd-app-view) the page stops owning a scroller: the document scrolls and the
37569
- * sticky header/footer become position:sticky layers offset by
37570
- * --context-layer-top/bottom. The mode is read on connect/resize and reflected
37727
+ * sticky header/footer stick against the document, offset by
37728
+ * --context-inset-top/bottom. The mode is read on connect/resize and reflected
37571
37729
  * to [data-scroll] so the CSS can branch.
37572
37730
  *
37731
+ * The page passes those insets on to its own content, with its sticky header
37732
+ * and footer added: anything sticky inside (an nldd-sidebar-section, a sticky
37733
+ * table head) reads --context-inset-top / --context-inset-bottom and clears
37734
+ * every bar above and below it without being told a number. The heights are
37735
+ * measured, because a top title bar shrinks as you scroll past its anchor. While
37736
+ * the page owns the scroller, only its own bars count: the chrome above the page
37737
+ * sits outside that scroller and does not push sticky content down.
37738
+ *
37573
37739
  * @element nldd-page
37574
37740
  *
37575
37741
  * @attr {boolean} sticky-header - Sticky header
@@ -37593,6 +37759,7 @@ var NLDDPage = (_NLDDPage = class NLDDPage extends LitElement {
37593
37759
  this._scrollTarget = null;
37594
37760
  this._scrollProvider = null;
37595
37761
  this._headerObserver = null;
37762
+ this._insetObserver = null;
37596
37763
  this._mainSlot = null;
37597
37764
  this._resizeRaf = 0;
37598
37765
  this._onResize = () => {
@@ -37641,6 +37808,9 @@ var NLDDPage = (_NLDDPage = class NLDDPage extends LitElement {
37641
37808
  get _scrollEl() {
37642
37809
  return this.shadowRoot?.querySelector(".page__scroll") ?? null;
37643
37810
  }
37811
+ get _footerEl() {
37812
+ return this.shadowRoot?.querySelector(".page__footer") ?? null;
37813
+ }
37644
37814
  connectedCallback() {
37645
37815
  super.connectedCallback();
37646
37816
  this.style.containerType = "inline-size";
@@ -37665,6 +37835,7 @@ var NLDDPage = (_NLDDPage = class NLDDPage extends LitElement {
37665
37835
  if (this._resizeRaf) cancelAnimationFrame(this._resizeRaf);
37666
37836
  this._teardownScrollListener();
37667
37837
  this._teardownHeaderObserver();
37838
+ this._teardownInsetObserver();
37668
37839
  this._teardownMainSlotListener();
37669
37840
  }
37670
37841
  firstUpdated() {
@@ -37695,8 +37866,41 @@ var NLDDPage = (_NLDDPage = class NLDDPage extends LitElement {
37695
37866
  if (this._scrollEl) this._scrollEl.style.paddingTop = "";
37696
37867
  this._setupScrollListener();
37697
37868
  if (this.stickyHeader && !this._isRoot) this._setupHeaderObserver();
37869
+ this._setupInsetObserver();
37698
37870
  this._onScroll();
37699
37871
  }
37872
+ /**
37873
+ * Publishes the page's own sticky bars as insets, so sticky content inside
37874
+ * the page knows how far to clear.
37875
+ *
37876
+ * Measured rather than assumed: a top title bar shrinks as you scroll past
37877
+ * its anchor, and a consumer that had written the number down would be wrong
37878
+ * from that moment on. A bar that is not sticky scrolls away and adds
37879
+ * nothing, so it stays at zero.
37880
+ */
37881
+ _setupInsetObserver() {
37882
+ this._teardownInsetObserver();
37883
+ const header = this._headerEl;
37884
+ const footer = this._footerEl;
37885
+ if (!header || !footer) return;
37886
+ const publish = () => {
37887
+ this.style.setProperty("--_header-height", `${this.stickyHeader ? header.offsetHeight : 0}px`);
37888
+ this.style.setProperty("--_footer-height", `${this.stickyFooter ? footer.offsetHeight : 0}px`);
37889
+ if (this._isRoot) this.style.removeProperty("--_scroll-height");
37890
+ else this.style.setProperty("--_scroll-height", `${this._scrollEl?.clientHeight ?? 0}px`);
37891
+ };
37892
+ publish();
37893
+ this._insetObserver = new ResizeObserver(publish);
37894
+ this._insetObserver.observe(header);
37895
+ this._insetObserver.observe(footer);
37896
+ if (this._scrollEl) this._insetObserver.observe(this._scrollEl);
37897
+ }
37898
+ _teardownInsetObserver() {
37899
+ if (this._insetObserver) {
37900
+ this._insetObserver.disconnect();
37901
+ this._insetObserver = null;
37902
+ }
37903
+ }
37700
37904
  _setupScrollListener() {
37701
37905
  const target = this.scrollEventTarget;
37702
37906
  target.addEventListener("scroll", this._onScroll, { passive: true });
@@ -39613,10 +39817,10 @@ var sidebarSectionStyles = css`
39613
39817
  --_lg-padding-top: initial;
39614
39818
  --_lg-padding-bottom: initial;
39615
39819
  --_max-width: var(--semantics-page-sections-body-max-width);
39616
- /* Sticky insets default to 16px top and bottom; override via sticky-top /
39617
- sticky-bottom to clear other sticky page elements (e.g. a sticky header). */
39618
- --_sticky-top: var(--primitives-space-16);
39619
- --_sticky-bottom: var(--primitives-space-16);
39820
+ /* 24px clear of the insets nldd-page publishes. 24 is the depth of a
39821
+ sticky header's fade, so the box starts where the fade ends. */
39822
+ --_sticky-top: calc(var(--context-inset-top, 0px) + var(--primitives-space-24));
39823
+ --_sticky-bottom: calc(var(--context-inset-bottom, 0px) + var(--primitives-space-24));
39620
39824
  --_sidebar-width: var(--primitives-area-320);
39621
39825
 
39622
39826
  display: flex;
@@ -39749,7 +39953,9 @@ var sidebarSectionStyles = css`
39749
39953
  position: sticky;
39750
39954
  top: var(--_sticky-top);
39751
39955
  bottom: var(--_sticky-bottom);
39752
- max-height: calc(100dvh - var(--_sticky-top) - var(--_sticky-bottom));
39956
+ /* What the scroller shows, not what the window is: a viewport-tall cap
39957
+ hangs out the bottom by the height of the chrome around the page. */
39958
+ max-height: calc(var(--context-scroller-height, 100dvh) - var(--_sticky-top) - var(--_sticky-bottom));
39753
39959
  overflow-y: auto;
39754
39960
  }
39755
39961
  }
@@ -39889,8 +40095,8 @@ var sheetStyles = css`
39889
40095
  sticky header sticks to that edge instead of to a bar that stands
39890
40096
  outside. See findScrollModeProvider for the other half. */
39891
40097
  --context-scroll-mode: nested;
39892
- --context-layer-top: 0px;
39893
- --context-layer-bottom: 0px;
40098
+ --context-inset-top: 0px;
40099
+ --context-inset-bottom: 0px;
39894
40100
 
39895
40101
  display: flex;
39896
40102
  position: fixed;
@@ -40903,29 +41109,21 @@ var collectionStyles = css`
40903
41109
  --_item-width: var(--primitives-area-280);
40904
41110
  --_focus-ring-z-index: 1;
40905
41111
 
40906
- @media (max-width: ${smMax$4}) {
40907
- --_gap: var(--components-collection-sm-gap);
40908
- }
41112
+ /* Two sets, because a collection inside a layout-container follows that
41113
+ container and anywhere else the viewport. The bare --_gap is what
41114
+ stands when neither set matches. */
41115
+ --_sm-gap: var(--components-collection-sm-gap);
41116
+ --_md-gap: var(--components-collection-md-gap);
41117
+ --_lg-gap: var(--components-collection-lg-gap);
41118
+ --_gap: var(--_sm-gap);
40909
41119
 
40910
- @media (min-width: ${mdMin$3}) and (max-width: ${mdMax$2}) {
40911
- --_gap: var(--components-collection-md-gap);
40912
- }
40913
-
40914
- @media (min-width: ${lgMin$2}) {
40915
- --_gap: var(--components-collection-lg-gap);
40916
- }
41120
+ @media (max-width: ${smMax$4}) { --_gap: var(--_sm-gap); }
41121
+ @media (min-width: ${mdMin$3}) and (max-width: ${mdMax$2}) { --_gap: var(--_md-gap); }
41122
+ @media (min-width: ${lgMin$2}) { --_gap: var(--_lg-gap); }
40917
41123
 
40918
- @container layout-container (max-width: ${smMax$4}) {
40919
- --_gap: var(--components-collection-sm-gap);
40920
- }
40921
-
40922
- @container layout-container (min-width: ${mdMin$3}) and (max-width: ${mdMax$2}) {
40923
- --_gap: var(--components-collection-md-gap);
40924
- }
40925
-
40926
- @container layout-container (min-width: ${lgMin$2}) {
40927
- --_gap: var(--components-collection-lg-gap);
40928
- }
41124
+ @container layout-container (max-width: ${smMax$4}) { --_gap: var(--_sm-gap); }
41125
+ @container layout-container (min-width: ${mdMin$3}) and (max-width: ${mdMax$2}) { --_gap: var(--_md-gap); }
41126
+ @container layout-container (min-width: ${lgMin$2}) { --_gap: var(--_lg-gap); }
40929
41127
 
40930
41128
  display: flex;
40931
41129
  width: 100%;
@@ -40972,6 +41170,27 @@ var collectionStyles = css`
40972
41170
  flex-direction: column;
40973
41171
  }
40974
41172
 
41173
+
41174
+ /* ## Lanes */
41175
+
41176
+ /* Falls back to the grid above, not to the multicol nldd-container uses:
41177
+ this component pages, and multicol redistributes the whole set every time
41178
+ load-more adds to it. */
41179
+ :host([layout="lanes"]) .collection__items {
41180
+ display: grid;
41181
+ grid-template-columns: repeat(auto-fill, minmax(min(var(--_item-width), 100%), 1fr));
41182
+ }
41183
+
41184
+ :host([layout="lanes"]) .collection__items ::slotted(*) {
41185
+ min-width: 0;
41186
+ }
41187
+
41188
+ @supports (display: grid-lanes) {
41189
+ :host([layout="lanes"]) .collection__items {
41190
+ display: grid-lanes;
41191
+ }
41192
+ }
41193
+
40975
41194
  /* ## Horizontal scroll */
40976
41195
 
40977
41196
  :host([layout="horizontal-scroll"]) .collection__items {
@@ -41122,7 +41341,7 @@ var nlddCollectionTranslations = {
41122
41341
  * Nederlandse Digitale Dienst Collection Component (Lit + TypeScript)
41123
41342
  *
41124
41343
  * A container for displaying collections of items.
41125
- * Supports grid, stack, and horizontal scroll layouts.
41344
+ * Supports grid, stack, lanes and horizontal scroll layouts.
41126
41345
  * In grid and stack modes, items are paginated via a load-more button. In
41127
41346
  * horizontal scroll, the prev/next controls and the edge fade appear only when
41128
41347
  * the items overflow the container.
@@ -41131,12 +41350,15 @@ var nlddCollectionTranslations = {
41131
41350
  *
41132
41351
  * @element nldd-collection
41133
41352
  *
41134
- * @attr {string} layout - Layout mode: 'grid' | 'stack' | 'horizontal-scroll' (default: 'grid')
41353
+ * @attr {string} layout - Layout mode: 'grid' | 'stack' | 'lanes' | 'horizontal-scroll' (default: 'grid')
41135
41354
  * @attr {boolean} show-load-more - Show load-more button in grid/stack (default: false)
41136
41355
  * @attr {number} max-items - Number of visible items per page (default: 24)
41137
41356
  * @attr {boolean} lazy-load - Automatically load more items when the button becomes visible
41138
- * @attr {string} item-width - Preferred width for each item (e.g. '280px', '20rem'). In grid layout used as the minimum column width (columns will be at least this wide; 1fr if container allows more). In horizontal scroll used as flex-basis. Never forces horizontal overflow — the value is clamped to container width.
41139
- * @attr {string} gap - Custom gap between items (any CSS length, e.g. '8px'). Overrides the responsive default at every breakpoint; unset keeps the default.
41357
+ * @attr {string} item-width - Preferred width for each item (e.g. '280px', '20rem'). In grid and lanes layouts used as the minimum column width (columns will be at least this wide; 1fr if container allows more). In horizontal scroll used as flex-basis. Never forces horizontal overflow — the value is clamped to container width.
41358
+ * @attr {string} gap - Gap between items, as a step of the spacing scale ('0', '2', '4', '6', '8', '10', '12', '16', '20', '24', '28', '32', '40', '44', '48', '56', '64', '80', '96'). Overrides the responsive default at every breakpoint; unset keeps the default.
41359
+ * @attr {string} sm-gap - Gap at sm, overriding `gap` there
41360
+ * @attr {string} md-gap - Gap at md, overriding `gap` there
41361
+ * @attr {string} lg-gap - Gap at lg, overriding `gap` there
41140
41362
  * @attr {object} translations - Translation overrides; unset keys fall back to Dutch. Available keys: 'components.collection.previous-action', 'components.collection.next-action', 'components.collection.load-more-action'
41141
41363
  *
41142
41364
  * @migration The `load-more-label` attribute has been removed.
@@ -41210,9 +41432,16 @@ var NLDDCollection = (_NLDDCollection = class NLDDCollection extends LitElement
41210
41432
  if (this.itemWidth) this.style.setProperty("--_item-width", this.itemWidth);
41211
41433
  else this.style.removeProperty("--_item-width");
41212
41434
  }
41213
- if (changedProperties.has("gap")) {
41214
- if (this.gap) this.style.setProperty("--_gap", this.gap);
41215
- else this.style.removeProperty("--_gap");
41435
+ if (changedProperties.has("gap") || changedProperties.has("smGap") || changedProperties.has("mdGap") || changedProperties.has("lgGap")) {
41436
+ const plain = spacingToValue(this.gap, "nldd-collection", "gap");
41437
+ const write = (name, size, attribute) => {
41438
+ const value = size === void 0 ? plain : spacingToValue(size, "nldd-collection", attribute) ?? plain;
41439
+ if (value === null) this.style.removeProperty(name);
41440
+ else this.style.setProperty(name, value);
41441
+ };
41442
+ write("--_sm-gap", this.smGap, "sm-gap");
41443
+ write("--_md-gap", this.mdGap, "md-gap");
41444
+ write("--_lg-gap", this.lgGap, "lg-gap");
41216
41445
  }
41217
41446
  if (this.lazyLoad && this._loadMoreBtn && !this._intersectionObserver) {
41218
41447
  this._intersectionObserver = new IntersectionObserver(([entry]) => {
@@ -41315,6 +41544,21 @@ __decorate([property({
41315
41544
  type: String,
41316
41545
  reflect: true
41317
41546
  })], NLDDCollection.prototype, "gap", void 0);
41547
+ __decorate([property({
41548
+ type: String,
41549
+ reflect: true,
41550
+ attribute: "sm-gap"
41551
+ })], NLDDCollection.prototype, "smGap", void 0);
41552
+ __decorate([property({
41553
+ type: String,
41554
+ reflect: true,
41555
+ attribute: "md-gap"
41556
+ })], NLDDCollection.prototype, "mdGap", void 0);
41557
+ __decorate([property({
41558
+ type: String,
41559
+ reflect: true,
41560
+ attribute: "lg-gap"
41561
+ })], NLDDCollection.prototype, "lgGap", void 0);
41318
41562
  __decorate([property({ type: Object })], NLDDCollection.prototype, "translations", void 0);
41319
41563
  __decorate([state()], NLDDCollection.prototype, "_visibleCount", void 0);
41320
41564
  __decorate([state()], NLDDCollection.prototype, "_totalCount", void 0);
@@ -45456,6 +45700,21 @@ var topNavigationBarStyles = css`
45456
45700
  /* # Block */
45457
45701
 
45458
45702
  .top-navigation-bar {
45703
+ /* The ribbon's width, and with it everything measured against the ribbon:
45704
+ its own height and the wordmark beside it. Here rather than on :host,
45705
+ because a container query cannot measure the container it sits on. */
45706
+ @container (max-width: ${smMax$2}) {
45707
+ --_logo-width: var(--semantics-brand-ribbon-sm-width);
45708
+ }
45709
+
45710
+ @container (min-width: ${mdMin$1}) and (max-width: ${mdMax}) {
45711
+ --_logo-width: var(--semantics-brand-ribbon-md-width);
45712
+ }
45713
+
45714
+ @container (min-width: ${lgMin}) {
45715
+ --_logo-width: var(--semantics-brand-ribbon-lg-width);
45716
+ }
45717
+
45459
45718
  box-sizing: border-box;
45460
45719
  display: flex;
45461
45720
  flex-direction: column;
@@ -45504,18 +45763,6 @@ var topNavigationBarStyles = css`
45504
45763
  align-self: start;
45505
45764
  align-items: center;
45506
45765
  justify-content: center;
45507
-
45508
- @container (max-width: ${smMax$2}) {
45509
- --_logo-width: var(--semantics-brand-ribbon-sm-width);
45510
- }
45511
-
45512
- @container (min-width: ${mdMin$1}) and (max-width: ${mdMax}) {
45513
- --_logo-width: var(--semantics-brand-ribbon-md-width);
45514
- }
45515
-
45516
- @container (min-width: ${lgMin}) {
45517
- --_logo-width: var(--semantics-brand-ribbon-lg-width);
45518
- }
45519
45766
  }
45520
45767
 
45521
45768
  .top-navigation-bar__logo svg {
@@ -45568,17 +45815,37 @@ var topNavigationBarStyles = css`
45568
45815
  /* ## Wordmark */
45569
45816
 
45570
45817
  .top-navigation-bar__wordmark {
45818
+ box-sizing: border-box;
45571
45819
  display: flex;
45820
+ /* A grid item is at least as wide as its longest word unless told
45821
+ otherwise, and the column it sits in is one of the two that keep the
45822
+ ribbon centred. One unbreakable name would push the ribbon off centre
45823
+ and the page past the screen. */
45824
+ min-width: 0;
45572
45825
  min-height: calc(var(--_logo-width) * 2);
45573
45826
  grid-column: 3;
45574
45827
  flex-direction: column;
45575
45828
  color: var(--_wordmark-content-color);
45829
+
45830
+ /* The distance the text keeps from the top edge once it outgrows the
45831
+ ribbon. Only at the top: space under it would raise the bar for
45832
+ nothing. The minimum gives up the same 12, so the text still centres
45833
+ on the middle of the ribbon rather than 6px below it. */
45834
+ @container (max-width: ${smMax$2}) {
45835
+ align-self: start;
45836
+ min-height: calc(var(--_logo-width) * 2 - var(--primitives-space-12));
45837
+ padding-block-start: var(--primitives-space-12);
45838
+ }
45576
45839
  }
45577
45840
 
45578
45841
  .top-navigation-bar__wordmark-spacer {
45579
45842
  height: var(--_logo-width);
45580
45843
  flex-grow: 0;
45581
45844
  flex-shrink: 0;
45845
+
45846
+ @container (max-width: ${smMax$2}) {
45847
+ display: none;
45848
+ }
45582
45849
  }
45583
45850
 
45584
45851
  .top-navigation-bar__wordmark-content {
@@ -45588,6 +45855,21 @@ var topNavigationBarStyles = css`
45588
45855
  flex-shrink: 1;
45589
45856
  flex-basis: 50%;
45590
45857
  max-width: var(--_wordmark-max-width);
45858
+ /* anywhere rather than break-word: only this one takes the break into
45859
+ the min-content width, which is what the track measures. A name that
45860
+ cannot break wraps mid-word here, because a name cut off by an
45861
+ ellipsis cannot be read at all. */
45862
+ overflow-wrap: anywhere;
45863
+
45864
+ /* Centred against the ribbon, and what does not fit grows downward: an
45865
+ auto margin takes positive free space and never negative, so the text
45866
+ cannot ride up past the top. Growing is the flex item's job here, and
45867
+ an item that grows leaves nothing for the margins to centre with. */
45868
+ @container (max-width: ${smMax$2}) {
45869
+ flex-grow: 0;
45870
+ flex-basis: auto;
45871
+ margin-block: auto;
45872
+ }
45591
45873
  }
45592
45874
 
45593
45875
  .top-navigation-bar__wordmark-title {
@@ -46165,7 +46447,7 @@ var NLDDTopNavigationBar = (_NLDDTopNavigationBar = class NLDDTopNavigationBar e
46165
46447
  Promise.resolve().then(() => list_item_exports),
46166
46448
  Promise.resolve().then(() => text_cell_exports),
46167
46449
  Promise.resolve().then(() => icon_cell_exports),
46168
- import("./icon-VTLbdcvZ.js").then((n) => n.n)
46450
+ import("./icon-Cd4BloIM.js").then((n) => n.n)
46169
46451
  ]);
46170
46452
  }
46171
46453
  _createGlobalMenuSheet() {
@@ -48722,10 +49004,10 @@ var modalDialogStyles = css`
48722
49004
  .modal-dialog {
48723
49005
  /* Where the app's layout context ends, as in nldd-sheet: the dialog scrolls
48724
49006
  itself and starts at its own top edge, so anything inside it stops
48725
- following the app's scroll mode and its layer offsets. */
49007
+ following the app's scroll mode and its insets. */
48726
49008
  --context-scroll-mode: nested;
48727
- --context-layer-top: 0px;
48728
- --context-layer-bottom: 0px;
49009
+ --context-inset-top: 0px;
49010
+ --context-inset-bottom: 0px;
48729
49011
 
48730
49012
  box-sizing: border-box;
48731
49013
  outline: none;
@@ -51441,6 +51723,21 @@ var progressCircleStyles = css`
51441
51723
  .progress-circle__segment-indicator--mintgroen { stroke: var(--semantics-categories-mintgroen-filled-background-color); }
51442
51724
 
51443
51725
 
51726
+ /* ## Filter flood color
51727
+
51728
+ Here rather than in a style attribute, which a strict style-src drops.
51729
+ The color of an arc varies per segment, so that one is set through the
51730
+ CSSOM instead. */
51731
+
51732
+ .progress-circle__flood--track {
51733
+ flood-color: var(--_track-border-color);
51734
+ }
51735
+
51736
+ .progress-circle__flood--indeterminate {
51737
+ flood-color: var(--_indeterminate-border-color);
51738
+ }
51739
+
51740
+
51444
51741
  /* # Spinner (indeterminate)
51445
51742
  GitHub-style: a fixed-width arc (25 / 100 = quarter turn, 90°) that
51446
51743
  simply rotates around the circle. Calmer than Material's elastic
@@ -51632,7 +51929,7 @@ function progressCircleTemplate(component, onSlotChange) {
51632
51929
  <filter id="progress-circle-border-track-${uid}" filterUnits="userSpaceOnUse" x="-10" y="-10" width="120" height="120" color-interpolation-filters="sRGB">
51633
51930
  <feMorphology in="SourceGraphic" operator="erode" radius=${borderErodeRadius} result="eroded"></feMorphology>
51634
51931
  <feComposite operator="out" in="SourceGraphic" in2="eroded" result="edge"></feComposite>
51635
- <feFlood style="flood-color: var(--_track-border-color)" result="flood"></feFlood>
51932
+ <feFlood class="progress-circle__flood progress-circle__flood--track" result="flood"></feFlood>
51636
51933
  <feComposite operator="in" in="flood" in2="edge" result="colored"></feComposite>
51637
51934
  <feComposite operator="over" in="colored" in2="SourceGraphic"></feComposite>
51638
51935
  </filter>
@@ -51640,7 +51937,7 @@ function progressCircleTemplate(component, onSlotChange) {
51640
51937
  <filter id="progress-circle-border-${color}-${uid}" filterUnits="userSpaceOnUse" x="-10" y="-10" width="120" height="120" color-interpolation-filters="sRGB">
51641
51938
  <feMorphology in="SourceGraphic" operator="erode" radius=${borderErodeRadius} result="eroded"></feMorphology>
51642
51939
  <feComposite operator="out" in="SourceGraphic" in2="eroded" result="edge"></feComposite>
51643
- <feFlood style="flood-color: var(--semantics-categories-${color}-filled-highlight-border-color)" result="flood"></feFlood>
51940
+ <feFlood class="progress-circle__flood" style=${styleMap({ floodColor: `var(--semantics-categories-${color}-filled-highlight-border-color)` })} result="flood"></feFlood>
51644
51941
  <feComposite operator="in" in="flood" in2="edge" result="colored"></feComposite>
51645
51942
  <feComposite operator="over" in="colored" in2="SourceGraphic"></feComposite>
51646
51943
  </filter>
@@ -51649,7 +51946,7 @@ function progressCircleTemplate(component, onSlotChange) {
51649
51946
  <filter id="progress-circle-border-indeterminate-${uid}" filterUnits="userSpaceOnUse" x="-10" y="-10" width="120" height="120" color-interpolation-filters="sRGB">
51650
51947
  <feMorphology in="SourceGraphic" operator="erode" radius=${borderErodeRadius} result="eroded"></feMorphology>
51651
51948
  <feComposite operator="out" in="SourceGraphic" in2="eroded" result="edge"></feComposite>
51652
- <feFlood style="flood-color: var(--_indeterminate-border-color)" result="flood"></feFlood>
51949
+ <feFlood class="progress-circle__flood progress-circle__flood--indeterminate" result="flood"></feFlood>
51653
51950
  <feComposite operator="in" in="flood" in2="edge" result="colored"></feComposite>
51654
51951
  <feComposite operator="over" in="colored" in2="SourceGraphic"></feComposite>
51655
51952
  </filter>