lintje 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +2 -2
  2. package/dist-elements/actions.js +1 -1
  3. package/dist-elements/chunks/{base-Bg-IFOPG.js → base-CbmWxUig.js} +444 -272
  4. package/dist-elements/chunks/{controls-B1455oPG.js → controls-DxmnDSBr.js} +6 -0
  5. package/dist-elements/chunks/dialog-DChINFxD.js +28 -0
  6. package/dist-elements/chunks/{disclosure-BXTX04gM.js → disclosure-D39vAR5q.js} +1 -1
  7. package/dist-elements/chunks/{disclosure-CMXhX-Vb.js → disclosure-DLkXPUpV.js} +6 -6
  8. package/dist-elements/chunks/download-Ct9q2anY.js +206 -0
  9. package/dist-elements/chunks/{focus-trap-9BnE-xWv.js → focus-trap-BwOxE5BX.js} +1 -1
  10. package/dist-elements/chunks/input-CRW_exv_.js +195 -0
  11. package/dist-elements/chunks/{player-DXOZEyEy.js → player-B8QXJ0Z5.js} +26 -26
  12. package/dist-elements/chunks/{sentence-BI3lwEuT.js → sentence-B19AyZBS.js} +3 -3
  13. package/dist-elements/chunks/{stagger-qGD3wmhg.js → stagger-BHoOgy0g.js} +81 -75
  14. package/dist-elements/core.js +1 -1
  15. package/dist-elements/custom-elements.json +980 -670
  16. package/dist-elements/data-types.json +6798 -0
  17. package/dist-elements/feedback.js +2 -1
  18. package/dist-elements/frame.js +0 -2
  19. package/dist-elements/guides/dashboard.md +8 -0
  20. package/dist-elements/guides/events.md +4 -5
  21. package/dist-elements/guides/loading.md +8 -7
  22. package/dist-elements/guides/page-contents.md +110 -0
  23. package/dist-elements/guides/start.md +12 -0
  24. package/dist-elements/inputs.js +2 -1
  25. package/dist-elements/layout.js +1 -1
  26. package/dist-elements/lintje.js +6975 -6120
  27. package/dist-elements/overlays.js +2 -2
  28. package/dist-elements/skills/lintje/SKILL.md +1 -1
  29. package/dist-elements/tables.js +1 -1
  30. package/dist-elements/tag/activity-log.js +15 -15
  31. package/dist-elements/tag/ai-label.js +10 -10
  32. package/dist-elements/tag/announcement.js +36 -76
  33. package/dist-elements/tag/app-search.js +49 -49
  34. package/dist-elements/tag/audio-player.js +57 -57
  35. package/dist-elements/tag/badge.js +1 -1
  36. package/dist-elements/tag/breadcrumbs.js +15 -15
  37. package/dist-elements/tag/button.js +1 -1
  38. package/dist-elements/tag/card-list.js +12 -12
  39. package/dist-elements/tag/card.js +39 -44
  40. package/dist-elements/tag/chart.js +1050 -795
  41. package/dist-elements/tag/chat-answer.js +49 -49
  42. package/dist-elements/tag/chat-composer.js +75 -71
  43. package/dist-elements/tag/chat-message.js +8 -8
  44. package/dist-elements/tag/chat-strip.js +22 -22
  45. package/dist-elements/tag/chat-suggestions.js +12 -12
  46. package/dist-elements/tag/chat.js +56 -56
  47. package/dist-elements/tag/checkbox-group.d.ts +1 -0
  48. package/dist-elements/tag/checkbox-group.js +59 -0
  49. package/dist-elements/tag/checkbox.js +8 -8
  50. package/dist-elements/tag/code.js +9 -9
  51. package/dist-elements/tag/combobox.js +18 -18
  52. package/dist-elements/tag/conflict-alert.js +12 -12
  53. package/dist-elements/tag/copy-button.js +14 -14
  54. package/dist-elements/tag/data-table.js +878 -530
  55. package/dist-elements/tag/date-input.js +30 -30
  56. package/dist-elements/tag/date-range.js +37 -37
  57. package/dist-elements/tag/description-list.js +29 -32
  58. package/dist-elements/tag/dialog.d.ts +1 -0
  59. package/dist-elements/tag/dialog.js +144 -0
  60. package/dist-elements/tag/document-viewer.js +23 -23
  61. package/dist-elements/tag/drawer.js +28 -32
  62. package/dist-elements/tag/empty-state.js +19 -30
  63. package/dist-elements/tag/error-page.d.ts +1 -0
  64. package/dist-elements/tag/error-page.js +109 -0
  65. package/dist-elements/tag/error-summary.js +10 -10
  66. package/dist-elements/tag/expander.js +8 -8
  67. package/dist-elements/tag/explainer.js +11 -11
  68. package/dist-elements/tag/field.js +5 -5
  69. package/dist-elements/tag/file-upload.js +34 -34
  70. package/dist-elements/tag/filter-bar.js +56 -56
  71. package/dist-elements/tag/filter-sheet.js +11 -11
  72. package/dist-elements/tag/filter-zone.js +31 -31
  73. package/dist-elements/tag/footer.js +21 -21
  74. package/dist-elements/tag/form-actions.js +29 -25
  75. package/dist-elements/tag/form-section.js +6 -6
  76. package/dist-elements/tag/form.js +12 -12
  77. package/dist-elements/tag/gallery.js +14 -14
  78. package/dist-elements/tag/grid-item.js +1 -1
  79. package/dist-elements/tag/grid.js +1 -1
  80. package/dist-elements/tag/hero.js +12 -12
  81. package/dist-elements/tag/highlight.js +5 -5
  82. package/dist-elements/tag/icon-button.js +1 -1
  83. package/dist-elements/tag/icon.js +1 -1
  84. package/dist-elements/tag/job-list.js +22 -44
  85. package/dist-elements/tag/kpi-row.js +12 -10
  86. package/dist-elements/tag/kpi.js +146 -137
  87. package/dist-elements/tag/level-meter.js +11 -11
  88. package/dist-elements/tag/list.js +55 -55
  89. package/dist-elements/tag/logo.js +30 -30
  90. package/dist-elements/tag/map.js +690 -665
  91. package/dist-elements/tag/menu-button.js +70 -69
  92. package/dist-elements/tag/modal.js +28 -37
  93. package/dist-elements/tag/multiselect.js +34 -34
  94. package/dist-elements/tag/note.js +5 -5
  95. package/dist-elements/tag/notifications.js +36 -36
  96. package/dist-elements/tag/number-input.js +12 -12
  97. package/dist-elements/tag/page-header.js +140 -37
  98. package/dist-elements/tag/pagination.js +53 -48
  99. package/dist-elements/tag/popover.js +1 -1
  100. package/dist-elements/tag/progress-bar.js +1 -1
  101. package/dist-elements/tag/prose.js +6 -6
  102. package/dist-elements/tag/qr-code.js +7 -7
  103. package/dist-elements/tag/radio-group.js +12 -12
  104. package/dist-elements/tag/range.js +22 -22
  105. package/dist-elements/tag/recording-status.js +14 -14
  106. package/dist-elements/tag/repeater.js +10 -10
  107. package/dist-elements/tag/segmented.js +13 -13
  108. package/dist-elements/tag/select.js +10 -10
  109. package/dist-elements/tag/shell.js +356 -339
  110. package/dist-elements/tag/skeleton.js +1 -1
  111. package/dist-elements/tag/slot-picker.js +14 -14
  112. package/dist-elements/tag/sortable-list.js +14 -14
  113. package/dist-elements/tag/spinner.js +1 -1
  114. package/dist-elements/tag/split-pane.js +12 -12
  115. package/dist-elements/tag/status-dot.js +1 -1
  116. package/dist-elements/tag/stepper.js +21 -21
  117. package/dist-elements/tag/streaming-text.js +13 -13
  118. package/dist-elements/tag/sub-nav.js +39 -38
  119. package/dist-elements/tag/tabs.js +38 -38
  120. package/dist-elements/tag/tag-input.js +19 -19
  121. package/dist-elements/tag/text-editor.js +24 -24
  122. package/dist-elements/tag/text-input.js +14 -14
  123. package/dist-elements/tag/textarea.js +14 -14
  124. package/dist-elements/tag/tile.js +1 -1
  125. package/dist-elements/tag/time-input.js +19 -19
  126. package/dist-elements/tag/toast.js +32 -23
  127. package/dist-elements/tag/toggle.js +8 -8
  128. package/dist-elements/tag/toggletip.js +27 -27
  129. package/dist-elements/tag/tooltip.js +1 -1
  130. package/dist-elements/tag/transcript.js +48 -48
  131. package/dist-elements/tag/translator.js +13 -13
  132. package/dist-elements/tag/tree-view.js +13 -13
  133. package/dist-elements/tag/user-menu.js +37 -37
  134. package/dist-elements/tag/video-player.js +21 -21
  135. package/dist-elements/tokens.css +120 -96
  136. package/dist-elements/types/bundle/feedback.d.ts +1 -0
  137. package/dist-elements/types/bundle/frame.d.ts +0 -2
  138. package/dist-elements/types/bundle/inputs.d.ts +1 -0
  139. package/dist-elements/types/bundle/overlays.d.ts +1 -1
  140. package/dist-elements/types/components/actions/copy-button/copy-button.d.ts +6 -7
  141. package/dist-elements/types/components/actions/menu-button/menu-button.d.ts +13 -15
  142. package/dist-elements/types/components/actions/qr-code/qr-code.d.ts +9 -9
  143. package/dist-elements/types/components/charts/chart/chart.d.ts +5 -4
  144. package/dist-elements/types/components/charts/kpi/kpi.d.ts +16 -8
  145. package/dist-elements/types/components/charts/kpi-row/kpi-row.d.ts +1 -7
  146. package/dist-elements/types/components/charts/note/note.d.ts +1 -1
  147. package/dist-elements/types/components/chat/chat/chat.d.ts +8 -10
  148. package/dist-elements/types/components/chat/chat-answer/chat-answer.d.ts +7 -8
  149. package/dist-elements/types/components/chat/chat-composer/chat-composer.d.ts +8 -10
  150. package/dist-elements/types/components/chat/chat-message/chat-message.d.ts +6 -7
  151. package/dist-elements/types/components/chat/chat-strip/chat-strip.d.ts +5 -5
  152. package/dist-elements/types/components/chat/chat-suggestions/chat-suggestions.d.ts +9 -10
  153. package/dist-elements/types/components/content/audio-player/audio-player.d.ts +10 -12
  154. package/dist-elements/types/components/content/code/code.d.ts +2 -3
  155. package/dist-elements/types/components/content/document-viewer/document-viewer.d.ts +8 -9
  156. package/dist-elements/types/components/content/gallery/gallery.d.ts +5 -4
  157. package/dist-elements/types/components/content/highlight/highlight.d.ts +4 -3
  158. package/dist-elements/types/components/content/prose/prose.d.ts +2 -3
  159. package/dist-elements/types/components/content/transcript/transcript.d.ts +12 -25
  160. package/dist-elements/types/components/content/translator/translator.d.ts +11 -15
  161. package/dist-elements/types/components/content/video-player/video-player.d.ts +11 -13
  162. package/dist-elements/types/components/feedback/ai-label/ai-label.d.ts +3 -4
  163. package/dist-elements/types/components/feedback/announcement/announcement.d.ts +3 -7
  164. package/dist-elements/types/components/feedback/conflict-alert/conflict-alert.d.ts +3 -4
  165. package/dist-elements/types/components/feedback/empty-state/empty-state.d.ts +5 -8
  166. package/dist-elements/types/components/feedback/error-page/error-page.d.ts +52 -0
  167. package/dist-elements/types/components/feedback/job-list/job-list.d.ts +9 -12
  168. package/dist-elements/types/components/feedback/level-meter/level-meter.d.ts +4 -6
  169. package/dist-elements/types/components/feedback/recording-status/recording-status.d.ts +5 -6
  170. package/dist-elements/types/components/feedback/streaming-text/streaming-text.d.ts +10 -7
  171. package/dist-elements/types/components/feedback/toast/toast.d.ts +8 -9
  172. package/dist-elements/types/components/filters/filter-bar/filter-bar.d.ts +9 -4
  173. package/dist-elements/types/components/filters/filter-sheet/filter-sheet.d.ts +5 -5
  174. package/dist-elements/types/components/filters/filter-zone/filter-zone.d.ts +4 -4
  175. package/dist-elements/types/components/forms/error-summary/error-summary.d.ts +5 -6
  176. package/dist-elements/types/components/forms/form/form.d.ts +5 -5
  177. package/dist-elements/types/components/forms/form-actions/form-actions.d.ts +9 -7
  178. package/dist-elements/types/components/forms/form-section/form-section.d.ts +6 -5
  179. package/dist-elements/types/components/forms/repeater/repeater.d.ts +13 -7
  180. package/dist-elements/types/components/forms/stepper/stepper.d.ts +5 -4
  181. package/dist-elements/types/components/frame/app-search/app-search.d.ts +6 -7
  182. package/dist-elements/types/components/frame/breadcrumbs/breadcrumbs.d.ts +2 -2
  183. package/dist-elements/types/components/frame/footer/footer.d.ts +3 -2
  184. package/dist-elements/types/components/frame/hero/hero.d.ts +7 -9
  185. package/dist-elements/types/components/frame/notifications/notifications.d.ts +5 -9
  186. package/dist-elements/types/components/frame/page-header/page-header.d.ts +12 -15
  187. package/dist-elements/types/components/frame/shell/shell.d.ts +14 -13
  188. package/dist-elements/types/components/frame/sub-nav/sub-nav.d.ts +10 -6
  189. package/dist-elements/types/components/frame/user-menu/user-menu.d.ts +11 -10
  190. package/dist-elements/types/components/index.d.ts +8 -9
  191. package/dist-elements/types/components/inputs/checkbox/checkbox.d.ts +4 -4
  192. package/dist-elements/types/components/inputs/checkbox-group/checkbox-group.d.ts +33 -0
  193. package/dist-elements/types/components/inputs/combobox/combobox.d.ts +12 -6
  194. package/dist-elements/types/components/inputs/date-input/date-input.d.ts +5 -5
  195. package/dist-elements/types/components/inputs/date-range/date-range.d.ts +11 -6
  196. package/dist-elements/types/components/inputs/field/field.d.ts +5 -3
  197. package/dist-elements/types/components/inputs/file-upload/file-upload.d.ts +6 -8
  198. package/dist-elements/types/components/inputs/multiselect/multiselect.d.ts +4 -6
  199. package/dist-elements/types/components/inputs/number-input/number-input.d.ts +8 -7
  200. package/dist-elements/types/components/inputs/radio-group/radio-group.d.ts +2 -4
  201. package/dist-elements/types/components/inputs/range/range.d.ts +5 -6
  202. package/dist-elements/types/components/inputs/segmented/segmented.d.ts +7 -4
  203. package/dist-elements/types/components/inputs/select/select.d.ts +6 -3
  204. package/dist-elements/types/components/inputs/slot-picker/slot-picker.d.ts +6 -5
  205. package/dist-elements/types/components/inputs/tag-input/tag-input.d.ts +7 -5
  206. package/dist-elements/types/components/inputs/text-editor/text-editor.d.ts +6 -6
  207. package/dist-elements/types/components/inputs/text-input/text-input.d.ts +11 -6
  208. package/dist-elements/types/components/inputs/textarea/textarea.d.ts +12 -11
  209. package/dist-elements/types/components/inputs/time-input/time-input.d.ts +7 -8
  210. package/dist-elements/types/components/inputs/toggle/toggle.d.ts +3 -1
  211. package/dist-elements/types/components/layout/expander/expander.d.ts +9 -10
  212. package/dist-elements/types/components/layout/split-pane/split-pane.d.ts +6 -6
  213. package/dist-elements/types/components/layout/tabs/tabs.d.ts +11 -9
  214. package/dist-elements/types/components/map/map/map.d.ts +10 -9
  215. package/dist-elements/types/components/overlays/dialog/dialog.d.ts +49 -0
  216. package/dist-elements/types/components/overlays/drawer/drawer.d.ts +6 -5
  217. package/dist-elements/types/components/overlays/modal/modal.d.ts +7 -12
  218. package/dist-elements/types/components/overlays/toggletip/toggletip.d.ts +3 -7
  219. package/dist-elements/types/components/shared/charts/index.d.ts +4 -1
  220. package/dist-elements/types/components/shared/charts/kinds.d.ts +86 -0
  221. package/dist-elements/types/components/shared/charts/line-chart/line-chart.d.ts +2 -2
  222. package/dist-elements/types/components/shared/charts/map-chart/leaflet.d.ts +5 -0
  223. package/dist-elements/types/components/shared/charts/shared/chart-states.d.ts +8 -19
  224. package/dist-elements/types/components/shared/charts/shared/controller.d.ts +7 -0
  225. package/dist-elements/types/components/shared/charts/shared/types.d.ts +29 -0
  226. package/dist-elements/types/components/shared/charts/stacked-area-chart/stacked-area-chart.d.ts +13 -0
  227. package/dist-elements/types/components/shared/dialog.d.ts +9 -0
  228. package/dist-elements/types/components/shared/overflow.d.ts +58 -0
  229. package/dist-elements/types/components/tables/activity-log/activity-log.d.ts +2 -3
  230. package/dist-elements/types/components/tables/card/card.d.ts +14 -20
  231. package/dist-elements/types/components/tables/card-list/card-list.d.ts +9 -11
  232. package/dist-elements/types/components/tables/data-table/data-table.d.ts +85 -16
  233. package/dist-elements/types/components/tables/data-table/filters.d.ts +13 -4
  234. package/dist-elements/types/components/tables/description-list/description-list.d.ts +12 -11
  235. package/dist-elements/types/components/tables/list/list.d.ts +9 -20
  236. package/dist-elements/types/components/tables/pagination/pagination.d.ts +12 -11
  237. package/dist-elements/types/components/tables/sortable-list/sortable-list.d.ts +5 -6
  238. package/dist-elements/types/components/tables/tree-view/tree-view.d.ts +4 -4
  239. package/dist-elements/types/core/media.d.ts +2 -2
  240. package/dist-elements/types/core/motion.d.ts +5 -0
  241. package/dist-elements/types/core/print.d.ts +15 -0
  242. package/dist-elements/types/core/shortcuts.d.ts +2 -2
  243. package/dist-elements/types/icons/icon/icon.d.ts +2 -3
  244. package/dist-elements/types/icons/register.d.ts +1 -1
  245. package/dist-elements/types/primitives/badge/badge.d.ts +9 -5
  246. package/dist-elements/types/primitives/button/button.d.ts +12 -9
  247. package/dist-elements/types/primitives/grid/grid.d.ts +3 -3
  248. package/dist-elements/types/primitives/grid-item/grid-item.d.ts +1 -1
  249. package/dist-elements/types/primitives/icon-button/icon-button.d.ts +7 -5
  250. package/dist-elements/types/primitives/index.d.ts +3 -1
  251. package/dist-elements/types/primitives/popover/popover.d.ts +5 -4
  252. package/dist-elements/types/primitives/progress-bar/progress-bar.d.ts +8 -6
  253. package/dist-elements/types/primitives/shared/announcement-block.d.ts +38 -0
  254. package/dist-elements/types/primitives/shared/empty-state-block.d.ts +26 -0
  255. package/dist-elements/types/primitives/shared/tone.d.ts +18 -0
  256. package/dist-elements/types/primitives/skeleton/skeleton.d.ts +1 -1
  257. package/dist-elements/types/primitives/spinner/spinner.d.ts +1 -2
  258. package/dist-elements/types/primitives/status-dot/status-dot.d.ts +4 -5
  259. package/dist-elements/types/primitives/tile/tile.d.ts +17 -5
  260. package/dist-elements/types/primitives/tooltip/tooltip.d.ts +6 -6
  261. package/dist-elements/types/types.d.ts +70 -10
  262. package/dist-icons/functioneel-kolommen.svg +1 -0
  263. package/dist-icons/functioneel-trechter.svg +1 -0
  264. package/package.json +1 -1
  265. package/dist-elements/chunks/confirm-dialog-D5EVGuil.js +0 -4
  266. package/dist-elements/chunks/download-y528pIHP.js +0 -230
  267. package/dist-elements/chunks/input-BtuNFSWk.js +0 -195
  268. package/dist-elements/tag/confirm-dialog.d.ts +0 -1
  269. package/dist-elements/tag/confirm-dialog.js +0 -118
  270. package/dist-elements/tag/session-expiry.d.ts +0 -1
  271. package/dist-elements/tag/session-expiry.js +0 -184
  272. package/dist-elements/tag/shortcuts.d.ts +0 -1
  273. package/dist-elements/tag/shortcuts.js +0 -104
  274. package/dist-elements/types/components/frame/session-expiry/session-expiry.d.ts +0 -55
  275. package/dist-elements/types/components/frame/shortcuts/shortcuts.d.ts +0 -41
  276. package/dist-elements/types/components/overlays/confirm-dialog/confirm-dialog.d.ts +0 -41
