lintje 0.4.0 → 0.5.1

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 (149) hide show
  1. package/README.md +1 -1
  2. package/dist-elements/actions.js +1 -1
  3. package/dist-elements/chunks/{base-DRGvkF-r.js → base-Bd2pmq86.js} +102 -99
  4. package/dist-elements/chunks/chart-styles-DEd0uIWK.js +108 -0
  5. package/dist-elements/chunks/{dialog-B7aRBtjy.js → dialog-BNbkcAxH.js} +2 -2
  6. package/dist-elements/chunks/disclosure-BK-MJsEn.js +4 -0
  7. package/dist-elements/chunks/{disclosure-DirPLy2E.js → disclosure-CcTr_FLd.js} +1 -1
  8. package/dist-elements/chunks/download-BGe7rpQo.js +103 -0
  9. package/dist-elements/chunks/{focus-trap-Dv8zu64A.js → focus-trap-Cl99vti9.js} +1 -1
  10. package/dist-elements/chunks/input-Dg1o0Sfu.js +4 -0
  11. package/dist-elements/chunks/{input-BGMLam-O.js → input-KqBT3qWD.js} +1 -1
  12. package/dist-elements/chunks/{key-CuuOw1KE.js → key-D5wy9ZTj.js} +1 -1
  13. package/dist-elements/chunks/{player-BApadXr8.js → player-BRG7bk_h.js} +1 -1
  14. package/dist-elements/chunks/{sentence-0wO85ZdJ.js → sentence-DIByCXQV.js} +1 -1
  15. package/dist-elements/chunks/{stagger-BB_gcxBI.js → stagger-DGRHP_We.js} +95 -94
  16. package/dist-elements/content.js +1 -0
  17. package/dist-elements/core.js +1 -1
  18. package/dist-elements/custom-elements.json +120 -2
  19. package/dist-elements/data-types.json +208 -1
  20. package/dist-elements/feedback.js +1 -1
  21. package/dist-elements/guides/loading.md +5 -1
  22. package/dist-elements/inputs.js +2 -2
  23. package/dist-elements/layout.js +1 -1
  24. package/dist-elements/lintje.js +2850 -1929
  25. package/dist-elements/overlays.js +1 -1
  26. package/dist-elements/tag/activity-log.js +2 -2
  27. package/dist-elements/tag/ai-label.js +2 -2
  28. package/dist-elements/tag/announcement.js +2 -2
  29. package/dist-elements/tag/app-search.js +3 -3
  30. package/dist-elements/tag/audio-player.js +2 -2
  31. package/dist-elements/tag/badge.js +1 -1
  32. package/dist-elements/tag/breadcrumbs.js +1 -1
  33. package/dist-elements/tag/button.js +1 -1
  34. package/dist-elements/tag/card-list.js +1 -1
  35. package/dist-elements/tag/card.js +2 -2
  36. package/dist-elements/tag/chart.js +1020 -961
  37. package/dist-elements/tag/chat-answer.js +2 -2
  38. package/dist-elements/tag/chat-composer.js +3 -3
  39. package/dist-elements/tag/chat-message.js +2 -2
  40. package/dist-elements/tag/chat-strip.js +2 -2
  41. package/dist-elements/tag/chat-suggestions.js +1 -1
  42. package/dist-elements/tag/chat.js +1 -1
  43. package/dist-elements/tag/checkbox-group.js +3 -3
  44. package/dist-elements/tag/checkbox.js +3 -3
  45. package/dist-elements/tag/code.js +1 -1
  46. package/dist-elements/tag/combobox.js +3 -3
  47. package/dist-elements/tag/conflict-alert.js +2 -2
  48. package/dist-elements/tag/copy-button.js +1 -1
  49. package/dist-elements/tag/data-table.js +266 -265
  50. package/dist-elements/tag/date-input.js +3 -3
  51. package/dist-elements/tag/date-range.js +5 -5
  52. package/dist-elements/tag/description-list.js +2 -2
  53. package/dist-elements/tag/dialog.js +3 -3
  54. package/dist-elements/tag/document-viewer.js +1 -1
  55. package/dist-elements/tag/drawer.js +3 -3
  56. package/dist-elements/tag/empty-state.js +1 -1
  57. package/dist-elements/tag/error-page.js +1 -1
  58. package/dist-elements/tag/error-summary.js +30 -30
  59. package/dist-elements/tag/expander.js +3 -3
  60. package/dist-elements/tag/explainer.js +3 -3
  61. package/dist-elements/tag/field.js +2 -2
  62. package/dist-elements/tag/file-upload.js +58 -58
  63. package/dist-elements/tag/filter-bar.js +3 -3
  64. package/dist-elements/tag/filter-sheet.js +3 -3
  65. package/dist-elements/tag/filter-zone.js +3 -3
  66. package/dist-elements/tag/find.js +16 -12
  67. package/dist-elements/tag/footer.js +1 -1
  68. package/dist-elements/tag/form-actions.js +1 -1
  69. package/dist-elements/tag/form-section.js +1 -1
  70. package/dist-elements/tag/form.js +1 -1
  71. package/dist-elements/tag/gallery.js +1 -1
  72. package/dist-elements/tag/grid-item.js +1 -1
  73. package/dist-elements/tag/grid.js +1 -1
  74. package/dist-elements/tag/hero.js +2 -2
  75. package/dist-elements/tag/highlight.js +1 -1
  76. package/dist-elements/tag/icon-button.js +1 -1
  77. package/dist-elements/tag/icon.js +1 -1
  78. package/dist-elements/tag/job-list.js +1 -1
  79. package/dist-elements/tag/kpi-row.js +1 -1
  80. package/dist-elements/tag/kpi.js +38 -36
  81. package/dist-elements/tag/level-meter.js +1 -1
  82. package/dist-elements/tag/list.js +3 -3
  83. package/dist-elements/tag/log-viewer.d.ts +1 -0
  84. package/dist-elements/tag/log-viewer.js +847 -0
  85. package/dist-elements/tag/logo.js +1 -1
  86. package/dist-elements/tag/map.js +185 -184
  87. package/dist-elements/tag/menu-button.js +14 -9
  88. package/dist-elements/tag/modal.js +3 -3
  89. package/dist-elements/tag/multiselect.js +5 -5
  90. package/dist-elements/tag/note.js +2 -2
  91. package/dist-elements/tag/notifications.js +2 -2
  92. package/dist-elements/tag/number-input.js +3 -3
  93. package/dist-elements/tag/page-header.js +2 -2
  94. package/dist-elements/tag/pagination.js +16 -16
  95. package/dist-elements/tag/popover.js +1 -1
  96. package/dist-elements/tag/progress-bar.js +1 -1
  97. package/dist-elements/tag/prose.js +1 -1
  98. package/dist-elements/tag/qr-code.js +1 -1
  99. package/dist-elements/tag/radio-group.js +3 -3
  100. package/dist-elements/tag/range.js +3 -3
  101. package/dist-elements/tag/recording-status.js +2 -2
  102. package/dist-elements/tag/repeater.js +2 -2
  103. package/dist-elements/tag/segmented.js +3 -3
  104. package/dist-elements/tag/select.js +3 -3
  105. package/dist-elements/tag/shell.js +4 -4
  106. package/dist-elements/tag/skeleton.js +1 -1
  107. package/dist-elements/tag/slot-picker.js +3 -3
  108. package/dist-elements/tag/sortable-list.js +1 -1
  109. package/dist-elements/tag/spinner.js +1 -1
  110. package/dist-elements/tag/split-pane.js +1 -1
  111. package/dist-elements/tag/status-dot.js +1 -1
  112. package/dist-elements/tag/stepper.js +2 -2
  113. package/dist-elements/tag/streaming-text.js +2 -2
  114. package/dist-elements/tag/sub-nav.js +1 -1
  115. package/dist-elements/tag/tabs.js +2 -2
  116. package/dist-elements/tag/tag-input.js +4 -4
  117. package/dist-elements/tag/text-editor.js +3 -3
  118. package/dist-elements/tag/text-input.js +3 -3
  119. package/dist-elements/tag/textarea.js +4 -4
  120. package/dist-elements/tag/tile.js +1 -1
  121. package/dist-elements/tag/time-input.js +3 -3
  122. package/dist-elements/tag/toast.js +2 -2
  123. package/dist-elements/tag/toggle.js +3 -3
  124. package/dist-elements/tag/toggletip.js +2 -2
  125. package/dist-elements/tag/token-value.js +1 -1
  126. package/dist-elements/tag/tooltip.js +1 -1
  127. package/dist-elements/tag/transcript.js +2 -2
  128. package/dist-elements/tag/translator.js +1 -1
  129. package/dist-elements/tag/tree-view.js +1 -1
  130. package/dist-elements/tag/user-menu.js +1 -1
  131. package/dist-elements/tag/video-player.js +2 -2
  132. package/dist-elements/tokens.css +22 -12
  133. package/dist-elements/tokens.json +10 -6
  134. package/dist-elements/types/bundle/content.d.ts +1 -0
  135. package/dist-elements/types/bundle/index.d.ts +1 -1
  136. package/dist-elements/types/components/actions/menu-button/menu-button.d.ts +4 -1
  137. package/dist-elements/types/components/content/log-viewer/lines.d.ts +33 -0
  138. package/dist-elements/types/components/content/log-viewer/log-viewer.d.ts +117 -0
  139. package/dist-elements/types/components/index.d.ts +2 -0
  140. package/dist-elements/types/components/inputs/find/find.d.ts +1 -0
  141. package/dist-elements/types/components/shared/charts/shared/axes.d.ts +7 -1
  142. package/dist-elements/types/components/shared/charts/shared/controller.d.ts +0 -1
  143. package/dist-elements/types/components/shared/charts/shared/layer-motion.d.ts +21 -0
  144. package/dist-elements/types/components/shared/download.d.ts +2 -0
  145. package/dist-elements/types/types.d.ts +44 -0
  146. package/package.json +1 -1
  147. package/dist-elements/chunks/disclosure-D39vAR5q.js +0 -4
  148. package/dist-elements/chunks/download-C68kcwPj.js +0 -206
  149. package/dist-elements/chunks/input-lQTmOMOz.js +0 -4
package/README.md CHANGED
@@ -104,7 +104,7 @@ opent.
104
104
  | [`CHANGELOG.md`](CHANGELOG.md) | wat er veranderde, en wat een host breekt |
105
105
  | [`examples/`](examples/index.html) | de voorbeeldapplicaties, met fictieve data |
106
106
  | [`assets/`](assets/README.md) | de iconen, de emblemen, de kaartgeometrie en het logo |