@@ -1,5 +1,5 @@
1
1
  //#region src/core/version.ts
2
- var e = "0.2.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.3.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 {
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-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 ========================================================================= */\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 Below 768 px the gutter follows the page padding and every pointer target is the touch\n floor.\n ========================================================================= */\n@media (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", 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";
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";
525
525
  //#endregion
526
526
  //#region src/core/styles.ts
527
527
  function Ve(e) {
@@ -629,7 +629,7 @@ function M(e, t) {
629
629
  }
630
630
  //#endregion
631
631
  //#region src/core/media.ts
632
- var et = "(max-width: 767px)", tt = "(min-width: 1440px)", nt = /* @__PURE__ */ new Map();
632
+ var et = "screen and (max-width: 767px)", tt = "(min-width: 1440px)", nt = /* @__PURE__ */ new Map();
633
633
  function rt(e) {
634
634
  if (typeof matchMedia > "u") return null;
635
635
  let t = nt.get(e);
@@ -766,11 +766,8 @@ function Ct(e) {
766
766
  e ? localStorage.removeItem(xt) : localStorage.setItem(xt, "off");
767
767
  } catch {}
768
768
  }
769
- function wt(e) {
770
- return Tt(Dt(e));
771
- }
772
- var Tt = (e) => !e.ctrl && !e.alt && !e.meta && e.key.length === 1, Et = (e) => /^[a-z]$/i.test(e);
773
- function Dt(e) {
769
+ var wt = (e) => !e.ctrl && !e.alt && !e.meta && e.key.length === 1, Tt = (e) => /^[a-z]$/i.test(e);
770
+ function Et(e) {
774
771
  let t = e === "+" ? ["+"] : e.split("+").filter((e) => e !== "");
775
772
  e.endsWith("++") && t.push("+");
776
773
  let n = {
@@ -790,7 +787,7 @@ function Dt(e) {
790
787
  n.key = a ?? (e.length === 1 ? e.toLowerCase() : e);
791
788
  }), n;
792
789
  }
793
- function Ot(e) {
790
+ function Dt(e) {
794
791
  return [
795
792
  e.ctrl ? "Ctrl" : "",
796
793
  e.alt ? "Alt" : "",
@@ -799,10 +796,10 @@ function Ot(e) {
799
796
  e.key
800
797
  ].filter(Boolean).join("+");
801
798
  }
802
- function kt(e, t) {
803
- return t.ctrlKey !== e.ctrl || t.altKey !== e.alt || t.metaKey !== e.meta || (t.key.length === 1 ? t.key.toLowerCase() : t.key) !== e.key ? !1 : e.key.length === 1 && !Et(e.key) || t.shiftKey === e.shift;
799
+ function Ot(e, t) {
800
+ return t.ctrlKey !== e.ctrl || t.altKey !== e.alt || t.metaKey !== e.meta || (t.key.length === 1 ? t.key.toLowerCase() : t.key) !== e.key ? !1 : e.key.length === 1 && !Tt(e.key) || t.shiftKey === e.shift;
804
801
  }
805
- function At(e) {
802
+ function kt(e) {
806
803
  let t = e.composedPath()[0];
807
804
  return t instanceof HTMLElement ? t.isContentEditable || t.getAttribute("contenteditable") === "true" || t instanceof HTMLTextAreaElement || t instanceof HTMLSelectElement ? !0 : t instanceof HTMLInputElement && ![
808
805
  "button",
@@ -815,28 +812,28 @@ function At(e) {
815
812
  "file"
816
813
  ].includes(t.type) : !1;
817
814
  }
818
- var jt = (e) => {
815
+ var At = (e) => {
819
816
  if (!(e.defaultPrevented || e.isComposing)) for (let t = F.length - 1; t >= 0; t--) {
820
817
  let { chord: n, options: r } = F[t];
821
- if (kt(n, e) && (!Tt(n) || St())) {
822
- if (At(e) && (!(n.ctrl || n.alt || n.meta) || !r.inFields)) return;
818
+ if (Ot(n, e) && (!wt(n) || St())) {
819
+ if (kt(e) && (!(n.ctrl || n.alt || n.meta) || !r.inFields)) return;
823
820
  e.preventDefault(), r.handler(e);
824
821
  return;
825
822
  }
826
823
  }
827
824
  };
828
- function Mt(e) {
829
- let t = Dt(e.keys), n = {
825
+ function jt(e) {
826
+ let t = Et(e.keys), n = {
830
827
  options: e,
831
828
  chord: t,
832
- normalized: Ot(t)
829
+ normalized: Dt(t)
833
830
  };
834
- return F.push(n), !bt && typeof document < "u" && (document.addEventListener("keydown", jt), bt = !0), () => {
831
+ return F.push(n), !bt && typeof document < "u" && (document.addEventListener("keydown", At), bt = !0), () => {
835
832
  let e = F.indexOf(n);
836
- e !== -1 && F.splice(e, 1), !F.length && bt && (document.removeEventListener("keydown", jt), bt = !1);
833
+ e !== -1 && F.splice(e, 1), !F.length && bt && (document.removeEventListener("keydown", At), bt = !1);
837
834
  };
838
835
  }
839
- function Nt() {
836
+ function Mt() {
840
837
  let e = /* @__PURE__ */ new Set(), t = [];
841
838
  for (let n = F.length - 1; n >= 0; n--) {
842
839
  let { options: r, normalized: i } = F[n];
@@ -848,12 +845,12 @@ function Nt() {
848
845
  }
849
846
  return t;
850
847
  }
851
- function Pt(e) {
852
- let t = Dt(e), n = [];
848
+ function Nt(e) {
849
+ let t = Et(e), n = [];
853
850
  return t.ctrl && n.push("Ctrl"), t.alt && n.push("Alt"), t.meta && n.push(yt.Meta), t.shift && n.push("Shift"), n.push(yt[t.key] ?? (t.key.length === 1 ? t.key.toUpperCase() : t.key)), n;
854
851
  }
855
- function Ft(e) {
856
- let t = Dt(e), n = t.key === " " ? "Space" : t.key.length === 1 ? t.key.toUpperCase() : t.key;
852
+ function Pt(e) {
853
+ let t = Et(e), n = t.key === " " ? "Space" : t.key.length === 1 ? t.key.toUpperCase() : t.key;
857
854
  return [
858
855
  t.ctrl ? "Control" : "",
859
856
  t.alt ? "Alt" : "",
@@ -864,7 +861,7 @@ function Ft(e) {
864
861
  }
865
862
  //#endregion
866
863
  //#region src/icons/register.ts
867
- var It = {
864
+ var Ft = {
868
865
  "beeld-en-geluid-microfoon": {
869
866
  viewBox: "0 0 64 64",
870
867
  attributes: {},
@@ -955,11 +952,6 @@ var It = {
955
952
  attributes: {},
956
953
  body: "<path d=\"m40.391 10.59c-.254-1.547-1.434-2.723-2.98-2.98-4.469-.746-11.922-.746-13.41-.746s-8.941 0-13.41.746c-1.547.258-2.727 1.434-2.98 2.98-.746 4.469-.746 11.922-.746 13.41s0 8.941.746 13.41c.254 1.547 1.434 2.723 2.98 2.98 4.469.746 11.922.746 13.41.746s8.941 0 13.41-.746c1.547-.258 2.727-1.434 2.98-2.98.746-4.469.746-11.922.746-13.41 0-4.473 0-8.941-.746-13.41zm-14.141 25.41h-4.922l.422-10.5v-6h4.5zm-2.234-19.5c-1.68 0-2.641-.941-2.641-2.656 0-1.461.891-2.594 2.609-2.594 1.68 0 2.641.906 2.641 2.594 0 1.488-.891 2.656-2.609 2.656zm0 0\"/>"
957
954
  },
958
- "functioneel-instellingen": {
959
- viewBox: "0 0 48 48",
960
- attributes: {},
961
- body: "<path d=\"m28.008 24c0-2.164-1.797-3.918-4.008-3.918s-4.004 1.754-4.004 3.918 1.793 3.918 4.004 3.918 4.008-1.754 4.008-3.918zm12.383-13.414c-.258-1.547-1.434-2.719-2.98-2.977-4.469-.746-11.922-.746-13.41-.746s-8.941 0-13.414.746a3.59 3.59 0 0 0 -2.98 2.977c-.744 4.473-.744 11.922-.744 13.414s0 8.941.742 13.41a3.59 3.59 0 0 0 2.98 2.98c4.473.746 11.922.746 13.414.746s8.941 0 13.41-.746a3.59 3.59 0 0 0 2.98-2.98c.746-4.469.746-11.922.746-13.41 0-4.473 0-8.941-.746-13.414zm-3.898 14.047c0 .359-.27.77-.594.91l-2.23 1.012c-.332.129-.719.504-.855.832l-.125.301a1.63 1.63 0 0 0 .027 1.184l.879 2.188a1.03 1.03 0 0 1 -.215 1.055l-1.012.992a1.12 1.12 0 0 1 -1.074.227l-2.297-.832a1.78 1.78 0 0 0 -1.199-.008l-.328.129c-.328.137-.703.52-.828.852l-.957 2.16a1.07 1.07 0 0 1 -.906.594h-1.441c-.355 0-.77-.266-.918-.59l-1.023-2.156a1.76 1.76 0 0 0 -.848-.848l-.324-.133a1.74 1.74 0 0 0 -1.191.027l-2.25.871c-.332.133-.812.035-1.066-.215l-1.016-.992c-.258-.25-.359-.727-.23-1.059l.84-2.238c.145-.324.152-.863.012-1.191l-.125-.297a1.71 1.71 0 0 0 -.863-.816l-2.223-.945a1.05 1.05 0 0 1 -.602-.898v-1.387c0-.355.27-.766.594-.91l2.227-1.004a1.78 1.78 0 0 0 .859-.832l.125-.301c.137-.328.125-.863-.027-1.184l-.879-2.187c-.137-.332-.039-.805.215-1.055l1.012-.992a1.12 1.12 0 0 1 1.074-.227l2.305.828a1.78 1.78 0 0 0 1.199.008l.316-.129a1.68 1.68 0 0 0 .828-.852l.961-2.156a1.07 1.07 0 0 1 .906-.598h1.441a1.11 1.11 0 0 1 .922.59l1.02 2.16c.133.332.516.711.848.848l.32.129c.332.137.871.125 1.195-.023l2.25-.871c.332-.133.813-.035 1.07.215l1.012.988c.254.25.359.727.23 1.059l-.84 2.238a1.74 1.74 0 0 0 -.012 1.191l.129.301c.137.328.527.695.863.816l2.219.945c.332.133.602.539.602.895zm0 0\"/>"
962
- },
963
955
  "functioneel-kalender": {
964
956
  viewBox: "0 0 48 48",
965
957
  attributes: {},
@@ -970,6 +962,11 @@ var It = {
970
962
  attributes: {},
971
963
  body: "<path d=\"m24 2a21.94 21.94 0 0 0 -22 22 21.94 21.94 0 0 0 22 22 21.94 21.94 0 0 0 22-22 21.94 21.94 0 0 0 -22-22zm0 39a16.99 16.99 0 1 1 0-34 16.99 16.99 0 1 1 0 34zm10.398-18.199-8.398-.602-.602-10.801c0-.797-.598-1.199-1.398-1.199s-1.398.602-1.398 1.199l-.602 12.403c0 1 .801 2 1.801 2 .398 0 2 0 10.398-.602.801 0 1.402-.598 1.402-1.199.199-.398 0-1-1.203-1.199zm0 0\"/>"
972
964
  },
965
+ "functioneel-kolommen": {
966
+ viewBox: "0 0 24 24",
967
+ attributes: {},
968
+ body: "<path d=\"M3.9 4h3a.9.9 0 0 1 .9.9v14.2a.9.9 0 0 1-.9.9h-3a.9.9 0 0 1-.9-.9V4.9a.9.9 0 0 1 .9-.9Zm.7 1.6v12.8h1.6V5.6ZM10.5 4h3a.9.9 0 0 1 .9.9v14.2a.9.9 0 0 1-.9.9h-3a.9.9 0 0 1-.9-.9V4.9a.9.9 0 0 1 .9-.9Zm.7 1.6v12.8h1.6V5.6ZM17.1 4h3a.9.9 0 0 1 .9.9v14.2a.9.9 0 0 1-.9.9h-3a.9.9 0 0 1-.9-.9V4.9a.9.9 0 0 1 .9-.9Zm.7 1.6v12.8h1.6V5.6Z\" fill-rule=\"evenodd\"/>"
969
+ },
973
970
  "functioneel-kopieren": {
974
971
  viewBox: "0 0 24 24",
975
972
  attributes: {},
@@ -1065,6 +1062,11 @@ var It = {
1065
1062
  attributes: {},
1066
1063
  body: "<path d=\"m38.684 18h-15.856l4.754-7.141c.68-1.02.512-2.383-.398-3.207a2.49 2.49 0 0 0 -1.867-.645c-.488.031-.973.211-1.383.535l-16.993 13.517c-.594.469-.937 1.188-.937 1.941a2.49 2.49 0 0 0 .938 1.941l16.992 13.516c.461.363 1.012.543 1.563.543.605 0 1.211-.219 1.688-.652.91-.824 1.078-2.187.398-3.207l-4.755-7.141h15.855c2.555 0 3.317-2.809 3.317-5.301s-.762-4.699-3.316-4.699zm0 0\"/>"
1067
1064
  },
1065
+ "functioneel-trechter": {
1066
+ viewBox: "0 0 24 24",
1067
+ attributes: {},
1068
+ body: "<path d=\"M3.6 4h16.8a.9.9 0 0 1 .7 1.47l-6.5 7.83v5.6a.9.9 0 0 1-.5.8l-3 1.5a.9.9 0 0 1-1.3-.8v-7.1L2.9 5.47A.9.9 0 0 1 3.6 4Zm1.9 1.8 5.6 6.7a.9.9 0 0 1 .2.58v6.04l1.5-.75v-5.29a.9.9 0 0 1 .2-.58l5.6-6.7Z\" fill-rule=\"evenodd\"/>"
1069
+ },
1068
1070
  "functioneel-uitloggen": {
1069
1071
  viewBox: "0 0 24 24",
1070
1072
  attributes: {},
@@ -1199,7 +1201,7 @@ var It = {
1199
1201
  update(e, t) {
1200
1202
  return this.render(...t);
1201
1203
  }
1202
- }, Lt = class extends z {
1204
+ }, It = class extends z {
1203
1205
  constructor(e) {
1204
1206
  if (super(e), this.it = T, e.type !== L.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings");
1205
1207
  }
@@ -1217,13 +1219,13 @@ var It = {
1217
1219
  };
1218
1220
  }
1219
1221
  };
1220
- Lt.directiveName = "unsafeHTML", Lt.resultType = 1;
1221
- var Rt = R(Lt), zt = class extends Lt {};
1222
- zt.directiveName = "unsafeSVG", zt.resultType = 2;
1223
- var Bt = R(zt);
1222
+ It.directiveName = "unsafeHTML", It.resultType = 1;
1223
+ var Lt = R(It), Rt = class extends It {};
1224
+ Rt.directiveName = "unsafeSVG", Rt.resultType = 2;
1225
+ var zt = R(Rt);
1224
1226
  //#endregion
1225
1227
  //#region src/core/style-props.ts
1226
- function Vt(e) {
1228
+ function Bt(e) {
1227
1229
  return e.includes("-") ? e : e.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g, "-$&").toLowerCase();
1228
1230
  }
1229
1231
  var B = R(class extends z {
@@ -1237,120 +1239,120 @@ var B = R(class extends z {
1237
1239
  let { style: n } = e.element, r = /* @__PURE__ */ new Set();
1238
1240
  for (let [e, i] of Object.entries(t)) {
1239
1241
  if (i == null || i === !1) continue;
1240
- let t = Vt(e);
1242
+ let t = Bt(e);
1241
1243
  r.add(t), n.setProperty(t, String(i));
1242
1244
  }
1243
1245
  for (let e of this.applied) r.has(e) || n.removeProperty(e);
1244
1246
  return this.applied = r, T;
1245
1247
  }
1246
- }), Ht = [
1248
+ }), Vt = [
1247
1249
  "fill",
1248
1250
  "stroke",
1249
1251
  "stroke-width",
1250
1252
  "stroke-linecap",
1251
1253
  "stroke-linejoin"
1252
- ], Ut = /(fill|stroke)="(#000|#000000|black)"/g, Wt = /\s(?:fill|stroke)="(?!none")[^"]*"/, Gt = (e) => e.startsWith("embleem-"), V = (e, t) => e.match(RegExp(`\\s${t}\\s*=\\s*"([^"]*)"`))?.[1];
1253
- function Kt(e, t) {
1254
- return e.fill === "none" && !Wt.test(t.replace(Ut, ""));
1254
+ ], Ht = /(fill|stroke)="(#000|#000000|black)"/g, Ut = /\s(?:fill|stroke)="(?!none")[^"]*"/, Wt = (e) => e.startsWith("embleem-"), V = (e, t) => e.match(RegExp(`\\s${t}\\s*=\\s*"([^"]*)"`))?.[1];
1255
+ function Gt(e, t) {
1256
+ return e.fill === "none" && !Ut.test(t.replace(Ht, ""));
1255
1257
  }
1256
- function qt(e) {
1258
+ function Kt(e) {
1257
1259
  return e.replace(/<(script|style)\b[\s\S]*?<\/\1>/gi, "").replace(/<(script|style)\b[^>]*\/>/gi, "").replace(/\sstyle\s*=\s*"[^"]*"/gi, "").replace(/\sstyle\s*=\s*'[^']*'/gi, "").replace(/\son[a-z]+\s*=\s*"[^"]*"/gi, "").replace(/\son[a-z]+\s*=\s*'[^']*'/gi, "").replace(/\s+/g, " ").trim();
1258
1260
  }
1259
- function Jt(e, t, n) {
1261
+ function qt(e, t, n) {
1260
1262
  let r = {};
1261
- for (let e of Ht) {
1263
+ for (let e of Vt) {
1262
1264
  let n = V(t, e);
1263
1265
  n !== void 0 && (r[e] = n);
1264
1266
  }
1265
- Kt(r, qt(n)) && delete r.fill;
1267
+ Gt(r, Kt(n)) && delete r.fill;
1266
1268
  for (let [e, t] of Object.entries(r)) /^(#000|#000000|black)$/.test(t) && (r[e] = "currentColor");
1267
1269
  return r;
1268
1270
  }
1269
- function Yt(e, t, n) {
1270
- let r = qt(n), i = {};
1271
- for (let e of Ht) {
1271
+ function Jt(e, t, n) {
1272
+ let r = Kt(n), i = {};
1273
+ for (let e of Vt) {
1272
1274
  let n = V(t, e);
1273
1275
  n !== void 0 && (i[e] = n);
1274
1276
  }
1275
- return Gt(e) || Kt(i, r) ? r.replace(Ut, "$1=\"currentColor\"") : r;
1277
+ return Wt(e) || Gt(i, r) ? r.replace(Ht, "$1=\"currentColor\"") : r;
1276
1278
  }
1277
- function Xt(e) {
1279
+ function Yt(e) {
1278
1280
  let t = V(e, "width"), n = V(e, "height");
1279
1281
  return t && n ? `0 0 ${parseFloat(t)} ${parseFloat(n)}` : "0 0 24 24";
1280
1282
  }
1281
- function Zt(e, t) {
1283
+ function Xt(e, t) {
1282
1284
  let n = t.indexOf("<svg"), r = t.indexOf(">", n), i = t.slice(n, r + 1), a = t.slice(r + 1, t.lastIndexOf("</svg>"));
1283
1285
  return {
1284
- viewBox: V(i, "viewBox") ?? Xt(i),
1285
- attributes: Jt(e, i, a),
1286
- body: Yt(e, i, a)
1286
+ viewBox: V(i, "viewBox") ?? Yt(i),
1287
+ attributes: qt(e, i, a),
1288
+ body: Jt(e, i, a)
1287
1289
  };
1288
1290
  }
1289
1291
  //#endregion
1290
1292
  //#region src/icons/loader.ts
1291
- var H = /* @__PURE__ */ new Map(), U = /* @__PURE__ */ new Set(), Qt = /* @__PURE__ */ new Map(), $t = /* @__PURE__ */ new Set(), W = { base: "/icons/" };
1292
- function en(e) {
1293
+ var H = /* @__PURE__ */ new Map(), U = /* @__PURE__ */ new Set(), Zt = /* @__PURE__ */ new Map(), Qt = /* @__PURE__ */ new Set(), W = { base: "/icons/" };
1294
+ function $t(e) {
1293
1295
  let t = W;
1294
1296
  W = {
1295
1297
  ...e,
1296
1298
  base: e.base.endsWith("/") ? e.base : `${e.base}/`
1297
- }, (W.base !== t.base || W.version !== t.version) && U.size && (U.clear(), sn());
1299
+ }, (W.base !== t.base || W.version !== t.version) && U.size && (U.clear(), on());
1298
1300
  }
1299
- function tn() {
1301
+ function en() {
1300
1302
  return W;
1301
1303
  }
1302
- function nn(e) {
1304
+ function tn(e) {
1303
1305
  return e ? H.get(e) : void 0;
1304
1306
  }
1305
- function rn(e) {
1307
+ function nn(e) {
1306
1308
  return e ? U.has(e) : !1;
1307
1309
  }
1308
- function an() {
1310
+ function rn() {
1309
1311
  return [...H.keys()];
1310
1312
  }
1313
+ function an(e) {
1314
+ return Qt.add(e), () => Qt.delete(e);
1315
+ }
1311
1316
  function on(e) {
1312
- return $t.add(e), () => $t.delete(e);
1317
+ for (let t of Qt) t(e);
1313
1318
  }
1314
1319
  function sn(e) {
1315
- for (let t of $t) t(e);
1316
- }
1317
- function cn(e) {
1318
- if (!e || H.has(e) || U.has(e) || Qt.has(e) || typeof fetch != "function") return;
1320
+ if (!e || H.has(e) || U.has(e) || Zt.has(e) || typeof fetch != "function") return;
1319
1321
  let t = W, n = `${t.base}${encodeURIComponent(e)}.svg${t.version ? `?b=${t.version}` : ""}`, r = fetch(n).then(async (t) => {
1320
1322
  if (!t.ok) throw Error(`${t.status}`);
1321
- let n = Zt(e, await t.text());
1323
+ let n = Xt(e, await t.text());
1322
1324
  if (!n.body) throw Error("empty");
1323
1325
  H.set(e, n);
1324
1326
  }).catch(() => {
1325
1327
  t === W && U.add(e);
1326
1328
  }).finally(() => {
1327
- Qt.delete(e), sn(e);
1329
+ Zt.delete(e), on(e);
1328
1330
  });
1329
- Qt.set(e, r);
1331
+ Zt.set(e, r);
1330
1332
  }
1331
- async function ln(e) {
1332
- return cn(e), await Qt.get(e), H.get(e);
1333
+ async function cn(e) {
1334
+ return sn(e), await Zt.get(e), H.get(e);
1333
1335
  }
1334
1336
  //#endregion
1335
1337
  //#region src/icons/render.ts
1336
- var G = A("/* One icon, drawn inline in the root that shows it: the glyph is the layout box. */\n.lintje-icon {\n display: inline-flex;\n flex: none;\n}\n/* A host-resolved SVG file, painted as a mask in the text color so nothing inside it runs. */\n.lintje-icon--file {\n background-color: currentColor;\n}\n\n/* --- An icon that leads a line of text ----------------------------------- */\n/* One line high (`1lh`), so it stays on the first line of a wrapping title; centred on the line\n box, where a 20 px glyph reads as level with the title. */\n.lintje-leading-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: none;\n align-self: start;\n font: var(--text-tile-title);\n height: 1.3em;\n height: 1lh;\n /* The gap is a margin, not a grid `column-gap`: an icon without a file draws nothing and a gap\n would indent the title. */\n margin-right: var(--space-2);\n color: var(--color-text-primary);\n}\n/* An icon known to be absent draws nothing; the heading is then the heading without an icon. */\n.lintje-leading-icon:empty { display: none; }\n\n/* `transform-origin` is explicit: the initial value for an `<svg>` differs between contexts. */\n.lintje-icon--rotate-90,\n.lintje-icon--rotate-180,\n.lintje-icon--rotate-270,\n.lintje-icon--flip-x,\n.lintje-icon--flip-y {\n transform-origin: 50% 50%;\n}\n.lintje-icon--rotate-90 { transform: rotate(90deg); }\n.lintje-icon--rotate-180 { transform: rotate(180deg); }\n.lintje-icon--rotate-270 { transform: rotate(270deg); }\n.lintje-icon--flip-x { transform: scaleX(-1); }\n.lintje-icon--flip-y { transform: scaleY(-1); }\n"), un = /* @__PURE__ */ new Set(), dn = !1;
1337
- function fn(e) {
1338
- if (!e || (un.add(e), dn)) return;
1339
- dn = !0;
1338
+ var G = A("/* One icon, drawn inline in the root that shows it: the glyph is the layout box. */\n.lintje-icon {\n display: inline-flex;\n flex: none;\n}\n/* A host-resolved SVG file, painted as a mask in the text color so nothing inside it runs. */\n.lintje-icon--file {\n background-color: currentColor;\n}\n\n/* --- An icon that leads a line of text ----------------------------------- */\n/* One line high (`1lh`), so it stays on the first line of a wrapping title; centred on the line\n box, where a 20 px glyph reads as level with the title. */\n.lintje-leading-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: none;\n align-self: start;\n font: var(--text-tile-title);\n height: 1.3em;\n height: 1lh;\n /* The gap is a margin, not a grid `column-gap`: an icon without a file draws nothing and a gap\n would indent the title. */\n margin-right: var(--space-2);\n color: var(--color-text-primary);\n}\n/* An icon known to be absent draws nothing; the heading is then the heading without an icon. */\n.lintje-leading-icon:empty { display: none; }\n\n/* `transform-origin` is explicit: the initial value for an `<svg>` differs between contexts. */\n.lintje-icon--rotate-90,\n.lintje-icon--rotate-180,\n.lintje-icon--rotate-270,\n.lintje-icon--flip-x,\n.lintje-icon--flip-y {\n transform-origin: 50% 50%;\n}\n.lintje-icon--rotate-90 { transform: rotate(90deg); }\n.lintje-icon--rotate-180 { transform: rotate(180deg); }\n.lintje-icon--rotate-270 { transform: rotate(270deg); }\n.lintje-icon--flip-x { transform: scaleX(-1); }\n.lintje-icon--flip-y { transform: scaleY(-1); }\n"), ln = /* @__PURE__ */ new Set(), un = !1;
1339
+ function dn(e) {
1340
+ if (!e || (ln.add(e), un)) return;
1341
+ un = !0;
1340
1342
  let t = !1;
1341
- on(() => {
1342
- un.size && !t && (t = !0, pn(() => {
1343
- t = !1, un.size && (un.clear(), $e());
1343
+ an(() => {
1344
+ ln.size && !t && (t = !0, fn(() => {
1345
+ t = !1, ln.size && (ln.clear(), $e());
1344
1346
  }));
1345
1347
  });
1346
1348
  }
1347
- function pn(e) {
1349
+ function fn(e) {
1348
1350
  typeof requestAnimationFrame == "function" ? requestAnimationFrame(e) : Promise.resolve().then(e);
1349
1351
  }
1350
- function mn(e) {
1351
- return (e ? It[e] : void 0) ?? nn(e);
1352
+ function pn(e) {
1353
+ return (e ? Ft[e] : void 0) ?? tn(e);
1352
1354
  }
1353
- function hn(e, t) {
1355
+ function mn(e, t) {
1354
1356
  return e ? C`<span class="lintje-leading-icon ${t}"
1355
1357
  >${K(e, { size: 20 })}</span
1356
1358
  >` : T;
@@ -1377,7 +1379,7 @@ function K(e, t = {}) {
1377
1379
  aria-hidden=${d}
1378
1380
  ></span>`;
1379
1381
  }
1380
- let p = mn(e);
1382
+ let p = pn(e);
1381
1383
  if (!p) {
1382
1384
  let t = C`<svg
1383
1385
  class="${f} lintje-icon--pending"
@@ -1387,7 +1389,7 @@ function K(e, t = {}) {
1387
1389
  viewBox="0 0 24 24"
1388
1390
  aria-hidden="true"
1389
1391
  ></svg>`;
1390
- return c && e ? t : (fn(e), e && !rn(e) ? (cn(e), t) : T);
1392
+ return c && e ? t : (dn(e), e && !nn(e) ? (sn(e), t) : T);
1391
1393
  }
1392
1394
  return C`<svg
1393
1395
  class=${f}
@@ -1403,7 +1405,7 @@ function K(e, t = {}) {
1403
1405
  role=${l}
1404
1406
  aria-label=${u}
1405
1407
  aria-hidden=${d}
1406
- >${Bt(p.body)}</svg>`;
1408
+ >${zt(p.body)}</svg>`;
1407
1409
  }
1408
1410
  //#endregion
1409
1411
  //#region node_modules/lit-html/directives/class-map.js
@@ -1428,28 +1430,35 @@ var q = R(class extends z {
1428
1430
  }
1429
1431
  return w;
1430
1432
  }
1431
- }), gn = "/*\n * The badge's drawing, shared by `<lintje-badge>` and every root that draws one through\n * `renderBadge()`. It holds no `:host` rule; the element's own box is `badge-host.css`.\n */\n\n.lintje-badge {\n display: inline-flex; align-items: center; justify-content: center;\n flex: none;\n box-sizing: border-box;\n height: 1.5rem;\n padding: 0 var(--space-2);\n border: 1px solid transparent;\n border-radius: var(--radius);\n font-family: var(--font-ui);\n font-size: 0.875rem; font-weight: 700; line-height: 1;\n white-space: nowrap;\n}\n\n/* Neutral: a line and a word, for what has not started. Subtle: the gray surface, for what is over. */\n.lintje-badge--neutral {\n color: var(--color-text-primary);\n border-color: var(--color-text-muted);\n}\n.lintje-badge--subtle {\n background: var(--color-bg-subtle);\n color: var(--color-text-primary);\n border-color: var(--color-border-default);\n}\n.lintje-badge--busy {\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n border-color: var(--color-action-primary-border);\n}\n/* A saturated status fill carries white text (success 4.52:1, error 5.01, info 4.51). */\n.lintje-badge--success { background: var(--color-success); color: var(--color-text-on-fill); }\n.lintje-badge--error { background: var(--color-error); color: var(--color-text-on-fill); }\n.lintje-badge--info { background: var(--color-info); color: var(--color-text-on-fill); }\n/* Yellow and orange take dark text in both modes: white on the orange is 3.2:1, near-black 5.54:1. */\n.lintje-badge--warning { background: var(--color-warning); color: var(--color-text-on-light-fill); }\n.lintje-badge--attention { background: var(--color-attention); color: var(--color-text-on-light-fill); }\n/* Live: the fill says it records now, the dot says it again for whoever does not see the colour. */\n.lintje-badge--live { gap: var(--space-2); background: var(--color-error); color: var(--color-text-on-fill); }\n.lintje-badge--live::before {\n content: '';\n width: 0.5rem; height: 0.5rem;\n border-radius: 50%;\n background: currentColor;\n}\n\n/* The quiet counter. The 2 px at its foot lift the figure 1 px: the house font's digits sit low. */\n.lintje-badge--count,\n.lintje-badge--unread {\n min-width: 1.5rem;\n padding: 0 var(--space-1) 2px;\n}\n.lintje-badge--count {\n background: var(--color-bg-subtle);\n color: var(--color-text-primary);\n border-color: var(--color-border-default);\n}\n/* Smaller than a label: it sits on a glyph's corner and must not cover it. At 12 px the\n digits need no lift. */\n.lintje-badge--unread {\n height: 1.25rem; min-width: 1.25rem;\n padding: 0 var(--space-1);\n font-size: 0.75rem;\n border: 0;\n border-radius: 999px;\n background: var(--color-nav-badge-bg);\n color: var(--color-nav-badge-text);\n animation: lintje-badge-pop var(--dur-badge) var(--ease-in-motion) both;\n}\n\n/* A new unread count pops in: past its size and back, so the eye catches it. It plays when the\n badge appears; a changing figure is the host's to animate. */\n@keyframes lintje-badge-pop {\n 0% { transform: scale(0); }\n 60% { transform: scale(1.2); }\n 100% { transform: none; }\n}\n\n/* On the menu's surface: the menu's text colour as the fill and its surface as the ink. After\n `--unread`, so the menu's count wins over the unread colours. */\n.lintje-badge--nav { background: var(--color-nav-text); color: var(--color-nav-bg); border: 0; }\n.lintje-badge--nav.lintje-badge--label { letter-spacing: 0.04em; }\n.lintje-badge--nav.is-muted { background: var(--color-nav-disabled); color: var(--color-nav-bg); }\n\n/* Forced colours: a fill is dropped, so every badge keeps a CanvasText edge in its border. */\n@media (forced-colors: active) {\n .lintje-badge { border-color: CanvasText; }\n .lintje-badge--unread,\n .lintje-badge--nav { outline: 1px solid CanvasText; outline-offset: -1px; }\n}\n", _n = "/*\n * `<lintje-badge>`'s own box: inline, on the text line it stands in. The drawing is `badge.css`,\n * which the element adopts beside this file and which other roots adopt without it.\n */\n:host { display: inline-flex; vertical-align: middle; }\n:host([hidden]) { display: none; }\n", vn = A(gn);
1432
- function yn(e) {
1433
- let { value: t, tone: n = "neutral", variant: r = "label", label: i, surface: a, muted: o, className: s } = e, c = a === "nav";
1433
+ }), hn = "/*\n * The badge's drawing, shared by `<lintje-badge>` and every root that draws one through\n * `renderBadge()`. It holds no `:host` rule; the element's own box is `badge-host.css`.\n */\n\n.lintje-badge {\n display: inline-flex; align-items: center; justify-content: center;\n flex: none;\n box-sizing: border-box;\n height: 1.5rem;\n padding: 0 var(--space-2);\n border: 1px solid transparent;\n border-radius: var(--radius);\n font-family: var(--font-ui);\n font-size: 0.875rem; font-weight: 700; line-height: 1;\n white-space: nowrap;\n}\n.lintje-badge__icon { flex: none; margin-inline-end: var(--space-1); }\n\n/* Neutral: a line and a word, for what has not started. Subtle: the gray surface, for what is over. */\n.lintje-badge--neutral {\n color: var(--color-text-primary);\n border-color: var(--color-text-muted);\n}\n.lintje-badge--subtle {\n background: var(--color-bg-subtle);\n color: var(--color-text-primary);\n border-color: var(--color-border-default);\n}\n.lintje-badge--busy {\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n border-color: var(--color-action-primary-border);\n}\n/* A saturated status fill carries white text (success 4.52:1, error 5.01, info 4.51). */\n.lintje-badge--success { background: var(--color-success); color: var(--color-text-on-fill); }\n.lintje-badge--error { background: var(--color-error); color: var(--color-text-on-fill); }\n.lintje-badge--info { background: var(--color-info); color: var(--color-text-on-fill); }\n/* Yellow and orange take dark text in both modes: white on the orange is 3.2:1, near-black 5.54:1. */\n.lintje-badge--warning { background: var(--color-warning); color: var(--color-text-on-light-fill); }\n.lintje-badge--attention { background: var(--color-attention); color: var(--color-text-on-light-fill); }\n/* Live: the fill says it records now, the dot says it again for whoever does not see the colour. */\n.lintje-badge--live { gap: var(--space-2); background: var(--color-error); color: var(--color-text-on-fill); }\n.lintje-badge--live::before {\n content: '';\n width: 0.5rem; height: 0.5rem;\n border-radius: 50%;\n background: currentColor;\n}\n\n/* The quiet counter. The 2 px at its foot lift the figure 1 px: the house font's digits sit low. */\n.lintje-badge--count,\n.lintje-badge--unread {\n min-width: 1.5rem;\n padding: 0 var(--space-1) 2px;\n}\n.lintje-badge--count {\n background: var(--color-bg-subtle);\n color: var(--color-text-primary);\n border-color: var(--color-border-default);\n}\n/* Smaller than a label: it sits on a glyph's corner and must not cover it. At 12 px the\n digits need no lift. */\n.lintje-badge--unread {\n height: 1.25rem; min-width: 1.25rem;\n padding: 0 var(--space-1);\n font-size: 0.75rem;\n border: 0;\n border-radius: 999px;\n background: var(--color-nav-badge-bg);\n color: var(--color-nav-badge-text);\n animation: lintje-badge-pop var(--dur-badge) var(--ease-in-motion) both;\n}\n\n/* A new unread count pops in: past its size and back, so the eye catches it. It plays when the\n badge appears; a changing figure is the host's to animate. */\n@keyframes lintje-badge-pop {\n 0% { transform: scale(0); }\n 60% { transform: scale(1.2); }\n 100% { transform: none; }\n}\n\n/* On the menu's surface: the menu's text colour as the fill and its surface as the ink. After\n `--unread`, so the menu's count wins over the unread colours. */\n.lintje-badge--nav { background: var(--color-nav-text); color: var(--color-nav-bg); border: 0; }\n.lintje-badge--nav.lintje-badge--label { letter-spacing: 0.04em; }\n.lintje-badge--nav.is-muted { background: var(--color-nav-disabled); color: var(--color-nav-bg); }\n\n/* Forced colours: a fill is dropped, so every badge keeps a CanvasText edge in its border. */\n@media (forced-colors: active) {\n .lintje-badge { border-color: CanvasText; }\n .lintje-badge--unread,\n .lintje-badge--nav { outline: 1px solid CanvasText; outline-offset: -1px; }\n}\n", gn = "/*\n * `<lintje-badge>`'s own box: inline, on the text line it stands in. The drawing is `badge.css`,\n * which the element adopts beside this file and which other roots adopt without it.\n */\n:host { display: inline-flex; vertical-align: middle; }\n:host([hidden]) { display: none; }\n", _n = A(hn);
1434
+ function vn(e) {
1435
+ let { value: t, tone: n = "neutral", variant: r = "label", label: i, surface: a, muted: o, className: s, icon: c } = e, l = a === "nav", u = c && r === "label" ? K(c, {
1436
+ size: 12,
1437
+ className: "lintje-badge__icon"
1438
+ }) : T;
1434
1439
  return C`<span
1435
1440
  class=${q({
1436
1441
  "lintje-badge": !0,
1437
1442
  [`lintje-badge--${r}`]: !0,
1438
- [`lintje-badge--${n}`]: r === "label" && !c,
1439
- "lintje-badge--nav": c,
1440
- "is-muted": c && !!o,
1443
+ [`lintje-badge--${n}`]: r === "label" && !l,
1444
+ "lintje-badge--nav": l,
1445
+ "is-muted": l && !!o,
1441
1446
  ...Object.fromEntries((s ?? "").split(/\s+/).filter(Boolean).map((e) => [e, !0]))
1442
1447
  })}
1443
- >${i ? C`<span aria-hidden="true">${t}</span
1448
+ >${u}${i ? C`<span aria-hidden="true">${t}</span
1444
1449
  ><span class="visually-hidden">${i}</span>` : t}</span
1445
1450
  >`;
1446
1451
  }
1447
- var bn = class extends j {
1452
+ var yn = class extends j {
1448
1453
  constructor(...e) {
1449
1454
  super(...e), this.tone = "neutral", this.variant = "label";
1450
1455
  }
1451
1456
  static {
1452
- this.styles = [A(_n), vn];
1457
+ this.styles = [
1458
+ G,
1459
+ A(gn),
1460
+ _n
1461
+ ];
1453
1462
  }
1454
1463
  static {
1455
1464
  this.properties = {
@@ -1461,24 +1470,30 @@ var bn = class extends j {
1461
1470
  type: String,
1462
1471
  reflect: !0
1463
1472
  },
1464
- label: { type: String }
1473
+ label: { type: String },
1474
+ icon: { type: String }
1465
1475
  };
1466
1476
  }
1467
1477
  render() {
1468
- return yn({
1478
+ return vn({
1469
1479
  value: C`<slot></slot>`,
1470
1480
  tone: this.tone,
1471
1481
  variant: this.variant,
1472
- label: this.label
1482
+ label: this.label,
1483
+ icon: this.icon
1473
1484
  });
1474
1485
  }
1475
1486
  };
1476
- M("lintje-badge", bn);
1487
+ M("lintje-badge", yn);
1477
1488
  //#endregion
1478
1489
  //#region src/primitives/button/button.css?inline
1479
- var xn = "/*\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", 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 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 {
1480
1491
  static {
1481
- this.styles = [G, A(xn)];
1492
+ this.styles = [
1493
+ G,
1494
+ A(bn),
1495
+ A(xn)
1496
+ ];
1482
1497
  }
1483
1498
  static {
1484
1499
  this.shadowRootOptions = {
@@ -1643,10 +1658,40 @@ function kn(e) {
1643
1658
  return t !== null && On(t, e);
1644
1659
  }
1645
1660
  //#endregion
1646
- //#region node_modules/lit-html/directive-helpers.js
1647
- var { I: An } = Pe, jn = (e) => e, Mn = (e) => e.strings === void 0, Nn = () => document.createComment(""), J = (e, t, n) => {
1661
+ //#region src/primitives/shared/tone.ts
1662
+ var An = {
1663
+ success: "functioneel-cirkel-vinkje",
1664
+ warning: "functioneel-waarschuwing",
1665
+ attention: "functioneel-waarschuwing",
1666
+ error: "functioneel-foutmelding",
1667
+ info: "functioneel-info"
1668
+ }, jn = {
1669
+ neutral: "onbekend",
1670
+ subtle: "onbekend",
1671
+ busy: "bezig",
1672
+ success: "in orde",
1673
+ warning: "let op",
1674
+ error: "storing",
1675
+ info: "informatie",
1676
+ attention: "aandacht",
1677
+ live: "live"
1678
+ }, Mn = {
1679
+ queued: "neutral",
1680
+ busy: "busy",
1681
+ paused: "warning",
1682
+ done: "success",
1683
+ error: "error",
1684
+ cancelled: "subtle"
1685
+ }, Nn = {
1686
+ queued: "Wachtrij",
1687
+ busy: "Bezig",
1688
+ paused: "Onderbroken",
1689
+ done: "Klaar",
1690
+ error: "Mislukt",
1691
+ cancelled: "Geannuleerd"
1692
+ }, { I: Pn } = Pe, Fn = (e) => e, In = (e) => e.strings === void 0, Ln = () => document.createComment(""), J = (e, t, n) => {
1648
1693
  let r = e._$AA.parentNode, i = t === void 0 ? e._$AB : t._$AA;
1649
- if (n === void 0) n = new An(r.insertBefore(Nn(), i), r.insertBefore(Nn(), i), e, e.options);
1694
+ if (n === void 0) n = new Pn(r.insertBefore(Ln(), i), r.insertBefore(Ln(), i), e, e.options);
1650
1695
  else {
1651
1696
  let t = n._$AB.nextSibling, a = n._$AM, o = a !== e;
1652
1697
  if (o) {
@@ -1656,15 +1701,15 @@ var { I: An } = Pe, jn = (e) => e, Mn = (e) => e.strings === void 0, Nn = () =>
1656
1701
  if (t !== i || o) {
1657
1702
  let e = n._$AA;
1658
1703
  for (; e !== t;) {
1659
- let t = jn(e).nextSibling;
1660
- jn(r).insertBefore(e, i), e = t;
1704
+ let t = Fn(e).nextSibling;
1705
+ Fn(r).insertBefore(e, i), e = t;
1661
1706
  }
1662
1707
  }
1663
1708
  }
1664
1709
  return n;
1665
- }, Y = (e, t, n = e) => (e._$AI(t, n), e), Pn = {}, Fn = (e, t = Pn) => e._$AH = t, In = (e) => e._$AH, Ln = (e) => {
1710
+ }, Y = (e, t, n = e) => (e._$AI(t, n), e), Rn = {}, zn = (e, t = Rn) => e._$AH = t, Bn = (e) => e._$AH, Vn = (e) => {
1666
1711
  e._$AR(), e._$AA.remove();
1667
- }, Rn = R(class extends z {
1712
+ }, Hn = R(class extends z {
1668
1713
  constructor() {
1669
1714
  super(...arguments), this.key = T;
1670
1715
  }
@@ -1672,10 +1717,10 @@ var { I: An } = Pe, jn = (e) => e, Mn = (e) => e.strings === void 0, Nn = () =>
1672
1717
  return this.key = e, t;
1673
1718
  }
1674
1719
  update(e, [t, n]) {
1675
- return t !== this.key && (Fn(e), this.key = t), n;
1720
+ return t !== this.key && (zn(e), this.key = t), n;
1676
1721
  }
1677
- }), zn = (e) => e ?? T, Bn = 180;
1678
- function Vn(e, t, n, r = "bottom-start", i = 6) {
1722
+ }), Un = (e) => e ?? T, Wn = 180;
1723
+ function Gn(e, t, n, r = "bottom-start", i = 6) {
1679
1724
  if (r === "left-center" || r === "left-start") {
1680
1725
  let a = e.left - i - t.width;
1681
1726
  if (a >= 8) {
@@ -1689,7 +1734,7 @@ function Vn(e, t, n, r = "bottom-start", i = 6) {
1689
1734
  }
1690
1735
  r = r === "left-start" ? "bottom-end" : "top-center";
1691
1736
  }
1692
- let a = n.height - e.bottom - i - 8, o = e.top - i - 8, s = Math.min(t.height || Bn, Bn), c = r.startsWith("top") ? !(o < s && a > o) : a < s && o > a, l = e.left;
1737
+ let a = n.height - e.bottom - i - 8, o = e.top - i - 8, s = Math.min(t.height || Wn, Wn), c = r.startsWith("top") ? !(o < s && a > o) : a < s && o > a, l = e.left;
1693
1738
  return r.endsWith("-end") && (l = e.right - t.width), r === "top-center" && (l = e.left + e.width / 2 - t.width / 2), l = Math.max(8, Math.min(l, n.width - t.width - 8)), {
1694
1739
  top: c ? null : e.bottom + i,
1695
1740
  bottom: c ? n.height - e.top + i : null,
@@ -1697,10 +1742,10 @@ function Vn(e, t, n, r = "bottom-start", i = 6) {
1697
1742
  space: Math.max(0, c ? o : a)
1698
1743
  };
1699
1744
  }
1700
- function Hn(e, t) {
1745
+ function Kn(e, t) {
1701
1746
  return !e || !t ? e === t : e.top === t.top && e.bottom === t.bottom && e.left === t.left && e.space === t.space;
1702
1747
  }
1703
- function Un() {
1748
+ function qn() {
1704
1749
  return {
1705
1750
  width: window.innerWidth || document.documentElement.clientWidth || 1024,
1706
1751
  height: window.innerHeight || document.documentElement.clientHeight || 768
@@ -1708,10 +1753,10 @@ function Un() {
1708
1753
  }
1709
1754
  //#endregion
1710
1755
  //#region src/primitives/popover/popover.css?inline
1711
- var Wn = ":host { display: contents; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n/* Fixed, not absolute: an `overflow` ancestor would cut it off. z-index 85: above the scrim (80),\n below the tooltip (90). */\n.lintje-popover {\n position: fixed;\n z-index: 85;\n max-width: calc(100vw - var(--space-4));\n max-height: var(--lintje-popover-space, none);\n overflow: auto;\n background: var(--color-bg-surface);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border-popover);\n box-shadow: var(--shadow-popover);\n font: var(--text-ui);\n animation: lintje-popover-in var(--dur-popover) var(--ease-in-motion);\n}\n";
1756
+ var Jn = ":host { display: contents; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n/* Fixed, not absolute: an `overflow` ancestor would cut it off. z-index 85: above the scrim (80),\n below the tooltip (90). */\n.lintje-popover {\n position: fixed;\n z-index: 85;\n max-width: calc(100vw - var(--space-4));\n max-height: var(--lintje-popover-space, none);\n overflow: auto;\n background: var(--color-bg-surface);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border-popover);\n box-shadow: var(--shadow-popover);\n font: var(--text-ui);\n animation: lintje-popover-in var(--dur-popover) var(--ease-in-motion);\n}\n";
1712
1757
  //#endregion
1713
1758
  //#region src/primitives/popover/popover.ts
1714
- function Gn(e, t) {
1759
+ function Yn(e, t) {
1715
1760
  return e ? {
1716
1761
  top: e.top === null ? null : `${e.top}px`,
1717
1762
  bottom: e.bottom === null ? null : `${e.bottom}px`,
@@ -1720,9 +1765,9 @@ function Gn(e, t) {
1720
1765
  "--lintje-popover-space": `${e.space}px`
1721
1766
  } : {};
1722
1767
  }
1723
- var Kn = class extends j {
1768
+ var Xn = class extends j {
1724
1769
  static {
1725
- this.styles = A(Wn);
1770
+ this.styles = A(Jn);
1726
1771
  }
1727
1772
  static {
1728
1773
  this.properties = {
@@ -1779,8 +1824,8 @@ var Kn = class extends j {
1779
1824
  height: n?.offsetHeight ?? 0
1780
1825
  };
1781
1826
  this.matchWidth && (r.width = Math.max(r.width, t.width));
1782
- let i = Vn(t, r, Un(), this.placement), a = this.matchWidth ? Math.round(t.width) : null;
1783
- Hn(this.spot, i) && a === this.anchorWidth || (this.anchorWidth = a, this.spot = i);
1827
+ let i = Gn(t, r, qn(), this.placement), a = this.matchWidth ? Math.round(t.width) : null;
1828
+ Kn(this.spot, i) && a === this.anchorWidth || (this.anchorWidth = a, this.spot = i);
1784
1829
  }
1785
1830
  willUpdate(e) {
1786
1831
  super.willUpdate(e), e.has("open") && (this.open ? this.measure() : this.spot = null);
@@ -1791,28 +1836,28 @@ var Kn = class extends j {
1791
1836
  render() {
1792
1837
  return this.open ? C`<div
1793
1838
  class="lintje-popover"
1794
- role=${zn(this.panelRole)}
1795
- aria-label=${zn(this.label)}
1796
- ${B(Gn(this.spot, this.anchorWidth))}
1839
+ role=${Un(this.panelRole)}
1840
+ aria-label=${Un(this.label)}
1841
+ ${B(Yn(this.spot, this.anchorWidth))}
1797
1842
  >
1798
1843
  <slot></slot>
1799
1844
  </div>` : T;
1800
1845
  }
1801
1846
  };
1802
- M("lintje-popover", Kn);
1847
+ M("lintje-popover", Xn);
1803
1848
  //#endregion
1804
1849
  //#region src/core/links.ts
1805
- function qn(e) {
1850
+ function Zn(e) {
1806
1851
  return e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey;
1807
1852
  }
1808
1853
  //#endregion
1809
1854
  //#region src/primitives/spinner/spinner.css?inline
1810
- var Jn = ":host { display: inline-flex; vertical-align: middle; }\n:host([stacked]) { display: flex; justify-content: center; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-spinner {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n font: var(--text-ui);\n color: var(--color-text-primary);\n}\n.lintje-spinner--stacked { flex-direction: column; gap: var(--space-3); }\n\n/* A line on a surface (3:1): the accent line, not the fill. */\n.lintje-spinner__ring {\n flex: none;\n width: 1rem; height: 1rem;\n border: 2px solid var(--color-accent-line);\n border-top-color: transparent;\n border-radius: var(--radius-round);\n animation: lintje-spin var(--dur-skeleton) linear infinite;\n}\n/* 16, 24 and 40 px: 1, 1.5 and 2.5rem, so the ring grows with the text beside it. */\n.lintje-spinner--24 .lintje-spinner__ring { width: 1.5rem; height: 1.5rem; }\n.lintje-spinner--40 .lintje-spinner__ring { width: 2.5rem; height: 2.5rem; border-width: 3px; }\n.lintje-spinner--current .lintje-spinner__ring {\n border-color: currentColor;\n border-top-color: transparent;\n}\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@media (prefers-reduced-motion: reduce) {\n .lintje-spinner__ring { animation: none; }\n}\n\n/* Forced colours: the ring draws in CanvasText with its open quarter in Canvas, so it still turns. */\n@media (forced-colors: active) {\n .lintje-spinner__ring,\n .lintje-spinner--current .lintje-spinner__ring {\n border-color: CanvasText;\n border-top-color: Canvas;\n }\n}\n", Yn = class extends j {
1855
+ var Qn = ":host { display: inline-flex; vertical-align: middle; }\n:host([stacked]) { display: flex; justify-content: center; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-spinner {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n font: var(--text-ui);\n color: var(--color-text-primary);\n}\n.lintje-spinner--stacked { flex-direction: column; gap: var(--space-3); }\n\n/* A line on a surface (3:1): the accent line, not the fill. */\n.lintje-spinner__ring {\n flex: none;\n width: 1rem; height: 1rem;\n border: 2px solid var(--color-accent-line);\n border-top-color: transparent;\n border-radius: var(--radius-round);\n animation: lintje-spin var(--dur-skeleton) linear infinite;\n}\n/* 16, 24 and 40 px: 1, 1.5 and 2.5rem, so the ring grows with the text beside it. */\n.lintje-spinner--24 .lintje-spinner__ring { width: 1.5rem; height: 1.5rem; }\n.lintje-spinner--40 .lintje-spinner__ring { width: 2.5rem; height: 2.5rem; border-width: 3px; }\n.lintje-spinner--current .lintje-spinner__ring {\n border-color: currentColor;\n border-top-color: transparent;\n}\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@media (prefers-reduced-motion: reduce) {\n .lintje-spinner__ring { animation: none; }\n}\n\n/* Forced colours: the ring draws in CanvasText with its open quarter in Canvas, so it still turns. */\n@media (forced-colors: active) {\n .lintje-spinner__ring,\n .lintje-spinner--current .lintje-spinner__ring {\n border-color: CanvasText;\n border-top-color: Canvas;\n }\n}\n", $n = class extends j {
1811
1856
  constructor(...e) {
1812
1857
  super(...e), this.size = 16, this.stacked = !1, this.current = !1, this.filled = null, this.#e = 0;
1813
1858
  }
1814
1859
  static {
1815
- this.styles = A(Jn);
1860
+ this.styles = A(Qn);
1816
1861
  }
1817
1862
  static {
1818
1863
  this.properties = {
@@ -1861,18 +1906,18 @@ var Jn = ":host { display: inline-flex; vertical-align: middle; }\n:host([stacke
1861
1906
  </span>`;
1862
1907
  }
1863
1908
  };
1864
- M("lintje-spinner", Yn);
1909
+ M("lintje-spinner", $n);
1865
1910
  //#endregion
1866
1911
  //#region src/primitives/tooltip/tooltip.css?inline
1867
- var Xn = "/* A box of its own for the pointer and focus to enter; inline, so flow is unchanged. */\n:host { display: inline-flex; vertical-align: middle; min-width: 0; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n/* The pointer can rest on it, to read it at a larger zoom; Escape takes it away. */\n.lintje-tooltip {\n position: fixed;\n z-index: 90;\n max-width: 15rem;\n padding: var(--space-2) var(--space-3);\n background: var(--color-bg-surface);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border-popover);\n box-shadow: var(--shadow-popover);\n font: var(--text-small);\n animation: lintje-fade-in var(--dur-hover) var(--ease-in-motion);\n}\n", Zn = 300, Qn = 150;
1868
- function $n(e) {
1912
+ var er = "/* A box of its own for the pointer and focus to enter; inline, so flow is unchanged. */\n:host { display: inline-flex; vertical-align: middle; min-width: 0; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n/* The pointer can rest on it, to read it at a larger zoom; Escape takes it away. */\n.lintje-tooltip {\n position: fixed;\n z-index: 90;\n max-width: 15rem;\n padding: var(--space-2) var(--space-3);\n background: var(--color-bg-surface);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border-popover);\n box-shadow: var(--shadow-popover);\n font: var(--text-small);\n animation: lintje-fade-in var(--dur-hover) var(--ease-in-motion);\n}\n", tr = 300, nr = 150;
1913
+ function rr(e) {
1869
1914
  return e ? {
1870
1915
  top: e.top === null ? null : `${e.top}px`,
1871
1916
  bottom: e.bottom === null ? null : `${e.bottom}px`,
1872
1917
  left: `${e.left}px`
1873
1918
  } : {};
1874
1919
  }
1875
- var er = class extends j {
1920
+ var ir = class extends j {
1876
1921
  constructor(...e) {
1877
1922
  super(...e), this.text = "", this.noDescribe = !1, this.placement = "top", this.open = !1, this.spot = null, this.reflowFrame = 0, this.#e = "", this.onPointerEnter = () => {
1878
1923
  this.open ? clearTimeout(this.timer) : this.show(300);
@@ -1887,7 +1932,7 @@ var er = class extends j {
1887
1932
  };
1888
1933
  }
1889
1934
  static {
1890
- this.styles = A(Xn);
1935
+ this.styles = A(er);
1891
1936
  }
1892
1937
  static {
1893
1938
  this.properties = {
@@ -1926,8 +1971,8 @@ var er = class extends j {
1926
1971
  let t = this.renderRoot.querySelector(".lintje-tooltip"), n = {
1927
1972
  width: t?.offsetWidth ?? 0,
1928
1973
  height: t?.offsetHeight ?? 0
1929
- }, r = this.placement === "left" ? "left-center" : "top-center", i = Vn(e.getBoundingClientRect(), n, Un(), r, 8);
1930
- Hn(this.spot, i) || (this.spot = i);
1974
+ }, r = this.placement === "left" ? "left-center" : "top-center", i = Gn(e.getBoundingClientRect(), n, qn(), r, 8);
1975
+ Kn(this.spot, i) || (this.spot = i);
1931
1976
  }
1932
1977
  willUpdate(e) {
1933
1978
  super.willUpdate(e), (e.has("text") || e.has("noDescribe")) && this.describe(), e.has("open") && (this.open ? this.measure() : this.spot = null);
@@ -1948,28 +1993,28 @@ var er = class extends j {
1948
1993
  } else n ? e.setAttribute("aria-description", n) : e.removeAttribute("aria-description");
1949
1994
  }
1950
1995
  render() {
1951
- return C`<slot @slotchange=${this.describe}></slot>${this.open ? C`<span class="lintje-tooltip" role="tooltip" ${B($n(this.spot))}
1996
+ return C`<slot @slotchange=${this.describe}></slot>${this.open ? C`<span class="lintje-tooltip" role="tooltip" ${B(rr(this.spot))}
1952
1997
  >${this.text}</span
1953
1998
  >` : T}`;
1954
1999
  }
1955
2000
  };
1956
- M("lintje-tooltip", er);
2001
+ M("lintje-tooltip", ir);
1957
2002
  //#endregion
1958
2003
  //#region src/primitives/icon-button/icon-button.css?inline
1959
- var tr = "/* Above the divider: what the element itself needs. Below it: the block's own BEM CSS. */\n:host {\n display: inline-flex;\n vertical-align: middle;\n}\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-icon-button {\n position: relative;\n width: var(--h-icon-button);\n height: var(--h-icon-button);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: var(--radius);\n transition: opacity var(--dur-hover) var(--ease-in-motion),\n background var(--dur-hover) var(--ease-in-motion);\n}\n/* The target reaches `--h-target` through a transparent hit area; 100 % is the box's own size,\n so the label variant's wider box only grows it upwards and downwards. */\n.lintje-icon-button::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target)) / 2));\n}\n/* Without a file for its icon the label becomes the text; the square grows as wide as the word. */\n.lintje-icon-button--text { width: auto; min-width: var(--h-icon-button); padding: 0 var(--space-3); }\n.lintje-icon-button__label { font-size: 0.875rem; font-weight: 700; white-space: nowrap; }\n\n/* The box is a line (3:1), the glyph stands in for a word (4.5:1): different tokens. */\n.lintje-icon-button--outlined {\n border: 1px solid var(--color-accent-line);\n background: var(--color-bg-surface);\n color: var(--color-accent-text);\n}\n.lintje-icon-button--outlined:not(.is-disabled):hover { background: var(--color-bg-selected); }\n\n.lintje-icon-button--flat { background: transparent; color: var(--color-text-primary); }\n.lintje-icon-button--flat:not(.is-disabled):hover { background: var(--color-bg-subtle); }\n\n/* Tile actions stand back in the muted text colour, never below 3:1; hover and focus darken them. */\n.lintje-icon-button--tile { background: transparent; color: var(--color-text-muted); }\n.lintje-icon-button--tile:not(.is-disabled):hover, .lintje-icon-button--tile:focus-visible { color: var(--color-text-primary); }\n\n/* The active button takes the primary-fill border, so the square keeps an edge in dark. */\n.lintje-icon-button.is-active {\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n border-color: var(--color-action-primary-border);\n}\n\n/* Live: it listens or speaks now. The primary fill with its border, and bars that move beside\n the icon, so the state is never colour alone; the box grows to hold them. */\n.lintje-icon-button.is-live {\n width: auto;\n gap: var(--space-2);\n padding: 0 var(--space-3);\n border: 1px solid var(--color-action-primary-border);\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n}\n.lintje-icon-button.is-live:not(.is-disabled):hover { background: var(--color-action-primary-hover); }\n.lintje-icon-button__waves { display: inline-flex; align-items: center; gap: 2px; height: 16px; }\n.lintje-icon-button__wave {\n width: 2px;\n height: 100%;\n background: currentColor;\n animation: lintje-icon-button-wave var(--dur-wave) var(--ease-in-motion) infinite alternate;\n}\n.lintje-icon-button__wave:nth-child(2) { animation-delay: calc(var(--dur-wave) * -0.5); }\n.lintje-icon-button__wave:nth-child(3) { animation-delay: calc(var(--dur-wave) * -0.25); }\n.lintje-icon-button__wave:nth-child(4) { animation-delay: calc(var(--dur-wave) * -0.75); }\n@keyframes lintje-icon-button-wave {\n from { transform: scaleY(0.25); }\n to { transform: scaleY(1); }\n}\n/* Without motion the bars stand still at different heights: still a wave, never a pulse. */\n@media (prefers-reduced-motion: reduce) {\n .lintje-icon-button__wave { animation: none; transform: scaleY(0.5); }\n .lintje-icon-button__wave:nth-child(2) { transform: scaleY(1); }\n .lintje-icon-button__wave:nth-child(4) { transform: scaleY(0.75); }\n}\n\n/* Disabled is `aria-disabled`: tab order and focus ring stay. After is-active, so it loses the fill. */\n.lintje-icon-button.is-disabled { cursor: not-allowed; color: var(--color-text-disabled); }\n.lintje-icon-button--outlined.is-disabled { background: var(--color-bg-surface); border-color: var(--color-border-default); }\n\n/* Forced colours: the active fill is dropped, so its border turns Highlight. */\n@media (forced-colors: active) {\n .lintje-icon-button.is-active,\n .lintje-icon-button.is-live { border-color: Highlight; }\n .lintje-icon-button.is-disabled { color: GrayText; border-color: GrayText; }\n}\n";
2004
+ var ar = "/* Above the divider: what the element itself needs. Below it: the block's own BEM CSS. */\n:host {\n display: inline-flex;\n vertical-align: middle;\n}\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-icon-button {\n position: relative;\n width: var(--h-icon-button);\n height: var(--h-icon-button);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: var(--radius);\n transition: opacity var(--dur-hover) var(--ease-in-motion),\n background var(--dur-hover) var(--ease-in-motion);\n}\n/* The target reaches `--h-target` through a transparent hit area; 100 % is the box's own size,\n so the label variant's wider box only grows it upwards and downwards. */\n.lintje-icon-button::after {\n content: '';\n position: absolute;\n inset: min(0px, calc((100% - var(--h-target)) / 2));\n}\n/* Without a file for its icon the label becomes the text; the square grows as wide as the word. */\n.lintje-icon-button--text { width: auto; min-width: var(--h-icon-button); padding: 0 var(--space-3); }\n.lintje-icon-button__label { font-size: 0.875rem; font-weight: 700; white-space: nowrap; }\n\n/* The box is a line (3:1), the glyph stands in for a word (4.5:1): different tokens. */\n.lintje-icon-button--outlined {\n border: 1px solid var(--color-accent-line);\n background: var(--color-bg-surface);\n color: var(--color-accent-text);\n}\n.lintje-icon-button--outlined:not(.is-disabled):hover { background: var(--color-bg-selected); }\n\n.lintje-icon-button--flat { background: transparent; color: var(--color-text-primary); }\n.lintje-icon-button--flat:not(.is-disabled):hover { background: var(--color-bg-subtle); }\n\n/* Tile actions stand back in the muted text colour, never below 3:1; hover and focus darken them. */\n.lintje-icon-button--tile { background: transparent; color: var(--color-text-muted); }\n.lintje-icon-button--tile:not(.is-disabled):hover, .lintje-icon-button--tile:focus-visible { color: var(--color-text-primary); }\n\n/* The active button takes the primary-fill border, so the square keeps an edge in dark. */\n.lintje-icon-button.is-active {\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n border-color: var(--color-action-primary-border);\n}\n\n/* Live: it listens or speaks now. The primary fill with its border, and bars that move beside\n the icon, so the state is never colour alone; the box grows to hold them. */\n.lintje-icon-button.is-live {\n width: auto;\n gap: var(--space-2);\n padding: 0 var(--space-3);\n border: 1px solid var(--color-action-primary-border);\n background: var(--color-action-primary);\n color: var(--color-action-primary-text);\n}\n.lintje-icon-button.is-live:not(.is-disabled):hover { background: var(--color-action-primary-hover); }\n.lintje-icon-button__waves { display: inline-flex; align-items: center; gap: 2px; height: 16px; }\n.lintje-icon-button__wave {\n width: 2px;\n height: 100%;\n background: currentColor;\n animation: lintje-icon-button-wave var(--dur-wave) var(--ease-in-motion) infinite alternate;\n}\n.lintje-icon-button__wave:nth-child(2) { animation-delay: calc(var(--dur-wave) * -0.5); }\n.lintje-icon-button__wave:nth-child(3) { animation-delay: calc(var(--dur-wave) * -0.25); }\n.lintje-icon-button__wave:nth-child(4) { animation-delay: calc(var(--dur-wave) * -0.75); }\n@keyframes lintje-icon-button-wave {\n from { transform: scaleY(0.25); }\n to { transform: scaleY(1); }\n}\n/* Without motion the bars stand still at different heights: still a wave, never a pulse. */\n@media (prefers-reduced-motion: reduce) {\n .lintje-icon-button__wave { animation: none; transform: scaleY(0.5); }\n .lintje-icon-button__wave:nth-child(2) { transform: scaleY(1); }\n .lintje-icon-button__wave:nth-child(4) { transform: scaleY(0.75); }\n}\n\n/* Disabled is `aria-disabled`: tab order and focus ring stay. After is-active, so it loses the fill. */\n.lintje-icon-button.is-disabled { cursor: not-allowed; color: var(--color-text-disabled); }\n.lintje-icon-button--outlined.is-disabled { background: var(--color-bg-surface); border-color: var(--color-border-default); }\n\n/* Forced colours: the active fill is dropped, so its border turns Highlight. */\n@media (forced-colors: active) {\n .lintje-icon-button.is-active,\n .lintje-icon-button.is-live { border-color: Highlight; }\n .lintje-icon-button.is-disabled { color: GrayText; border-color: GrayText; }\n}\n";
1960
2005
  //#endregion
1961
2006
  //#region src/core/length.ts
1962
- function nr(e, t, n) {
2007
+ function or(e, t, n) {
1963
2008
  let r = getComputedStyle(e).getPropertyValue(t).trim(), i = parseFloat(r);
1964
- return Number.isFinite(i) ? r.endsWith("rem") ? i * rr() : i : n;
2009
+ return Number.isFinite(i) ? r.endsWith("rem") ? i * sr() : i : n;
1965
2010
  }
1966
- function rr() {
2011
+ function sr() {
1967
2012
  let e = parseFloat(getComputedStyle(document.documentElement).fontSize);
1968
2013
  return Number.isFinite(e) && e > 0 ? e : 16;
1969
2014
  }
1970
2015
  //#endregion
1971
2016
  //#region src/primitives/shared/grid-item-element.ts
1972
- var ir = A("/* `min-width: auto` is the default; tiles hold long words and wide tables that would overflow. */\n:host {\n min-width: 0;\n}\n:host(lintje-grid-item) {\n display: block;\n}\n:host([span]) {\n grid-column: span var(--lintje-span, 1);\n}\n@media (min-width: 768px) and (max-width: 1023px) {\n :host([span='4']) { grid-column: span 6; }\n :host([span='8']) { grid-column: span 12; }\n}\n@media (max-width: 767px) {\n :host([span]) { grid-column: span 1; }\n}\n"), ar = class extends j {
2017
+ var cr = A("/* `min-width: auto` is the default; tiles hold long words and wide tables that would overflow. */\n:host {\n min-width: 0;\n}\n:host(lintje-grid-item) {\n display: block;\n}\n:host([span]) {\n grid-column: span var(--lintje-span, 1);\n}\n@media (min-width: 768px) and (max-width: 1023px), print and (max-width: 1023px) {\n :host([span='4']) { grid-column: span 6; }\n :host([span='8']) { grid-column: span 12; }\n}\n@media screen and (max-width: 767px) {\n :host([span]) { grid-column: span 1; }\n}\n"), lr = class extends j {
1973
2018
  static {
1974
2019
  this.properties = { span: {
1975
2020
  type: Number,
@@ -1979,15 +2024,82 @@ var ir = A("/* `min-width: auto` is the default; tiles hold long words and wide
1979
2024
  willUpdate(e) {
1980
2025
  super.willUpdate(e), this.span ? this.style.setProperty("--lintje-span", String(this.span)) : this.style.removeProperty("--lintje-span");
1981
2026
  }
1982
- }, or = /^-?\d+(?:\.\d+)?$/;
1983
- function sr(e) {
1984
- if (e !== void 0) return typeof e == "number" || or.test(e) ? `${e}px` : e;
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 = {
2028
+ warning: "attention",
2029
+ outage: "error",
2030
+ error: "error",
2031
+ info: "info",
2032
+ ok: "success"
2033
+ }, fr = {
2034
+ warning: "status",
2035
+ outage: "alert",
2036
+ error: "status",
2037
+ info: "status",
2038
+ ok: "status"
2039
+ }, pr = {
2040
+ warning: "Waarschuwing",
2041
+ outage: "Storing",
2042
+ error: "Fout",
2043
+ info: "Informatie",
2044
+ ok: "Gelukt"
2045
+ }, mr = A(ur);
2046
+ function hr(e) {
2047
+ let t = e.kind ?? "warning", n = e.live === !0, r = n && !e.filled;
2048
+ return C`<div
2049
+ class=${q({
2050
+ "lintje-announcement": !0,
2051
+ [`lintje-announcement--${t}`]: !0
2052
+ })}
2053
+ role=${n ? fr[t] : T}
2054
+ >
2055
+ <div class="lintje-announcement__inner">
2056
+ ${gr(t)} ${r ? T : _r(t, e)}
2057
+ </div>
2058
+ </div>`;
2059
+ }
2060
+ function gr(e) {
2061
+ let t = An[dr[e]];
2062
+ return C`<span class="lintje-announcement__icon" aria-hidden="true"
2063
+ >${t ? K(t, { size: 16 }) : T}</span
2064
+ >`;
2065
+ }
2066
+ function _r(e, t) {
2067
+ let { title: n, text: r, meta: i, link: a } = t, o = C`<span class="visually-hidden">${pr[e]}: </span>`;
2068
+ return C`<div class="lintje-announcement__body">
2069
+ <div class="lintje-announcement__content">
2070
+ ${n ? C`<p class="lintje-announcement__title">${o}${n}</p>` : T}
2071
+ ${r ? C`<p class="lintje-announcement__text">${n ? T : o}${r}</p>` : T}
2072
+ ${i || a ? C`<p class="lintje-announcement__meta">
2073
+ ${i ?? T}${i && a ? " · " : T}${a ? C`<a class="lintje-announcement__link" href=${a.href}>${a.label}</a>` : T}
2074
+ </p>` : T}
2075
+ </div>
2076
+ ${t.action ?? T}
2077
+ </div>
2078
+ ${t.media ?? T}
2079
+ ${t.onClose ? C`<button
2080
+ type="button"
2081
+ class="lintje-announcement__close"
2082
+ aria-label="Mededeling sluiten"
2083
+ @click=${t.onClose}
2084
+ >
2085
+ ${K("functioneel-kruis", { size: 16 })}
2086
+ </button>` : T}`;
2087
+ }
2088
+ //#endregion
2089
+ //#region src/primitives/shared/length.ts
2090
+ var vr = /^-?\d+(?:\.\d+)?$/;
2091
+ function yr(e) {
2092
+ if (e !== void 0) return typeof e == "number" || vr.test(e) ? `${e}px` : e;
1985
2093
  }
1986
2094
  //#endregion
1987
2095
  //#region src/primitives/icon-button/icon-button.ts
1988
- var cr = class extends j {
2096
+ var br = class extends j {
1989
2097
  static {
1990
- this.styles = [G, A(tr)];
2098
+ this.styles = [
2099
+ G,
2100
+ A(ar),
2101
+ A(xn)
2102
+ ];
1991
2103
  }
1992
2104
  static {
1993
2105
  this.properties = {
@@ -2051,20 +2163,25 @@ var cr = class extends j {
2051
2163
  </button>`;
2052
2164
  }
2053
2165
  };
2054
- M("lintje-icon-button", cr);
2166
+ M("lintje-icon-button", br);
2055
2167
  //#endregion
2056
2168
  //#region src/primitives/status-dot/status-dot.css?inline
2057
- var lr = ":host { display: inline-flex; vertical-align: middle; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-status { display: inline-flex; align-items: center; gap: var(--space-2); font: var(--text-small); }\n.lintje-status__dot { border-radius: var(--radius-round); flex: none; display: block; }\n.lintje-status__dot--complete { background: var(--color-success); }\n.lintje-status__dot--delayed { background: var(--color-warning); }\n.lintje-status__dot--outage { background: var(--color-error); }\n.lintje-status__dot--no-data { background: var(--color-text-muted); }\n\n/* Forced colours: the dot's fill is dropped, so it keeps its drawing as one CanvasText dot. */\n@media (forced-colors: active) {\n .lintje-status__dot { forced-color-adjust: none; background: CanvasText; }\n}\n", ur = {
2169
+ var xr = ":host { display: inline-flex; vertical-align: middle; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-status { display: inline-flex; align-items: center; gap: var(--space-2); font: var(--text-small); }\n.lintje-status__dot { border-radius: var(--radius-round); flex: none; display: block; }\n.lintje-status__dot--success { background: var(--color-success); }\n.lintje-status__dot--warning { background: var(--color-warning); }\n.lintje-status__dot--attention { background: var(--color-attention); }\n.lintje-status__dot--error { background: var(--color-error); }\n.lintje-status__dot--info { background: var(--color-info); }\n.lintje-status__dot--busy { background: var(--color-action-primary); }\n.lintje-status__dot--neutral { background: var(--color-text-muted); }\n.lintje-status__dot--subtle { background: var(--color-text-muted); }\n.lintje-status__dot--live { background: var(--color-error); }\n\n/* Forced colours: the dot's fill is dropped, so it keeps its drawing as one CanvasText dot. */\n@media (forced-colors: active) {\n .lintje-status__dot { forced-color-adjust: none; background: CanvasText; }\n}\n", Sr = {
2170
+ complete: "success",
2171
+ delayed: "warning",
2172
+ outage: "error",
2173
+ "no-data": "neutral"
2174
+ }, Cr = {
2058
2175
  complete: "compleet",
2059
2176
  delayed: "vertraagd",
2060
2177
  outage: "storing",
2061
2178
  "no-data": "geen data"
2062
- }, dr = class extends j {
2179
+ }, wr = class extends j {
2063
2180
  constructor(...e) {
2064
2181
  super(...e), this.tone = "complete", this.size = 10;
2065
2182
  }
2066
2183
  static {
2067
- this.styles = A(lr);
2184
+ this.styles = A(xr);
2068
2185
  }
2069
2186
  static {
2070
2187
  this.properties = {
@@ -2077,27 +2194,28 @@ var lr = ":host { display: inline-flex; vertical-align: middle; }\n:host([hidden
2077
2194
  };
2078
2195
  }
2079
2196
  render() {
2197
+ let e = Object.hasOwn(Sr, this.tone) ? this.tone : void 0, t = e ? Sr[e] : this.tone, n = e ? Cr[e] : jn[t];
2080
2198
  return C`<span class="lintje-status">
2081
2199
  <span
2082
- class="lintje-status__dot lintje-status__dot--${this.tone}"
2200
+ class="lintje-status__dot lintje-status__dot--${t}"
2083
2201
  ${B({
2084
2202
  width: `${this.size}px`,
2085
2203
  height: `${this.size}px`
2086
2204
  })}
2087
2205
  ></span>
2088
- <span>${this.label ?? ur[this.tone]}</span>
2206
+ <span>${this.label ?? n}</span>
2089
2207
  </span>`;
2090
2208
  }
2091
2209
  };
2092
- M("lintje-status-dot", dr);
2210
+ M("lintje-status-dot", wr);
2093
2211
  //#endregion
2094
2212
  //#region src/primitives/skeleton/skeleton.css?inline
2095
- var fr = "/* The size is on the host so a percentage has a box to resolve against. */\n:host { display: block; }\n:host(lintje-skeleton) .lintje-skeleton { width: 100%; height: 100%; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-skeleton {\n display: block;\n background: linear-gradient(90deg,\n var(--color-bg-subtle) 25%,\n var(--color-border-default) 37%,\n var(--color-bg-subtle) 63%);\n background-size: 200% 100%;\n animation: lintje-shimmer var(--dur-skeleton) linear infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n .lintje-skeleton { animation: none; background: var(--color-bg-subtle); }\n}\n\n/* Forced colours: the gradient is dropped, so the placeholder keeps a 1 px GrayText line. */\n@media (forced-colors: active) {\n .lintje-skeleton { outline: 1px solid GrayText; outline-offset: -1px; }\n}\n", pr = class extends j {
2213
+ var Tr = "/* The size is on the host so a percentage has a box to resolve against. */\n:host { display: block; }\n:host(lintje-skeleton) .lintje-skeleton { width: 100%; height: 100%; }\n:host([hidden]) { display: none; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-skeleton {\n display: block;\n background: linear-gradient(90deg,\n var(--color-bg-subtle) 25%,\n var(--color-border-default) 37%,\n var(--color-bg-subtle) 63%);\n background-size: 200% 100%;\n animation: lintje-shimmer var(--dur-skeleton) linear infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n .lintje-skeleton { animation: none; background: var(--color-bg-subtle); }\n}\n\n/* Forced colours: the gradient is dropped, so the placeholder keeps a 1 px GrayText line. */\n@media (forced-colors: active) {\n .lintje-skeleton { outline: 1px solid GrayText; outline-offset: -1px; }\n}\n", Er = class extends j {
2096
2214
  constructor(...e) {
2097
2215
  super(...e), this.width = "100%", this.height = 12;
2098
2216
  }
2099
2217
  static {
2100
- this.styles = A(fr);
2218
+ this.styles = A(Tr);
2101
2219
  }
2102
2220
  static {
2103
2221
  this.properties = {
@@ -2106,25 +2224,57 @@ var fr = "/* The size is on the host so a percentage has a box to resolve agains
2106
2224
  };
2107
2225
  }
2108
2226
  willUpdate(e) {
2109
- super.willUpdate(e), this.style.width = sr(this.width) ?? "", this.style.height = sr(this.height) ?? "";
2227
+ super.willUpdate(e), this.style.width = yr(this.width) ?? "", this.style.height = yr(this.height) ?? "";
2110
2228
  }
2111
2229
  render() {
2112
2230
  return C`<span class="lintje-skeleton" aria-hidden="true"></span>`;
2113
2231
  }
2114
2232
  };
2115
- M("lintje-skeleton", pr);
2233
+ M("lintje-skeleton", Er);
2234
+ //#endregion
2235
+ //#region src/primitives/shared/empty-state-block.ts
2236
+ var Dr = A(".lintje-empty-state {\n display: flex; flex-direction: column; align-items: center;\n gap: var(--space-2);\n padding: var(--space-8) var(--space-4);\n text-align: center;\n font: var(--text-ui);\n color: var(--color-text-primary);\n}\n.lintje-empty-state__icon { color: var(--color-text-muted); }\n.lintje-empty-state__heading {\n margin: var(--space-1) 0 0;\n font: var(--text-tile-title);\n color: var(--color-text-primary);\n}\n.lintje-empty-state__text {\n max-width: 280px;\n margin: 0;\n color: var(--color-text-muted);\n}\n.lintje-empty-state__action { margin-top: var(--space-2); }\n\n.lintje-empty-state--compact {\n display: block;\n padding: var(--space-4);\n text-align: left;\n color: var(--color-text-muted);\n}\n\n/* Phone: the action runs the full width. */\n@media screen and (max-width: 767px) {\n .lintje-empty-state:not(.lintje-empty-state--compact) .lintje-empty-state__action {\n align-self: stretch;\n }\n}\n");
2237
+ function Or(e, t) {
2238
+ switch (t) {
2239
+ case 2: return C`<h2 class="lintje-empty-state__heading">${e}</h2>`;
2240
+ case 4: return C`<h4 class="lintje-empty-state__heading">${e}</h4>`;
2241
+ case 5: return C`<h5 class="lintje-empty-state__heading">${e}</h5>`;
2242
+ case 6: return C`<h6 class="lintje-empty-state__heading">${e}</h6>`;
2243
+ default: return C`<h3 class="lintje-empty-state__heading">${e}</h3>`;
2244
+ }
2245
+ }
2246
+ function kr(e) {
2247
+ let t = e.status ? "status" : T, n = !!e.status && !e.filled;
2248
+ return e.compact ? C`<div class="lintje-empty-state lintje-empty-state--compact" role=${t}>
2249
+ ${n ? T : C`${e.text ?? T} ${e.action ?? T}`}
2250
+ </div>` : C`<div class="lintje-empty-state" role=${t}>
2251
+ ${n ? T : Ar(e)}
2252
+ </div>`;
2253
+ }
2254
+ function Ar(e) {
2255
+ return C`${e.icon ? K(e.icon, {
2256
+ size: 40,
2257
+ className: "lintje-empty-state__icon"
2258
+ }) : T}
2259
+ ${e.heading ? Or(e.heading, e.level ?? 3) : T}
2260
+ ${e.text ? C`<p class="lintje-empty-state__text">${e.text}</p>` : T}
2261
+ ${e.action === void 0 ? T : C`<div class="lintje-empty-state__action" ?hidden=${!e.actionShown}>
2262
+ ${e.action}
2263
+ </div>`}`;
2264
+ }
2116
2265
  //#endregion
2117
2266
  //#region src/primitives/tile/tile.css?inline
2118
- var mr = "/*\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.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; font: var(--text-small); color: var(--color-text-muted); gap: var(--space-3); }\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 (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", hr = ".lintje-announcement {\n container-type: inline-size;\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-4);\n border-radius: var(--radius);\n}\n.lintje-announcement.is-compact { padding: 10px var(--space-3); gap: var(--space-2); }\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@container (min-width: 560px) {\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--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 (max-width: 767px) {\n .lintje-announcement { padding: 10px var(--space-3); gap: var(--space-2); }\n .lintje-announcement__title { font: var(--text-tile-title); color: var(--color-text-primary); }\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", gr = "Gegevens laden…", _r = class e extends ar {
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 {
2119
2268
  constructor(...e) {
2120
- 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.filled = null, this.#e = 0;
2269
+ 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;
2121
2270
  }
2122
2271
  static {
2123
2272
  this.styles = [
2124
- ir,
2273
+ cr,
2125
2274
  G,
2126
- A(mr),
2127
- A(hr)
2275
+ A(jr),
2276
+ mr,
2277
+ Dr
2128
2278
  ];
2129
2279
  }
2130
2280
  static {
@@ -2161,6 +2311,10 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2161
2311
  reflect: !0
2162
2312
  },
2163
2313
  flush: { type: Boolean },
2314
+ breakable: {
2315
+ type: Boolean,
2316
+ reflect: !0
2317
+ },
2164
2318
  filled: { state: !0 }
2165
2319
  };
2166
2320
  }
@@ -2172,7 +2326,7 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2172
2326
  this.#e && cancelAnimationFrame(this.#e), this.#e = 0, super.disconnectedCallback();
2173
2327
  }
2174
2328
  get regionText() {
2175
- return this.state === "error" ? this.message ?? "" : this.state === "loading" ? gr : null;
2329
+ return this.state === "error" || this.state === "empty" ? this.message ?? "" : this.state === "loading" ? Mr : null;
2176
2330
  }
2177
2331
  willUpdate(e) {
2178
2332
  super.willUpdate(e), e.has("state") && (this.filled = null);
@@ -2207,7 +2361,7 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2207
2361
  "lintje-tile__heading--icon": !!this.icon
2208
2362
  })}
2209
2363
  >
2210
- ${hn(this.icon, "lintje-tile__icon")}
2364
+ ${mn(this.icon, "lintje-tile__icon")}
2211
2365
  ${this.heading ? C`<h3 id=${t ?? T} class="lintje-tile__title">${this.heading}</h3>` : T}
2212
2366
  ${this.subtitle ? C`<p class="lintje-tile__sub">${this.subtitle}</p>` : T}
2213
2367
  </div>
@@ -2251,44 +2405,45 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2251
2405
  </section>`;
2252
2406
  }
2253
2407
  content() {
2254
- let e = sr(this.contentHeight);
2408
+ let e = yr(this.contentHeight);
2255
2409
  switch (this.state) {
2256
2410
  case "loading": return C`<div ${B({ height: e })} role="status">
2257
- <span class="visually-hidden">${this.filled === gr ? gr : T}</span>
2411
+ <span class="visually-hidden">${this.filled === Mr ? Mr : T}</span>
2258
2412
  <slot name="loading"><lintje-skeleton height="100%"></lintje-skeleton></slot>
2259
2413
  </div>`;
2260
2414
  case "empty": return C`<div class="lintje-chart-state lintje-chart-state--empty" ${B({ height: e })}>
2261
- <p>${this.message}</p>
2415
+ ${kr({
2416
+ text: this.message,
2417
+ compact: !0,
2418
+ status: !0,
2419
+ filled: this.filled === this.regionText
2420
+ })}
2262
2421
  </div>`;
2263
2422
  case "error": return C`<div
2264
2423
  class="lintje-chart-state lintje-chart-state--error"
2265
2424
  ${B({ minHeight: e })}
2266
2425
  >
2267
- <div class="lintje-announcement lintje-announcement--warning" role="status">
2268
- <span class="lintje-announcement__icon" aria-hidden="true"
2269
- >${K("functioneel-waarschuwing", { size: 16 })}</span
2270
- >
2271
- <div class="lintje-announcement__body">
2272
- ${this.filled === this.regionText ? C`<p class="lintje-announcement__text">
2273
- <span class="visually-hidden">Waarschuwing: </span>${this.message}
2274
- </p>` : T}
2275
- </div>
2276
- </div>
2426
+ ${hr({
2427
+ kind: "warning",
2428
+ text: this.message,
2429
+ live: !0,
2430
+ filled: this.filled === this.regionText
2431
+ })}
2277
2432
  ${this.lastKnown ? C`<div class="lintje-chart-state__last-known">${this.lastKnown}</div>` : T}
2278
2433
  </div>`;
2279
2434
  default: return C`<slot></slot>`;
2280
2435
  }
2281
2436
  }
2282
2437
  };
2283
- M("lintje-tile", _r);
2438
+ M("lintje-tile", Nr);
2284
2439
  //#endregion
2285
2440
  //#region src/primitives/grid/grid.css?inline
2286
- var vr = "/*\n * Written with `:host(…)` and `::slotted()`: a selector from outside cannot reach into an item's\n * own root. An item's width comes from `--lintje-span`, so a media rule can override `grid-column`.\n */\n\n/* --- The grid ------------------------------------------------------------ */\n:host {\n display: grid;\n grid-template-columns: repeat(var(--lintje-grid-columns, 12), minmax(0, 1fr));\n gap: var(--grid-gutter);\n align-items: stretch;\n}\n:host([hidden]) { display: none; }\n\n@media (min-width: 768px) and (max-width: 1023px) {\n :host([variant='kpi-row']) { grid-template-columns: repeat(3, minmax(0, 1fr)); }\n}\n@media (max-width: 767px) {\n :host { grid-template-columns: minmax(0, 1fr); }\n :host([variant='kpi-row']) { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n/* --- Every item its column ------------------------------------------------ */\n\n::slotted([span]) {\n min-width: 0;\n grid-column: span var(--lintje-span, 1);\n}\n\n@media (min-width: 768px) and (max-width: 1023px) {\n ::slotted([span='4']) { grid-column: span 6; }\n ::slotted([span='8']) { grid-column: span 12; }\n}\n@media (max-width: 767px) {\n ::slotted([span]) { grid-column: span 1; }\n}\n", yr = class extends j {
2441
+ var Pr = "/*\n * Written with `:host(…)` and `::slotted()`: a selector from outside cannot reach into an item's\n * own root. An item's width comes from `--lintje-span`, so a media rule can override `grid-column`.\n */\n\n/* --- The grid ------------------------------------------------------------ */\n:host {\n display: grid;\n grid-template-columns: repeat(var(--lintje-grid-columns, 12), minmax(0, 1fr));\n gap: var(--grid-gutter);\n align-items: stretch;\n}\n:host([hidden]) { display: none; }\n\n@media (min-width: 768px) and (max-width: 1023px), print and (max-width: 1023px) {\n :host([variant='kpi-row']) { grid-template-columns: repeat(3, minmax(0, 1fr)); }\n}\n@media screen and (max-width: 767px) {\n :host { grid-template-columns: minmax(0, 1fr); }\n :host([variant='kpi-row']) { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n/* --- Every item its column ------------------------------------------------ */\n\n::slotted([span]) {\n min-width: 0;\n grid-column: span var(--lintje-span, 1);\n}\n\n@media (min-width: 768px) and (max-width: 1023px), print and (max-width: 1023px) {\n ::slotted([span='4']) { grid-column: span 6; }\n ::slotted([span='8']) { grid-column: span 12; }\n}\n@media screen and (max-width: 767px) {\n ::slotted([span]) { grid-column: span 1; }\n}\n", Fr = class extends j {
2287
2442
  constructor(...e) {
2288
2443
  super(...e), this.columns = 12;
2289
2444
  }
2290
2445
  static {
2291
- this.styles = A(vr);
2446
+ this.styles = A(Pr);
2292
2447
  }
2293
2448
  static {
2294
2449
  this.properties = {
@@ -2306,45 +2461,45 @@ var vr = "/*\n * Written with `:host(…)` and `::slotted()`: a selector from ou
2306
2461
  return C`<slot></slot>`;
2307
2462
  }
2308
2463
  };
2309
- M("lintje-grid", yr);
2464
+ M("lintje-grid", Fr);
2310
2465
  //#endregion
2311
2466
  //#region src/primitives/grid-item/grid-item.ts
2312
- var br = class extends ar {
2467
+ var Ir = class extends lr {
2313
2468
  static {
2314
- this.styles = ir;
2469
+ this.styles = cr;
2315
2470
  }
2316
2471
  render() {
2317
2472
  return C`<slot></slot>`;
2318
2473
  }
2319
2474
  };
2320
- M("lintje-grid-item", br);
2475
+ M("lintje-grid-item", Ir);
2321
2476
  //#endregion
2322
2477
  //#region src/icons/visible.ts
2323
- var xr = "400px", Sr = /* @__PURE__ */ new WeakMap(), X = null, Cr = !1;
2324
- function wr() {
2325
- return X || Cr ? X : typeof IntersectionObserver == "function" ? (X = new IntersectionObserver((e) => {
2478
+ var Lr = "400px", Rr = /* @__PURE__ */ new WeakMap(), X = null, zr = !1;
2479
+ function Br() {
2480
+ return X || zr ? X : typeof IntersectionObserver == "function" ? (X = new IntersectionObserver((e) => {
2326
2481
  for (let t of e) {
2327
2482
  if (!t.isIntersecting) continue;
2328
- let e = Sr.get(t.target);
2329
- Er(t.target), e?.();
2483
+ let e = Rr.get(t.target);
2484
+ Hr(t.target), e?.();
2330
2485
  }
2331
- }, { rootMargin: xr }), X) : (Cr = !0, null);
2486
+ }, { rootMargin: Lr }), X) : (zr = !0, null);
2332
2487
  }
2333
- function Tr(e, t) {
2334
- let n = wr();
2335
- n ? (Sr.set(e, t), n.observe(e)) : t();
2488
+ function Vr(e, t) {
2489
+ let n = Br();
2490
+ n ? (Rr.set(e, t), n.observe(e)) : t();
2336
2491
  }
2337
- function Er(e) {
2338
- Sr.delete(e), X?.unobserve(e);
2492
+ function Hr(e) {
2493
+ Rr.delete(e), X?.unobserve(e);
2339
2494
  }
2340
2495
  //#endregion
2341
2496
  //#region src/icons/icon/icon.css?inline
2342
- var Dr = "/* `<lintje-icon>`'s own box: the host is the flex child; the glyph inside is a plain block. */\n:host {\n display: inline-flex;\n flex: none;\n}\n:host([hidden]) { display: none; }\n.lintje-icon {\n display: block;\n}\n", Or = Object.keys(It), kr = class extends j {
2497
+ var Ur = "/* `<lintje-icon>`'s own box: the host is the flex child; the glyph inside is a plain block. */\n:host {\n display: inline-flex;\n flex: none;\n}\n:host([hidden]) { display: none; }\n.lintje-icon {\n display: block;\n}\n", Wr = Object.keys(Ft), Gr = class extends j {
2343
2498
  constructor(...e) {
2344
2499
  super(...e), this.size = 16, this.lazy = !1, this.#e = null, this.#t = !1;
2345
2500
  }
2346
2501
  static {
2347
- this.styles = [G, A(Dr)];
2502
+ this.styles = [G, A(Ur)];
2348
2503
  }
2349
2504
  static {
2350
2505
  this.properties = {
@@ -2358,14 +2513,14 @@ var Dr = "/* `<lintje-icon>`'s own box: the host is the flex child; the glyph in
2358
2513
  #e;
2359
2514
  #t;
2360
2515
  connectedCallback() {
2361
- super.connectedCallback(), this.#e = on((e) => {
2516
+ super.connectedCallback(), this.#e = an((e) => {
2362
2517
  (e === void 0 || e === this.name) && this.requestUpdate();
2363
- }), this.lazy && !this.#t && Tr(this, () => {
2518
+ }), this.lazy && !this.#t && Vr(this, () => {
2364
2519
  this.#t = !0, this.requestUpdate();
2365
2520
  });
2366
2521
  }
2367
2522
  disconnectedCallback() {
2368
- this.#e?.(), this.#e = null, Er(this), super.disconnectedCallback();
2523
+ this.#e?.(), this.#e = null, Hr(this), super.disconnectedCallback();
2369
2524
  }
2370
2525
  render() {
2371
2526
  return K(this.name, {
@@ -2376,37 +2531,38 @@ var Dr = "/* `<lintje-icon>`'s own box: the host is the flex child; the glyph in
2376
2531
  });
2377
2532
  }
2378
2533
  };
2379
- M("lintje-icon", kr);
2534
+ M("lintje-icon", Gr);
2380
2535
  //#endregion
2381
2536
  //#region src/core/motion.ts
2382
- function Ar(e, t) {
2537
+ function Kr(e, t) {
2383
2538
  let n = getComputedStyle(e).getPropertyValue(t).trim(), r = parseFloat(n);
2384
2539
  return Number.isFinite(r) ? n.endsWith("ms") ? r : n.endsWith("s") ? r * 1e3 : r : 0;
2385
2540
  }
2386
- function jr() {
2541
+ function qr(e, t) {
2542
+ let n = getComputedStyle(e).getPropertyValue(t).trim(), r = /^cubic-bezier\(([^)]+)\)$/.exec(n)?.[1].split(",").map(Number);
2543
+ if (!r || r.length !== 4 || r.some((e) => !Number.isFinite(e))) return (e) => e;
2544
+ let [i, a, o, s] = r, c = (e, t, n) => 3 * e * n * (1 - n) ** 2 + 3 * t * n * n * (1 - n) + n ** 3;
2545
+ return (e) => {
2546
+ if (e <= 0 || e >= 1) return Math.min(1, Math.max(0, e));
2547
+ let t = 0, n = 1;
2548
+ for (let r = 0; r < 24; r++) {
2549
+ let r = (t + n) / 2;
2550
+ c(i, o, r) < e ? t = r : n = r;
2551
+ }
2552
+ return c(a, s, (t + n) / 2);
2553
+ };
2554
+ }
2555
+ function Jr() {
2387
2556
  return typeof matchMedia < "u" && matchMedia("(prefers-reduced-motion: reduce)").matches;
2388
2557
  }
2389
2558
  //#endregion
2390
2559
  //#region src/primitives/progress-bar/progress-bar.css?inline
2391
- var Mr = ":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", Nr = {
2392
- done: {
2393
- word: "klaar",
2394
- icon: "functioneel-cirkel-vinkje"
2395
- },
2396
- error: {
2397
- word: "mislukt",
2398
- icon: "functioneel-waarschuwing"
2399
- },
2400
- paused: {
2401
- word: "gepauzeerd",
2402
- icon: "multimedia-player-pauze"
2403
- }
2404
- }, Pr = class extends j {
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 {
2405
2561
  constructor(...e) {
2406
- super(...e), this.label = "", this.hideLabel = !1, this.tone = "run";
2562
+ super(...e), this.label = "", this.hideLabel = !1, this.state = "busy";
2407
2563
  }
2408
2564
  static {
2409
- this.styles = [G, A(Mr)];
2565
+ this.styles = [G, A(Yr)];
2410
2566
  }
2411
2567
  static {
2412
2568
  this.properties = {
@@ -2417,7 +2573,7 @@ var Mr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: no
2417
2573
  attribute: "hide-label"
2418
2574
  },
2419
2575
  detail: { type: String },
2420
- tone: {
2576
+ state: {
2421
2577
  type: String,
2422
2578
  reflect: !0
2423
2579
  }
@@ -2429,14 +2585,17 @@ var Mr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: no
2429
2585
  get percent() {
2430
2586
  return Math.max(0, Math.min(100, this.value ?? 0));
2431
2587
  }
2432
- get resolvedTone() {
2433
- return this.tone === "run" && this.known && this.percent >= 100 ? "done" : this.tone;
2588
+ get resolvedState() {
2589
+ return this.state === "busy" && this.known && this.percent >= 100 ? "done" : this.state;
2434
2590
  }
2435
2591
  valueText(e) {
2436
2592
  return [this.detail ?? (e && this.known ? `${this.percent}%` : void 0), e?.word].filter(Boolean).join(", ") || void 0;
2437
2593
  }
2438
2594
  render() {
2439
- let e = this.resolvedTone, t = Nr[e], n = !this.hideLabel && (this.label || this.detail);
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);
2440
2599
  return C`<div class=${q({
2441
2600
  "lintje-progress": !0,
2442
2601
  [`lintje-progress--${e}`]: !0
@@ -2470,14 +2629,14 @@ var Mr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: no
2470
2629
  </div>`;
2471
2630
  }
2472
2631
  };
2473
- M("lintje-progress-bar", Pr);
2632
+ M("lintje-progress-bar", Xr);
2474
2633
  //#endregion
2475
2634
  //#region node_modules/lit-html/directives/repeat.js
2476
- var Fr = (e, t, n) => {
2635
+ var Zr = (e, t, n) => {
2477
2636
  let r = /* @__PURE__ */ new Map();
2478
2637
  for (let i = t; i <= n; i++) r.set(e[i], i);
2479
2638
  return r;
2480
- }, Ir = R(class extends z {
2639
+ }, Qr = R(class extends z {
2481
2640
  constructor(e) {
2482
2641
  if (super(e), e.type !== L.CHILD) throw Error("repeat() can only be used in text expressions");
2483
2642
  }
@@ -2495,7 +2654,7 @@ var Fr = (e, t, n) => {
2495
2654
  return this.dt(e, t, n).values;
2496
2655
  }
2497
2656
  update(e, [t, n, r]) {
2498
- let i = In(e), { values: a, keys: o } = this.dt(t, n, r);
2657
+ let i = Bn(e), { values: a, keys: o } = this.dt(t, n, r);
2499
2658
  if (!Array.isArray(i)) return this.ut = o, a;
2500
2659
  let s = this.ut ??= [], c = [], l, u, d = 0, f = i.length - 1, p = 0, m = a.length - 1;
2501
2660
  for (; d <= f && p <= m;) if (i[d] === null) d++;
@@ -2504,7 +2663,7 @@ var Fr = (e, t, n) => {
2504
2663
  else if (s[f] === o[m]) c[m] = Y(i[f], a[m]), f--, m--;
2505
2664
  else if (s[d] === o[m]) c[m] = Y(i[d], a[m]), J(e, c[m + 1], i[d]), d++, m--;
2506
2665
  else if (s[f] === o[p]) c[p] = Y(i[f], a[p]), J(e, i[d], i[f]), f--, p++;
2507
- else if (l === void 0 && (l = Fr(o, p, m), u = Fr(s, d, f)), l.has(s[d])) {
2666
+ else if (l === void 0 && (l = Zr(o, p, m), u = Zr(s, d, f)), l.has(s[d])) {
2508
2667
  if (l.has(s[f])) {
2509
2668
  let t = u.get(o[p]), n = t === void 0 ? null : i[t];
2510
2669
  if (n === null) {
@@ -2512,22 +2671,22 @@ var Fr = (e, t, n) => {
2512
2671
  Y(t, a[p]), c[p] = t;
2513
2672
  } else c[p] = Y(n, a[p]), J(e, i[d], n), i[t] = null;
2514
2673
  p++;
2515
- } else Ln(i[f]), f--;
2516
- } else Ln(i[d]), d++;
2674
+ } else Vn(i[f]), f--;
2675
+ } else Vn(i[d]), d++;
2517
2676
  for (; p <= m;) {
2518
2677
  let t = J(e, c[m + 1]);
2519
2678
  Y(t, a[p]), c[p++] = t;
2520
2679
  }
2521
2680
  for (; d <= f;) {
2522
2681
  let e = i[d++];
2523
- e !== null && Ln(e);
2682
+ e !== null && Vn(e);
2524
2683
  }
2525
- return this.ut = o, Fn(e, c), w;
2684
+ return this.ut = o, zn(e, c), w;
2526
2685
  }
2527
- }), Lr = R(class extends z {
2686
+ }), $r = R(class extends z {
2528
2687
  constructor(e) {
2529
2688
  if (super(e), e.type !== L.PROPERTY && e.type !== L.ATTRIBUTE && e.type !== L.BOOLEAN_ATTRIBUTE) throw Error("The `live` directive is not allowed on child or event bindings");
2530
- if (!Mn(e)) throw Error("`live` bindings can only contain a single expression");
2689
+ if (!In(e)) throw Error("`live` bindings can only contain a single expression");
2531
2690
  }
2532
2691
  render(e) {
2533
2692
  return e;
@@ -2540,53 +2699,53 @@ var Fr = (e, t, n) => {
2540
2699
  } else if (e.type === L.BOOLEAN_ATTRIBUTE) {
2541
2700
  if (!!t === n.hasAttribute(r)) return w;
2542
2701
  } else if (e.type === L.ATTRIBUTE && n.getAttribute(r) === t + "") return w;
2543
- return Fn(e), t;
2702
+ return zn(e), t;
2544
2703
  }
2545
2704
  }), Z = (e, t) => {
2546
2705
  let n = e._$AN;
2547
2706
  if (n === void 0) return !1;
2548
2707
  for (let e of n) e._$AO?.(t, !1), Z(e, t);
2549
2708
  return !0;
2550
- }, Rr = (e) => {
2709
+ }, ei = (e) => {
2551
2710
  let t, n;
2552
2711
  do {
2553
2712
  if ((t = e._$AM) === void 0) break;
2554
2713
  n = t._$AN, n.delete(e), e = t;
2555
2714
  } while (n?.size === 0);
2556
- }, zr = (e) => {
2715
+ }, ti = (e) => {
2557
2716
  for (let t; t = e._$AM; e = t) {
2558
2717
  let n = t._$AN;
2559
2718
  if (n === void 0) t._$AN = n = /* @__PURE__ */ new Set();
2560
2719
  else if (n.has(e)) break;
2561
- n.add(e), Hr(t);
2720
+ n.add(e), ii(t);
2562
2721
  }
2563
2722
  };
2564
- function Br(e) {
2565
- this._$AN === void 0 ? this._$AM = e : (Rr(this), this._$AM = e, zr(this));
2723
+ function ni(e) {
2724
+ this._$AN === void 0 ? this._$AM = e : (ei(this), this._$AM = e, ti(this));
2566
2725
  }
2567
- function Vr(e, t = !1, n = 0) {
2726
+ function ri(e, t = !1, n = 0) {
2568
2727
  let r = this._$AH, i = this._$AN;
2569
2728
  if (i !== void 0 && i.size !== 0) {
2570
2729
  if (t) {
2571
- if (Array.isArray(r)) for (let e = n; e < r.length; e++) Z(r[e], !1), Rr(r[e]);
2572
- else r != null && (Z(r, !1), Rr(r));
2730
+ if (Array.isArray(r)) for (let e = n; e < r.length; e++) Z(r[e], !1), ei(r[e]);
2731
+ else r != null && (Z(r, !1), ei(r));
2573
2732
  } else Z(this, e);
2574
2733
  }
2575
2734
  }
2576
- var Hr = (e) => {
2577
- e.type == L.CHILD && (e._$AP ??= Vr, e._$AQ ??= Br);
2578
- }, Ur = class extends z {
2735
+ var ii = (e) => {
2736
+ e.type == L.CHILD && (e._$AP ??= ri, e._$AQ ??= ni);
2737
+ }, ai = class extends z {
2579
2738
  constructor() {
2580
2739
  super(...arguments), this._$AN = void 0;
2581
2740
  }
2582
2741
  _$AT(e, t, n) {
2583
- super._$AT(e, t, n), zr(this), this.isConnected = e._$AU;
2742
+ super._$AT(e, t, n), ti(this), this.isConnected = e._$AU;
2584
2743
  }
2585
2744
  _$AO(e, t = !0) {
2586
- e !== this.isConnected && (this.isConnected = e, e ? this.reconnected?.() : this.disconnected?.()), t && (Z(this, e), Rr(this));
2745
+ e !== this.isConnected && (this.isConnected = e, e ? this.reconnected?.() : this.disconnected?.()), t && (Z(this, e), ei(this));
2587
2746
  }
2588
2747
  setValue(e) {
2589
- if (Mn(this._$Ct)) this._$Ct._$AI(e, this);
2748
+ if (In(this._$Ct)) this._$Ct._$AI(e, this);
2590
2749
  else {
2591
2750
  let t = [...this._$Ct._$AH];
2592
2751
  t[this._$Ci] = e, this._$Ct._$AI(t, this, 0);
@@ -2594,7 +2753,7 @@ var Hr = (e) => {
2594
2753
  }
2595
2754
  disconnected() {}
2596
2755
  reconnected() {}
2597
- }, Wr = /* @__PURE__ */ new WeakMap(), Gr = R(class extends Ur {
2756
+ }, oi = /* @__PURE__ */ new WeakMap(), si = R(class extends ai {
2598
2757
  render(e) {
2599
2758
  return T;
2600
2759
  }
@@ -2605,13 +2764,13 @@ var Hr = (e) => {
2605
2764
  rt(e) {
2606
2765
  if (this.G !== void 0) {
2607
2766
  if (this.isConnected || (e = void 0), typeof this.G == "function") {
2608
- let t = this.ht ?? globalThis, n = Wr.get(t);
2609
- n === void 0 && (n = /* @__PURE__ */ new WeakMap(), Wr.set(t, n)), n.get(this.G) !== void 0 && this.G.call(this.ht, void 0), n.set(this.G, e), e !== void 0 && this.G.call(this.ht, e);
2767
+ let t = this.ht ?? globalThis, n = oi.get(t);
2768
+ n === void 0 && (n = /* @__PURE__ */ new WeakMap(), oi.set(t, n)), n.get(this.G) !== void 0 && this.G.call(this.ht, void 0), n.set(this.G, e), e !== void 0 && this.G.call(this.ht, e);
2610
2769
  } else this.G.value = e;
2611
2770
  }
2612
2771
  }
2613
2772
  get lt() {
2614
- return typeof this.G == "function" ? Wr.get(this.ht ?? globalThis)?.get(this.G) : this.G?.value;
2773
+ return typeof this.G == "function" ? oi.get(this.ht ?? globalThis)?.get(this.G) : this.G?.value;
2615
2774
  }
2616
2775
  disconnected() {
2617
2776
  this.lt === this.ct && this.rt(void 0);
@@ -2619,7 +2778,20 @@ var Hr = (e) => {
2619
2778
  reconnected() {
2620
2779
  this.rt(this.ct);
2621
2780
  }
2622
- });
2781
+ }), ci = /* @__PURE__ */ new Set(), li = !1;
2782
+ function ui() {
2783
+ for (let e of ci) e();
2784
+ }
2785
+ function di(e) {
2786
+ return !li && typeof window < "u" && (window.addEventListener("beforeprint", ui), li = !0), ci.add(e), () => ci.delete(e);
2787
+ }
2788
+ var fi = /* @__PURE__ */ new Set(), pi = null;
2789
+ function mi(e) {
2790
+ for (let t of fi) t(e.matches);
2791
+ }
2792
+ function hi(e) {
2793
+ return !pi && typeof matchMedia < "u" && (pi = matchMedia("print"), pi.addEventListener("change", mi)), fi.add(e), () => fi.delete(e);
2794
+ }
2623
2795
  //#endregion
2624
2796
  //#region src/core/format.ts
2625
2797
  function Q(e, t = 0) {
@@ -2628,37 +2800,37 @@ function Q(e, t = 0) {
2628
2800
  maximumFractionDigits: t
2629
2801
  });
2630
2802
  }
2631
- function Kr(e) {
2803
+ function gi(e) {
2632
2804
  return Math.abs(e) >= 1e6 ? `${Q(e / 1e6, 1)} mln` : Math.abs(e) >= 1e4 ? `${Math.round(e / 1e3)}k` : Q(e);
2633
2805
  }
2634
- function qr(e, t) {
2806
+ function _i(e, t) {
2635
2807
  let n = Q(e);
2636
- return Yr(n, t) ? n : Kr(e);
2808
+ return yi(n, t) ? n : gi(e);
2637
2809
  }
2638
- var Jr = 6.5;
2639
- function Yr(e, t) {
2640
- return e.length * Jr <= t;
2810
+ var vi = 6.5;
2811
+ function yi(e, t) {
2812
+ return e.length * vi <= t;
2641
2813
  }
2642
- var Xr = "'RijksSans', 'Source Sans 3', sans-serif", $;
2643
- function Zr(e, t, n = "") {
2644
- if (Qr(e, n) <= t) return e;
2814
+ var bi = "'RijksSans', 'Source Sans 3', sans-serif", $;
2815
+ function xi(e, t, n = "") {
2816
+ if (Si(e, n) <= t) return e;
2645
2817
  let r = e.length;
2646
2818
  for (; r > 1;) {
2647
2819
  --r;
2648
2820
  let i = `${e.slice(0, r).trimEnd()}…`;
2649
- if (Qr(i, n) <= t) return i;
2821
+ if (Si(i, n) <= t) return i;
2650
2822
  }
2651
2823
  return "…";
2652
2824
  }
2653
- function Qr(e, t = "", n = 400) {
2654
- return $ === void 0 && ($ = typeof document > "u" ? null : document.createElement("canvas").getContext("2d") ?? null), $ ? ($.font = `${n} 12px ${t.trim() || Xr}`, $.measureText(e).width) : e.length * Jr;
2825
+ function Si(e, t = "", n = 400) {
2826
+ return $ === void 0 && ($ = typeof document > "u" ? null : document.createElement("canvas").getContext("2d") ?? null), $ ? ($.font = `${n} 12px ${t.trim() || bi}`, $.measureText(e).width) : e.length * vi;
2655
2827
  }
2656
- function $r(e, t = 0) {
2828
+ function Ci(e, t = 0) {
2657
2829
  return `${Q(e, t)}%`;
2658
2830
  }
2659
2831
  //#endregion
2660
2832
  //#region src/tokens/colors.ts
2661
- var ei = [
2833
+ var wi = [
2662
2834
  "sky-blue",
2663
2835
  "dark-yellow",
2664
2836
  "red",
@@ -2677,11 +2849,11 @@ var ei = [
2677
2849
  "light-blue",
2678
2850
  "moss-green"
2679
2851
  ];
2680
- function ti(e) {
2681
- return typeof e == "string" && ei.includes(e);
2852
+ function Ti(e) {
2853
+ return typeof e == "string" && wi.includes(e);
2682
2854
  }
2683
- function ni(e) {
2855
+ function Ei(e) {
2684
2856
  return `var(--color-chart-${e})`;
2685
2857
  }
2686
2858
  //#endregion
2687
- export { G as $, nr as A, pt as At, zn as B, M as Bt, pr as C, Ct, cr as D, dt as Dt, ur as E, _t as Et, Yn as F, ot as Ft, On as G, T as Gt, wn as H, A as Ht, qn as I, et as It, bn as J, Ce as Jt, Cn as K, Ie as Kt, Kn as L, it as Lt, er as M, ct as Mt, Zn as N, lt as Nt, ar as O, ft as Ot, Qn as P, st as Pt, mn as Q, Vn as R, tt as Rt, hr as S, Mt as St, dr as T, gt as Tt, kn as U, Ve as Ut, Rn as V, We as Vt, Dn as W, Ue as Wt, yn as X, e as Xt, vn as Y, o as Yt, q as Z, Or as _, Ft as _t, Kr as a, nn as at, yr as b, At as bt, $r as c, cn as ct, Gr as d, Bt as dt, K as et, Lr as f, Rt as ft, jr as g, It as gt, Ar as h, L as ht, Yr as i, ln as it, tr as j, ht as jt, ir as k, mt as kt, Qr as l, en as lt, Pr as m, z as mt, ni as n, rn as nt, qr as o, an as ot, Ir as p, R as pt, xn as q, C as qt, ti as r, tn as rt, Q as s, on as st, ei as t, hn as tt, Zr as u, B as ut, kr as v, St as vt, fr as w, Nt as wt, _r as x, Pt as xt, br as y, wt as yt, Un as z, j as zt };
2859
+ 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, gi as a, e as an, _n as at, Wr as b, B as bt, Ci as c, pn as ct, di as d, mn as dt, T as en, On as et, hi 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, Si as l, G as lt, $r as m, cn as mt, Ei as n, C as nn, xn as nt, _i as o, vn as ot, si as p, en as pt, Hn as q, tt as qt, Ti as r, Ce as rn, bn as rt, Q as s, q as st, wi as t, Ie as tn, Cn as tt, xi 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 };