107
- | [`docs/OPEN_ISSUES.md`](docs/OPEN_ISSUES.md) | wat nog openstaat: iconen, tokens, browsercontroles, bekende afwijkingen |
107
+ | [issues op GitHub](https://github.com/h11t-labs/lintje/issues) | wat nog openstaat; met het label `agent` beschreven zodat een agent het kan oppakken |
108
108
  | [`SECURITY.md`](SECURITY.md) | een kwetsbaarheid melden |
109
109
 
110
110
  ## Licentie
@@ -1,4 +1,4 @@
1
- import "./chunks/base-DRGvkF-r.js";
1
+ import "./chunks/base-Bd2pmq86.js";
2
2
  import "./tag/logo.js";
3
3
  import "./tag/qr-code.js";
4
4
  import "./tag/menu-button.js";
@@ -1,5 +1,5 @@
1
1
  //#region src/core/version.ts
2
- var e = "0.4.0", t = globalThis, n = t.ShadowRoot && (t.ShadyCSS === void 0 || t.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, r = Symbol(), i = /* @__PURE__ */ new WeakMap(), a = class {
2
+ var e = "0.5.1", t = globalThis, n = t.ShadowRoot && (t.ShadyCSS === void 0 || t.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, r = Symbol(), i = /* @__PURE__ */ new WeakMap(), a = class {
3
3
  constructor(e, t, n) {
4
4
  if (this._$cssResult$ = !0, n !== r) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
5
5
  this.cssText = e, this.t = t;
@@ -521,7 +521,7 @@ var Re = Le.litElementPolyfillSupport;
521
521
  Re?.({ LitElement: k }), (Le.litElementVersions ??= []).push("4.2.2");
522
522
  //#endregion
523
523
  //#region src/tokens/tokens.css?inline
524
- var ze = "/* ============================================================================\n Lintje — design tokens\n\n Colour is in three groups: themable UI colour (a theme sets only `--primary` and `--accent`, in\n `themes.css`), fixed data colour (`--data-*`, identical in every\n mode and theme except the two grays) and fixed status colour (`--status-*`).\n\n Three layers, one direction: component -> semantic (`--color-*`) -> primitives. Only the\n primitive blocks may hold a colour literal. To change a colour in one mode, re-point the\n layer-2 name inside `[data-mode='dark']`.\n\n `color-mix(in srgb, …)` and the relative `oklch(from …)` need Chrome/Edge 122+, Firefox 128+\n or Safari 18+;\n `colour-scheme.test.ts` repeats the arithmetic. The `@font-face` rules live in `fonts.css`:\n they cannot work inside a shadow root.\n ========================================================================= */\n\n/* ============================================================================\n Layer 1 — primitives (the only literals)\n ========================================================================= */\n:root {\n /* --- Neutral (light). The one mode-dependent primitive family ----------\n Neutral-5 is the cool-grey step 600, not 500, because it carries muted TEXT:\n #64748B is 4.34:1 on neutral-2, #475569 is 6.92:1. */\n --neutral-0: #FFFFFF;\n --neutral-1: #F8FAFC;\n --neutral-2: #F1F5F9;\n --neutral-3: #E2E8F0;\n --neutral-4: #94A3B8;\n --neutral-5: #475569;\n --neutral-6: #0F172A;\n\n /* --- Fixed ink ---------------------------------------------------------\n The same in both modes because it sits on a fill, not on the page. */\n --ink-white: #FFFFFF;\n --ink-black: #0F172A;\n --alpha-white-82: rgba(255, 255, 255, 0.82);\n --alpha-white-45: rgba(255, 255, 255, 0.45);\n\n /* --- Focus -------------------------------------------------------------\n Its own constant: it must not move with the accent or the attention status. */\n --focus-orange: #E17000;\n\n /* --- The ribbon --------------------------------------------------------\n Lintblauw, and the Rijkshuisstijl's own lighter tint for the ribbon in the logo in dark. */\n --ribbon-blue: #154273;\n --ribbon-blue-dark: #004A8D;\n\n /* --- Data (fixed Rijkshuisstijl, identical in light, dark and every theme)\n The two grays follow the mode: as fixed literals the comparison line landed at 2.69:1\n on the dark surface. Light #475569 / #94A3B8, dark #B0B0B0 / #7A7A7A. The variables\n stand in the order of `tokens/colors.ts`, the one list of their names. */\n --data-sky-blue: #007BC7;\n --data-dark-yellow: #FFB612;\n --data-red: #D52B1E;\n --data-green: #39870C;\n --data-mint-green: #76D2B6;\n --data-violet: #A90061;\n --data-orange: #E17000;\n --data-pink: #F092CD;\n --data-dark-green: #275937;\n --data-purple: #42145F;\n --data-ruby-red: #CA005D;\n --data-yellow: #F9E11E;\n --data-dark-brown: #673328;\n --data-brown: #94710A;\n --data-dark-blue: #01689B;\n --data-light-blue: #8FCAE7;\n --data-moss-green: #777B00;\n /* Sky blue's ladder is written out: the map's areas draw in from the land to these classes,\n and Chromium interpolates a `color-mix()` target wrongly (the land's RGB numbers taken as\n oklab), so the areas flash yellow. The values are its mix with white; the test checks. */\n --data-sky-blue-75: #409CD5;\n --data-sky-blue-60: #66B0DD;\n --data-sky-blue-45: #8CC4E6;\n --data-sky-blue-30: #B2D7EE;\n --data-sky-blue-15: #D9EBF7;\n --data-comparison: var(--neutral-5);\n --data-other: var(--neutral-4);\n /* Yellow as TEXT fails contrast on white: light writes a wait time in this dark gold. */\n --data-dark-yellow-text: #B07A00;\n /* Grid and emphasis follow the surface, like the two grays. */\n --data-grid: var(--neutral-3);\n --data-emphasis: var(--neutral-6);\n\n /* --- Status (fixed) ---------------------------------------------------- */\n --status-success: #39870C;\n --status-warning: #FFB612;\n --status-attention: #E17000;\n --status-error: #D52B1E;\n --status-info: #007BC7;\n\n /* Black at the alphas the shadows and overlays use; the digits are the alpha in percent. */\n --alpha-black-08: rgba(0, 0, 0, 0.08);\n --alpha-black-14: rgba(0, 0, 0, 0.14);\n --alpha-black-16: rgba(0, 0, 0, 0.16);\n --alpha-black-18: rgba(0, 0, 0, 0.18);\n --alpha-black-22: rgba(0, 0, 0, 0.22);\n --alpha-black-40: rgba(0, 0, 0, 0.4);\n --alpha-black-55: rgba(0, 0, 0, 0.55);\n --alpha-black-60: rgba(0, 0, 0, 0.6);\n}\n\n/* ============================================================================\n Layer 1 — derivations\n\n Mixes of the primitives and of the theme's two properties. The tint ladder is 75 / 60 / 45\n / 30 / 15 % of the base over white; every data colour carries the complete ladder.\n ========================================================================= */\n:root {\n /* Darker than the primary in light: a lighter fill under white text lost contrast (2.80:1 on\n orange). The dark block re-declares it lighter. */\n --primary-hover: color-mix(in srgb, var(--primary), black 30%);\n --primary-line: color-mix(in srgb, var(--primary), white 22%);\n /* The dark tints lift only the perceived lightness, so they keep the primary's colour; a mix\n with white greys it. Each lightness is the smallest hundredth that clears its floor in every\n theme: 3:1 on #282828 for a line, 4.5:1 on #333333 (neutral-2), the lightest neutral\n surface a word stands on, for text. A primary that is lighter already keeps its own. */\n --primary-tint: oklch(from var(--primary) max(l, 0.55) c h);\n --primary-tint-text: oklch(from var(--primary) max(l, 0.71) c h);\n /* A wash behind a word or under a band, never a colour that reads by itself. Fixed in\n perceived lightness, so it is equally light in every theme and keeps the primary's hue; an\n sRGB mix with white greys a dark primary. The chroma cap keeps every theme inside sRGB. */\n --primary-wash: oklch(from var(--primary) 0.955 min(c, 0.02) h);\n\n --data-dark-yellow-75: color-mix(in srgb, var(--data-dark-yellow) 75%, white);\n --data-dark-yellow-60: color-mix(in srgb, var(--data-dark-yellow) 60%, white);\n --data-dark-yellow-45: color-mix(in srgb, var(--data-dark-yellow) 45%, white);\n --data-dark-yellow-30: color-mix(in srgb, var(--data-dark-yellow) 30%, white);\n --data-dark-yellow-15: color-mix(in srgb, var(--data-dark-yellow) 15%, white);\n\n --data-red-75: color-mix(in srgb, var(--data-red) 75%, white);\n --data-red-60: color-mix(in srgb, var(--data-red) 60%, white);\n --data-red-45: color-mix(in srgb, var(--data-red) 45%, white);\n --data-red-30: color-mix(in srgb, var(--data-red) 30%, white);\n --data-red-15: color-mix(in srgb, var(--data-red) 15%, white);\n\n --data-green-75: color-mix(in srgb, var(--data-green) 75%, white);\n --data-green-60: color-mix(in srgb, var(--data-green) 60%, white);\n --data-green-45: color-mix(in srgb, var(--data-green) 45%, white);\n --data-green-30: color-mix(in srgb, var(--data-green) 30%, white);\n --data-green-15: color-mix(in srgb, var(--data-green) 15%, white);\n\n --data-mint-green-75: color-mix(in srgb, var(--data-mint-green) 75%, white);\n --data-mint-green-60: color-mix(in srgb, var(--data-mint-green) 60%, white);\n --data-mint-green-45: color-mix(in srgb, var(--data-mint-green) 45%, white);\n --data-mint-green-30: color-mix(in srgb, var(--data-mint-green) 30%, white);\n --data-mint-green-15: color-mix(in srgb, var(--data-mint-green) 15%, white);\n\n --data-violet-75: color-mix(in srgb, var(--data-violet) 75%, white);\n --data-violet-60: color-mix(in srgb, var(--data-violet) 60%, white);\n --data-violet-45: color-mix(in srgb, var(--data-violet) 45%, white);\n --data-violet-30: color-mix(in srgb, var(--data-violet) 30%, white);\n --data-violet-15: color-mix(in srgb, var(--data-violet) 15%, white);\n\n --data-orange-75: color-mix(in srgb, var(--data-orange) 75%, white);\n --data-orange-60: color-mix(in srgb, var(--data-orange) 60%, white);\n --data-orange-45: color-mix(in srgb, var(--data-orange) 45%, white);\n --data-orange-30: color-mix(in srgb, var(--data-orange) 30%, white);\n --data-orange-15: color-mix(in srgb, var(--data-orange) 15%, white);\n\n --data-pink-75: color-mix(in srgb, var(--data-pink) 75%, white);\n --data-pink-60: color-mix(in srgb, var(--data-pink) 60%, white);\n --data-pink-45: color-mix(in srgb, var(--data-pink) 45%, white);\n --data-pink-30: color-mix(in srgb, var(--data-pink) 30%, white);\n --data-pink-15: color-mix(in srgb, var(--data-pink) 15%, white);\n\n --data-dark-green-75: color-mix(in srgb, var(--data-dark-green) 75%, white);\n --data-dark-green-60: color-mix(in srgb, var(--data-dark-green) 60%, white);\n --data-dark-green-45: color-mix(in srgb, var(--data-dark-green) 45%, white);\n --data-dark-green-30: color-mix(in srgb, var(--data-dark-green) 30%, white);\n --data-dark-green-15: color-mix(in srgb, var(--data-dark-green) 15%, white);\n\n --data-purple-75: color-mix(in srgb, var(--data-purple) 75%, white);\n --data-purple-60: color-mix(in srgb, var(--data-purple) 60%, white);\n --data-purple-45: color-mix(in srgb, var(--data-purple) 45%, white);\n --data-purple-30: color-mix(in srgb, var(--data-purple) 30%, white);\n --data-purple-15: color-mix(in srgb, var(--data-purple) 15%, white);\n\n --data-ruby-red-75: color-mix(in srgb, var(--data-ruby-red) 75%, white);\n --data-ruby-red-60: color-mix(in srgb, var(--data-ruby-red) 60%, white);\n --data-ruby-red-45: color-mix(in srgb, var(--data-ruby-red) 45%, white);\n --data-ruby-red-30: color-mix(in srgb, var(--data-ruby-red) 30%, white);\n --data-ruby-red-15: color-mix(in srgb, var(--data-ruby-red) 15%, white);\n\n --data-yellow-75: color-mix(in srgb, var(--data-yellow) 75%, white);\n --data-yellow-60: color-mix(in srgb, var(--data-yellow) 60%, white);\n --data-yellow-45: color-mix(in srgb, var(--data-yellow) 45%, white);\n --data-yellow-30: color-mix(in srgb, var(--data-yellow) 30%, white);\n --data-yellow-15: color-mix(in srgb, var(--data-yellow) 15%, white);\n\n --data-dark-brown-75: color-mix(in srgb, var(--data-dark-brown) 75%, white);\n --data-dark-brown-60: color-mix(in srgb, var(--data-dark-brown) 60%, white);\n --data-dark-brown-45: color-mix(in srgb, var(--data-dark-brown) 45%, white);\n --data-dark-brown-30: color-mix(in srgb, var(--data-dark-brown) 30%, white);\n --data-dark-brown-15: color-mix(in srgb, var(--data-dark-brown) 15%, white);\n\n --data-brown-75: color-mix(in srgb, var(--data-brown) 75%, white);\n --data-brown-60: color-mix(in srgb, var(--data-brown) 60%, white);\n --data-brown-45: color-mix(in srgb, var(--data-brown) 45%, white);\n --data-brown-30: color-mix(in srgb, var(--data-brown) 30%, white);\n --data-brown-15: color-mix(in srgb, var(--data-brown) 15%, white);\n\n --data-dark-blue-75: color-mix(in srgb, var(--data-dark-blue) 75%, white);\n --data-dark-blue-60: color-mix(in srgb, var(--data-dark-blue) 60%, white);\n --data-dark-blue-45: color-mix(in srgb, var(--data-dark-blue) 45%, white);\n --data-dark-blue-30: color-mix(in srgb, var(--data-dark-blue) 30%, white);\n --data-dark-blue-15: color-mix(in srgb, var(--data-dark-blue) 15%, white);\n\n --data-light-blue-75: color-mix(in srgb, var(--data-light-blue) 75%, white);\n --data-light-blue-60: color-mix(in srgb, var(--data-light-blue) 60%, white);\n --data-light-blue-45: color-mix(in srgb, var(--data-light-blue) 45%, white);\n --data-light-blue-30: color-mix(in srgb, var(--data-light-blue) 30%, white);\n --data-light-blue-15: color-mix(in srgb, var(--data-light-blue) 15%, white);\n\n --data-moss-green-75: color-mix(in srgb, var(--data-moss-green) 75%, white);\n --data-moss-green-60: color-mix(in srgb, var(--data-moss-green) 60%, white);\n --data-moss-green-45: color-mix(in srgb, var(--data-moss-green) 45%, white);\n --data-moss-green-30: color-mix(in srgb, var(--data-moss-green) 30%, white);\n --data-moss-green-15: color-mix(in srgb, var(--data-moss-green) 15%, white);\n\n /* 15 % of the status colour over the surface, so one declaration covers both modes. */\n --status-success-bg: color-mix(in srgb, var(--status-success) 15%, var(--neutral-0));\n --status-warning-bg: color-mix(in srgb, var(--status-warning) 15%, var(--neutral-0));\n --status-attention-bg: color-mix(in srgb, var(--status-attention) 15%, var(--neutral-0));\n --status-error-bg: color-mix(in srgb, var(--status-error) 15%, var(--neutral-0));\n --status-info-bg: color-mix(in srgb, var(--status-info) 15%, var(--neutral-0));\n}\n\n/* ============================================================================\n Layers 2 and 3 — semantic and component tokens (light)\n\n No colour literal below this line.\n ========================================================================= */\n:root {\n /* --- Typography -------------------------------------------------------- */\n --font-ui: 'RijksSans', 'Source Sans 3', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --font-mono: 'Source Code Pro', ui-monospace, SFMono-Regular, Menlo, monospace;\n\n --text-dashboard: 700 1.25rem/1.2 var(--font-ui);\n --text-h1: 700 1.75rem/1.2 var(--font-ui);\n --text-h1-mobile: 700 1.5rem/1.15 var(--font-ui);\n --text-h1-display: 700 2.5rem/1.1 var(--font-ui);\n --text-h2: 700 1.25rem/1.25 var(--font-ui);\n --text-tile-title: 700 1rem/1.3 var(--font-ui);\n --text-tile-sub: 400 0.875rem/1.35 var(--font-ui);\n --text-kpi: 700 2rem/1.1 var(--font-ui);\n --text-kpi-mobile: 700 1.5rem/1.1 var(--font-ui);\n --text-kpi-secondary: 700 1.25rem/1.1 var(--font-ui);\n --text-body: 400 1rem/1.5 var(--font-ui);\n /* The text being translated and its translation: larger than body, read at a glance. */\n --text-translation: 400 1.25rem/1.5 var(--font-ui);\n --text-ui: 400 1rem/1.4 var(--font-ui);\n --text-small: 400 0.875rem/1.45 var(--font-ui);\n --text-meta: 400 0.875rem/1.4 var(--font-ui);\n --text-table: 400 1rem/1.4 var(--font-ui);\n --text-table-head: 700 0.875rem/1.3 var(--font-ui);\n --text-axis: 400 0.75rem/1.2 var(--font-ui);\n\n --label-size: 0.875rem;\n --label-weight: 700;\n --label-tracking: 0.08em;\n --kpi-tracking: -0.02em;\n\n /* --- Spacing (4 px scale) --------------------------------------------- */\n --space-1: 4px;\n --space-2: 8px;\n --space-3: 12px;\n --space-4: 16px;\n --space-5: 20px;\n --space-6: 24px;\n --space-8: 32px;\n --space-10: 40px;\n\n /* --- Component sizes --------------------------------------------------- */\n --h-topbar: 3.5rem;\n --h-contextbar: 3rem;\n --h-mobile-header: 4.5rem;\n --h-control: 3rem;\n --h-button: 3rem;\n --h-button-compact: 2.5rem;\n --h-button-chrome: 2.5rem;\n --h-icon-button: 2.5rem;\n --h-chip: 2rem;\n --h-chip-field: 1.75rem;\n --h-nav-row: 3rem;\n --h-nav-head: 6.5rem;\n --h-table-row: 3rem;\n --h-touch: 3rem;\n /* The smallest pointer target. A box that draws smaller reaches it through a\n transparent hit area (`::after`, negative inset). */\n --h-target: 3rem;\n /* A link in a list of text links: one line of text, the WCAG AA floor, as on rijksoverheid.nl. */\n --h-target-text: 1.5rem;\n /* The two dense exceptions to the target: a date picker day cell and a listbox option row. */\n --h-option: 2.5rem;\n /* The sparkline of a KPI: a line and its area under the figure, with no axes. */\n --h-sparkline: 2rem;\n\n --w-nav: 288px;\n --w-rail: 72px;\n --w-text: 760px;\n --w-message: 560px;\n /* A language choice in the translator's bar. */\n --w-translator-language: 18rem;\n /* The widest the page's content gets. A host sets `--lintje-content-width` to change it. */\n --w-content: 1360px;\n --nav-edge: 4px;\n /* The ribbon is the unit: 48 px, 40 on a phone. Both bars are in rem, so they grow with the\n reader's text size. */\n --w-ribbon: 3rem;\n --h-logobar: calc(2.5 * var(--w-ribbon));\n /* The top bar's height: what pins under the bar measures `--h-topbar`. */\n --h-navbar: var(--h-topbar);\n /* How far what follows the hero stands over its band's lower edge. */\n --hero-overlap: var(--space-10);\n /* The widest the picture beside the hero's text gets: four of the twelve columns at 1440. */\n --w-hero-aside: 400px;\n /* The narrowest a card gets in a card list before the list drops a column. */\n --w-card: 320px;\n /* The same for a horizontal card, whose picture takes a column of its own. */\n --w-card-wide: 480px;\n --w-card-media: 200px;\n --w-card-logo: 3.5rem;\n --w-card-logo-wide: 5rem;\n /* The narrowest thumbnail under a gallery's large picture. */\n --w-gallery-thumb: 120px;\n /* The narrowest column of links in a footer before the columns stand under each other. */\n --w-footer-column: 220px;\n\n --page-pad-y: 32px;\n --page-pad-x: 24px;\n /* What a full-width bar or the content adds to its side padding so what stands in it keeps to\n `--w-content`; the percentage is taken of the box the bar stands in. */\n --page-gutter: max(\n 0px,\n calc((100% - var(--lintje-content-width, var(--w-content)) - 2 * var(--page-pad-x)) / 2)\n );\n --grid-gutter: 24px;\n --tile-pad-y: 20px;\n --tile-pad-x: 24px;\n --chart-h-main: 260px;\n --chart-h-small: 180px;\n --chart-h-expanded: 560px;\n\n /* Sticky context = top bar + summary bar. */\n --h-sticky: calc(var(--h-topbar) + var(--h-contextbar));\n\n --radius: 0px;\n --radius-round: 50%;\n\n --shadow-sticky: 0 2px 6px var(--alpha-black-08);\n --shadow-popover: 0 4px 16px var(--alpha-black-14);\n --shadow-nav: 2px 0 8px var(--alpha-black-08);\n --shadow-chart-hover: 0 1px 4px var(--alpha-black-22);\n --shadow-scroll-start: inset 12px 0 10px -10px var(--alpha-black-18);\n --shadow-scroll-end: inset -12px 0 10px -10px var(--alpha-black-18);\n\n --color-overlay-page: var(--alpha-black-60);\n --color-overlay-nav: var(--alpha-black-16);\n\n --focus-width: 3px;\n --focus-offset: 2px;\n\n /* --- Motion ------------------------------------------------------------ */\n /* `@kind other` marks these for design tooling as neither colors, sizes nor type; the library\n CSS ships unminified so the notes reach it. */\n --ease-in-motion: cubic-bezier(0.2, 0, 0, 1); /* @kind other */\n --ease-out-motion: cubic-bezier(0.4, 0, 1, 1); /* @kind other */\n --dur-base: 200ms; /* @kind other */\n --dur-hover: 120ms; /* @kind other */\n --dur-popover: var(--dur-base); /* @kind other */\n --dur-submenu: 300ms; /* @kind other */\n --dur-toast: var(--dur-base); /* @kind other */\n --dur-scrim: var(--dur-base); /* @kind other */\n --dur-rail: var(--dur-base); /* @kind other */\n --dur-collapse: var(--dur-base); /* @kind other */\n --dur-modal: var(--dur-base); /* @kind other */\n --dur-sheet: var(--dur-base); /* @kind other */\n --dur-kpi: var(--dur-base); /* @kind other */\n --dur-badge: 300ms; /* @kind other */\n --dur-draw: 900ms; /* @kind other */\n --dur-data-label: 300ms; /* @kind other */\n --dur-layer: 400ms; /* @kind other */\n --dur-skeleton: 1200ms; /* @kind other */\n --dur-wave: 600ms; /* @kind other */\n\n /* --- Semantic: surfaces ------------------------------------------------ */\n --color-bg-page: var(--neutral-1);\n --color-bg-surface: var(--neutral-0);\n --color-bg-subtle: var(--neutral-2);\n --color-bg-title: var(--neutral-1);\n /* Between steps 2 and 3: on the cool-grey ramp neutral-2 sits too close to the page to read\n as a band. */\n --color-bg-filter: color-mix(in srgb, var(--neutral-2), var(--neutral-3));\n --color-bg-selected: var(--neutral-2);\n --color-bg-inset: var(--neutral-2);\n\n /* --- Semantic: text ---------------------------------------------------- */\n --color-text-primary: var(--neutral-6);\n --color-text-secondary: var(--neutral-6);\n --color-text-muted: var(--neutral-5);\n --color-text-inverse: var(--neutral-0);\n --color-text-disabled: var(--neutral-4);\n /* A placeholder must stay readable: 4.5:1 on the surface in both modes. */\n --color-text-placeholder: var(--neutral-5);\n --color-text-on-fill: var(--ink-white);\n --color-text-on-light-fill: var(--ink-black);\n --color-qr-bg: var(--ink-white);\n --color-qr-fg: var(--ink-black);\n\n /* --- Semantic: borders ------------------------------------------------- */\n --color-border-default: var(--neutral-3);\n --color-border-strong: var(--neutral-3);\n --color-border-filter: var(--neutral-3);\n --color-border-heavy: var(--neutral-4);\n /* The resting edge of a field box: 3:1 (WCAG 1.4.11) on the surface and the filter band. */\n --color-border-field: var(--neutral-5);\n /* The 2 px edge of a checkbox and a radio: 3:1 on the surface; dark re-points it. */\n --color-border-choice: var(--neutral-5);\n /* In dark a sheet is the same #282828 as the tile under it, so this line separates them. */\n --color-border-popover: var(--neutral-3);\n /* A DASHED outline (a suggestion, an uncertain term): neutral-5, because a dashed line has half\n the ink of a solid one and must still reach 3:1. */\n --color-border-suggestion: var(--neutral-5);\n\n /* --- Semantic: action -------------------------------------------------- */\n --color-action-primary: var(--primary);\n --color-action-primary-hover: var(--primary-hover);\n --color-action-primary-text: var(--ink-white);\n /* A primary fill in dark is a dark box on a dark page (WCAG 1.4.11): it gets a tint border. */\n --color-action-primary-border: var(--primary);\n --color-action-secondary-border: var(--primary);\n /* The destructive fill: the error red, white text on it (5.01:1). Hover is darker in light,\n lighter in dark. In dark the border is a tint, because #D52B1E is 2.94:1 on #282828. */\n --color-action-danger: var(--status-error);\n --color-action-danger-hover: color-mix(in srgb, var(--status-error), black 30%);\n --color-action-danger-border: var(--status-error);\n /* The word of the outlined danger button; dark re-points it (the red is 2.94:1 on #282828). */\n --color-action-danger-text: var(--status-error);\n --color-link: var(--primary);\n --color-link-hover: var(--primary-hover);\n /* A link on a status background: in dark no tint of the primary reaches 4.5:1 there, so it\n reads in the text colour. It is bold and underlined, so colour never carried it alone. */\n --color-link-on-status: var(--primary);\n\n /* The accent splits in three, because a fill, a line and a word have different floors:\n fill (the primary), line (non-text, 3:1: `--primary-tint` in dark) and text (4.5:1:\n `--primary-tint-text` in dark). A word in the line token fails: it is sized for 3:1. */\n --color-accent: var(--primary);\n --color-accent-line: var(--primary);\n --color-accent-text: var(--primary);\n\n --color-focus: var(--focus-orange);\n\n /* --- Semantic: status -------------------------------------------------- */\n --color-attention: var(--status-attention);\n --color-success: var(--status-success);\n --color-warning: var(--status-warning);\n --color-error: var(--status-error);\n --color-info: var(--status-info);\n\n --color-warning-bg: var(--status-warning-bg);\n --color-attention-bg: var(--status-attention-bg);\n --color-error-bg: var(--status-error-bg);\n --color-info-bg: var(--status-info-bg);\n --color-success-bg: var(--status-success-bg);\n\n /* A status mark on its own tint: the status colour, nudged to 3:1 where it falls short. */\n --color-attention-line: color-mix(in srgb, var(--status-attention), black 10%);\n --color-error-line: var(--status-error);\n --color-info-line: var(--status-info);\n --color-success-line: var(--status-success);\n /* A status WORD at 4.5:1 on the surface and on `--color-bg-subtle`: the red itself, the green\n 5 % darker (4.13:1 on neutral-2); dark lifts both. A glyph or an edge keeps the line token. */\n --color-error-text: var(--status-error);\n --color-success-text: color-mix(in srgb, var(--status-success), black 5%);\n\n /* --- Navigation (the theme fill; neutral in dark) ---------------------- */\n --color-nav-bg: var(--primary);\n --color-nav-text: var(--ink-white);\n --color-nav-text-sub: var(--alpha-white-82);\n --color-nav-hover: var(--primary-hover);\n --color-nav-active: var(--primary-hover);\n --color-nav-active-edge: var(--ink-white);\n --color-nav-active-text: var(--ink-white);\n --color-nav-line: var(--primary-line);\n --color-nav-disabled: var(--alpha-white-45);\n --color-nav-badge-bg: var(--status-error);\n --color-nav-badge-text: var(--ink-white);\n /* The avatar is white with black initials wherever it stands, in both modes. */\n --color-nav-avatar-bg: var(--ink-white);\n --color-nav-avatar-text: var(--ink-black);\n /* Orange fails on the theme fill (1.89:1 on #01689B, 1:1 on #E17000); white reaches 3:1 on\n all six primaries. Dark re-points it to the orange. */\n --color-focus-on-theme: var(--ink-white);\n /* The theme's ACCENT, not the attention status: on `defensie` the menu is `#E17000` and the\n status colour made the band disappear. `--accent` is document level only. */\n --color-nav-environment-bg: var(--accent);\n --color-nav-environment-text: var(--color-text-on-fill);\n /* The page's surface in both modes. The navigation bar under it is the menu turned a quarter,\n on `--color-nav-*`. */\n --color-logobar-bg: var(--color-bg-surface);\n --color-logobar-text: var(--color-text-primary);\n /* The ribbon in the emblem; only the logo re-points it in dark, never lintblauw elsewhere. */\n --color-logo-ribbon: var(--ribbon-blue);\n /* What marks an entry in that bar. They name the primitives, never `--color-nav-*`: the bar\n points those at these, and the two would refer to each other. */\n --color-navbar-hover: var(--primary-hover);\n --color-navbar-active: var(--primary-hover);\n --color-navbar-active-edge: var(--ink-white);\n --color-navbar-open-text: var(--color-accent-text);\n /* The start page's band is the primary's wash, so it never reads as the menu. The orange ring\n misses 3:1 on it; the ring takes the text colour. */\n --color-hero-bg: var(--primary-wash);\n --color-hero-text: var(--color-text-primary);\n --color-hero-focus: var(--color-text-primary);\n /* The site's foot stands on the menu's own fill, as on rijksoverheid.nl; in dark it follows the menu. */\n --color-footer-bg: var(--color-nav-bg);\n --color-footer-text: var(--color-nav-text);\n --color-footer-line: var(--color-nav-line);\n --color-footer-focus: var(--color-focus-on-theme);\n\n /* The box behind a recognised term: the primary's wash; dark re-points it. */\n --color-term-bg: var(--primary-wash);\n /* The chosen option of a row of options: the primary's wash; dark re-points it. */\n --color-choice-active-bg: var(--primary-wash);\n /* The 2 px line under a term; dark takes the text tint, as the line tint falls short on it. */\n --color-term-line: var(--color-accent-line);\n\n /* --- Data colors ------------------------------------------------------- */\n /* One colour per variable, named after the Rijkshuisstijl colour. */\n --color-chart-sky-blue: var(--data-sky-blue);\n --color-chart-dark-yellow: var(--data-dark-yellow);\n --color-chart-dark-yellow-text: var(--data-dark-yellow-text);\n --color-chart-red: var(--data-red);\n --color-chart-green: var(--data-green);\n --color-chart-mint-green: var(--data-mint-green);\n --color-chart-violet: var(--data-violet);\n --color-chart-orange: var(--data-orange);\n --color-chart-pink: var(--data-pink);\n --color-chart-dark-green: var(--data-dark-green);\n --color-chart-purple: var(--data-purple);\n --color-chart-ruby-red: var(--data-ruby-red);\n --color-chart-yellow: var(--data-yellow);\n --color-chart-dark-brown: var(--data-dark-brown);\n --color-chart-brown: var(--data-brown);\n --color-chart-dark-blue: var(--data-dark-blue);\n --color-chart-light-blue: var(--data-light-blue);\n --color-chart-moss-green: var(--data-moss-green);\n --color-chart-secondary: var(--data-comparison); /* comparison, context */\n --color-chart-other: var(--data-other); /* \"Overig\" */\n --color-chart-remainder: var(--neutral-3); /* the rest of a whole, e.g. a donut's open part */\n --color-chart-emphasis: var(--data-emphasis); /* trend, threshold, target */\n --color-chart-grid: var(--data-grid);\n --color-chart-axis: var(--neutral-5);\n /* The zero line (darker than the grid) and the hatch of missing data carry meaning, so they\n reach 3:1 on the surface: a fifth of the way from neutral-4 to neutral-5 (3.1:1; 4.0:1 dark). */\n --color-chart-zero: color-mix(in srgb, var(--neutral-5) 20%, var(--neutral-4));\n --color-chart-hatch: color-mix(in srgb, var(--neutral-5) 20%, var(--neutral-4));\n /* A speaker's colour under a whole fragment: this share of it over the surface, so text keeps\n its contrast in light and in dark. */\n --tint-speaker: 12%;\n\n /* These map colours stay deliberately neutral so the data is the only colour on the map. */\n --color-map-water: var(--neutral-0);\n --color-map-land: var(--neutral-2);\n --color-map-border: var(--neutral-4);\n /* An area with a figure: 3:1 against the land and the lightest class, which are 1.1:1 apart. */\n --color-map-border-data: var(--neutral-5);\n\n /* The variable a figure draws when its data names none: the first colour of the list, the\n same decision as `DEFAULT_SERIES_COLOR` in `charts/shared/colors.ts`. */\n --color-chart-default: var(--color-chart-sky-blue);\n\n /* Subdivision of one variable: its colour in its tint ladder, strongest first, on the steps\n 100 / 75 / 60 / 45 / 30. Every colour carries its ladder, so a figure that brings a colour\n brings its tints: a renderer names `--color-chart-<colour>` and\n `--color-chart-<colour>-tint-N`, never a --data-* colour. */\n --color-chart-sky-blue-tint-2: var(--data-sky-blue-75);\n --color-chart-sky-blue-tint-3: var(--data-sky-blue-60);\n --color-chart-sky-blue-tint-4: var(--data-sky-blue-45);\n --color-chart-sky-blue-tint-5: var(--data-sky-blue-30);\n\n --color-chart-dark-yellow-tint-2: var(--data-dark-yellow-75);\n --color-chart-dark-yellow-tint-3: var(--data-dark-yellow-60);\n --color-chart-dark-yellow-tint-4: var(--data-dark-yellow-45);\n --color-chart-dark-yellow-tint-5: var(--data-dark-yellow-30);\n\n --color-chart-red-tint-2: var(--data-red-75);\n --color-chart-red-tint-3: var(--data-red-60);\n --color-chart-red-tint-4: var(--data-red-45);\n --color-chart-red-tint-5: var(--data-red-30);\n\n --color-chart-green-tint-2: var(--data-green-75);\n --color-chart-green-tint-3: var(--data-green-60);\n --color-chart-green-tint-4: var(--data-green-45);\n --color-chart-green-tint-5: var(--data-green-30);\n\n --color-chart-mint-green-tint-2: var(--data-mint-green-75);\n --color-chart-mint-green-tint-3: var(--data-mint-green-60);\n --color-chart-mint-green-tint-4: var(--data-mint-green-45);\n --color-chart-mint-green-tint-5: var(--data-mint-green-30);\n\n --color-chart-violet-tint-2: var(--data-violet-75);\n --color-chart-violet-tint-3: var(--data-violet-60);\n --color-chart-violet-tint-4: var(--data-violet-45);\n --color-chart-violet-tint-5: var(--data-violet-30);\n\n --color-chart-orange-tint-2: var(--data-orange-75);\n --color-chart-orange-tint-3: var(--data-orange-60);\n --color-chart-orange-tint-4: var(--data-orange-45);\n --color-chart-orange-tint-5: var(--data-orange-30);\n\n --color-chart-pink-tint-2: var(--data-pink-75);\n --color-chart-pink-tint-3: var(--data-pink-60);\n --color-chart-pink-tint-4: var(--data-pink-45);\n --color-chart-pink-tint-5: var(--data-pink-30);\n\n --color-chart-dark-green-tint-2: var(--data-dark-green-75);\n --color-chart-dark-green-tint-3: var(--data-dark-green-60);\n --color-chart-dark-green-tint-4: var(--data-dark-green-45);\n --color-chart-dark-green-tint-5: var(--data-dark-green-30);\n\n --color-chart-purple-tint-2: var(--data-purple-75);\n --color-chart-purple-tint-3: var(--data-purple-60);\n --color-chart-purple-tint-4: var(--data-purple-45);\n --color-chart-purple-tint-5: var(--data-purple-30);\n\n --color-chart-ruby-red-tint-2: var(--data-ruby-red-75);\n --color-chart-ruby-red-tint-3: var(--data-ruby-red-60);\n --color-chart-ruby-red-tint-4: var(--data-ruby-red-45);\n --color-chart-ruby-red-tint-5: var(--data-ruby-red-30);\n\n --color-chart-yellow-tint-2: var(--data-yellow-75);\n --color-chart-yellow-tint-3: var(--data-yellow-60);\n --color-chart-yellow-tint-4: var(--data-yellow-45);\n --color-chart-yellow-tint-5: var(--data-yellow-30);\n\n --color-chart-dark-brown-tint-2: var(--data-dark-brown-75);\n --color-chart-dark-brown-tint-3: var(--data-dark-brown-60);\n --color-chart-dark-brown-tint-4: var(--data-dark-brown-45);\n --color-chart-dark-brown-tint-5: var(--data-dark-brown-30);\n\n --color-chart-brown-tint-2: var(--data-brown-75);\n --color-chart-brown-tint-3: var(--data-brown-60);\n --color-chart-brown-tint-4: var(--data-brown-45);\n --color-chart-brown-tint-5: var(--data-brown-30);\n\n --color-chart-dark-blue-tint-2: var(--data-dark-blue-75);\n --color-chart-dark-blue-tint-3: var(--data-dark-blue-60);\n --color-chart-dark-blue-tint-4: var(--data-dark-blue-45);\n --color-chart-dark-blue-tint-5: var(--data-dark-blue-30);\n\n --color-chart-light-blue-tint-2: var(--data-light-blue-75);\n --color-chart-light-blue-tint-3: var(--data-light-blue-60);\n --color-chart-light-blue-tint-4: var(--data-light-blue-45);\n --color-chart-light-blue-tint-5: var(--data-light-blue-30);\n\n --color-chart-moss-green-tint-2: var(--data-moss-green-75);\n --color-chart-moss-green-tint-3: var(--data-moss-green-60);\n --color-chart-moss-green-tint-4: var(--data-moss-green-45);\n --color-chart-moss-green-tint-5: var(--data-moss-green-30);\n\n /* The default ladder, for a figure that names no colour: the sky blue's. */\n --color-chart-tint-1: var(--color-chart-sky-blue);\n --color-chart-tint-2: var(--color-chart-sky-blue-tint-2);\n --color-chart-tint-3: var(--color-chart-sky-blue-tint-3);\n --color-chart-tint-4: var(--color-chart-sky-blue-tint-4);\n --color-chart-tint-5: var(--color-chart-sky-blue-tint-5);\n\n /* Sequential scale for ordinal classes (heatmap, choropleth), lightest first. A component names\n these, never a --data-* colour directly. */\n --color-chart-seq-1: var(--data-sky-blue-15);\n --color-chart-seq-2: var(--data-sky-blue-30);\n --color-chart-seq-3: var(--data-sky-blue-45);\n --color-chart-seq-4: var(--data-sky-blue-75);\n --color-chart-seq-5: var(--data-sky-blue);\n}\n\n/* ============================================================================\n Dark mode — the Logius range, no inversion\n\n Redefines the seven `--neutral-*` primitives, re-declares `--primary-hover` lighter and\n re-points the layer-2/3 names whose meaning changes; everything that merely follows a\n neutral is absent on purpose. Page and tiles are both #282828, the border separates them: the\n step below is the menu's, so it stays a band beside the page and under the logo bar.\n Screen only: paper is always light, whatever the reader chose.\n ========================================================================= */\n@media screen {\n [data-mode='dark'] {\n --neutral-0: #282828;\n --neutral-1: #1D1D1D;\n --neutral-2: #333333;\n --neutral-3: #4A4A4A;\n --neutral-4: #7A7A7A;\n --neutral-5: #B0B0B0;\n --neutral-6: #FFFFFF;\n\n /* The hover goes UP in dark: the light mix would put a near-black fill on the near-black page. */\n --primary-hover: color-mix(in srgb, var(--primary), white 12%);\n\n --color-bg-page: var(--neutral-0);\n --color-bg-title: var(--neutral-0);\n /* The hero's wash sits halfway between the menu (L 0.231) and the page (L 0.277), below the\n page as in light: a panel or tab on it is lighter than its ground. */\n --primary-wash: oklch(from var(--primary) 0.254 min(c, 0.02) h);\n\n /* The filter zone must read as a band, so in dark it steps UP to neutral-2 (neutral-1 turned\n the fields in it into light boxes). `--color-bg-inset` keeps neutral-1: \"sunken\". */\n --color-bg-filter: var(--neutral-2);\n --color-bg-inset: var(--neutral-1);\n\n --color-text-inverse: var(--neutral-1);\n\n /* Colour that must read by itself on #282828 becomes the tint; a FILL keeps the primary. */\n --color-action-primary-border: var(--primary-tint);\n --color-action-secondary-border: var(--primary-tint);\n /* Danger hover: 8 % white is the most that keeps white text at 4.5:1 (4.56:1). The border and\n the word lift the red as the primary's tints do, to 3:1 on #282828 and 4.5:1 on #333333,\n the hover surface; the word's chroma cap keeps it inside sRGB. */\n --color-action-danger-hover: color-mix(in srgb, var(--status-error), white 8%);\n --color-action-danger-border: oklch(from var(--status-error) max(l, 0.58) c h);\n --color-action-danger-text: oklch(from var(--status-error) max(l, 0.71) min(c, 0.18) h);\n /* A status mark at 3:1 on its own tint. */\n --color-attention-line: var(--status-attention);\n --color-error-line: oklch(from var(--status-error) max(l, 0.6) c h);\n --color-info-line: oklch(from var(--status-info) max(l, 0.58) c h);\n --color-success-line: oklch(from var(--status-success) max(l, 0.57) c h);\n /* A status word at 4.5:1 on #333333, lifted as the danger word is. */\n --color-error-text: oklch(from var(--status-error) max(l, 0.71) min(c, 0.18) h);\n --color-success-text: oklch(from var(--status-success) max(l, 0.68) min(c, 0.18) h);\n /* A link is text: the text tint, not the line tint. The hover stays white. */\n --color-link: var(--primary-tint-text);\n --color-link-hover: var(--neutral-6);\n --color-link-on-status: var(--neutral-6);\n --color-accent-line: var(--primary-tint);\n --color-accent-text: var(--primary-tint-text);\n\n /* Lintblauw has too little contrast on the dark surface; the house style lightens it. */\n --color-logo-ribbon: var(--ribbon-blue-dark);\n\n /* The menu is neutral in dark: near-black, in the rail and in the bar alike, so in the top\n layout it stays its own band under the logo bar. Hover and active are one step up, as they\n are one fill in light; the edge is the text tint, as the line tint is 3:1 on neutral-0 only. */\n --color-nav-bg: var(--neutral-1);\n --color-nav-text: var(--neutral-6);\n --color-nav-text-sub: var(--neutral-5);\n --color-nav-hover: var(--neutral-2);\n --color-nav-active: var(--neutral-2);\n --color-nav-active-edge: var(--primary-tint-text);\n --color-navbar-hover: var(--neutral-2);\n --color-navbar-active: var(--neutral-2);\n --color-navbar-active-edge: var(--primary-tint-text);\n /* The open entry's word stands on the panel's surface: full text contrast, not the tint. */\n --color-navbar-open-text: var(--color-text-primary);\n /* The label is 16 px text: the tint is 3.0:1 and needs 4.5:1. The edge keeps the tint. */\n --color-nav-active-text: var(--neutral-6);\n /* The sheet is told from the page by its shadow and this quiet line; 1.66:1 is accepted here. */\n --color-border-popover: var(--neutral-3);\n --color-nav-line: var(--neutral-2);\n --color-nav-disabled: var(--neutral-4);\n /* The menu is neutral here, so its ring is the orange of every other surface. */\n --color-focus-on-theme: var(--color-focus);\n /* The choice edge keeps neutral-4 in dark: it already reaches 3:1 there (3.43:1 on #282828). */\n --color-border-choice: var(--neutral-4);\n\n /* A term's box is the subtle surface: behind a word on #282828 the dark wash would be a hole. */\n --color-term-bg: var(--neutral-2);\n --color-choice-active-bg: var(--neutral-2);\n --color-hero-focus: var(--color-focus);\n --color-term-line: var(--primary-tint-text);\n\n /* Yellow as text works on the dark surface, so the dark gold is not needed. */\n --color-chart-dark-yellow-text: var(--data-dark-yellow);\n --color-map-water: var(--neutral-1);\n\n --shadow-sticky: 0 2px 6px var(--alpha-black-40);\n --shadow-popover: 0 4px 16px var(--alpha-black-55);\n --shadow-nav: 2px 0 8px var(--alpha-black-40);\n --shadow-chart-hover: 0 1px 4px var(--alpha-black-60);\n --shadow-scroll-start: inset 12px 0 10px -10px var(--alpha-black-60);\n --shadow-scroll-end: inset -12px 0 10px -10px var(--alpha-black-60);\n --color-overlay-nav: var(--alpha-black-40);\n }\n}\n\n/* ============================================================================\n Below 768 px the gutter follows the page padding and every pointer target is the touch\n floor. Screen only: a portrait page is narrower than 768 px and keeps the desktop form.\n ========================================================================= */\n@media screen and (max-width: 767px) {\n :root {\n --grid-gutter: 16px;\n --h-target: var(--h-touch);\n --h-option: var(--h-touch);\n --chart-h-expanded: 320px;\n --w-ribbon: 2.5rem;\n }\n}\n\n/* ============================================================================\n Paper — white under the content, since Lintje prints its own fills\n (`print-color-adjust: exact` in base.css): a band in the page's grey would cost ink and\n say nothing.\n ========================================================================= */\n@media print {\n :root {\n /* The paper's margin is the page's edge: bars and content start at it, aligned. */\n --page-pad-x: 0px;\n --color-bg-page: var(--neutral-0);\n --color-bg-title: var(--neutral-0);\n --color-bg-filter: var(--neutral-0);\n }\n}\n\n/* The sheet's own margin, so the content never runs to the paper's edge: room for the browser's\n date, address and page number above and below, and a portrait sheet still wide enough for the\n tablet's form. A custom property does not reach `@page`, so the value stands here. */\n@page { margin: 15mm 12mm; }\n", Be = "/*\n * The reset every shadow root needs, adopted once as one shared `CSSStyleSheet`.\n *\n * `background` and `color` are deliberately not on `:host`: every element has a `:host`, so\n * they would cut the inheritance chain at each boundary (an icon in the navigation would lose\n * its white `currentColor`). Page-level rules (`html, body`) belong to the host page.\n */\n\n:host {\n font: var(--text-ui);\n font-family: var(--font-ui);\n -webkit-font-smoothing: antialiased;\n font-variant-numeric: tabular-nums;\n}\n\n*, *::before, *::after { box-sizing: border-box; }\n\nh1, h2, h3, h4, h5, h6, p, figure { margin: 0; }\nul, ol { margin: 0; padding: 0; list-style: none; }\n\nbutton {\n font: inherit;\n color: inherit;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n}\n\na { color: var(--color-link); }\n\ninput, select, textarea { font: inherit; color: inherit; }\n\n/* Focus: always orange 3 px, never animated. */\n:focus-visible {\n outline: var(--focus-width) solid var(--color-focus);\n outline-offset: var(--focus-offset);\n}\n/* Where the outside would be clipped (tiles in a grid, table rows) the ring sits inside. */\n.focus-inset:focus-visible { outline-offset: calc(var(--focus-width) * -1); }\n\n[hidden] { display: none !important; }\n\n.visually-hidden {\n position: absolute;\n width: 1px; height: 1px;\n padding: 0; margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes lintje-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n}\n@keyframes lintje-rise {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: none; }\n}\n@keyframes lintje-sheet-in {\n from { transform: translateY(100%); }\n to { transform: none; }\n}\n@keyframes lintje-menu-in {\n from { transform: translateY(-100%); }\n to { transform: none; }\n}\n@keyframes lintje-menu-out {\n from { transform: none; }\n to { transform: translateY(-100%); }\n}\n@keyframes lintje-fade-in { from { opacity: 0; } to { opacity: 1; } }\n/* A point, on a map or in a scatter plot, grows from its middle. */\n@keyframes lintje-point-grow { from { transform: scale(0); } }\n@keyframes lintje-drop-in { from { transform: translateY(-10px); } to { transform: none; } }\n@keyframes lintje-popover-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: none; }\n}\n\n/* prefers-reduced-motion: all durations 0 except opacity (80 ms). */\n@media (prefers-reduced-motion: reduce) {\n :host {\n --dur-base: 0ms; --dur-hover: 0ms; --dur-popover: 0ms; --dur-submenu: 0ms; --dur-toast: 0ms; --dur-scrim: 0ms; --dur-rail: 0ms; --dur-collapse: 0ms;\n --dur-modal: 0ms; --dur-sheet: 0ms; --dur-kpi: 0ms; --dur-badge: 0ms; --dur-draw: 0ms;\n }\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 80ms !important;\n scroll-behavior: auto !important;\n }\n}\n\n/* Forced colours: the browser replaces every colour and drops shadows; what every root shares\n is the focus ring, in the system's Highlight. */\n@media (forced-colors: active) {\n :focus-visible { outline-color: Highlight; }\n}\n\n/* Paper. A fill carries meaning (a legend swatch, a status cell, the current page), so it prints\n even with the browser's background graphics off; the surfaces under it are white in print.\n A drawing in progress would print half drawn, so every mark stands in its final state. */\n@media print {\n *, *::before, *::after {\n print-color-adjust: exact;\n animation: none !important;\n transition: none !important;\n }\n}\n";
524
+ var ze = "/* ============================================================================\n Lintje — design tokens\n\n Colour is in three groups: themable UI colour (a theme sets only `--primary` and `--accent`, in\n `themes.css`), fixed data colour (`--data-*`, identical in every\n mode and theme except the two grays) and fixed status colour (`--status-*`).\n\n Three layers, one direction: component -> semantic (`--color-*`) -> primitives. Only the\n primitive blocks may hold a colour literal. To change a colour in one mode, re-point the\n layer-2 name inside `[data-mode='dark']`.\n\n `color-mix(in srgb, …)` and the relative `oklch(from …)` need Chrome/Edge 122+, Firefox 128+\n or Safari 18+;\n `colour-scheme.test.ts` repeats the arithmetic. The `@font-face` rules live in `fonts.css`:\n they cannot work inside a shadow root.\n ========================================================================= */\n\n/* ============================================================================\n Layer 1 — primitives (the only literals)\n ========================================================================= */\n:root {\n /* --- Neutral (light). The one mode-dependent primitive family ----------\n Neutral-5 is the cool-grey step 600, not 500, because it carries muted TEXT:\n #64748B is 4.34:1 on neutral-2, #475569 is 6.92:1. */\n --neutral-0: #FFFFFF;\n --neutral-1: #F8FAFC;\n --neutral-2: #F1F5F9;\n --neutral-3: #E2E8F0;\n --neutral-4: #94A3B8;\n --neutral-5: #475569;\n --neutral-6: #0F172A;\n\n /* --- Fixed ink ---------------------------------------------------------\n The same in both modes because it sits on a fill, not on the page. */\n --ink-white: #FFFFFF;\n --ink-black: #0F172A;\n --alpha-white-82: rgba(255, 255, 255, 0.82);\n --alpha-white-45: rgba(255, 255, 255, 0.45);\n\n /* --- Focus -------------------------------------------------------------\n Its own constant: it must not move with the accent or the attention status. */\n --focus-orange: #E17000;\n\n /* --- The ribbon --------------------------------------------------------\n Lintblauw, and the Rijkshuisstijl's own lighter tint for the ribbon in the logo in dark. */\n --ribbon-blue: #154273;\n --ribbon-blue-dark: #004A8D;\n\n /* --- Data (fixed Rijkshuisstijl, identical in light, dark and every theme)\n The two grays follow the mode: as fixed literals the comparison line landed at 2.69:1\n on the dark surface. Light #475569 / #94A3B8, dark #B0B0B0 / #7A7A7A. The variables\n stand in the order of `tokens/colors.ts`, the one list of their names. */\n --data-sky-blue: #007BC7;\n --data-dark-yellow: #FFB612;\n --data-red: #D52B1E;\n --data-green: #39870C;\n --data-mint-green: #76D2B6;\n --data-violet: #A90061;\n --data-orange: #E17000;\n --data-pink: #F092CD;\n --data-dark-green: #275937;\n --data-purple: #42145F;\n --data-ruby-red: #CA005D;\n --data-yellow: #F9E11E;\n --data-dark-brown: #673328;\n --data-brown: #94710A;\n --data-dark-blue: #01689B;\n --data-light-blue: #8FCAE7;\n --data-moss-green: #777B00;\n /* Sky blue's ladder is written out: the map's areas draw in from the land to these classes,\n and Chromium interpolates a `color-mix()` target wrongly (the land's RGB numbers taken as\n oklab), so the areas flash yellow. The values are its mix with white; the test checks. */\n --data-sky-blue-75: #409CD5;\n --data-sky-blue-60: #66B0DD;\n --data-sky-blue-45: #8CC4E6;\n --data-sky-blue-30: #B2D7EE;\n --data-sky-blue-15: #D9EBF7;\n --data-comparison: var(--neutral-5);\n --data-other: var(--neutral-4);\n /* Yellow as TEXT fails contrast on white: light writes a wait time in this dark gold. */\n --data-dark-yellow-text: #B07A00;\n /* Grid and emphasis follow the surface, like the two grays. */\n --data-grid: var(--neutral-3);\n --data-emphasis: var(--neutral-6);\n\n /* --- Status (fixed) ---------------------------------------------------- */\n --status-success: #39870C;\n --status-warning: #FFB612;\n --status-attention: #E17000;\n --status-error: #D52B1E;\n --status-info: #007BC7;\n\n /* Black at the alphas the shadows and overlays use; the digits are the alpha in percent. */\n --alpha-black-08: rgba(0, 0, 0, 0.08);\n --alpha-black-14: rgba(0, 0, 0, 0.14);\n --alpha-black-16: rgba(0, 0, 0, 0.16);\n --alpha-black-18: rgba(0, 0, 0, 0.18);\n --alpha-black-22: rgba(0, 0, 0, 0.22);\n --alpha-black-40: rgba(0, 0, 0, 0.4);\n --alpha-black-55: rgba(0, 0, 0, 0.55);\n --alpha-black-60: rgba(0, 0, 0, 0.6);\n}\n\n/* ============================================================================\n Layer 1 — derivations\n\n Mixes of the primitives and of the theme's two properties. The tint ladder is 75 / 60 / 45\n / 30 / 15 % of the base over white; every data colour carries the complete ladder.\n ========================================================================= */\n:root {\n /* Darker than the primary in light: a lighter fill under white text lost contrast (2.80:1 on\n orange). The dark block re-declares it lighter. */\n --primary-hover: color-mix(in srgb, var(--primary), black 30%);\n --primary-line: color-mix(in srgb, var(--primary), white 22%);\n /* The dark tints lift only the perceived lightness, so they keep the primary's colour; a mix\n with white greys it. Each lightness is the smallest hundredth that clears its floor in every\n theme: 3:1 on #282828 for a line, 4.5:1 on #333333 (neutral-2), the lightest neutral\n surface a word stands on, for text. A primary that is lighter already keeps its own. */\n --primary-tint: oklch(from var(--primary) max(l, 0.55) c h);\n --primary-tint-text: oklch(from var(--primary) max(l, 0.71) c h);\n /* A wash behind a word or under a band, never a colour that reads by itself. Fixed in\n perceived lightness, so it is equally light in every theme and keeps the primary's hue; an\n sRGB mix with white greys a dark primary. The chroma cap keeps every theme inside sRGB. */\n --primary-wash: oklch(from var(--primary) 0.955 min(c, 0.02) h);\n\n --data-dark-yellow-75: color-mix(in srgb, var(--data-dark-yellow) 75%, white);\n --data-dark-yellow-60: color-mix(in srgb, var(--data-dark-yellow) 60%, white);\n --data-dark-yellow-45: color-mix(in srgb, var(--data-dark-yellow) 45%, white);\n --data-dark-yellow-30: color-mix(in srgb, var(--data-dark-yellow) 30%, white);\n --data-dark-yellow-15: color-mix(in srgb, var(--data-dark-yellow) 15%, white);\n\n --data-red-75: color-mix(in srgb, var(--data-red) 75%, white);\n --data-red-60: color-mix(in srgb, var(--data-red) 60%, white);\n --data-red-45: color-mix(in srgb, var(--data-red) 45%, white);\n --data-red-30: color-mix(in srgb, var(--data-red) 30%, white);\n --data-red-15: color-mix(in srgb, var(--data-red) 15%, white);\n\n --data-green-75: color-mix(in srgb, var(--data-green) 75%, white);\n --data-green-60: color-mix(in srgb, var(--data-green) 60%, white);\n --data-green-45: color-mix(in srgb, var(--data-green) 45%, white);\n --data-green-30: color-mix(in srgb, var(--data-green) 30%, white);\n --data-green-15: color-mix(in srgb, var(--data-green) 15%, white);\n\n --data-mint-green-75: color-mix(in srgb, var(--data-mint-green) 75%, white);\n --data-mint-green-60: color-mix(in srgb, var(--data-mint-green) 60%, white);\n --data-mint-green-45: color-mix(in srgb, var(--data-mint-green) 45%, white);\n --data-mint-green-30: color-mix(in srgb, var(--data-mint-green) 30%, white);\n --data-mint-green-15: color-mix(in srgb, var(--data-mint-green) 15%, white);\n\n --data-violet-75: color-mix(in srgb, var(--data-violet) 75%, white);\n --data-violet-60: color-mix(in srgb, var(--data-violet) 60%, white);\n --data-violet-45: color-mix(in srgb, var(--data-violet) 45%, white);\n --data-violet-30: color-mix(in srgb, var(--data-violet) 30%, white);\n --data-violet-15: color-mix(in srgb, var(--data-violet) 15%, white);\n\n --data-orange-75: color-mix(in srgb, var(--data-orange) 75%, white);\n --data-orange-60: color-mix(in srgb, var(--data-orange) 60%, white);\n --data-orange-45: color-mix(in srgb, var(--data-orange) 45%, white);\n --data-orange-30: color-mix(in srgb, var(--data-orange) 30%, white);\n --data-orange-15: color-mix(in srgb, var(--data-orange) 15%, white);\n\n --data-pink-75: color-mix(in srgb, var(--data-pink) 75%, white);\n --data-pink-60: color-mix(in srgb, var(--data-pink) 60%, white);\n --data-pink-45: color-mix(in srgb, var(--data-pink) 45%, white);\n --data-pink-30: color-mix(in srgb, var(--data-pink) 30%, white);\n --data-pink-15: color-mix(in srgb, var(--data-pink) 15%, white);\n\n --data-dark-green-75: color-mix(in srgb, var(--data-dark-green) 75%, white);\n --data-dark-green-60: color-mix(in srgb, var(--data-dark-green) 60%, white);\n --data-dark-green-45: color-mix(in srgb, var(--data-dark-green) 45%, white);\n --data-dark-green-30: color-mix(in srgb, var(--data-dark-green) 30%, white);\n --data-dark-green-15: color-mix(in srgb, var(--data-dark-green) 15%, white);\n\n --data-purple-75: color-mix(in srgb, var(--data-purple) 75%, white);\n --data-purple-60: color-mix(in srgb, var(--data-purple) 60%, white);\n --data-purple-45: color-mix(in srgb, var(--data-purple) 45%, white);\n --data-purple-30: color-mix(in srgb, var(--data-purple) 30%, white);\n --data-purple-15: color-mix(in srgb, var(--data-purple) 15%, white);\n\n --data-ruby-red-75: color-mix(in srgb, var(--data-ruby-red) 75%, white);\n --data-ruby-red-60: color-mix(in srgb, var(--data-ruby-red) 60%, white);\n --data-ruby-red-45: color-mix(in srgb, var(--data-ruby-red) 45%, white);\n --data-ruby-red-30: color-mix(in srgb, var(--data-ruby-red) 30%, white);\n --data-ruby-red-15: color-mix(in srgb, var(--data-ruby-red) 15%, white);\n\n --data-yellow-75: color-mix(in srgb, var(--data-yellow) 75%, white);\n --data-yellow-60: color-mix(in srgb, var(--data-yellow) 60%, white);\n --data-yellow-45: color-mix(in srgb, var(--data-yellow) 45%, white);\n --data-yellow-30: color-mix(in srgb, var(--data-yellow) 30%, white);\n --data-yellow-15: color-mix(in srgb, var(--data-yellow) 15%, white);\n\n --data-dark-brown-75: color-mix(in srgb, var(--data-dark-brown) 75%, white);\n --data-dark-brown-60: color-mix(in srgb, var(--data-dark-brown) 60%, white);\n --data-dark-brown-45: color-mix(in srgb, var(--data-dark-brown) 45%, white);\n --data-dark-brown-30: color-mix(in srgb, var(--data-dark-brown) 30%, white);\n --data-dark-brown-15: color-mix(in srgb, var(--data-dark-brown) 15%, white);\n\n --data-brown-75: color-mix(in srgb, var(--data-brown) 75%, white);\n --data-brown-60: color-mix(in srgb, var(--data-brown) 60%, white);\n --data-brown-45: color-mix(in srgb, var(--data-brown) 45%, white);\n --data-brown-30: color-mix(in srgb, var(--data-brown) 30%, white);\n --data-brown-15: color-mix(in srgb, var(--data-brown) 15%, white);\n\n --data-dark-blue-75: color-mix(in srgb, var(--data-dark-blue) 75%, white);\n --data-dark-blue-60: color-mix(in srgb, var(--data-dark-blue) 60%, white);\n --data-dark-blue-45: color-mix(in srgb, var(--data-dark-blue) 45%, white);\n --data-dark-blue-30: color-mix(in srgb, var(--data-dark-blue) 30%, white);\n --data-dark-blue-15: color-mix(in srgb, var(--data-dark-blue) 15%, white);\n\n --data-light-blue-75: color-mix(in srgb, var(--data-light-blue) 75%, white);\n --data-light-blue-60: color-mix(in srgb, var(--data-light-blue) 60%, white);\n --data-light-blue-45: color-mix(in srgb, var(--data-light-blue) 45%, white);\n --data-light-blue-30: color-mix(in srgb, var(--data-light-blue) 30%, white);\n --data-light-blue-15: color-mix(in srgb, var(--data-light-blue) 15%, white);\n\n --data-moss-green-75: color-mix(in srgb, var(--data-moss-green) 75%, white);\n --data-moss-green-60: color-mix(in srgb, var(--data-moss-green) 60%, white);\n --data-moss-green-45: color-mix(in srgb, var(--data-moss-green) 45%, white);\n --data-moss-green-30: color-mix(in srgb, var(--data-moss-green) 30%, white);\n --data-moss-green-15: color-mix(in srgb, var(--data-moss-green) 15%, white);\n\n /* 15 % of the status colour over the surface, so one declaration covers both modes. */\n --status-success-bg: color-mix(in srgb, var(--status-success) 15%, var(--neutral-0));\n --status-warning-bg: color-mix(in srgb, var(--status-warning) 15%, var(--neutral-0));\n --status-attention-bg: color-mix(in srgb, var(--status-attention) 15%, var(--neutral-0));\n --status-error-bg: color-mix(in srgb, var(--status-error) 15%, var(--neutral-0));\n --status-info-bg: color-mix(in srgb, var(--status-info) 15%, var(--neutral-0));\n}\n\n/* ============================================================================\n Layers 2 and 3 — semantic and component tokens (light)\n\n No colour literal below this line.\n ========================================================================= */\n:root {\n /* --- Typography -------------------------------------------------------- */\n --font-ui: 'RijksSans', 'Source Sans 3', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --font-mono: 'Source Code Pro', ui-monospace, SFMono-Regular, Menlo, monospace;\n\n --text-dashboard: 700 1.25rem/1.2 var(--font-ui);\n --text-h1: 700 1.75rem/1.2 var(--font-ui);\n --text-h1-mobile: 700 1.5rem/1.15 var(--font-ui);\n --text-h1-display: 700 2.5rem/1.1 var(--font-ui);\n --text-h2: 700 1.25rem/1.25 var(--font-ui);\n --text-tile-title: 700 1rem/1.3 var(--font-ui);\n --text-kpi: 700 2rem/1.1 var(--font-ui);\n --text-kpi-mobile: 700 1.5rem/1.1 var(--font-ui);\n --text-kpi-secondary: 700 1.25rem/1.1 var(--font-ui);\n --text-body: 400 1rem/1.5 var(--font-ui);\n /* Larger than body, read at a glance: the text being translated, a hero's introduction, a\n transcript in its large size. */\n --text-translation: 400 1.25rem/1.5 var(--font-ui);\n --text-ui: 400 1rem/1.4 var(--font-ui);\n /* Secondary text is one token: a hint, a sub-line, a meta line, a date. */\n --text-small: 400 0.875rem/1.45 var(--font-ui);\n /* Former names of the same token; they go with the next breaking release. */\n --text-meta: var(--text-small);\n --text-tile-sub: var(--text-small);\n --text-table: 400 1rem/1.4 var(--font-ui);\n --text-table-head: 700 0.875rem/1.3 var(--font-ui);\n --text-axis: 400 0.75rem/1.2 var(--font-ui);\n\n --label-size: 0.875rem;\n --label-weight: 700;\n --label-tracking: 0.08em;\n --kpi-tracking: -0.02em;\n\n /* --- Spacing (4 px scale) --------------------------------------------- */\n --space-1: 4px;\n --space-2: 8px;\n --space-3: 12px;\n --space-4: 16px;\n --space-5: 20px;\n --space-6: 24px;\n --space-8: 32px;\n --space-10: 40px;\n\n /* --- Component sizes --------------------------------------------------- */\n --h-topbar: 3.5rem;\n --h-contextbar: 3rem;\n --h-mobile-header: 4.5rem;\n --h-control: 3rem;\n --h-button: 3rem;\n --h-button-compact: 2.5rem;\n --h-button-chrome: 2.5rem;\n --h-icon-button: 2.5rem;\n --h-chip: 2rem;\n --h-chip-field: 1.75rem;\n --h-nav-row: 3rem;\n --h-nav-head: 6.5rem;\n --h-table-row: 3rem;\n --h-touch: 3rem;\n /* The smallest pointer target. A box that draws smaller reaches it through a\n transparent hit area (`::after`, negative inset). */\n --h-target: 3rem;\n /* A link in a list of text links: one line of text, the WCAG AA floor, as on rijksoverheid.nl. */\n --h-target-text: 1.5rem;\n /* The two dense exceptions to the target: a date picker day cell and a listbox option row. */\n --h-option: 2.5rem;\n /* The sparkline of a KPI: a line and its area under the figure, with no axes. */\n --h-sparkline: 2rem;\n\n --w-nav: 288px;\n --w-rail: 72px;\n --w-text: 760px;\n --w-message: 560px;\n /* A language choice in the translator's bar. */\n --w-translator-language: 18rem;\n /* The widest the page's content gets. A host sets `--lintje-content-width` to change it. */\n --w-content: 1360px;\n --nav-edge: 4px;\n /* The ribbon is the unit: 48 px, 40 on a phone. Both bars are in rem, so they grow with the\n reader's text size. */\n --w-ribbon: 3rem;\n --h-logobar: calc(2.5 * var(--w-ribbon));\n /* The top bar's height: what pins under the bar measures `--h-topbar`. */\n --h-navbar: var(--h-topbar);\n /* How far what follows the hero stands over its band's lower edge. */\n --hero-overlap: var(--space-10);\n /* The widest the picture beside the hero's text gets: four of the twelve columns at 1440. */\n --w-hero-aside: 400px;\n /* The narrowest a card gets in a card list before the list drops a column. */\n --w-card: 320px;\n /* The same for a horizontal card, whose picture takes a column of its own. */\n --w-card-wide: 480px;\n --w-card-media: 200px;\n --w-card-logo: 3.5rem;\n --w-card-logo-wide: 5rem;\n /* The narrowest thumbnail under a gallery's large picture. */\n --w-gallery-thumb: 120px;\n /* The narrowest column of links in a footer before the columns stand under each other. */\n --w-footer-column: 220px;\n\n --page-pad-y: 32px;\n --page-pad-x: 24px;\n /* What a full-width bar or the content adds to its side padding so what stands in it keeps to\n `--w-content`; the percentage is taken of the box the bar stands in. */\n --page-gutter: max(\n 0px,\n calc((100% - var(--lintje-content-width, var(--w-content)) - 2 * var(--page-pad-x)) / 2)\n );\n --grid-gutter: 24px;\n --tile-pad-y: 20px;\n --tile-pad-x: 24px;\n --chart-h-main: 260px;\n --chart-h-small: 180px;\n --chart-h-expanded: 560px;\n\n /* Sticky context = top bar + summary bar. */\n --h-sticky: calc(var(--h-topbar) + var(--h-contextbar));\n\n --radius: 0px;\n --radius-round: 50%;\n\n --shadow-sticky: 0 2px 6px var(--alpha-black-08);\n --shadow-popover: 0 4px 16px var(--alpha-black-14);\n --shadow-nav: 2px 0 8px var(--alpha-black-08);\n --shadow-chart-hover: 0 1px 4px var(--alpha-black-22);\n --shadow-scroll-start: inset 12px 0 10px -10px var(--alpha-black-18);\n --shadow-scroll-end: inset -12px 0 10px -10px var(--alpha-black-18);\n\n --color-overlay-page: var(--alpha-black-60);\n --color-overlay-nav: var(--alpha-black-16);\n\n --focus-width: 3px;\n --focus-offset: 2px;\n\n /* --- Motion ------------------------------------------------------------ */\n /* `@kind other` marks these for design tooling as neither colors, sizes nor type; the library\n CSS ships unminified so the notes reach it. */\n --ease-in-motion: cubic-bezier(0.2, 0, 0, 1); /* @kind other */\n --ease-out-motion: cubic-bezier(0.4, 0, 1, 1); /* @kind other */\n /* A fade that runs both ways: straight, so out is in played backwards; a curve leaves a ghost. */\n --ease-fade: linear; /* @kind other */\n --dur-base: 200ms; /* @kind other */\n --dur-hover: 120ms; /* @kind other */\n --dur-popover: var(--dur-base); /* @kind other */\n --dur-submenu: 300ms; /* @kind other */\n --dur-toast: var(--dur-base); /* @kind other */\n --dur-scrim: var(--dur-base); /* @kind other */\n --dur-rail: var(--dur-base); /* @kind other */\n --dur-collapse: var(--dur-base); /* @kind other */\n --dur-modal: var(--dur-base); /* @kind other */\n --dur-sheet: var(--dur-base); /* @kind other */\n --dur-kpi: var(--dur-base); /* @kind other */\n --dur-badge: 300ms; /* @kind other */\n --dur-draw: 900ms; /* @kind other */\n --dur-data-label: 300ms; /* @kind other */\n --dur-layer: 400ms; /* @kind other */\n --dur-skeleton: 1200ms; /* @kind other */\n --dur-wave: 600ms; /* @kind other */\n\n /* --- Semantic: surfaces ------------------------------------------------ */\n --color-bg-page: var(--neutral-1);\n --color-bg-surface: var(--neutral-0);\n --color-bg-subtle: var(--neutral-2);\n --color-bg-title: var(--neutral-1);\n /* Between steps 2 and 3: on the cool-grey ramp neutral-2 sits too close to the page to read\n as a band. */\n --color-bg-filter: color-mix(in srgb, var(--neutral-2), var(--neutral-3));\n --color-bg-selected: var(--neutral-2);\n --color-bg-inset: var(--neutral-2);\n\n /* --- Semantic: text ---------------------------------------------------- */\n --color-text-primary: var(--neutral-6);\n --color-text-secondary: var(--neutral-6);\n --color-text-muted: var(--neutral-5);\n --color-text-inverse: var(--neutral-0);\n --color-text-disabled: var(--neutral-4);\n /* A placeholder must stay readable: 4.5:1 on the surface in both modes. */\n --color-text-placeholder: var(--neutral-5);\n --color-text-on-fill: var(--ink-white);\n --color-text-on-light-fill: var(--ink-black);\n --color-qr-bg: var(--ink-white);\n --color-qr-fg: var(--ink-black);\n\n /* --- Semantic: borders ------------------------------------------------- */\n --color-border-default: var(--neutral-3);\n --color-border-strong: var(--neutral-3);\n --color-border-filter: var(--neutral-3);\n --color-border-heavy: var(--neutral-4);\n /* The resting edge of a field box: 3:1 (WCAG 1.4.11) on the surface and the filter band. */\n --color-border-field: var(--neutral-5);\n /* The 2 px edge of a checkbox and a radio: 3:1 on the surface; dark re-points it. */\n --color-border-choice: var(--neutral-5);\n /* In dark a sheet is the same #282828 as the tile under it, so this line separates them. */\n --color-border-popover: var(--neutral-3);\n /* A DASHED outline (a suggestion, an uncertain term): neutral-5, because a dashed line has half\n the ink of a solid one and must still reach 3:1. */\n --color-border-suggestion: var(--neutral-5);\n\n /* --- Semantic: action -------------------------------------------------- */\n --color-action-primary: var(--primary);\n --color-action-primary-hover: var(--primary-hover);\n --color-action-primary-text: var(--ink-white);\n /* A primary fill in dark is a dark box on a dark page (WCAG 1.4.11): it gets a tint border. */\n --color-action-primary-border: var(--primary);\n --color-action-secondary-border: var(--primary);\n /* The destructive fill: the error red, white text on it (5.01:1). Hover is darker in light,\n lighter in dark. In dark the border is a tint, because #D52B1E is 2.94:1 on #282828. */\n --color-action-danger: var(--status-error);\n --color-action-danger-hover: color-mix(in srgb, var(--status-error), black 30%);\n --color-action-danger-border: var(--status-error);\n /* The word of the outlined danger button; dark re-points it (the red is 2.94:1 on #282828). */\n --color-action-danger-text: var(--status-error);\n --color-link: var(--primary);\n --color-link-hover: var(--primary-hover);\n /* A link on a status background: in dark no tint of the primary reaches 4.5:1 there, so it\n reads in the text colour. It is bold and underlined, so colour never carried it alone. */\n --color-link-on-status: var(--primary);\n\n /* The accent splits in three, because a fill, a line and a word have different floors:\n fill (the primary), line (non-text, 3:1: `--primary-tint` in dark) and text (4.5:1:\n `--primary-tint-text` in dark). A word in the line token fails: it is sized for 3:1. */\n --color-accent: var(--primary);\n --color-accent-line: var(--primary);\n --color-accent-text: var(--primary);\n\n --color-focus: var(--focus-orange);\n\n /* --- Semantic: status -------------------------------------------------- */\n --color-attention: var(--status-attention);\n --color-success: var(--status-success);\n --color-warning: var(--status-warning);\n --color-error: var(--status-error);\n --color-info: var(--status-info);\n\n --color-warning-bg: var(--status-warning-bg);\n --color-attention-bg: var(--status-attention-bg);\n --color-error-bg: var(--status-error-bg);\n --color-info-bg: var(--status-info-bg);\n --color-success-bg: var(--status-success-bg);\n\n /* A status mark on its own tint: the status colour, nudged to 3:1 where it falls short. */\n --color-attention-line: color-mix(in srgb, var(--status-attention), black 10%);\n --color-error-line: var(--status-error);\n --color-info-line: var(--status-info);\n --color-success-line: var(--status-success);\n /* A status WORD at 4.5:1 on the surface and on `--color-bg-subtle`: the red itself, the green\n 5 % darker (4.13:1 on neutral-2); dark lifts both. A glyph or an edge keeps the line token. */\n --color-error-text: var(--status-error);\n --color-success-text: color-mix(in srgb, var(--status-success), black 5%);\n\n /* --- Navigation (the theme fill; neutral in dark) ---------------------- */\n --color-nav-bg: var(--primary);\n --color-nav-text: var(--ink-white);\n --color-nav-text-sub: var(--alpha-white-82);\n --color-nav-hover: var(--primary-hover);\n --color-nav-active: var(--primary-hover);\n --color-nav-active-edge: var(--ink-white);\n --color-nav-active-text: var(--ink-white);\n --color-nav-line: var(--primary-line);\n --color-nav-disabled: var(--alpha-white-45);\n --color-nav-badge-bg: var(--status-error);\n --color-nav-badge-text: var(--ink-white);\n /* The avatar is white with black initials wherever it stands, in both modes. */\n --color-nav-avatar-bg: var(--ink-white);\n --color-nav-avatar-text: var(--ink-black);\n /* Orange fails on the theme fill (1.89:1 on #01689B, 1:1 on #E17000); white reaches 3:1 on\n all six primaries. Dark re-points it to the orange. */\n --color-focus-on-theme: var(--ink-white);\n /* The theme's ACCENT, not the attention status: on `defensie` the menu is `#E17000` and the\n status colour made the band disappear. `--accent` is document level only. */\n --color-nav-environment-bg: var(--accent);\n --color-nav-environment-text: var(--color-text-on-fill);\n /* The page's surface in both modes. The navigation bar under it is the menu turned a quarter,\n on `--color-nav-*`. */\n --color-logobar-bg: var(--color-bg-surface);\n --color-logobar-text: var(--color-text-primary);\n /* The ribbon in the emblem; only the logo re-points it in dark, never lintblauw elsewhere. */\n --color-logo-ribbon: var(--ribbon-blue);\n /* What marks an entry in that bar. They name the primitives, never `--color-nav-*`: the bar\n points those at these, and the two would refer to each other. */\n --color-navbar-hover: var(--primary-hover);\n --color-navbar-active: var(--primary-hover);\n --color-navbar-active-edge: var(--ink-white);\n --color-navbar-open-text: var(--color-accent-text);\n /* The start page's band is the primary's wash, so it never reads as the menu. The orange ring\n misses 3:1 on it; the ring takes the text colour. */\n --color-hero-bg: var(--primary-wash);\n --color-hero-text: var(--color-text-primary);\n --color-hero-focus: var(--color-text-primary);\n /* The site's foot stands on the menu's own fill, as on rijksoverheid.nl; in dark it follows the menu. */\n --color-footer-bg: var(--color-nav-bg);\n --color-footer-text: var(--color-nav-text);\n --color-footer-line: var(--color-nav-line);\n --color-footer-focus: var(--color-focus-on-theme);\n\n /* The box behind a recognised term: the primary's wash; dark re-points it. */\n --color-term-bg: var(--primary-wash);\n /* The chosen option of a row of options: the primary's wash; dark re-points it. */\n --color-choice-active-bg: var(--primary-wash);\n /* The 2 px line under a term; dark takes the text tint, as the line tint falls short on it. */\n --color-term-line: var(--color-accent-line);\n\n /* --- Data colors ------------------------------------------------------- */\n /* One colour per variable, named after the Rijkshuisstijl colour. */\n --color-chart-sky-blue: var(--data-sky-blue);\n --color-chart-dark-yellow: var(--data-dark-yellow);\n --color-chart-dark-yellow-text: var(--data-dark-yellow-text);\n --color-chart-red: var(--data-red);\n --color-chart-green: var(--data-green);\n --color-chart-mint-green: var(--data-mint-green);\n --color-chart-violet: var(--data-violet);\n --color-chart-orange: var(--data-orange);\n --color-chart-pink: var(--data-pink);\n --color-chart-dark-green: var(--data-dark-green);\n --color-chart-purple: var(--data-purple);\n --color-chart-ruby-red: var(--data-ruby-red);\n --color-chart-yellow: var(--data-yellow);\n --color-chart-dark-brown: var(--data-dark-brown);\n --color-chart-brown: var(--data-brown);\n --color-chart-dark-blue: var(--data-dark-blue);\n --color-chart-light-blue: var(--data-light-blue);\n --color-chart-moss-green: var(--data-moss-green);\n --color-chart-secondary: var(--data-comparison); /* comparison, context */\n --color-chart-other: var(--data-other); /* \"Overig\" */\n --color-chart-remainder: var(--neutral-3); /* the rest of a whole, e.g. a donut's open part */\n --color-chart-emphasis: var(--data-emphasis); /* trend, threshold, target */\n --color-chart-grid: var(--data-grid);\n --color-chart-axis: var(--neutral-5);\n /* The zero line (darker than the grid) and the hatch of missing data carry meaning, so they\n reach 3:1 on the surface: a fifth of the way from neutral-4 to neutral-5 (3.1:1; 4.0:1 dark). */\n --color-chart-zero: color-mix(in srgb, var(--neutral-5) 20%, var(--neutral-4));\n --color-chart-hatch: color-mix(in srgb, var(--neutral-5) 20%, var(--neutral-4));\n /* A speaker's colour under a whole fragment: this share of it over the surface, so text keeps\n its contrast in light and in dark. */\n --tint-speaker: 12%;\n\n /* These map colours stay deliberately neutral so the data is the only colour on the map. */\n --color-map-water: var(--neutral-0);\n --color-map-land: var(--neutral-2);\n --color-map-border: var(--neutral-4);\n /* An area with a figure: 3:1 against the land and the lightest class, which are 1.1:1 apart. */\n --color-map-border-data: var(--neutral-5);\n\n /* The variable a figure draws when its data names none: the first colour of the list, the\n same decision as `DEFAULT_SERIES_COLOR` in `charts/shared/colors.ts`. */\n --color-chart-default: var(--color-chart-sky-blue);\n\n /* Subdivision of one variable: its colour in its tint ladder, strongest first, on the steps\n 100 / 75 / 60 / 45 / 30. Every colour carries its ladder, so a figure that brings a colour\n brings its tints: a renderer names `--color-chart-<colour>` and\n `--color-chart-<colour>-tint-N`, never a --data-* colour. */\n --color-chart-sky-blue-tint-2: var(--data-sky-blue-75);\n --color-chart-sky-blue-tint-3: var(--data-sky-blue-60);\n --color-chart-sky-blue-tint-4: var(--data-sky-blue-45);\n --color-chart-sky-blue-tint-5: var(--data-sky-blue-30);\n\n --color-chart-dark-yellow-tint-2: var(--data-dark-yellow-75);\n --color-chart-dark-yellow-tint-3: var(--data-dark-yellow-60);\n --color-chart-dark-yellow-tint-4: var(--data-dark-yellow-45);\n --color-chart-dark-yellow-tint-5: var(--data-dark-yellow-30);\n\n --color-chart-red-tint-2: var(--data-red-75);\n --color-chart-red-tint-3: var(--data-red-60);\n --color-chart-red-tint-4: var(--data-red-45);\n --color-chart-red-tint-5: var(--data-red-30);\n\n --color-chart-green-tint-2: var(--data-green-75);\n --color-chart-green-tint-3: var(--data-green-60);\n --color-chart-green-tint-4: var(--data-green-45);\n --color-chart-green-tint-5: var(--data-green-30);\n\n --color-chart-mint-green-tint-2: var(--data-mint-green-75);\n --color-chart-mint-green-tint-3: var(--data-mint-green-60);\n --color-chart-mint-green-tint-4: var(--data-mint-green-45);\n --color-chart-mint-green-tint-5: var(--data-mint-green-30);\n\n --color-chart-violet-tint-2: var(--data-violet-75);\n --color-chart-violet-tint-3: var(--data-violet-60);\n --color-chart-violet-tint-4: var(--data-violet-45);\n --color-chart-violet-tint-5: var(--data-violet-30);\n\n --color-chart-orange-tint-2: var(--data-orange-75);\n --color-chart-orange-tint-3: var(--data-orange-60);\n --color-chart-orange-tint-4: var(--data-orange-45);\n --color-chart-orange-tint-5: var(--data-orange-30);\n\n --color-chart-pink-tint-2: var(--data-pink-75);\n --color-chart-pink-tint-3: var(--data-pink-60);\n --color-chart-pink-tint-4: var(--data-pink-45);\n --color-chart-pink-tint-5: var(--data-pink-30);\n\n --color-chart-dark-green-tint-2: var(--data-dark-green-75);\n --color-chart-dark-green-tint-3: var(--data-dark-green-60);\n --color-chart-dark-green-tint-4: var(--data-dark-green-45);\n --color-chart-dark-green-tint-5: var(--data-dark-green-30);\n\n --color-chart-purple-tint-2: var(--data-purple-75);\n --color-chart-purple-tint-3: var(--data-purple-60);\n --color-chart-purple-tint-4: var(--data-purple-45);\n --color-chart-purple-tint-5: var(--data-purple-30);\n\n --color-chart-ruby-red-tint-2: var(--data-ruby-red-75);\n --color-chart-ruby-red-tint-3: var(--data-ruby-red-60);\n --color-chart-ruby-red-tint-4: var(--data-ruby-red-45);\n --color-chart-ruby-red-tint-5: var(--data-ruby-red-30);\n\n --color-chart-yellow-tint-2: var(--data-yellow-75);\n --color-chart-yellow-tint-3: var(--data-yellow-60);\n --color-chart-yellow-tint-4: var(--data-yellow-45);\n --color-chart-yellow-tint-5: var(--data-yellow-30);\n\n --color-chart-dark-brown-tint-2: var(--data-dark-brown-75);\n --color-chart-dark-brown-tint-3: var(--data-dark-brown-60);\n --color-chart-dark-brown-tint-4: var(--data-dark-brown-45);\n --color-chart-dark-brown-tint-5: var(--data-dark-brown-30);\n\n --color-chart-brown-tint-2: var(--data-brown-75);\n --color-chart-brown-tint-3: var(--data-brown-60);\n --color-chart-brown-tint-4: var(--data-brown-45);\n --color-chart-brown-tint-5: var(--data-brown-30);\n\n --color-chart-dark-blue-tint-2: var(--data-dark-blue-75);\n --color-chart-dark-blue-tint-3: var(--data-dark-blue-60);\n --color-chart-dark-blue-tint-4: var(--data-dark-blue-45);\n --color-chart-dark-blue-tint-5: var(--data-dark-blue-30);\n\n --color-chart-light-blue-tint-2: var(--data-light-blue-75);\n --color-chart-light-blue-tint-3: var(--data-light-blue-60);\n --color-chart-light-blue-tint-4: var(--data-light-blue-45);\n --color-chart-light-blue-tint-5: var(--data-light-blue-30);\n\n --color-chart-moss-green-tint-2: var(--data-moss-green-75);\n --color-chart-moss-green-tint-3: var(--data-moss-green-60);\n --color-chart-moss-green-tint-4: var(--data-moss-green-45);\n --color-chart-moss-green-tint-5: var(--data-moss-green-30);\n\n /* The default ladder, for a figure that names no colour: the sky blue's. */\n --color-chart-tint-1: var(--color-chart-sky-blue);\n --color-chart-tint-2: var(--color-chart-sky-blue-tint-2);\n --color-chart-tint-3: var(--color-chart-sky-blue-tint-3);\n --color-chart-tint-4: var(--color-chart-sky-blue-tint-4);\n --color-chart-tint-5: var(--color-chart-sky-blue-tint-5);\n\n /* Sequential scale for ordinal classes (heatmap, choropleth), lightest first. A component names\n these, never a --data-* colour directly. */\n --color-chart-seq-1: var(--data-sky-blue-15);\n --color-chart-seq-2: var(--data-sky-blue-30);\n --color-chart-seq-3: var(--data-sky-blue-45);\n --color-chart-seq-4: var(--data-sky-blue-75);\n --color-chart-seq-5: var(--data-sky-blue);\n}\n\n/* ============================================================================\n Dark mode — the Logius range, no inversion\n\n Redefines the seven `--neutral-*` primitives, re-declares `--primary-hover` lighter and\n re-points the layer-2/3 names whose meaning changes; everything that merely follows a\n neutral is absent on purpose. Page and tiles are both #282828, the border separates them: the\n step below is the menu's, so it stays a band beside the page and under the logo bar.\n Screen only: paper is always light, whatever the reader chose.\n ========================================================================= */\n@media screen {\n [data-mode='dark'] {\n --neutral-0: #282828;\n --neutral-1: #1D1D1D;\n --neutral-2: #333333;\n --neutral-3: #4A4A4A;\n --neutral-4: #7A7A7A;\n --neutral-5: #B0B0B0;\n --neutral-6: #FFFFFF;\n\n /* The hover goes UP in dark: the light mix would put a near-black fill on the near-black page. */\n --primary-hover: color-mix(in srgb, var(--primary), white 12%);\n\n /* The order of light holds: menu under page under surface. The series has no step between\n the menu (neutral-1, L 0.231) and the surface (L 0.277), so the page is their midpoint\n (L 0.252); neutral-1 itself was too dark for the menu's step under it. */\n --color-bg-page: color-mix(in srgb, var(--neutral-0), var(--neutral-1));\n --color-bg-title: var(--color-bg-page);\n /* The hero's wash sits halfway between the menu and the page, under the page as in light:\n a panel or tab on it is lighter than its ground. */\n --primary-wash: oklch(from var(--primary) 0.241 min(c, 0.02) h);\n\n /* The filter zone must read as a band, so in dark it steps UP to neutral-2 (neutral-1 turned\n the fields in it into light boxes). `--color-bg-inset` is \"sunken\": neutral-1, under the\n page, as in light. */\n --color-bg-filter: var(--neutral-2);\n --color-bg-inset: var(--neutral-1);\n\n --color-text-inverse: var(--neutral-1);\n\n /* Colour that must read by itself on #282828 becomes the tint; a FILL keeps the primary. */\n --color-action-primary-border: var(--primary-tint);\n --color-action-secondary-border: var(--primary-tint);\n /* Danger hover: 8 % white is the most that keeps white text at 4.5:1 (4.56:1). The border and\n the word lift the red as the primary's tints do, to 3:1 on #282828 and 4.5:1 on #333333,\n the hover surface; the word's chroma cap keeps it inside sRGB. */\n --color-action-danger-hover: color-mix(in srgb, var(--status-error), white 8%);\n --color-action-danger-border: oklch(from var(--status-error) max(l, 0.58) c h);\n --color-action-danger-text: oklch(from var(--status-error) max(l, 0.71) min(c, 0.18) h);\n /* A status mark at 3:1 on its own tint. */\n --color-attention-line: var(--status-attention);\n --color-error-line: oklch(from var(--status-error) max(l, 0.6) c h);\n --color-info-line: oklch(from var(--status-info) max(l, 0.58) c h);\n --color-success-line: oklch(from var(--status-success) max(l, 0.57) c h);\n /* A status word at 4.5:1 on #333333, lifted as the danger word is. */\n --color-error-text: oklch(from var(--status-error) max(l, 0.71) min(c, 0.18) h);\n --color-success-text: oklch(from var(--status-success) max(l, 0.68) min(c, 0.18) h);\n /* A link is text: the text tint, not the line tint. The hover stays white. */\n --color-link: var(--primary-tint-text);\n --color-link-hover: var(--neutral-6);\n --color-link-on-status: var(--neutral-6);\n --color-accent-line: var(--primary-tint);\n --color-accent-text: var(--primary-tint-text);\n\n /* Lintblauw has too little contrast on the dark surface; the house style lightens it. */\n --color-logo-ribbon: var(--ribbon-blue-dark);\n\n /* The menu is neutral in dark: near-black, under the page, in the rail and in the bar alike,\n so it stays its own band beside the page and under the logo bar. Hover and active are one\n step up, as they are one fill in light; the edge is the text tint, as the line tint is\n 3:1 on neutral-0 only. */\n --color-nav-bg: var(--neutral-1);\n --color-nav-text: var(--neutral-6);\n --color-nav-text-sub: var(--neutral-5);\n --color-nav-hover: var(--neutral-2);\n --color-nav-active: var(--neutral-2);\n --color-nav-active-edge: var(--primary-tint-text);\n --color-navbar-hover: var(--neutral-2);\n --color-navbar-active: var(--neutral-2);\n --color-navbar-active-edge: var(--primary-tint-text);\n /* The open entry's word stands on the panel's surface: full text contrast, not the tint. */\n --color-navbar-open-text: var(--color-text-primary);\n /* The label is 16 px text: the tint is 3.0:1 and needs 4.5:1. The edge keeps the tint. */\n --color-nav-active-text: var(--neutral-6);\n /* The sheet is told from the page by its shadow and this quiet line; 1.66:1 is accepted here. */\n --color-border-popover: var(--neutral-3);\n --color-nav-line: var(--neutral-2);\n --color-nav-disabled: var(--neutral-4);\n /* The menu is neutral here, so its ring is the orange of every other surface. */\n --color-focus-on-theme: var(--color-focus);\n /* The choice edge keeps neutral-4 in dark: it already reaches 3:1 there (3.43:1 on #282828). */\n --color-border-choice: var(--neutral-4);\n\n /* A term's box is the subtle surface: behind a word on #282828 the dark wash would be a hole. */\n --color-term-bg: var(--neutral-2);\n --color-choice-active-bg: var(--neutral-2);\n --color-hero-focus: var(--color-focus);\n --color-term-line: var(--primary-tint-text);\n\n /* Yellow as text works on the dark surface, so the dark gold is not needed. */\n --color-chart-dark-yellow-text: var(--data-dark-yellow);\n --color-map-water: var(--neutral-1);\n\n --shadow-sticky: 0 2px 6px var(--alpha-black-40);\n --shadow-popover: 0 4px 16px var(--alpha-black-55);\n --shadow-nav: 2px 0 8px var(--alpha-black-40);\n --shadow-chart-hover: 0 1px 4px var(--alpha-black-60);\n --shadow-scroll-start: inset 12px 0 10px -10px var(--alpha-black-60);\n --shadow-scroll-end: inset -12px 0 10px -10px var(--alpha-black-60);\n --color-overlay-nav: var(--alpha-black-40);\n }\n}\n\n/* ============================================================================\n Below 768 px the gutter follows the page padding and every pointer target is the touch\n floor. Screen only: a portrait page is narrower than 768 px and keeps the desktop form.\n ========================================================================= */\n@media screen and (max-width: 767px) {\n :root {\n --grid-gutter: 16px;\n --h-target: var(--h-touch);\n --h-option: var(--h-touch);\n --chart-h-expanded: 320px;\n --w-ribbon: 2.5rem;\n }\n}\n\n/* ============================================================================\n Paper — white under the content, since Lintje prints its own fills\n (`print-color-adjust: exact` in base.css): a band in the page's grey would cost ink and\n say nothing.\n ========================================================================= */\n@media print {\n :root {\n /* The paper's margin is the page's edge: bars and content start at it, aligned. */\n --page-pad-x: 0px;\n --color-bg-page: var(--neutral-0);\n --color-bg-title: var(--neutral-0);\n --color-bg-filter: var(--neutral-0);\n }\n}\n\n/* The sheet's own margin, so the content never runs to the paper's edge: room for the browser's\n date, address and page number above and below, and a portrait sheet still wide enough for the\n tablet's form. A custom property does not reach `@page`, so the value stands here. */\n@page { margin: 15mm 12mm; }\n", Be = "/*\n * The reset every shadow root needs, adopted once as one shared `CSSStyleSheet`.\n *\n * `background` and `color` are deliberately not on `:host`: every element has a `:host`, so\n * they would cut the inheritance chain at each boundary (an icon in the navigation would lose\n * its white `currentColor`). Page-level rules (`html, body`) belong to the host page.\n */\n\n:host {\n font: var(--text-ui);\n font-family: var(--font-ui);\n -webkit-font-smoothing: antialiased;\n font-variant-numeric: tabular-nums;\n}\n\n*, *::before, *::after { box-sizing: border-box; }\n\nh1, h2, h3, h4, h5, h6, p, figure { margin: 0; }\nul, ol { margin: 0; padding: 0; list-style: none; }\n\nbutton {\n font: inherit;\n color: inherit;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n}\n\na { color: var(--color-link); }\n\ninput, select, textarea { font: inherit; color: inherit; }\n\n/* Focus: always orange 3 px, never animated. */\n:focus-visible {\n outline: var(--focus-width) solid var(--color-focus);\n outline-offset: var(--focus-offset);\n}\n/* Where the outside would be clipped (tiles in a grid, table rows) the ring sits inside. */\n.focus-inset:focus-visible { outline-offset: calc(var(--focus-width) * -1); }\n\n[hidden] { display: none !important; }\n\n.visually-hidden {\n position: absolute;\n width: 1px; height: 1px;\n padding: 0; margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes lintje-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n}\n@keyframes lintje-rise {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: none; }\n}\n@keyframes lintje-sheet-in {\n from { transform: translateY(100%); }\n to { transform: none; }\n}\n@keyframes lintje-menu-in {\n from { transform: translateY(-100%); }\n to { transform: none; }\n}\n@keyframes lintje-menu-out {\n from { transform: none; }\n to { transform: translateY(-100%); }\n}\n@keyframes lintje-fade-in { from { opacity: 0; } to { opacity: 1; } }\n/* A point, on a map or in a scatter plot, grows from its middle. */\n@keyframes lintje-point-grow { from { transform: scale(0); } }\n@keyframes lintje-drop-in { from { transform: translateY(-10px); } to { transform: none; } }\n@keyframes lintje-popover-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: none; }\n}\n\n/* prefers-reduced-motion: all durations 0 except opacity (80 ms). */\n@media (prefers-reduced-motion: reduce) {\n :host {\n --dur-base: 0ms; --dur-hover: 0ms; --dur-popover: 0ms; --dur-submenu: 0ms; --dur-toast: 0ms; --dur-scrim: 0ms; --dur-rail: 0ms; --dur-collapse: 0ms;\n --dur-modal: 0ms; --dur-sheet: 0ms; --dur-kpi: 0ms; --dur-badge: 0ms; --dur-draw: 0ms;\n }\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 80ms !important;\n scroll-behavior: auto !important;\n }\n}\n\n/* Forced colours: the browser replaces every colour and drops shadows; what every root shares\n is the focus ring, in the system's Highlight. */\n@media (forced-colors: active) {\n :focus-visible { outline-color: Highlight; }\n}\n\n/* Paper. A fill carries meaning (a legend swatch, a status cell, the current page), so it prints\n even with the browser's background graphics off; the surfaces under it are white in print.\n A drawing in progress would print half drawn, so every mark stands in its final state. */\n@media print {\n *, *::before, *::after {\n print-color-adjust: exact;\n animation: none !important;\n transition: none !important;\n }\n}\n";
525
525
  //#endregion
526
526
  //#region src/core/styles.ts
527
527
  function Ve(e) {
@@ -1487,7 +1487,7 @@ var yn = class extends j {
1487
1487
  M("lintje-badge", yn);
1488
1488
  //#endregion
1489
1489
  //#region src/components/actions/button/button.css?inline
1490
- var bn = "/*\n * Above the divider: what the element itself needs (`lintje-button` is the box the page lays\n * out). Below it: the block's own BEM CSS, in the shadow root.\n */\n:host {\n display: inline-flex;\n vertical-align: middle;\n}\n:host([hidden]) { display: none; }\n:host(.lintje-button--block),\n:host([block]) { display: flex; }\n:host([block]) .lintje-button { width: 100%; }\n:host([span]) .lintje-button { width: 100%; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-button {\n /* Never wider than its place: in a narrow cell the label is cut with an ellipsis. */\n max-width: 100%;\n min-width: 0;\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-2);\n height: var(--h-button);\n padding: 0 var(--space-4);\n border: 1px solid transparent;\n font-family: var(--font-ui);\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n cursor: pointer;\n border-radius: var(--radius);\n transition: background var(--dur-hover) var(--ease-in-motion),\n color var(--dur-hover) var(--ease-in-motion),\n border-color var(--dur-hover) var(--ease-in-motion);\n}\n.lintje-button__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lintje-button--compact { height: var(--h-button-compact); padding: 0 var(--space-3); }\n.lintje-button--chrome { height: var(--h-button-chrome); padding: 0 14px; }\n/* The compact and chrome button reach the 48 px target through a transparent hit area, 4 px out\n on each side. A row of them keeps 8 px between the boxes, so hit areas never overlap. */\n.lintje-button--compact::after,\n.lintje-button--chrome::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target)) / 2)) 0;\n}\n\n/* The 1 px border is transparent, so the primary fill fills it in light; in dark it draws the\n tint, the only thing that separates a #0E3B6E box from a #282828 page (1.31:1). */\n.lintje-button--primary {\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n border-color: var(--color-action-primary-border);\n}\n.lintje-button--primary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-action-primary-hover); }\n\n.lintje-button--secondary {\n background: var(--color-bg-surface);\n color: var(--color-accent-text);\n border-color: var(--color-action-secondary-border);\n}\n.lintje-button--secondary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-bg-selected); }\n\n.lintje-button--tertiary {\n background: transparent;\n color: var(--color-text-primary);\n border-color: var(--color-border-strong);\n}\n.lintje-button--tertiary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-bg-subtle); }\n\n/* The destructive weight; in dark the border is the red's tint, the only thing reaching 3:1. */\n.lintje-button--danger {\n background: var(--color-action-danger);\n color: var(--color-text-on-fill);\n border-color: var(--color-action-danger-border);\n}\n.lintje-button--danger:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-action-danger-hover); }\n\n/* `danger-secondary`: the quieter destructive form, for a row where the fill would shout. The\n colour is `--color-action-danger-text`. The hover is the tertiary's `--color-bg-subtle`:\n the red word on `--color-error-bg` was 3.96:1 in light. */\n.lintje-button--danger-secondary {\n background: var(--color-bg-surface);\n color: var(--color-action-danger-text);\n border-color: var(--color-action-danger-text);\n}\n.lintje-button--danger-secondary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-bg-subtle); }\n\n.lintje-button--link {\n height: auto;\n padding: 0;\n color: var(--color-link);\n text-decoration: underline;\n background: none;\n}\n.lintje-button--link:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { color: var(--color-link-hover); }\n/* The link reaches the text target (24 px) through a transparent hit area. */\n.lintje-button--link::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target-text)) / 2)) 0;\n}\n\n/* Disabled is `aria-disabled`: the button keeps its tab order and focus ring. A busy button is\n not `is-disabled`: it keeps its variant's colours. Native `<button>`s with these classes get\n the look from `:disabled` or `aria-disabled`, without the class. */\n.lintje-button.is-disabled,\n.lintje-button:disabled,\n.lintje-button[aria-disabled='true']:not(.is-busy) {\n opacity: 1;\n cursor: not-allowed;\n background: var(--color-bg-subtle);\n color: var(--color-text-disabled);\n border-color: var(--color-border-default);\n}\n.lintje-button--link.is-disabled,\n.lintje-button--link:disabled,\n.lintje-button--link[aria-disabled='true']:not(.is-busy) {\n background: none;\n border-color: transparent;\n text-decoration: none;\n}\n\n/* --- Busy --------------------------------------------------------------- */\n/*\n * An action that round-trips. The button keeps its width: label and icons only lose their ink,\n * and the ring is drawn over the middle, so nothing re-flows. The label is transparent, not\n * `visibility: hidden`, so the focused button keeps its name.\n */\n.lintje-button.is-busy { cursor: progress; }\n.lintje-button.is-busy .lintje-button__label { opacity: 0; }\n.lintje-button.is-busy .lintje-button__icon { visibility: hidden; }\n.lintje-button__busy {\n position: absolute;\n top: 50%; left: 50%;\n width: 16px; height: 16px;\n margin: -8px 0 0 -8px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: var(--radius-round);\n opacity: 0.85;\n animation: lintje-spin var(--dur-skeleton) linear infinite;\n}\n/* A keyframe only works in the root that uses it. */\n@keyframes lintje-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n/* Reduced motion: the ring stands still; `aria-busy` carries the state. */\n@media (prefers-reduced-motion: reduce) {\n .lintje-button__busy { animation: none; }\n}\n\n/* Forced colours: `aria-disabled` is not grayed out by the browser. */\n@media (forced-colors: active) {\n .lintje-button.is-disabled,\n .lintje-button:disabled,\n .lintje-button[aria-disabled='true']:not(.is-busy) { color: GrayText; border-color: GrayText; }\n}\n", xn = "/*\n * Adopted by a control that has nothing to say on paper: a button, a question box, a bar of\n * actions. What the reader chose stays in the elements that show it; what to press does not.\n * `!important`, so a page's own `display` on the tag does not bring it back.\n */\n@media print {\n :host { display: none !important; }\n}\n", Sn = "lintje-button-reason", Cn = class extends j {
1490
+ var bn = "/*\n * Above the divider: what the element itself needs (`lintje-button` is the box the page lays\n * out). Below it: the block's own BEM CSS, in the shadow root.\n */\n:host {\n display: inline-flex;\n vertical-align: middle;\n}\n:host([hidden]) { display: none; }\n:host(.lintje-button--block),\n:host([block]) { display: flex; }\n:host([block]) .lintje-button { width: 100%; }\n:host([span]) .lintje-button { width: 100%; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-button {\n /* Never wider than its place: in a narrow cell the label is cut with an ellipsis. */\n max-width: 100%;\n min-width: 0;\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-2);\n height: var(--h-button);\n padding: 0 var(--space-4);\n border: 1px solid transparent;\n font-family: var(--font-ui);\n font-size: 1rem;\n font-weight: 700;\n text-decoration: none;\n cursor: pointer;\n border-radius: var(--radius);\n transition: background var(--dur-hover) var(--ease-in-motion),\n color var(--dur-hover) var(--ease-in-motion),\n border-color var(--dur-hover) var(--ease-in-motion);\n}\n.lintje-button__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lintje-button--compact { height: var(--h-button-compact); padding: 0 var(--space-3); }\n.lintje-button--chrome { height: var(--h-button-chrome); padding: 0 14px; }\n/* The compact and chrome button reach the 48 px target through a transparent hit area, 4 px out\n on each side. A row of them keeps 8 px between the boxes, so hit areas never overlap. */\n.lintje-button--compact::after,\n.lintje-button--chrome::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target)) / 2)) 0;\n}\n\n/* The 1 px border is transparent, so the primary fill fills it in light; in dark it draws the\n tint, the only thing that separates a #0E3B6E box from a #282828 surface (1.31:1). */\n.lintje-button--primary {\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n border-color: var(--color-action-primary-border);\n}\n.lintje-button--primary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-action-primary-hover); }\n\n.lintje-button--secondary {\n background: var(--color-bg-surface);\n color: var(--color-accent-text);\n border-color: var(--color-action-secondary-border);\n}\n.lintje-button--secondary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-bg-selected); }\n\n.lintje-button--tertiary {\n background: transparent;\n color: var(--color-text-primary);\n border-color: var(--color-border-strong);\n}\n.lintje-button--tertiary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-bg-subtle); }\n\n/* The destructive weight; in dark the border is the red's tint, the only thing reaching 3:1. */\n.lintje-button--danger {\n background: var(--color-action-danger);\n color: var(--color-text-on-fill);\n border-color: var(--color-action-danger-border);\n}\n.lintje-button--danger:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-action-danger-hover); }\n\n/* `danger-secondary`: the quieter destructive form, for a row where the fill would shout. The\n colour is `--color-action-danger-text`. The hover is the tertiary's `--color-bg-subtle`:\n the red word on `--color-error-bg` was 3.96:1 in light. */\n.lintje-button--danger-secondary {\n background: var(--color-bg-surface);\n color: var(--color-action-danger-text);\n border-color: var(--color-action-danger-text);\n}\n.lintje-button--danger-secondary:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { background: var(--color-bg-subtle); }\n\n.lintje-button--link {\n height: auto;\n padding: 0;\n color: var(--color-link);\n text-decoration: underline;\n background: none;\n}\n.lintje-button--link:not(.is-disabled, .is-busy, :disabled, [aria-disabled='true']):hover { color: var(--color-link-hover); }\n/* The link reaches the text target (24 px) through a transparent hit area. */\n.lintje-button--link::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target-text)) / 2)) 0;\n}\n\n/* Disabled is `aria-disabled`: the button keeps its tab order and focus ring. A busy button is\n not `is-disabled`: it keeps its variant's colours. Native `<button>`s with these classes get\n the look from `:disabled` or `aria-disabled`, without the class. */\n.lintje-button.is-disabled,\n.lintje-button:disabled,\n.lintje-button[aria-disabled='true']:not(.is-busy) {\n opacity: 1;\n cursor: not-allowed;\n background: var(--color-bg-subtle);\n color: var(--color-text-disabled);\n border-color: var(--color-border-default);\n}\n.lintje-button--link.is-disabled,\n.lintje-button--link:disabled,\n.lintje-button--link[aria-disabled='true']:not(.is-busy) {\n background: none;\n border-color: transparent;\n text-decoration: none;\n}\n\n/* --- Busy --------------------------------------------------------------- */\n/*\n * An action that round-trips. The button keeps its width: label and icons only lose their ink,\n * and the ring is drawn over the middle, so nothing re-flows. The label is transparent, not\n * `visibility: hidden`, so the focused button keeps its name.\n */\n.lintje-button.is-busy { cursor: progress; }\n.lintje-button.is-busy .lintje-button__label { opacity: 0; }\n.lintje-button.is-busy .lintje-button__icon { visibility: hidden; }\n.lintje-button__busy {\n position: absolute;\n top: 50%; left: 50%;\n width: 16px; height: 16px;\n margin: -8px 0 0 -8px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: var(--radius-round);\n opacity: 0.85;\n animation: lintje-spin var(--dur-skeleton) linear infinite;\n}\n/* A keyframe only works in the root that uses it. */\n@keyframes lintje-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n/* Reduced motion: the ring stands still; `aria-busy` carries the state. */\n@media (prefers-reduced-motion: reduce) {\n .lintje-button__busy { animation: none; }\n}\n\n/* Forced colours: `aria-disabled` is not grayed out by the browser. */\n@media (forced-colors: active) {\n .lintje-button.is-disabled,\n .lintje-button:disabled,\n .lintje-button[aria-disabled='true']:not(.is-busy) { color: GrayText; border-color: GrayText; }\n}\n", xn = "/*\n * Adopted by a control that has nothing to say on paper: a button, a question box, a bar of\n * actions. What the reader chose stays in the elements that show it; what to press does not.\n * `!important`, so a page's own `display` on the tag does not bring it back.\n */\n@media print {\n :host { display: none !important; }\n}\n", Sn = "lintje-button-reason", Cn = class extends j {
1491
1491
  static {
1492
1492
  this.styles = [
1493
1493
  G,
@@ -2024,7 +2024,7 @@ var cr = A("/* `min-width: auto` is the default; tiles hold long words and wide
2024
2024
  willUpdate(e) {
2025
2025
  super.willUpdate(e), this.span ? this.style.setProperty("--lintje-span", String(this.span)) : this.style.removeProperty("--lintje-span");
2026
2026
  }
2027
- }, ur = "/* The block is the container, so the inner row can take its margin from the block's own width. */\n.lintje-announcement {\n container-type: inline-size;\n border-radius: var(--radius);\n}\n.lintje-announcement__inner {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-3);\n}\n\n.lintje-announcement__icon {\n width: 20px; height: 20px;\n flex: none;\n display: flex; align-items: center; justify-content: center;\n color: var(--color-text-primary);\n margin-top: 1px;\n}\n.lintje-announcement__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--space-1); }\n.lintje-announcement__content { min-width: 0; display: flex; flex-direction: column; gap: var(--space-1); }\n.lintje-announcement__title { font: var(--text-tile-title); color: var(--color-text-primary); }\n.lintje-announcement__text { font: var(--text-ui); line-height: 1.45; color: var(--color-text-primary); }\n.lintje-announcement__meta { font: var(--text-meta); color: var(--color-text-muted); }\n.lintje-announcement__link { color: var(--color-link-on-status); font-weight: 700; }\n/* The `action` slot keeps its own width: under the text, or beside it where the announcement is wide. */\n.lintje-announcement__action::slotted(*) { align-self: flex-start; }\n.lintje-announcement__media::slotted(*) { flex: none; max-width: 40%; height: auto; }\n/* Wide enough for the action beside the text, wide enough for the full margin. */\n@container (min-width: 560px) {\n .lintje-announcement__inner { padding: var(--space-4); }\n .lintje-announcement__body { flex-direction: row; align-items: center; gap: var(--space-4); }\n .lintje-announcement__content { flex: 1; }\n .lintje-announcement__action::slotted(*) { align-self: center; flex: none; }\n}\n\n/* The margin pulls the button's middle in line with the icon box; the hit area reaches the target. */\n.lintje-announcement__close {\n position: relative;\n width: var(--h-icon-button); height: var(--h-icon-button); flex: none;\n display: flex; align-items: center; justify-content: center;\n --lintje-close-pull: calc((var(--space-5) - var(--h-icon-button)) / 2);\n margin: var(--lintje-close-pull) var(--lintje-close-pull) var(--lintje-close-pull) 0;\n border: 0;\n background: transparent;\n color: var(--color-text-primary);\n cursor: pointer;\n}\n.lintje-announcement__close:hover { background: var(--color-bg-subtle); }\n.lintje-announcement__close::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target)) / 2));\n}\n\n.lintje-announcement--warning { background: var(--color-attention-bg); }\n.lintje-announcement--warning .lintje-announcement__icon { color: var(--color-attention-line); }\n.lintje-announcement--error { background: var(--color-error-bg); }\n.lintje-announcement--error .lintje-announcement__icon { color: var(--color-error-line); }\n.lintje-announcement--outage { background: var(--color-error-bg); }\n.lintje-announcement--outage .lintje-announcement__icon { color: var(--color-error-line); }\n.lintje-announcement--info { background: var(--color-info-bg); }\n.lintje-announcement--info .lintje-announcement__icon { color: var(--color-info-line); }\n.lintje-announcement--ok { background: var(--color-success-bg); }\n.lintje-announcement--ok .lintje-announcement__icon { color: var(--color-success-line); }\n\n@media screen and (max-width: 767px) {\n .lintje-announcement__inner { padding: var(--space-3); }\n .lintje-announcement__text { font: var(--text-small); }\n}\n\n/* Forced colours drop the fill, so the announcement takes an outline. */\n@media (forced-colors: active) {\n .lintje-announcement { outline: 1px solid CanvasText; outline-offset: -1px; }\n}\n\n@media print {\n .lintje-announcement { break-inside: avoid; }\n}\n", dr = {
2027
+ }, ur = "/* The block is the container, so the inner row can take its margin from the block's own width. */\n.lintje-announcement {\n container-type: inline-size;\n border-radius: var(--radius);\n}\n.lintje-announcement__inner {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-3);\n}\n\n.lintje-announcement__icon {\n width: 20px; height: 20px;\n flex: none;\n display: flex; align-items: center; justify-content: center;\n color: var(--color-text-primary);\n margin-top: 1px;\n}\n.lintje-announcement__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--space-1); }\n.lintje-announcement__lead { min-width: 0; display: flex; align-items: flex-start; gap: var(--space-2); }\n.lintje-announcement__content { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--space-1); }\n.lintje-announcement__title { font: var(--text-tile-title); color: var(--color-text-primary); }\n.lintje-announcement__text { font: var(--text-ui); line-height: 1.45; color: var(--color-text-primary); }\n.lintje-announcement__meta { font: var(--text-small); color: var(--color-text-muted); }\n.lintje-announcement__link { color: var(--color-link-on-status); font-weight: 700; }\n/* The `action` slot keeps its own width: under the text, or beside it where the announcement is wide. */\n.lintje-announcement__action::slotted(*) { align-self: flex-start; margin-left: calc(var(--space-5) + var(--space-2)); }\n.lintje-announcement__media::slotted(*) { flex: none; max-width: 40%; height: auto; }\n/* Wide enough for the action beside the text, wide enough for the full margin. */\n@container (min-width: 560px) {\n .lintje-announcement__inner { padding: var(--space-4); }\n .lintje-announcement__body { flex-direction: row; align-items: center; gap: var(--space-4); }\n .lintje-announcement__lead { flex: 1; }\n .lintje-announcement__action::slotted(*) { align-self: center; flex: none; margin-left: 0; }\n}\n\n/* The margin pulls the button's middle in line with the icon box; the hit area reaches the target. */\n.lintje-announcement__close {\n position: relative;\n width: var(--h-icon-button); height: var(--h-icon-button); flex: none;\n display: flex; align-items: center; justify-content: center;\n --lintje-close-pull: calc((var(--space-5) - var(--h-icon-button)) / 2);\n margin: var(--lintje-close-pull) var(--lintje-close-pull) var(--lintje-close-pull) 0;\n border: 0;\n background: transparent;\n color: var(--color-text-primary);\n cursor: pointer;\n}\n.lintje-announcement__close:hover { background: var(--color-bg-subtle); }\n.lintje-announcement__close::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target)) / 2));\n}\n\n.lintje-announcement--warning { background: var(--color-attention-bg); }\n.lintje-announcement--warning .lintje-announcement__icon { color: var(--color-attention-line); }\n.lintje-announcement--error { background: var(--color-error-bg); }\n.lintje-announcement--error .lintje-announcement__icon { color: var(--color-error-line); }\n.lintje-announcement--outage { background: var(--color-error-bg); }\n.lintje-announcement--outage .lintje-announcement__icon { color: var(--color-error-line); }\n.lintje-announcement--info { background: var(--color-info-bg); }\n.lintje-announcement--info .lintje-announcement__icon { color: var(--color-info-line); }\n.lintje-announcement--ok { background: var(--color-success-bg); }\n.lintje-announcement--ok .lintje-announcement__icon { color: var(--color-success-line); }\n\n@media screen and (max-width: 767px) {\n .lintje-announcement__inner { padding: var(--space-3); }\n .lintje-announcement__text { font: var(--text-small); }\n}\n\n/* Forced colours drop the fill, so the announcement takes an outline. */\n@media (forced-colors: active) {\n .lintje-announcement { outline: 1px solid CanvasText; outline-offset: -1px; }\n}\n\n@media print {\n .lintje-announcement { break-inside: avoid; }\n}\n", dr = {
2028
2028
  warning: "attention",
2029
2029
  outage: "error",
2030
2030
  error: "error",
@@ -2053,7 +2053,7 @@ function hr(e) {
2053
2053
  role=${n ? fr[t] : T}
2054
2054
  >
2055
2055
  <div class="lintje-announcement__inner">
2056
- ${gr(t)} ${r ? T : _r(t, e)}
2056
+ ${r ? C`<div class="lintje-announcement__body"><div class="lintje-announcement__lead">${gr(t)}</div></div>` : _r(t, e)}
2057
2057
  </div>
2058
2058
  </div>`;
2059
2059
  }
@@ -2066,6 +2066,8 @@ function gr(e) {
2066
2066
  function _r(e, t) {
2067
2067
  let { title: n, text: r, meta: i, link: a } = t, o = C`<span class="visually-hidden">${pr[e]}: </span>`;
2068
2068
  return C`<div class="lintje-announcement__body">
2069
+ <div class="lintje-announcement__lead">
2070
+ ${gr(e)}
2069
2071
  <div class="lintje-announcement__content">
2070
2072
  ${n ? C`<p class="lintje-announcement__title">${o}${n}</p>` : T}
2071
2073
  ${r ? C`<p class="lintje-announcement__text">${n ? T : o}${r}</p>` : T}
@@ -2073,6 +2075,7 @@ function _r(e, t) {
2073
2075
  ${i ?? T}${i && a ? " · " : T}${a ? C`<a class="lintje-announcement__link" href=${a.href}>${a.label}</a>` : T}
2074
2076
  </p>` : T}
2075
2077
  </div>
2078
+ </div>
2076
2079
  ${t.action ?? T}
2077
2080
  </div>
2078
2081
  ${t.media ?? T}
@@ -2264,7 +2267,7 @@ function Ar(e) {
2264
2267
  }
2265
2268
  //#endregion
2266
2269
  //#region src/components/layout/tile/tile.css?inline
2267
- var jr = "/*\n * Above the divider: the host, the grid item the tile fills by its height or, when the host has\n * only a floor, by `min-height: inherit`. Below it: the block's BEM CSS.\n */\n:host {\n display: block;\n min-width: 0;\n}\n:host([hidden]) { display: none; }\n.lintje-tile {\n height: 100%;\n min-height: inherit;\n}\n/* On paper a tile stays on one sheet where it fits, unless it is `breakable`. */\n@media print { :host(:not([breakable])) { break-inside: avoid; } }\n.lintje-chart-state {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n justify-content: center;\n align-items: center;\n min-width: 0;\n}\n.lintje-chart-state--empty { text-align: center; gap: var(--space-3); }\n.lintje-chart-state--empty .lintje-empty-state--compact { text-align: center; font: var(--text-small); }\n/* An announcement measures as a container, so it has no width of its own to centre by. */\n.lintje-chart-state--error { justify-content: flex-start; align-items: stretch; gap: var(--space-4); }\n.lintje-chart-state__last-known { font: var(--text-small); color: var(--color-text-muted); text-align: center; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-tile {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n background: var(--color-bg-surface);\n border: 1px solid var(--color-border-default);\n border-radius: var(--radius);\n padding: var(--tile-pad-y) var(--tile-pad-x);\n}\n\n.lintje-tile__head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: var(--space-4);\n}\n.lintje-tile__heading { min-width: 0; }\n/* With an icon the heading becomes two columns, which centres the icon on the title's line and\n keeps the subtitle under the title text. */\n.lintje-tile__heading--icon {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n}\n/* Only the placement is the tile's; the alignment is `.lintje-leading-icon`. */\n.lintje-tile__icon { grid-row: 1; }\n.lintje-tile__heading--icon .lintje-tile__title,\n.lintje-tile__heading--icon .lintje-tile__sub { grid-column: 2; }\n.lintje-tile__title { font: var(--text-tile-title); color: var(--color-text-primary); }\n.lintje-tile__sub { font: var(--text-tile-sub); color: var(--color-text-muted); margin-top: 2px; }\n/* The actions are 40 px icon buttons beside a title of one line: they stand out above and below\n it, so the head is the title's height and a tile without a subtitle keeps no empty band. */\n.lintje-tile__actions {\n display: flex; gap: var(--space-2); flex: none;\n margin-block: calc(var(--space-2) * -1);\n}\n/* Expand and download appear only while the tile is hovered or holds keyboard focus; without\n hover they stay visible. The tile only hides the action; how the visible action looks is the\n icon button's own. */\n.lintje-tile:not(:hover):not(:focus-within) lintje-icon-button[variant='tile'] { opacity: 0; }\n@media (hover: none) {\n .lintje-tile:not(:hover):not(:focus-within) lintje-icon-button[variant='tile'] { opacity: 1; }\n}\n\n.lintje-tile__intro { font: var(--text-small); color: var(--color-text-secondary); }\n\n/* Body and content are flex columns, so slotted content can place itself in a taller tile. */\n.lintje-tile__body { flex: 1; min-height: 0; min-width: 0; display: flex; flex-direction: column; }\n.lintje-tile__content { flex: 1; min-height: 0; display: flex; flex-direction: column; }\n/* A tile with a height of its own scrolls what does not fit (`content-scroll`). */\n:host([content-scroll]) .lintje-tile__content { overflow: auto; }\n.lintje-tile__body--aside { flex-direction: row; gap: var(--space-5); align-items: stretch; }\n.lintje-tile__body--aside .lintje-tile__content { flex: 1; min-width: 0; }\n.lintje-tile__aside { flex: none; display: flex; flex-direction: column; justify-content: center; }\n/* On a phone the content keeps its full width and the key figure leads above it. */\n@media screen and (max-width: 767px) {\n .lintje-tile__body--aside { flex-direction: column; }\n}\n\n.lintje-tile__footnote {\n font: var(--text-meta);\n color: var(--color-text-muted);\n border-top: 1px solid var(--color-border-default);\n padding-top: var(--space-2);\n margin-top: auto;\n}\n\n/* Flush: the rows' lines reach the frame, and what they draw keeps the heading's indent through\n --lintje-inset, as does a pager under them. The last row's line is the footnote's rule. */\n.lintje-tile--flush .lintje-tile__body {\n margin-inline: calc(var(--tile-pad-x) * -1);\n --lintje-inset: var(--tile-pad-x);\n}\n.lintje-tile--flush .lintje-tile__footnote { border-top: 0; padding-top: 0; }\n/* Without a footnote the last row's line is the frame's: no empty strip under it. A pager under\n the rows gives the strip back through --lintje-inset-end. */\n.lintje-tile--flush:has(> .lintje-tile__footnote[hidden]) > .lintje-tile__body {\n margin-bottom: calc(var(--tile-pad-y) * -1 - 1px);\n --lintje-inset-end: calc(var(--tile-pad-y) + 1px);\n}\n\n/* Enlarging and downloading are for the screen. A tile split over two sheets is a block:\n Chromium sizes a flex column that breaks too short, and what follows overlaps its rows. */\n@media print {\n .lintje-tile__actions { display: none; }\n :host([breakable]) .lintje-tile { display: block; }\n :host([breakable]) .lintje-tile > :not(:first-child) { margin-top: 14px; }\n}\n", Mr = "Gegevens laden…", Nr = class e extends lr {
2270
+ var jr = "/*\n * Above the divider: the host, the grid item the tile fills by its height or, when the host has\n * only a floor, by `min-height: inherit`. Below it: the block's BEM CSS.\n */\n:host {\n display: block;\n min-width: 0;\n}\n:host([hidden]) { display: none; }\n.lintje-tile {\n height: 100%;\n min-height: inherit;\n}\n/* On paper a tile stays on one sheet where it fits, unless it is `breakable`. */\n@media print { :host(:not([breakable])) { break-inside: avoid; } }\n.lintje-chart-state {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n justify-content: center;\n align-items: center;\n min-width: 0;\n}\n.lintje-chart-state--empty { text-align: center; gap: var(--space-3); }\n.lintje-chart-state--empty .lintje-empty-state--compact { text-align: center; font: var(--text-small); }\n/* An announcement measures as a container, so it has no width of its own to centre by. */\n.lintje-chart-state--error { justify-content: flex-start; align-items: stretch; gap: var(--space-4); }\n.lintje-chart-state__last-known { font: var(--text-small); color: var(--color-text-muted); text-align: center; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-tile {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n background: var(--color-bg-surface);\n border: 1px solid var(--color-border-default);\n border-radius: var(--radius);\n padding: var(--tile-pad-y) var(--tile-pad-x);\n}\n\n.lintje-tile__head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: var(--space-4);\n}\n.lintje-tile__heading { min-width: 0; }\n/* With an icon the heading becomes two columns, which centres the icon on the title's line and\n keeps the subtitle under the title text. */\n.lintje-tile__heading--icon {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n}\n/* Only the placement is the tile's; the alignment is `.lintje-leading-icon`. */\n.lintje-tile__icon { grid-row: 1; }\n.lintje-tile__heading--icon .lintje-tile__title,\n.lintje-tile__heading--icon .lintje-tile__sub { grid-column: 2; }\n.lintje-tile__title { font: var(--text-tile-title); color: var(--color-text-primary); }\n.lintje-tile__sub { font: var(--text-small); color: var(--color-text-muted); margin-top: 2px; }\n/* The actions are 40 px icon buttons beside a title of one line: they stand out above and below\n it, so the head is the title's height and a tile without a subtitle keeps no empty band. */\n.lintje-tile__actions {\n display: flex; gap: var(--space-2); flex: none;\n margin-block: calc(var(--space-2) * -1);\n}\n/* Expand and download appear only while the tile is hovered or holds keyboard focus; without\n hover they stay visible. The tile only hides the action; how the visible action looks is the\n icon button's own. */\n.lintje-tile:not(:hover):not(:focus-within) lintje-icon-button[variant='tile'] { opacity: 0; }\n@media (hover: none) {\n .lintje-tile:not(:hover):not(:focus-within) lintje-icon-button[variant='tile'] { opacity: 1; }\n}\n\n.lintje-tile__intro { font: var(--text-small); color: var(--color-text-secondary); }\n\n/* Body and content are flex columns, so slotted content can place itself in a taller tile. */\n.lintje-tile__body { flex: 1; min-height: 0; min-width: 0; display: flex; flex-direction: column; }\n.lintje-tile__content { flex: 1; min-height: 0; display: flex; flex-direction: column; }\n/* A tile with a height of its own scrolls what does not fit (`content-scroll`). */\n:host([content-scroll]) .lintje-tile__content { overflow: auto; }\n.lintje-tile__body--aside { flex-direction: row; gap: var(--space-5); align-items: stretch; }\n.lintje-tile__body--aside .lintje-tile__content { flex: 1; min-width: 0; }\n.lintje-tile__aside { flex: none; display: flex; flex-direction: column; justify-content: center; }\n/* On a phone the content keeps its full width and the key figure leads above it. */\n@media screen and (max-width: 767px) {\n .lintje-tile__body--aside { flex-direction: column; }\n}\n\n.lintje-tile__footnote {\n font: var(--text-small);\n color: var(--color-text-muted);\n border-top: 1px solid var(--color-border-default);\n padding-top: var(--space-2);\n margin-top: auto;\n}\n\n/* Flush: the rows' lines reach the frame, and what they draw keeps the heading's indent through\n --lintje-inset, as does a pager under them. The last row's line is the footnote's rule. */\n.lintje-tile--flush .lintje-tile__body {\n margin-inline: calc(var(--tile-pad-x) * -1);\n --lintje-inset: var(--tile-pad-x);\n}\n.lintje-tile--flush .lintje-tile__footnote { border-top: 0; padding-top: 0; }\n/* Without a footnote the last row's line is the frame's: no empty strip under it. A pager under\n the rows gives the strip back through --lintje-inset-end. */\n.lintje-tile--flush:has(> .lintje-tile__footnote[hidden]) > .lintje-tile__body {\n margin-bottom: calc(var(--tile-pad-y) * -1 - 1px);\n --lintje-inset-end: calc(var(--tile-pad-y) + 1px);\n}\n\n/* Enlarging and downloading are for the screen. A tile split over two sheets is a block:\n Chromium sizes a flex column that breaks too short, and what follows overlaps its rows. */\n@media print {\n .lintje-tile__actions { display: none; }\n :host([breakable]) .lintje-tile { display: block; }\n :host([breakable]) .lintje-tile > :not(:first-child) { margin-top: 14px; }\n}\n", Mr = "Gegevens laden…", Nr = class e extends lr {
2268
2271
  constructor(...e) {
2269
2272
  super(...e), this.footnoteSlotted = !1, this.asideSlotted = !1, this.legendBelow = !1, this.expandable = !1, this.download = !1, this.state = "ready", this.contentHeight = "var(--chart-h-main)", this.contentScroll = !1, this.flush = !1, this.breakable = !1, this.filled = null, this.#e = 0;
2270
2273
  }
@@ -2424,7 +2427,7 @@ var jr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2424
2427
  ${B({ minHeight: e })}
2425
2428
  >
2426
2429
  ${hr({
2427
- kind: "warning",
2430
+ kind: "error",
2428
2431
  text: this.message,
2429
2432
  live: !0,
2430
2433
  filled: this.filled === this.regionText
@@ -2556,87 +2559,12 @@ function Jr() {
2556
2559
  return typeof matchMedia < "u" && matchMedia("(prefers-reduced-motion: reduce)").matches;
2557
2560
  }
2558
2561
  //#endregion
2559
- //#region src/components/feedback/progress-bar/progress-bar.css?inline
2560
- var Yr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-progress { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }\n.lintje-progress__head {\n display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;\n gap: var(--space-1) var(--space-4);\n font: var(--text-small);\n}\n.lintje-progress__label { font-weight: 700; color: var(--color-text-primary); }\n.lintje-progress__detail { color: var(--color-text-muted); }\n.lintje-progress__mark { margin-right: var(--space-1); vertical-align: -0.125em; }\n.lintje-progress--done .lintje-progress__mark { color: var(--color-success-line); }\n.lintje-progress--error .lintje-progress__mark { color: var(--color-error-line); }\n.lintje-progress--paused .lintje-progress__mark { color: var(--color-text-muted); }\n\n/* The accent LINE, not the fill colour, keeps 3:1 on the dark surface. */\n.lintje-progress__track { height: 6px; background: var(--color-border-default); overflow: hidden; }\n.lintje-progress__fill {\n height: 100%;\n background: var(--color-accent-line);\n transition: width var(--dur-base) var(--ease-in-motion);\n}\n\n.lintje-progress--done .lintje-progress__fill { background: var(--color-success); }\n.lintje-progress--error .lintje-progress__fill { background: var(--color-error); }\n.lintje-progress--error .lintje-progress__label { color: var(--color-error-text); }\n.lintje-progress--paused .lintje-progress__fill { background: var(--color-text-muted); }\n\n.lintje-progress__track.is-indeterminate .lintje-progress__fill {\n width: 30%;\n animation: lintje-progress-slide var(--dur-skeleton) linear infinite alternate;\n}\n@keyframes lintje-progress-slide {\n from { margin-left: 0; }\n to { margin-left: 70%; }\n}\n@media (prefers-reduced-motion: reduce) {\n .lintje-progress__fill { transition: none; }\n .lintje-progress__track.is-indeterminate .lintje-progress__fill { animation: none; margin-left: 35%; }\n}\n\n/* Forced colours: the browser drops fills, so the track keeps a CanvasText edge and the fill\n draws as Highlight. */\n@media (forced-colors: active) {\n .lintje-progress__track { outline: 1px solid CanvasText; outline-offset: -1px; }\n .lintje-progress__fill { forced-color-adjust: none; background: Highlight; }\n}\n", Xr = class extends j {
2561
- constructor(...e) {
2562
- super(...e), this.label = "", this.hideLabel = !1, this.state = "busy";
2563
- }
2564
- static {
2565
- this.styles = [G, A(Yr)];
2566
- }
2567
- static {
2568
- this.properties = {
2569
- value: { type: Number },
2570
- label: { type: String },
2571
- hideLabel: {
2572
- type: Boolean,
2573
- attribute: "hide-label"
2574
- },
2575
- detail: { type: String },
2576
- state: {
2577
- type: String,
2578
- reflect: !0
2579
- }
2580
- };
2581
- }
2582
- get known() {
2583
- return typeof this.value == "number" && !Number.isNaN(this.value);
2584
- }
2585
- get percent() {
2586
- return Math.max(0, Math.min(100, this.value ?? 0));
2587
- }
2588
- get resolvedState() {
2589
- return this.state === "busy" && this.known && this.percent >= 100 ? "done" : this.state;
2590
- }
2591
- valueText(e) {
2592
- return [this.detail ?? (e && this.known ? `${this.percent}%` : void 0), e?.word].filter(Boolean).join(", ") || void 0;
2593
- }
2594
- render() {
2595
- let e = this.resolvedState, t = e === "busy" ? void 0 : {
2596
- word: Nn[e].toLowerCase(),
2597
- icon: e === "paused" ? "multimedia-player-pauze" : An[Mn[e]]
2598
- }, n = !this.hideLabel && (this.label || this.detail);
2599
- return C`<div class=${q({
2600
- "lintje-progress": !0,
2601
- [`lintje-progress--${e}`]: !0
2602
- })}>
2603
- ${n ? C`<div class="lintje-progress__head">
2604
- <span class="lintje-progress__label"
2605
- >${t ? K(t.icon, {
2606
- size: 16,
2607
- className: "lintje-progress__mark"
2608
- }) : T}${this.label}</span
2609
- >
2610
- <span class="lintje-progress__detail">${this.detail ?? T}<slot></slot></span>
2611
- </div>` : T}
2612
- <div
2613
- class=${q({
2614
- "lintje-progress__track": !0,
2615
- "is-indeterminate": !this.known
2616
- })}
2617
- role="progressbar"
2618
- aria-label=${this.label}
2619
- aria-valuemin="0"
2620
- aria-valuemax="100"
2621
- aria-valuenow=${this.known ? this.percent : T}
2622
- aria-valuetext=${this.valueText(t) ?? T}
2623
- >
2624
- <div
2625
- class="lintje-progress__fill"
2626
- ${B({ width: this.known ? `${this.percent}%` : null })}
2627
- ></div>
2628
- </div>
2629
- </div>`;
2630
- }
2631
- };
2632
- M("lintje-progress-bar", Xr);
2633
- //#endregion
2634
2562
  //#region node_modules/lit-html/directives/repeat.js
2635
- var Zr = (e, t, n) => {
2563
+ var Yr = (e, t, n) => {
2636
2564
  let r = /* @__PURE__ */ new Map();
2637
2565
  for (let i = t; i <= n; i++) r.set(e[i], i);
2638
2566
  return r;
2639
- }, Qr = R(class extends z {
2567
+ }, Xr = R(class extends z {
2640
2568
  constructor(e) {
2641
2569
  if (super(e), e.type !== L.CHILD) throw Error("repeat() can only be used in text expressions");
2642
2570
  }
@@ -2663,7 +2591,7 @@ var Zr = (e, t, n) => {
2663
2591
  else if (s[f] === o[m]) c[m] = Y(i[f], a[m]), f--, m--;
2664
2592
  else if (s[d] === o[m]) c[m] = Y(i[d], a[m]), J(e, c[m + 1], i[d]), d++, m--;
2665
2593
  else if (s[f] === o[p]) c[p] = Y(i[f], a[p]), J(e, i[d], i[f]), f--, p++;
2666
- else if (l === void 0 && (l = Zr(o, p, m), u = Zr(s, d, f)), l.has(s[d])) {
2594
+ else if (l === void 0 && (l = Yr(o, p, m), u = Yr(s, d, f)), l.has(s[d])) {
2667
2595
  if (l.has(s[f])) {
2668
2596
  let t = u.get(o[p]), n = t === void 0 ? null : i[t];
2669
2597
  if (n === null) {
@@ -2692,35 +2620,110 @@ function Z(e, t = 0) {
2692
2620
  maximumFractionDigits: t
2693
2621
  });
2694
2622
  }
2695
- function $r(e) {
2623
+ function Zr(e) {
2696
2624
  return Math.abs(e) >= 1e6 ? `${Z(e / 1e6, 1)} mln` : Math.abs(e) >= 1e4 ? `${Math.round(e / 1e3)}k` : Z(e);
2697
2625
  }
2698
- function ei(e, t) {
2626
+ function Qr(e, t) {
2699
2627
  let n = Z(e);
2700
- return ni(n, t) ? n : $r(e);
2628
+ return ei(n, t) ? n : Zr(e);
2701
2629
  }
2702
- var ti = 6.5;
2703
- function ni(e, t) {
2704
- return e.length * ti <= t;
2630
+ var $r = 6.5;
2631
+ function ei(e, t) {
2632
+ return e.length * $r <= t;
2705
2633
  }
2706
- var ri = "'RijksSans', 'Source Sans 3', sans-serif", Q;
2707
- function ii(e, t, n = "") {
2708
- if (ai(e, n) <= t) return e;
2634
+ var ti = "'RijksSans', 'Source Sans 3', sans-serif", Q;
2635
+ function ni(e, t, n = "") {
2636
+ if (ri(e, n) <= t) return e;
2709
2637
  let r = e.length;
2710
2638
  for (; r > 1;) {
2711
2639
  --r;
2712
2640
  let i = `${e.slice(0, r).trimEnd()}…`;
2713
- if (ai(i, n) <= t) return i;
2641
+ if (ri(i, n) <= t) return i;
2714
2642
  }
2715
2643
  return "…";
2716
2644
  }
2717
- function ai(e, t = "", n = 400) {
2718
- return Q === void 0 && (Q = typeof document > "u" ? null : document.createElement("canvas").getContext("2d") ?? null), Q ? (Q.font = `${n} 12px ${t.trim() || ri}`, Q.measureText(e).width) : e.length * ti;
2645
+ function ri(e, t = "", n = 400) {
2646
+ return Q === void 0 && (Q = typeof document > "u" ? null : document.createElement("canvas").getContext("2d") ?? null), Q ? (Q.font = `${n} 12px ${t.trim() || ti}`, Q.measureText(e).width) : e.length * $r;
2719
2647
  }
2720
- function oi(e, t = 0) {
2648
+ function ii(e, t = 0) {
2721
2649
  return `${Z(e, t)}%`;
2722
2650
  }
2723
2651
  //#endregion
2652
+ //#region src/components/feedback/progress-bar/progress-bar.css?inline
2653
+ var ai = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-progress { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }\n.lintje-progress__head {\n display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;\n gap: var(--space-1) var(--space-4);\n font: var(--text-small);\n}\n.lintje-progress__label { font-weight: 700; color: var(--color-text-primary); }\n.lintje-progress__detail { color: var(--color-text-muted); }\n.lintje-progress__mark { margin-right: var(--space-1); vertical-align: -0.125em; }\n.lintje-progress--done .lintje-progress__mark { color: var(--color-success-line); }\n.lintje-progress--error .lintje-progress__mark { color: var(--color-error-line); }\n.lintje-progress--paused .lintje-progress__mark { color: var(--color-text-muted); }\n\n/* The accent LINE, not the fill colour, keeps 3:1 on the dark surface. */\n.lintje-progress__track { height: 6px; background: var(--color-border-default); overflow: hidden; }\n.lintje-progress__fill {\n height: 100%;\n background: var(--color-accent-line);\n transition: width var(--dur-base) var(--ease-in-motion);\n}\n\n.lintje-progress--done .lintje-progress__fill { background: var(--color-success); }\n.lintje-progress--error .lintje-progress__fill { background: var(--color-error); }\n.lintje-progress--error .lintje-progress__label { color: var(--color-error-text); }\n.lintje-progress--paused .lintje-progress__fill { background: var(--color-text-muted); }\n\n.lintje-progress__track.is-indeterminate .lintje-progress__fill {\n width: 30%;\n animation: lintje-progress-slide var(--dur-skeleton) linear infinite alternate;\n}\n@keyframes lintje-progress-slide {\n from { margin-left: 0; }\n to { margin-left: 70%; }\n}\n@media (prefers-reduced-motion: reduce) {\n .lintje-progress__fill { transition: none; }\n .lintje-progress__track.is-indeterminate .lintje-progress__fill { animation: none; margin-left: 35%; }\n}\n\n/* Forced colours: the browser drops fills, so the track keeps a CanvasText edge and the fill\n draws as Highlight. */\n@media (forced-colors: active) {\n .lintje-progress__track { outline: 1px solid CanvasText; outline-offset: -1px; }\n .lintje-progress__fill { forced-color-adjust: none; background: Highlight; }\n}\n", oi = class extends j {
2654
+ constructor(...e) {
2655
+ super(...e), this.label = "", this.hideLabel = !1, this.state = "busy";
2656
+ }
2657
+ static {
2658
+ this.styles = [G, A(ai)];
2659
+ }
2660
+ static {
2661
+ this.properties = {
2662
+ value: { type: Number },
2663
+ label: { type: String },
2664
+ hideLabel: {
2665
+ type: Boolean,
2666
+ attribute: "hide-label"
2667
+ },
2668
+ detail: { type: String },
2669
+ state: {
2670
+ type: String,
2671
+ reflect: !0
2672
+ }
2673
+ };
2674
+ }
2675
+ get known() {
2676
+ return typeof this.value == "number" && !Number.isNaN(this.value);
2677
+ }
2678
+ get percent() {
2679
+ return Math.max(0, Math.min(100, this.value ?? 0));
2680
+ }
2681
+ get resolvedState() {
2682
+ return this.state === "busy" && this.known && this.percent >= 100 ? "done" : this.state;
2683
+ }
2684
+ valueText(e) {
2685
+ return [this.detail ?? (e && this.known ? `${this.percent}%` : void 0), e?.word].filter(Boolean).join(", ") || void 0;
2686
+ }
2687
+ render() {
2688
+ let e = this.resolvedState, t = e === "busy" ? void 0 : {
2689
+ word: Nn[e].toLowerCase(),
2690
+ icon: e === "paused" ? "multimedia-player-pauze" : An[Mn[e]]
2691
+ }, n = !this.hideLabel && (this.label || this.detail);
2692
+ return C`<div class=${q({
2693
+ "lintje-progress": !0,
2694
+ [`lintje-progress--${e}`]: !0
2695
+ })}>
2696
+ ${n ? C`<div class="lintje-progress__head">
2697
+ <span class="lintje-progress__label"
2698
+ >${t ? K(t.icon, {
2699
+ size: 16,
2700
+ className: "lintje-progress__mark"
2701
+ }) : T}${this.label}</span
2702
+ >
2703
+ <span class="lintje-progress__detail">${this.detail ?? T}<slot></slot></span>
2704
+ </div>` : T}
2705
+ <div
2706
+ class=${q({
2707
+ "lintje-progress__track": !0,
2708
+ "is-indeterminate": !this.known
2709
+ })}
2710
+ role="progressbar"
2711
+ aria-label=${this.label}
2712
+ aria-valuemin="0"
2713
+ aria-valuemax="100"
2714
+ aria-valuenow=${this.known ? this.percent : T}
2715
+ aria-valuetext=${this.valueText(t) ?? T}
2716
+ >
2717
+ <div
2718
+ class="lintje-progress__fill"
2719
+ ${B({ width: this.known ? `${this.percent}%` : null })}
2720
+ ></div>
2721
+ </div>
2722
+ </div>`;
2723
+ }
2724
+ };
2725
+ M("lintje-progress-bar", oi);
2726
+ //#endregion
2724
2727
  //#region node_modules/lit-html/directives/live.js
2725
2728
  var si = R(class extends z {
2726
2729
  constructor(e) {
@@ -2859,4 +2862,4 @@ function Ei(e) {
2859
2862
  return `var(--color-chart-${e})`;
2860
2863
  }
2861
2864
  //#endregion
2862
- export { Dn as $, Ue as $t, Cr as A, Nt as At, nr as B, ht as Bt, Fr as C, R as Ct, Er as D, Pt as Dt, kr as E, Ft as Et, cr as F, _t as Ft, qn as G, et as Gt, Zn as H, lt as Ht, or as I, dt as It, An as J, j as Jt, Un as K, it as Kt, ar as L, ft as Lt, mr as M, Ct as Mt, hr as N, Mt as Nt, Tr as O, St as Ot, lr as P, gt as Pt, kn as Q, Ve as Qt, ir as R, mt as Rt, Ir as S, Lt as St, Dr as T, L as Tt, Xn as U, st as Ut, $n as V, ct as Vt, Gn as W, ot as Wt, Mn as X, We as Xt, Nn as Y, M as Yt, wn as Z, A as Zt, Kr as _, an as _t, Ci as a, e as an, _n as at, Wr as b, B as bt, ni as c, pn as ct, Z as d, mn as dt, T as en, On as et, oi as f, nn as ft, Xr as g, rn as gt, Qr as h, tn as ht, yi as i, o as in, yn as it, br as j, jt, wr as k, kt, $r as l, G as lt, ii as m, cn as mt, Ei as n, C as nn, xn as nt, hi as o, vn as ot, ai as p, en as pt, Hn as q, tt as qt, Ti as r, Ce as rn, bn as rt, si as s, q as st, wi as t, Ie as tn, Cn as tt, ei as u, K as ut, qr as v, sn as vt, Nr as w, z as wt, Gr as x, zt as xt, Jr as y, $t as yt, tr as z, pt as zt };
2865
+ export { Dn as $, Ue as $t, Cr as A, Nt as At, nr as B, ht as Bt, Fr as C, R as Ct, Er as D, Pt as Dt, kr as E, Ft as Et, cr as F, _t as Ft, qn as G, et as Gt, Zn as H, lt as Ht, or as I, dt as It, An as J, j as Jt, Un as K, it as Kt, ar as L, ft as Lt, mr as M, Ct as Mt, hr as N, Mt as Nt, Tr as O, St as Ot, lr as P, gt as Pt, kn as Q, Ve as Qt, ir as R, mt as Rt, Ir as S, Lt as St, Dr as T, L as Tt, Xn as U, st as Ut, $n as V, ct as Vt, Gn as W, ot as Wt, Mn as X, We as Xt, Nn as Y, M as Yt, wn as Z, A as Zt, Kr as _, an as _t, Ci as a, e as an, _n as at, Wr as b, B as bt, oi as c, pn as ct, Qr as d, mn as dt, T as en, On as et, Z as f, nn as ft, Xr as g, rn as gt, ni as h, tn as ht, yi as i, o as in, yn as it, br as j, jt, wr as k, kt, ei as l, G as lt, ri as m, cn as mt, Ei as n, C as nn, xn as nt, hi as o, vn as ot, ii as p, en as pt, Hn as q, tt as qt, Ti as r, Ce as rn, bn as rt, si as s, q as st, wi as t, Ie as tn, Cn as tt, Zr as u, K as ut, qr as v, sn as vt, Nr as w, z as wt, Gr as x, zt as xt, Jr as y, $t as yt, tr as z, pt as zt };