lintje 0.1.1 → 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 (312) hide show
  1. package/README.md +2 -2
  2. package/dist-elements/actions.js +1 -1
  3. package/dist-elements/charts.js +1 -1
  4. package/dist-elements/chunks/{base-rBLTcEIv.js → base-CbmWxUig.js} +538 -337
  5. package/dist-elements/chunks/{controls-B1455oPG.js → controls-DxmnDSBr.js} +6 -0
  6. package/dist-elements/chunks/{date-format-B5DPGjAw.js → date-format-mHtZyBys.js} +28 -2
  7. package/dist-elements/chunks/dialog-DChINFxD.js +28 -0
  8. package/dist-elements/chunks/disclosure-D39vAR5q.js +4 -0
  9. package/dist-elements/chunks/{disclosure-CHasOudX.js → disclosure-DLkXPUpV.js} +10 -10
  10. package/dist-elements/chunks/download-Ct9q2anY.js +206 -0
  11. package/dist-elements/chunks/{focus-trap-w3vCamJ6.js → focus-trap-BwOxE5BX.js} +1 -1
  12. package/dist-elements/chunks/input-CRW_exv_.js +195 -0
  13. package/dist-elements/chunks/{player-Bq9YGnpt.js → player-B8QXJ0Z5.js} +35 -35
  14. package/dist-elements/chunks/{sentence-CLNJOeXz.js → sentence-B19AyZBS.js} +1 -1
  15. package/dist-elements/chunks/{stagger-9hYzxhMG.js → stagger-BHoOgy0g.js} +163 -135
  16. package/dist-elements/core.js +1 -1
  17. package/dist-elements/custom-elements.json +2049 -1329
  18. package/dist-elements/data-types.json +6798 -0
  19. package/dist-elements/feedback.js +2 -1
  20. package/dist-elements/frame.js +0 -2
  21. package/dist-elements/guides/dashboard.md +9 -1
  22. package/dist-elements/guides/events.md +7 -7
  23. package/dist-elements/guides/loading.md +10 -9
  24. package/dist-elements/guides/page-contents.md +110 -0
  25. package/dist-elements/guides/start.md +13 -1
  26. package/dist-elements/inputs.js +3 -1
  27. package/dist-elements/layout.js +1 -1
  28. package/dist-elements/lintje.js +24508 -23210
  29. package/dist-elements/map.js +1 -1
  30. package/dist-elements/overlays.js +2 -2
  31. package/dist-elements/skills/lintje/SKILL.md +1 -1
  32. package/dist-elements/tables.js +1 -1
  33. package/dist-elements/tag/activity-log.js +18 -18
  34. package/dist-elements/tag/ai-label.js +11 -11
  35. package/dist-elements/tag/announcement.js +36 -76
  36. package/dist-elements/tag/app-search.js +50 -50
  37. package/dist-elements/tag/audio-player.js +57 -57
  38. package/dist-elements/tag/badge.js +1 -1
  39. package/dist-elements/tag/breadcrumbs.js +20 -20
  40. package/dist-elements/tag/button.js +1 -1
  41. package/dist-elements/tag/card-list.js +12 -12
  42. package/dist-elements/tag/card.js +51 -56
  43. package/dist-elements/tag/chart.d.ts +1 -0
  44. package/dist-elements/tag/chart.js +2123 -0
  45. package/dist-elements/tag/chat-answer.js +51 -51
  46. package/dist-elements/tag/chat-composer.js +75 -71
  47. package/dist-elements/tag/chat-message.js +13 -13
  48. package/dist-elements/tag/chat-strip.js +22 -22
  49. package/dist-elements/tag/chat-suggestions.js +12 -12
  50. package/dist-elements/tag/chat.js +56 -56
  51. package/dist-elements/tag/checkbox-group.d.ts +1 -0
  52. package/dist-elements/tag/checkbox-group.js +59 -0
  53. package/dist-elements/tag/checkbox.js +4 -4
  54. package/dist-elements/tag/code.js +7 -7
  55. package/dist-elements/tag/combobox.js +18 -18
  56. package/dist-elements/tag/conflict-alert.js +12 -12
  57. package/dist-elements/tag/copy-button.js +17 -17
  58. package/dist-elements/tag/data-table.js +880 -532
  59. package/dist-elements/tag/date-input.js +44 -52
  60. package/dist-elements/tag/date-range.js +42 -42
  61. package/dist-elements/tag/description-list.js +29 -32
  62. package/dist-elements/tag/dialog.d.ts +1 -0
  63. package/dist-elements/tag/dialog.js +144 -0
  64. package/dist-elements/tag/document-viewer.js +29 -29
  65. package/dist-elements/tag/drawer.js +27 -31
  66. package/dist-elements/tag/empty-state.js +19 -30
  67. package/dist-elements/tag/error-page.d.ts +1 -0
  68. package/dist-elements/tag/error-page.js +109 -0
  69. package/dist-elements/tag/error-summary.js +16 -16
  70. package/dist-elements/tag/expander.js +7 -7
  71. package/dist-elements/tag/explainer.js +11 -11
  72. package/dist-elements/tag/field.js +7 -7
  73. package/dist-elements/tag/file-upload.js +32 -32
  74. package/dist-elements/tag/filter-bar.js +57 -57
  75. package/dist-elements/tag/filter-sheet.js +12 -12
  76. package/dist-elements/tag/filter-zone.js +31 -31
  77. package/dist-elements/tag/footer.js +21 -21
  78. package/dist-elements/tag/form-actions.js +30 -26
  79. package/dist-elements/tag/form-section.js +7 -7
  80. package/dist-elements/tag/form.js +12 -12
  81. package/dist-elements/tag/gallery.js +16 -16
  82. package/dist-elements/tag/grid-item.js +1 -1
  83. package/dist-elements/tag/grid.js +1 -1
  84. package/dist-elements/tag/hero.js +12 -12
  85. package/dist-elements/tag/highlight.js +9 -9
  86. package/dist-elements/tag/icon-button.js +1 -1
  87. package/dist-elements/tag/icon.js +1 -1
  88. package/dist-elements/tag/job-list.js +23 -45
  89. package/dist-elements/tag/kpi-row.js +14 -10
  90. package/dist-elements/tag/kpi.js +276 -77
  91. package/dist-elements/tag/level-meter.js +11 -11
  92. package/dist-elements/tag/list.js +63 -63
  93. package/dist-elements/tag/logo.js +34 -34
  94. package/dist-elements/tag/map.d.ts +1 -0
  95. package/dist-elements/tag/map.js +21935 -0
  96. package/dist-elements/tag/menu-button.js +70 -68
  97. package/dist-elements/tag/modal.js +27 -36
  98. package/dist-elements/tag/multiselect.js +33 -33
  99. package/dist-elements/tag/note.js +6 -6
  100. package/dist-elements/tag/notifications.js +36 -36
  101. package/dist-elements/tag/number-input.js +6 -6
  102. package/dist-elements/tag/page-header.js +138 -35
  103. package/dist-elements/tag/pagination.js +54 -49
  104. package/dist-elements/tag/popover.js +1 -1
  105. package/dist-elements/tag/progress-bar.js +1 -1
  106. package/dist-elements/tag/prose.js +6 -6
  107. package/dist-elements/tag/qr-code.js +8 -8
  108. package/dist-elements/tag/radio-group.js +7 -7
  109. package/dist-elements/tag/range.js +28 -28
  110. package/dist-elements/tag/recording-status.js +16 -16
  111. package/dist-elements/tag/repeater.js +10 -10
  112. package/dist-elements/tag/segmented.js +9 -9
  113. package/dist-elements/tag/select.js +6 -6
  114. package/dist-elements/tag/shell.js +356 -339
  115. package/dist-elements/tag/skeleton.js +1 -1
  116. package/dist-elements/tag/slot-picker.d.ts +1 -0
  117. package/dist-elements/tag/slot-picker.js +74 -0
  118. package/dist-elements/tag/sortable-list.js +18 -18
  119. package/dist-elements/tag/spinner.js +1 -1
  120. package/dist-elements/tag/split-pane.js +12 -12
  121. package/dist-elements/tag/status-dot.js +1 -1
  122. package/dist-elements/tag/stepper.js +21 -21
  123. package/dist-elements/tag/streaming-text.js +21 -21
  124. package/dist-elements/tag/sub-nav.js +40 -39
  125. package/dist-elements/tag/tabs.js +38 -38
  126. package/dist-elements/tag/tag-input.js +19 -19
  127. package/dist-elements/tag/text-editor.js +19 -19
  128. package/dist-elements/tag/text-input.js +6 -6
  129. package/dist-elements/tag/textarea.js +16 -16
  130. package/dist-elements/tag/tile.js +1 -1
  131. package/dist-elements/tag/time-input.js +136 -42
  132. package/dist-elements/tag/toast.js +32 -23
  133. package/dist-elements/tag/toggle.js +4 -4
  134. package/dist-elements/tag/toggletip.js +27 -27
  135. package/dist-elements/tag/tooltip.js +1 -1
  136. package/dist-elements/tag/transcript.js +47 -47
  137. package/dist-elements/tag/translator.js +13 -13
  138. package/dist-elements/tag/tree-view.js +20 -20
  139. package/dist-elements/tag/user-menu.js +42 -41
  140. package/dist-elements/tag/video-player.js +21 -21
  141. package/dist-elements/tokens.css +122 -96
  142. package/dist-elements/types/bundle/charts.d.ts +1 -1
  143. package/dist-elements/types/bundle/feedback.d.ts +1 -0
  144. package/dist-elements/types/bundle/frame.d.ts +0 -2
  145. package/dist-elements/types/bundle/index.d.ts +1 -1
  146. package/dist-elements/types/bundle/inputs.d.ts +2 -0
  147. package/dist-elements/types/bundle/map.d.ts +1 -1
  148. package/dist-elements/types/bundle/overlays.d.ts +1 -1
  149. package/dist-elements/types/components/actions/copy-button/copy-button.d.ts +6 -7
  150. package/dist-elements/types/components/actions/menu-button/menu-button.d.ts +13 -15
  151. package/dist-elements/types/components/actions/qr-code/qr-code.d.ts +9 -9
  152. package/dist-elements/types/components/charts/{chart-tile/chart-tile.d.ts → chart/chart.d.ts} +12 -11
  153. package/dist-elements/types/components/charts/kpi/gauge.d.ts +18 -0
  154. package/dist-elements/types/components/charts/kpi/kpi.d.ts +38 -5
  155. package/dist-elements/types/components/charts/kpi-row/kpi-row.d.ts +1 -7
  156. package/dist-elements/types/components/charts/note/note.d.ts +1 -1
  157. package/dist-elements/types/components/chat/chat/chat.d.ts +8 -10
  158. package/dist-elements/types/components/chat/chat-answer/chat-answer.d.ts +8 -9
  159. package/dist-elements/types/components/chat/chat-composer/chat-composer.d.ts +8 -10
  160. package/dist-elements/types/components/chat/chat-message/chat-message.d.ts +6 -7
  161. package/dist-elements/types/components/chat/chat-strip/chat-strip.d.ts +5 -5
  162. package/dist-elements/types/components/chat/chat-suggestions/chat-suggestions.d.ts +9 -10
  163. package/dist-elements/types/components/content/audio-player/audio-player.d.ts +10 -12
  164. package/dist-elements/types/components/content/code/code.d.ts +2 -3
  165. package/dist-elements/types/components/content/document-viewer/document-viewer.d.ts +8 -9
  166. package/dist-elements/types/components/content/gallery/gallery.d.ts +5 -4
  167. package/dist-elements/types/components/content/highlight/highlight.d.ts +4 -3
  168. package/dist-elements/types/components/content/prose/prose.d.ts +2 -3
  169. package/dist-elements/types/components/content/transcript/transcript.d.ts +12 -25
  170. package/dist-elements/types/components/content/translator/translator.d.ts +11 -15
  171. package/dist-elements/types/components/content/video-player/video-player.d.ts +11 -13
  172. package/dist-elements/types/components/feedback/ai-label/ai-label.d.ts +3 -4
  173. package/dist-elements/types/components/feedback/announcement/announcement.d.ts +3 -7
  174. package/dist-elements/types/components/feedback/conflict-alert/conflict-alert.d.ts +3 -4
  175. package/dist-elements/types/components/feedback/empty-state/empty-state.d.ts +5 -8
  176. package/dist-elements/types/components/feedback/error-page/error-page.d.ts +52 -0
  177. package/dist-elements/types/components/feedback/job-list/job-list.d.ts +9 -12
  178. package/dist-elements/types/components/feedback/level-meter/level-meter.d.ts +4 -6
  179. package/dist-elements/types/components/feedback/recording-status/recording-status.d.ts +5 -6
  180. package/dist-elements/types/components/feedback/streaming-text/streaming-text.d.ts +10 -7
  181. package/dist-elements/types/components/feedback/toast/toast.d.ts +8 -9
  182. package/dist-elements/types/components/filters/filter-bar/filter-bar.d.ts +9 -4
  183. package/dist-elements/types/components/filters/filter-sheet/filter-sheet.d.ts +5 -5
  184. package/dist-elements/types/components/filters/filter-zone/filter-zone.d.ts +4 -4
  185. package/dist-elements/types/components/forms/error-summary/error-summary.d.ts +5 -6
  186. package/dist-elements/types/components/forms/form/form.d.ts +5 -5
  187. package/dist-elements/types/components/forms/form-actions/form-actions.d.ts +9 -7
  188. package/dist-elements/types/components/forms/form-section/form-section.d.ts +6 -5
  189. package/dist-elements/types/components/forms/repeater/repeater.d.ts +13 -7
  190. package/dist-elements/types/components/forms/stepper/stepper.d.ts +5 -4
  191. package/dist-elements/types/components/frame/app-search/app-search.d.ts +6 -7
  192. package/dist-elements/types/components/frame/breadcrumbs/breadcrumbs.d.ts +2 -2
  193. package/dist-elements/types/components/frame/footer/footer.d.ts +3 -2
  194. package/dist-elements/types/components/frame/hero/hero.d.ts +7 -9
  195. package/dist-elements/types/components/frame/notifications/notifications.d.ts +5 -9
  196. package/dist-elements/types/components/frame/page-header/page-header.d.ts +12 -15
  197. package/dist-elements/types/components/frame/shell/shell.d.ts +14 -13
  198. package/dist-elements/types/components/frame/sub-nav/sub-nav.d.ts +10 -6
  199. package/dist-elements/types/components/frame/user-menu/user-menu.d.ts +11 -10
  200. package/dist-elements/types/components/index.d.ts +16 -14
  201. package/dist-elements/types/components/inputs/checkbox/checkbox.d.ts +4 -4
  202. package/dist-elements/types/components/inputs/checkbox-group/checkbox-group.d.ts +33 -0
  203. package/dist-elements/types/components/inputs/combobox/combobox.d.ts +12 -6
  204. package/dist-elements/types/components/inputs/date-input/date-format.d.ts +4 -0
  205. package/dist-elements/types/components/inputs/date-input/date-input.d.ts +5 -5
  206. package/dist-elements/types/components/inputs/date-range/date-range.d.ts +11 -6
  207. package/dist-elements/types/components/inputs/field/field.d.ts +5 -3
  208. package/dist-elements/types/components/inputs/file-upload/file-upload.d.ts +6 -8
  209. package/dist-elements/types/components/inputs/multiselect/multiselect.d.ts +4 -6
  210. package/dist-elements/types/components/inputs/number-input/number-input.d.ts +8 -7
  211. package/dist-elements/types/components/inputs/radio-group/radio-group.d.ts +2 -4
  212. package/dist-elements/types/components/inputs/range/range.d.ts +5 -6
  213. package/dist-elements/types/components/inputs/segmented/segmented.d.ts +7 -4
  214. package/dist-elements/types/components/inputs/select/select.d.ts +6 -3
  215. package/dist-elements/types/components/inputs/slot-picker/slot-picker.d.ts +42 -0
  216. package/dist-elements/types/components/inputs/tag-input/tag-input.d.ts +7 -5
  217. package/dist-elements/types/components/inputs/text-editor/text-editor.d.ts +6 -6
  218. package/dist-elements/types/components/inputs/text-input/text-input.d.ts +11 -6
  219. package/dist-elements/types/components/inputs/textarea/textarea.d.ts +12 -11
  220. package/dist-elements/types/components/inputs/time-input/time-format.d.ts +4 -0
  221. package/dist-elements/types/components/inputs/time-input/time-input.d.ts +25 -7
  222. package/dist-elements/types/components/inputs/toggle/toggle.d.ts +3 -1
  223. package/dist-elements/types/components/layout/expander/expander.d.ts +9 -10
  224. package/dist-elements/types/components/layout/split-pane/split-pane.d.ts +6 -6
  225. package/dist-elements/types/components/layout/tabs/tabs.d.ts +11 -9
  226. package/dist-elements/types/components/map/{map-tile/map-tile.d.ts → map/map.d.ts} +16 -11
  227. package/dist-elements/types/components/overlays/dialog/dialog.d.ts +49 -0
  228. package/dist-elements/types/components/overlays/drawer/drawer.d.ts +6 -5
  229. package/dist-elements/types/components/overlays/modal/modal.d.ts +7 -12
  230. package/dist-elements/types/components/overlays/toggletip/toggletip.d.ts +3 -7
  231. package/dist-elements/types/components/shared/charts/histogram-chart/histogram-chart.d.ts +33 -0
  232. package/dist-elements/types/components/shared/charts/index.d.ts +7 -2
  233. package/dist-elements/types/components/shared/charts/kinds.d.ts +86 -0
  234. package/dist-elements/types/components/shared/charts/line-chart/line-chart.d.ts +2 -2
  235. package/dist-elements/types/components/shared/charts/map-chart/area.d.ts +16 -0
  236. package/dist-elements/types/components/shared/charts/map-chart/drawings.d.ts +6 -2
  237. package/dist-elements/types/components/shared/charts/map-chart/geo.d.ts +6 -0
  238. package/dist-elements/types/components/shared/charts/map-chart/leaflet.d.ts +45 -2
  239. package/dist-elements/types/components/shared/charts/map-chart/map-chart.d.ts +17 -3
  240. package/dist-elements/types/components/shared/charts/map-chart/map-legend.d.ts +26 -0
  241. package/dist-elements/types/components/shared/charts/map-chart/marks.d.ts +47 -0
  242. package/dist-elements/types/components/shared/charts/map-chart/reveal.d.ts +1 -1
  243. package/dist-elements/types/components/shared/charts/scatter-chart/scatter-chart.d.ts +29 -0
  244. package/dist-elements/types/components/shared/charts/shared/axes.d.ts +21 -4
  245. package/dist-elements/types/components/shared/charts/shared/chart-icons.d.ts +4 -3
  246. package/dist-elements/types/components/shared/charts/shared/chart-states.d.ts +8 -19
  247. package/dist-elements/types/components/shared/charts/shared/controller.d.ts +34 -15
  248. package/dist-elements/types/components/shared/charts/shared/types.d.ts +141 -6
  249. package/dist-elements/types/components/shared/charts/stacked-area-chart/stacked-area-chart.d.ts +13 -0
  250. package/dist-elements/types/components/shared/dialog.d.ts +9 -0
  251. package/dist-elements/types/components/shared/overflow.d.ts +58 -0
  252. package/dist-elements/types/components/tables/activity-log/activity-log.d.ts +2 -3
  253. package/dist-elements/types/components/tables/card/card.d.ts +14 -20
  254. package/dist-elements/types/components/tables/card-list/card-list.d.ts +9 -11
  255. package/dist-elements/types/components/tables/data-table/data-table.d.ts +85 -16
  256. package/dist-elements/types/components/tables/data-table/filters.d.ts +13 -4
  257. package/dist-elements/types/components/tables/description-list/description-list.d.ts +12 -11
  258. package/dist-elements/types/components/tables/list/list.d.ts +9 -20
  259. package/dist-elements/types/components/tables/pagination/pagination.d.ts +12 -11
  260. package/dist-elements/types/components/tables/sortable-list/sortable-list.d.ts +5 -6
  261. package/dist-elements/types/components/tables/tree-view/tree-view.d.ts +4 -4
  262. package/dist-elements/types/core/format.d.ts +5 -2
  263. package/dist-elements/types/core/media.d.ts +2 -2
  264. package/dist-elements/types/core/motion.d.ts +5 -0
  265. package/dist-elements/types/core/print.d.ts +15 -0
  266. package/dist-elements/types/core/shortcuts.d.ts +2 -2
  267. package/dist-elements/types/icons/icon/icon.d.ts +2 -3
  268. package/dist-elements/types/icons/register.d.ts +1 -1
  269. package/dist-elements/types/primitives/badge/badge.d.ts +9 -5
  270. package/dist-elements/types/primitives/button/button.d.ts +12 -9
  271. package/dist-elements/types/primitives/grid/grid.d.ts +3 -3
  272. package/dist-elements/types/primitives/grid-item/grid-item.d.ts +1 -1
  273. package/dist-elements/types/primitives/icon-button/icon-button.d.ts +7 -5
  274. package/dist-elements/types/primitives/index.d.ts +3 -1
  275. package/dist-elements/types/primitives/popover/popover.d.ts +5 -4
  276. package/dist-elements/types/primitives/progress-bar/progress-bar.d.ts +8 -6
  277. package/dist-elements/types/primitives/shared/announcement-block.d.ts +38 -0
  278. package/dist-elements/types/primitives/shared/empty-state-block.d.ts +26 -0
  279. package/dist-elements/types/primitives/shared/place.d.ts +1 -1
  280. package/dist-elements/types/primitives/shared/tone.d.ts +18 -0
  281. package/dist-elements/types/primitives/skeleton/skeleton.d.ts +1 -1
  282. package/dist-elements/types/primitives/spinner/spinner.d.ts +1 -2
  283. package/dist-elements/types/primitives/status-dot/status-dot.d.ts +4 -5
  284. package/dist-elements/types/primitives/tile/tile.d.ts +17 -5
  285. package/dist-elements/types/primitives/tooltip/tooltip.d.ts +8 -6
  286. package/dist-elements/types/types.d.ts +106 -16
  287. package/dist-icons/functioneel-cirkelselectie.svg +1 -0
  288. package/dist-icons/functioneel-kolommen.svg +1 -0
  289. package/dist-icons/functioneel-lasso.svg +1 -0
  290. package/dist-icons/functioneel-punaise-outline.svg +1 -0
  291. package/dist-icons/functioneel-punaise.svg +1 -0
  292. package/dist-icons/functioneel-rechthoekselectie.svg +1 -0
  293. package/dist-icons/functioneel-selectie.svg +1 -0
  294. package/dist-icons/functioneel-trechter.svg +1 -0
  295. package/package.json +1 -1
  296. package/dist-elements/chunks/confirm-dialog-D5EVGuil.js +0 -4
  297. package/dist-elements/chunks/disclosure-Z7Ny17sS.js +0 -4
  298. package/dist-elements/chunks/download-lFooAfD1.js +0 -226
  299. package/dist-elements/chunks/input-jQVTln7H.js +0 -195
  300. package/dist-elements/tag/chart-tile.d.ts +0 -1
  301. package/dist-elements/tag/chart-tile.js +0 -1474
  302. package/dist-elements/tag/confirm-dialog.d.ts +0 -1
  303. package/dist-elements/tag/confirm-dialog.js +0 -118
  304. package/dist-elements/tag/map-tile.d.ts +0 -1
  305. package/dist-elements/tag/map-tile.js +0 -22292
  306. package/dist-elements/tag/session-expiry.d.ts +0 -1
  307. package/dist-elements/tag/session-expiry.js +0 -184
  308. package/dist-elements/tag/shortcuts.d.ts +0 -1
  309. package/dist-elements/tag/shortcuts.js +0 -104
  310. package/dist-elements/types/components/frame/session-expiry/session-expiry.d.ts +0 -55
  311. package/dist-elements/types/components/frame/shortcuts/shortcuts.d.ts +0 -41
  312. 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.1.1", t = globalThis, n = t.ShadowRoot && (t.ShadyCSS === void 0 || t.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, r = Symbol(), i = /* @__PURE__ */ new WeakMap(), a = class {
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\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@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: {},
@@ -885,6 +882,11 @@ var It = {
885
882
  attributes: {},
886
883
  body: "<path d=\"M11.958 1C18.035 1.022 22.961 5.933 23 12.009l-.006.39a10.992 10.992 0 0 1-1.3 4.825 10.843 10.843 0 0 1-1.86 2.525l-.063.071a10.78 10.78 0 0 1-2.193 1.686 11.035 11.035 0 0 1-13.574-1.973A11.031 11.031 0 0 1 2.84 5.867a11.18 11.18 0 0 1 1.346-1.638A11.147 11.147 0 0 1 11.958 1Zm5.013 4.266-6.37 7.05-3.83-3.281a1.095 1.095 0 0 0-1.411-.01c-.41.339-.509.923-.234 1.376l4.639 7.659c.196.323.548.521.929.522h.004c.38 0 .732-.195.93-.517l7.084-11.523a1.068 1.068 0 0 0-.282-1.423 1.097 1.097 0 0 0-1.459.147Z\" fill-rule=\"evenodd\"/>"
887
884
  },
885
+ "functioneel-cirkelselectie": {
886
+ viewBox: "0 0 24 24",
887
+ attributes: {},
888
+ body: "<path d=\"M12 2.5a9.5 9.5 0 1 0 0 19 9.5 9.5 0 0 0 0-19Zm0 2a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15Z\" fill-rule=\"evenodd\"/><path d=\"M12 9.75a2.25 2.25 0 1 0 2.1 3.25h3.4v-2h-3.4A2.25 2.25 0 0 0 12 9.75Z\"/>"
889
+ },
888
890
  "functioneel-darkmode": {
889
891
  viewBox: "0 0 24 24",
890
892
  attributes: {},
@@ -945,21 +947,11 @@ var It = {
945
947
  attributes: {},
946
948
  body: "<path d=\"m41 24c0 2.602-1 5-2.398 7l2.797 2.801a15.1 15.1 0 0 0 3.601-9.801c0-8.199-6.801-15-15-15v4c6 0 11 5 11 11zm-7 0a3.36 3.36 0 0 1 -.602 2l2.801 2.801c1-1.402 1.602-3 1.602-4.801a8.03 8.03 0 0 0 -8-8v4c2.398 0 4.199 1.801 4.199 4zm-8-14.602c0-1.199-1.199-1.797-2.199-1.199-.402.199-2.402 1.801-4.402 3.402l6.601 6.797zm-18.602-4.796c-.797-.801-2-.801-2.797 0s-.801 2 0 2.797l8.598 8.601h-3.199c-4.398 0-6 4.199-6 8s1.602 8 6 8h4l9.801 7.602c1 .598 2.199 0 2.199-1.203v-9.797l6 6c-.602.199-1.398.199-2 .199v4c1.801 0 3.602-.402 5.199-1l5.402 5.398a2.15 2.15 0 0 0 1.398.602c.602 0 1-.199 1.398-.602a1.93 1.93 0 0 0 0-2.801zm0 0\"/>"
947
949
  },
948
- "functioneel-home": {
949
- viewBox: "0 0 48 48",
950
- attributes: {},
951
- body: "<path d=\"m45.199 23.199-19-19c-1.199-1.199-3-1.199-4.199 0l-19 19c-.602.602-.801 1.199-.801 2-.199 1.602 1 2.801 2.602 2.801h1.199v16h14v-14h8v14h14v-16h1.199a2.73 2.73 0 0 0 2.801-2.801c0-.801-.199-1.398-.801-2zm0 0\"/>"
952
- },
953
950
  "functioneel-info": {
954
951
  viewBox: "0 0 48 48",
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: {},
@@ -980,6 +977,11 @@ var It = {
980
977
  attributes: {},
981
978
  body: "<path d=\"m35.375 8.426-11.355 10.058-11.352-10.058a3.09 3.09 0 0 0 -4.16.063c-1.09 1.16-1.117 2.965-.059 4.156l10.055 11.355-10.055 11.355c-1.059 1.191-1.031 2.996.059 4.156a3.09 3.09 0 0 0 4.16.063l11.352-10.058 11.355 10.059c1.191 1.055 2.996 1.031 4.156-.062a3.08 3.08 0 0 0 .063-4.156l-10.055-11.357 10.055-11.355a3.08 3.08 0 0 0 -.062-4.156c-1.16-1.094-2.965-1.117-4.156-.062zm-11.355 15.601-.028-.027.027-.027.016.012.016.016-.016.016zm0 0\"/>"
982
979
  },
980
+ "functioneel-lasso": {
981
+ viewBox: "0 0 24 24",
982
+ attributes: {},
983
+ body: "<path d=\"M13 2.5c-5.2 0-9.5 2.9-9.5 6.5 0 1.8 1.1 3.5 2.9 4.7l-.3.8a2.2 2.2 0 0 0 .3 3.3c-.3 1.6.4 3.3 2.2 4.5l1.1-1.6c-1.2-.8-1.6-1.8-1.5-2.7a2.2 2.2 0 0 0 1.4-2.6l.3-.7c1 .3 2 .4 3.1.4 5.2 0 9.5-2.9 9.5-6.5S18.2 2.5 13 2.5Zm0 2c4.3 0 7.5 2.3 7.5 4.5S17.3 13.5 13 13.5c-1 0-2-.1-2.8-.4a2.2 2.2 0 0 0-2.7-.6C6.3 11.7 5.5 10.4 5.5 9c0-2.2 3.2-4.5 7.5-4.5Z\" fill-rule=\"evenodd\"/>"
984
+ },
983
985
  "functioneel-locatiemarker": {
984
986
  viewBox: "0 0 48 48",
985
987
  attributes: {},
@@ -1020,11 +1022,31 @@ var It = {
1020
1022
  attributes: {},
1021
1023
  body: "<path d=\"m12 2h24v6h-24zm32 8h-40c-1 0-2 .801-2 2v16c0 1.199.801 2 2 2h6v3.199c0 .602.199 1 .602 1.402l8.797 8.797c.402.402.801.602 1.402.602h15.199c1.199 0 2-.801 2-2v-12h6c1.199 0 2-.801 2-2v-16c0-1.199-1-2-2-2zm-10 30h-12v-6c0-1.199-.801-2-2-2h-6v-8h20zm8-22h-4v-4h4zm0 0\"/>"
1022
1024
  },
1025
+ "functioneel-punaise-outline": {
1026
+ viewBox: "0 0 24 24",
1027
+ attributes: {},
1028
+ body: "<path d=\"M8 2h8a1 1 0 0 1 0 2h-.8v5.6l3.2 3.2c.4.4.6.9.6 1.4v.8c0 .5-.4 1-1 1H13v5.2l-1 1.8-1-1.8V16H6c-.6 0-1-.5-1-1v-.8c0-.5.2-1 .6-1.4l3.2-3.2V4H8a1 1 0 0 1 0-2Zm2.8 2v6.4l-3.6 3.6h9.6l-3.6-3.6V4h-2.4Z\" fill-rule=\"evenodd\"/>"
1029
+ },
1030
+ "functioneel-punaise": {
1031
+ viewBox: "0 0 24 24",
1032
+ attributes: {},
1033
+ body: "<path d=\"M8 2h8a1 1 0 0 1 0 2h-.8v5.6l3.2 3.2c.4.4.6.9.6 1.4v.8c0 .5-.4 1-1 1H13v5.2l-1 1.8-1-1.8V16H6c-.6 0-1-.5-1-1v-.8c0-.5.2-1 .6-1.4l3.2-3.2V4H8a1 1 0 0 1 0-2Z\"/>"
1034
+ },
1035
+ "functioneel-rechthoekselectie": {
1036
+ viewBox: "0 0 24 24",
1037
+ attributes: {},
1038
+ body: "<path d=\"M3 4h18v12h-2V6H5v12h9v2H3V4Z\"/><path d=\"M16 15.5a1 1 0 0 1 1.4-.9l4 1.9a.8.8 0 0 1-.1 1.5l-1.5.4-.4 1.5a.8.8 0 0 1-1.5.1l-1.9-4a1 1 0 0 1 0-.5Z\"/>"
1039
+ },
1023
1040
  "functioneel-refresh": {
1024
1041
  viewBox: "0 0 48 48",
1025
1042
  attributes: {},
1026
1043
  body: "<path d=\"m38 24c0 5-2.602 9.602-7 12.199-6.602 3.801-15.199 1.602-19.199-5.199-3.801-6.801-1.403-15.398 5.199-19.199 5.398-3 12-2.199 16.398 2l-3.598.398c-.801 0-1.402.801-1.402 1.402 0 .797.402 1.398 1.203 1.598l10.399 2.403c.398.199 1 0 1.398-.402.403-.2.602-.598.602-1.2v-10.602c0-.797-.602-1.398-1.199-1.598-.801-.199-1.402.398-1.801 1l-1 3c-6.199-6.199-16.199-7.602-24-3-9.602 5.399-12.801 17.598-7.398 27.2 3.597 6.398 10.398 10 17.398 10 3.398 0 6.801-.801 10-2.602 6.199-3.597 10-10.199 10-17.398zm0 0\"/>"
1027
1044
  },
1045
+ "functioneel-selectie": {
1046
+ viewBox: "0 0 24 24",
1047
+ attributes: {},
1048
+ body: "<path d=\"M3 3h4v2H5v2H3V3Zm6 0h4v2H9V3Zm6 0h4v4h-2V5h-2V3ZM3 9h2v4H3V9Zm14 0h2v3h-2V9ZM3 15h2v2h2v2H3v-4Zm6 4h3v2H9v-2Z\"/><path d=\"M13 12.5a1 1 0 0 1 1.4-.9l6.8 3.2a.8.8 0 0 1-.1 1.5l-2.7.7-.7 2.7a.8.8 0 0 1-1.5.1L13 13a1 1 0 0 1 0-.5Z\"/>"
1049
+ },
1028
1050
  "functioneel-sleep": {
1029
1051
  viewBox: "0 0 24 24",
1030
1052
  attributes: {},
@@ -1040,6 +1062,11 @@ var It = {
1040
1062
  attributes: {},
1041
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\"/>"
1042
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
+ },
1043
1070
  "functioneel-uitloggen": {
1044
1071
  viewBox: "0 0 24 24",
1045
1072
  attributes: {},
@@ -1100,16 +1127,6 @@ var It = {
1100
1127
  attributes: {},
1101
1128
  body: "<path d=\"m0 0h64v64h-64z\" fill=\"none\"/><path d=\"m25.3321 6.1345-2.0177 5.8167c-1.5646.4527-3.052 1.08-4.4418 1.8659l-5.5687-2.7003c-.6468-.3137-1.4213-.1831-1.9295.3251-1.8 1.8001-1.1346 1.1346-2.9326 2.9326-.5082.5082-.6388 1.2827-.3251 1.9295l2.7253 5.6202c-.751 1.3627-1.3406 2.8227-1.774 4.3497l-5.9335 2.0582c-.6792.2356-1.1345.8755-1.1345 1.5943v4.1472c0 .7188.4553 1.3587 1.1345 1.5943l5.9493 2.0637c.4348 1.5144 1.0258 2.9611 1.7733 4.3132l-2.7404 5.6513c-.3137.6468-.1831 1.4213.3251 1.9295 1.8001 1.8 1.1346 1.1346 2.9326 2.9326.5082.5082 1.2827.6388 1.9295.3251l5.6199-2.7251c1.3686.7687 2.832 1.3828 4.3694 1.8294l2.0389 5.8779c.2356.6792.8755 1.1345 1.5943 1.1345h3.0736v-18.8266c-.3284.0398-.6608.0666-1 .0666-4.5508 0-8.24-3.6891-8.24-8.24s3.6891-8.24 8.24-8.24c.3392 0 .6716.0268 1 .0666v-18.8266c-1.0243 0-1.9494 0-3.0736 0-.7188 0-1.3587.4553-1.5943 1.1345z\"/><path d=\"m56.4597 18.2619c-.9368 1.3607-2.035 2.1028-2.5842 2.4344-.3743.2261-.5553.1334-.625.0277.5175-.9286 1.545-1.9612 1.8037-4.1695.5469-4.6689-2.7309-7.6347-7.046-6.7027-2.202.4755-3.1174 1.6548-3.9827 2.2869-.11-.0599-.219-.2343-.0375-.638.3029-.6736 1.0467-2.1241 2.6442-3.3198-2.0998-2.5516-5.3422-3.8409-8.3787-3.0182-1.8707.5068-3.3339 1.7326-4.2535 3.3427v16.5745c1.137-1.3279 2.8383-2.157 4.2604-2.3041.4833-.05.85-.05.8081.2855-3.8585 2.1403-5.0526 6.2694-5.0526 9.6201 0 0-.0085-.0154-.0159-.0287v3.4125c2.7195-.9948 6.6523.5735 7.4603 4.2599.1595.728-.1895.7773-.1895.7773-.0007-.0196-.7006-1.5947-2.4891-2.5005-1.547-.7835-3.2694-.7393-4.7818-.0375v16.9331c.9218 1.6047 2.387 2.8242 4.2535 3.3298 3.2304.8752 7.3005-.3219 9.3547-4.4847-1.6866-.7966-2.5984-1.925-2.9814-2.454-.2289-.3162-.1509-.4777-.0554-.5428.8576.3952 1.8273 1.1967 3.7447 1.3754 5.3935.5027 9.2785-4.3926 7.5309-8.8385-.5915-1.5048-1.5737-2.1742-2.1412-2.8269.0508-.0983.2086-.2005.5944-.0596.481.1757 1.3794.552 2.3003 1.2874 3.8477-1.9865 5.5184-7.1115 2.923-11.8442 3.2212-4.9393 1.1661-10.4082-3.0637-12.1775zm-18.884-3.7363c.1496-.3161.3948-.5866.5424-.4489-.0057 1.5189 1.3575 4.7581 6.0538 3.4775 1.436-.3975 2.5232-1.0786 3.8069-1.9644.1677.0311.176.21.0157.4925-.8182 1.4423-2.2335 3.397-5.8046 3.6405-4.1617.3227-5.6461-3.0164-4.6142-5.1972zm3.7179 17.9331c-1.644-1.2926-1.5016-5.3531 1.3011-6.9296 1.59-.8944 3.8758-.2982 5.5991.1456 2.6202.6747 4.4614.6252 6.6873-.3674.1786.335-.0214.6517-.2714.935-1.2223 1.3853-3.705 1.7718-5.788 1.5767-2.5236-.2364-3.2969-1.0359-5.2844-.1415-2.5067 1.1281-1.5673 4.8135-1.5451 4.8554-.1819.3091-.4844.0941-.6986-.0742zm8.3018 14.8819c-.3134-.7933-1.3-1.816-2.7258-2.1866-1.4886-.3867-3.3753-.0684-4.9788 1.0889-2.799 2.0198-2.6901 4.5175-2.6911 4.5413 0 0-.4391.1696-.4559-.6763-.0284-1.4266.5886-4.3583 2.4884-5.7824 3.765-2.8222 8.3582-1.0955 8.6945 2.0992.0666.6333-.0334.95-.3313.9159zm6.7083-9.8518c-2.1619-2.5216-4.9835-3.7319-7.5697-2.037-1.7897 1.1729-2.9113 3.4847-2.9097 3.5055 0 0-.3239.0415-.2475-.6321.1077-.9494.7598-2.842 2.0525-4.1174 2.7535-2.7166 7.7401-1.7885 8.7137 2.3842.1167.4998.2.7331-.0393.8968z\"/>"
1102
1129
  },
1103
- "kantoor-label-outline": {
1104
- viewBox: "0 0 24 24",
1105
- attributes: {},
1106
- body: "<path d=\"m11.996 19.496 1.997-1.006.782.397-1.593 1.215 5.63 2.848c.312.15.688-.055.688-.374V1h-15v21.394c0 .402.474.66.867.47l6.629-3.368Zm-5.696.875 5.695-2.893 5.705 2.89V2.8H6.3v17.571Z\" fill-rule=\"evenodd\"/>"
1107
- },
1108
- "kantoor-label": {
1109
- viewBox: "0 0 24 24",
1110
- attributes: {},
1111
- body: "<path d=\"M4.5 1v21.394c0 .402.474.66.867.47L17.2 16.853s.105.088-.017.196c-.072.064-2.554 1.96-3.992 3.057l5.62 2.845c.313.15.689-.054.689-.374V1h-15Z\" fill-rule=\"evenodd\"/>"
1112
- },
1113
1130
  "lichaam-duim-omhoog": {
1114
1131
  viewBox: "0 0 64 64",
1115
1132
  attributes: {},
@@ -1184,7 +1201,7 @@ var It = {
1184
1201
  update(e, t) {
1185
1202
  return this.render(...t);
1186
1203
  }
1187
- }, Lt = class extends z {
1204
+ }, It = class extends z {
1188
1205
  constructor(e) {
1189
1206
  if (super(e), this.it = T, e.type !== L.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings");
1190
1207
  }
@@ -1202,13 +1219,13 @@ var It = {
1202
1219
  };
1203
1220
  }
1204
1221
  };
1205
- Lt.directiveName = "unsafeHTML", Lt.resultType = 1;
1206
- var Rt = R(Lt), zt = class extends Lt {};
1207
- zt.directiveName = "unsafeSVG", zt.resultType = 2;
1208
- 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);
1209
1226
  //#endregion
1210
1227
  //#region src/core/style-props.ts
1211
- function Vt(e) {
1228
+ function Bt(e) {
1212
1229
  return e.includes("-") ? e : e.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g, "-$&").toLowerCase();
1213
1230
  }
1214
1231
  var B = R(class extends z {
@@ -1222,120 +1239,120 @@ var B = R(class extends z {
1222
1239
  let { style: n } = e.element, r = /* @__PURE__ */ new Set();
1223
1240
  for (let [e, i] of Object.entries(t)) {
1224
1241
  if (i == null || i === !1) continue;
1225
- let t = Vt(e);
1242
+ let t = Bt(e);
1226
1243
  r.add(t), n.setProperty(t, String(i));
1227
1244
  }
1228
1245
  for (let e of this.applied) r.has(e) || n.removeProperty(e);
1229
1246
  return this.applied = r, T;
1230
1247
  }
1231
- }), Ht = [
1248
+ }), Vt = [
1232
1249
  "fill",
1233
1250
  "stroke",
1234
1251
  "stroke-width",
1235
1252
  "stroke-linecap",
1236
1253
  "stroke-linejoin"
1237
- ], 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];
1238
- function Kt(e, t) {
1239
- 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, ""));
1240
1257
  }
1241
- function qt(e) {
1258
+ function Kt(e) {
1242
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();
1243
1260
  }
1244
- function Jt(e, t, n) {
1261
+ function qt(e, t, n) {
1245
1262
  let r = {};
1246
- for (let e of Ht) {
1263
+ for (let e of Vt) {
1247
1264
  let n = V(t, e);
1248
1265
  n !== void 0 && (r[e] = n);
1249
1266
  }
1250
- Kt(r, qt(n)) && delete r.fill;
1267
+ Gt(r, Kt(n)) && delete r.fill;
1251
1268
  for (let [e, t] of Object.entries(r)) /^(#000|#000000|black)$/.test(t) && (r[e] = "currentColor");
1252
1269
  return r;
1253
1270
  }
1254
- function Yt(e, t, n) {
1255
- let r = qt(n), i = {};
1256
- for (let e of Ht) {
1271
+ function Jt(e, t, n) {
1272
+ let r = Kt(n), i = {};
1273
+ for (let e of Vt) {
1257
1274
  let n = V(t, e);
1258
1275
  n !== void 0 && (i[e] = n);
1259
1276
  }
1260
- 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;
1261
1278
  }
1262
- function Xt(e) {
1279
+ function Yt(e) {
1263
1280
  let t = V(e, "width"), n = V(e, "height");
1264
1281
  return t && n ? `0 0 ${parseFloat(t)} ${parseFloat(n)}` : "0 0 24 24";
1265
1282
  }
1266
- function Zt(e, t) {
1283
+ function Xt(e, t) {
1267
1284
  let n = t.indexOf("<svg"), r = t.indexOf(">", n), i = t.slice(n, r + 1), a = t.slice(r + 1, t.lastIndexOf("</svg>"));
1268
1285
  return {
1269
- viewBox: V(i, "viewBox") ?? Xt(i),
1270
- attributes: Jt(e, i, a),
1271
- body: Yt(e, i, a)
1286
+ viewBox: V(i, "viewBox") ?? Yt(i),
1287
+ attributes: qt(e, i, a),
1288
+ body: Jt(e, i, a)
1272
1289
  };
1273
1290
  }
1274
1291
  //#endregion
1275
1292
  //#region src/icons/loader.ts
1276
- var H = /* @__PURE__ */ new Map(), U = /* @__PURE__ */ new Set(), Qt = /* @__PURE__ */ new Map(), $t = /* @__PURE__ */ new Set(), W = { base: "/icons/" };
1277
- 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) {
1278
1295
  let t = W;
1279
1296
  W = {
1280
1297
  ...e,
1281
1298
  base: e.base.endsWith("/") ? e.base : `${e.base}/`
1282
- }, (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());
1283
1300
  }
1284
- function tn() {
1301
+ function en() {
1285
1302
  return W;
1286
1303
  }
1287
- function nn(e) {
1304
+ function tn(e) {
1288
1305
  return e ? H.get(e) : void 0;
1289
1306
  }
1290
- function rn(e) {
1307
+ function nn(e) {
1291
1308
  return e ? U.has(e) : !1;
1292
1309
  }
1293
- function an() {
1310
+ function rn() {
1294
1311
  return [...H.keys()];
1295
1312
  }
1313
+ function an(e) {
1314
+ return Qt.add(e), () => Qt.delete(e);
1315
+ }
1296
1316
  function on(e) {
1297
- return $t.add(e), () => $t.delete(e);
1317
+ for (let t of Qt) t(e);
1298
1318
  }
1299
1319
  function sn(e) {
1300
- for (let t of $t) t(e);
1301
- }
1302
- function cn(e) {
1303
- 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;
1304
1321
  let t = W, n = `${t.base}${encodeURIComponent(e)}.svg${t.version ? `?b=${t.version}` : ""}`, r = fetch(n).then(async (t) => {
1305
1322
  if (!t.ok) throw Error(`${t.status}`);
1306
- let n = Zt(e, await t.text());
1323
+ let n = Xt(e, await t.text());
1307
1324
  if (!n.body) throw Error("empty");
1308
1325
  H.set(e, n);
1309
1326
  }).catch(() => {
1310
1327
  t === W && U.add(e);
1311
1328
  }).finally(() => {
1312
- Qt.delete(e), sn(e);
1329
+ Zt.delete(e), on(e);
1313
1330
  });
1314
- Qt.set(e, r);
1331
+ Zt.set(e, r);
1315
1332
  }
1316
- async function ln(e) {
1317
- 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);
1318
1335
  }
1319
1336
  //#endregion
1320
1337
  //#region src/icons/render.ts
1321
- 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;
1322
- function fn(e) {
1323
- if (!e || (un.add(e), dn)) return;
1324
- 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;
1325
1342
  let t = !1;
1326
- on(() => {
1327
- un.size && !t && (t = !0, pn(() => {
1328
- t = !1, un.size && (un.clear(), $e());
1343
+ an(() => {
1344
+ ln.size && !t && (t = !0, fn(() => {
1345
+ t = !1, ln.size && (ln.clear(), $e());
1329
1346
  }));
1330
1347
  });
1331
1348
  }
1332
- function pn(e) {
1349
+ function fn(e) {
1333
1350
  typeof requestAnimationFrame == "function" ? requestAnimationFrame(e) : Promise.resolve().then(e);
1334
1351
  }
1335
- function mn(e) {
1336
- return (e ? It[e] : void 0) ?? nn(e);
1352
+ function pn(e) {
1353
+ return (e ? Ft[e] : void 0) ?? tn(e);
1337
1354
  }
1338
- function hn(e, t) {
1355
+ function mn(e, t) {
1339
1356
  return e ? C`<span class="lintje-leading-icon ${t}"
1340
1357
  >${K(e, { size: 20 })}</span
1341
1358
  >` : T;
@@ -1362,7 +1379,7 @@ function K(e, t = {}) {
1362
1379
  aria-hidden=${d}
1363
1380
  ></span>`;
1364
1381
  }
1365
- let p = mn(e);
1382
+ let p = pn(e);
1366
1383
  if (!p) {
1367
1384
  let t = C`<svg
1368
1385
  class="${f} lintje-icon--pending"
@@ -1372,7 +1389,7 @@ function K(e, t = {}) {
1372
1389
  viewBox="0 0 24 24"
1373
1390
  aria-hidden="true"
1374
1391
  ></svg>`;
1375
- 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);
1376
1393
  }
1377
1394
  return C`<svg
1378
1395
  class=${f}
@@ -1388,7 +1405,7 @@ function K(e, t = {}) {
1388
1405
  role=${l}
1389
1406
  aria-label=${u}
1390
1407
  aria-hidden=${d}
1391
- >${Bt(p.body)}</svg>`;
1408
+ >${zt(p.body)}</svg>`;
1392
1409
  }
1393
1410
  //#endregion
1394
1411
  //#region node_modules/lit-html/directives/class-map.js
@@ -1413,28 +1430,35 @@ var q = R(class extends z {
1413
1430
  }
1414
1431
  return w;
1415
1432
  }
1416
- }), 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);
1417
- function yn(e) {
1418
- 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;
1419
1439
  return C`<span
1420
1440
  class=${q({
1421
1441
  "lintje-badge": !0,
1422
1442
  [`lintje-badge--${r}`]: !0,
1423
- [`lintje-badge--${n}`]: r === "label" && !c,
1424
- "lintje-badge--nav": c,
1425
- "is-muted": c && !!o,
1443
+ [`lintje-badge--${n}`]: r === "label" && !l,
1444
+ "lintje-badge--nav": l,
1445
+ "is-muted": l && !!o,
1426
1446
  ...Object.fromEntries((s ?? "").split(/\s+/).filter(Boolean).map((e) => [e, !0]))
1427
1447
  })}
1428
- >${i ? C`<span aria-hidden="true">${t}</span
1448
+ >${u}${i ? C`<span aria-hidden="true">${t}</span
1429
1449
  ><span class="visually-hidden">${i}</span>` : t}</span
1430
1450
  >`;
1431
1451
  }
1432
- var bn = class extends j {
1452
+ var yn = class extends j {
1433
1453
  constructor(...e) {
1434
1454
  super(...e), this.tone = "neutral", this.variant = "label";
1435
1455
  }
1436
1456
  static {
1437
- this.styles = [A(_n), vn];
1457
+ this.styles = [
1458
+ G,
1459
+ A(gn),
1460
+ _n
1461
+ ];
1438
1462
  }
1439
1463
  static {
1440
1464
  this.properties = {
@@ -1446,24 +1470,30 @@ var bn = class extends j {
1446
1470
  type: String,
1447
1471
  reflect: !0
1448
1472
  },
1449
- label: { type: String }
1473
+ label: { type: String },
1474
+ icon: { type: String }
1450
1475
  };
1451
1476
  }
1452
1477
  render() {
1453
- return yn({
1478
+ return vn({
1454
1479
  value: C`<slot></slot>`,
1455
1480
  tone: this.tone,
1456
1481
  variant: this.variant,
1457
- label: this.label
1482
+ label: this.label,
1483
+ icon: this.icon
1458
1484
  });
1459
1485
  }
1460
1486
  };
1461
- M("lintje-badge", bn);
1487
+ M("lintje-badge", yn);
1462
1488
  //#endregion
1463
1489
  //#region src/primitives/button/button.css?inline
1464
- 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 {
1465
1491
  static {
1466
- this.styles = [G, A(xn)];
1492
+ this.styles = [
1493
+ G,
1494
+ A(bn),
1495
+ A(xn)
1496
+ ];
1467
1497
  }
1468
1498
  static {
1469
1499
  this.shadowRootOptions = {
@@ -1628,10 +1658,40 @@ function kn(e) {
1628
1658
  return t !== null && On(t, e);
1629
1659
  }
1630
1660
  //#endregion
1631
- //#region node_modules/lit-html/directive-helpers.js
1632
- 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) => {
1633
1693
  let r = e._$AA.parentNode, i = t === void 0 ? e._$AB : t._$AA;
1634
- 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);
1635
1695
  else {
1636
1696
  let t = n._$AB.nextSibling, a = n._$AM, o = a !== e;
1637
1697
  if (o) {
@@ -1641,15 +1701,15 @@ var { I: An } = Pe, jn = (e) => e, Mn = (e) => e.strings === void 0, Nn = () =>
1641
1701
  if (t !== i || o) {
1642
1702
  let e = n._$AA;
1643
1703
  for (; e !== t;) {
1644
- let t = jn(e).nextSibling;
1645
- jn(r).insertBefore(e, i), e = t;
1704
+ let t = Fn(e).nextSibling;
1705
+ Fn(r).insertBefore(e, i), e = t;
1646
1706
  }
1647
1707
  }
1648
1708
  }
1649
1709
  return n;
1650
- }, 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) => {
1651
1711
  e._$AR(), e._$AA.remove();
1652
- }, Rn = R(class extends z {
1712
+ }, Hn = R(class extends z {
1653
1713
  constructor() {
1654
1714
  super(...arguments), this.key = T;
1655
1715
  }
@@ -1657,11 +1717,24 @@ var { I: An } = Pe, jn = (e) => e, Mn = (e) => e.strings === void 0, Nn = () =>
1657
1717
  return this.key = e, t;
1658
1718
  }
1659
1719
  update(e, [t, n]) {
1660
- return t !== this.key && (Fn(e), this.key = t), n;
1720
+ return t !== this.key && (zn(e), this.key = t), n;
1721
+ }
1722
+ }), Un = (e) => e ?? T, Wn = 180;
1723
+ function Gn(e, t, n, r = "bottom-start", i = 6) {
1724
+ if (r === "left-center" || r === "left-start") {
1725
+ let a = e.left - i - t.width;
1726
+ if (a >= 8) {
1727
+ let i = r === "left-start" ? e.top : (e.top + e.bottom) / 2 - t.height / 2;
1728
+ return {
1729
+ top: Math.round(Math.max(8, Math.min(i, n.height - t.height - 8))),
1730
+ bottom: null,
1731
+ left: Math.round(a),
1732
+ space: Math.max(0, n.height - 16)
1733
+ };
1734
+ }
1735
+ r = r === "left-start" ? "bottom-end" : "top-center";
1661
1736
  }
1662
- }), zn = (e) => e ?? T, Bn = 180;
1663
- function Vn(e, t, n, r = "bottom-start", i = 6) {
1664
- 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;
1665
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)), {
1666
1739
  top: c ? null : e.bottom + i,
1667
1740
  bottom: c ? n.height - e.top + i : null,
@@ -1669,10 +1742,10 @@ function Vn(e, t, n, r = "bottom-start", i = 6) {
1669
1742
  space: Math.max(0, c ? o : a)
1670
1743
  };
1671
1744
  }
1672
- function Hn(e, t) {
1745
+ function Kn(e, t) {
1673
1746
  return !e || !t ? e === t : e.top === t.top && e.bottom === t.bottom && e.left === t.left && e.space === t.space;
1674
1747
  }
1675
- function Un() {
1748
+ function qn() {
1676
1749
  return {
1677
1750
  width: window.innerWidth || document.documentElement.clientWidth || 1024,
1678
1751
  height: window.innerHeight || document.documentElement.clientHeight || 768
@@ -1680,10 +1753,10 @@ function Un() {
1680
1753
  }
1681
1754
  //#endregion
1682
1755
  //#region src/primitives/popover/popover.css?inline
1683
- 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";
1684
1757
  //#endregion
1685
1758
  //#region src/primitives/popover/popover.ts
1686
- function Gn(e, t) {
1759
+ function Yn(e, t) {
1687
1760
  return e ? {
1688
1761
  top: e.top === null ? null : `${e.top}px`,
1689
1762
  bottom: e.bottom === null ? null : `${e.bottom}px`,
@@ -1692,9 +1765,9 @@ function Gn(e, t) {
1692
1765
  "--lintje-popover-space": `${e.space}px`
1693
1766
  } : {};
1694
1767
  }
1695
- var Kn = class extends j {
1768
+ var Xn = class extends j {
1696
1769
  static {
1697
- this.styles = A(Wn);
1770
+ this.styles = A(Jn);
1698
1771
  }
1699
1772
  static {
1700
1773
  this.properties = {
@@ -1751,8 +1824,8 @@ var Kn = class extends j {
1751
1824
  height: n?.offsetHeight ?? 0
1752
1825
  };
1753
1826
  this.matchWidth && (r.width = Math.max(r.width, t.width));
1754
- let i = Vn(t, r, Un(), this.placement), a = this.matchWidth ? Math.round(t.width) : null;
1755
- 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);
1756
1829
  }
1757
1830
  willUpdate(e) {
1758
1831
  super.willUpdate(e), e.has("open") && (this.open ? this.measure() : this.spot = null);
@@ -1763,28 +1836,28 @@ var Kn = class extends j {
1763
1836
  render() {
1764
1837
  return this.open ? C`<div
1765
1838
  class="lintje-popover"
1766
- role=${zn(this.panelRole)}
1767
- aria-label=${zn(this.label)}
1768
- ${B(Gn(this.spot, this.anchorWidth))}
1839
+ role=${Un(this.panelRole)}
1840
+ aria-label=${Un(this.label)}
1841
+ ${B(Yn(this.spot, this.anchorWidth))}
1769
1842
  >
1770
1843
  <slot></slot>
1771
1844
  </div>` : T;
1772
1845
  }
1773
1846
  };
1774
- M("lintje-popover", Kn);
1847
+ M("lintje-popover", Xn);
1775
1848
  //#endregion
1776
1849
  //#region src/core/links.ts
1777
- function qn(e) {
1850
+ function Zn(e) {
1778
1851
  return e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey;
1779
1852
  }
1780
1853
  //#endregion
1781
1854
  //#region src/primitives/spinner/spinner.css?inline
1782
- 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 {
1783
1856
  constructor(...e) {
1784
1857
  super(...e), this.size = 16, this.stacked = !1, this.current = !1, this.filled = null, this.#e = 0;
1785
1858
  }
1786
1859
  static {
1787
- this.styles = A(Jn);
1860
+ this.styles = A(Qn);
1788
1861
  }
1789
1862
  static {
1790
1863
  this.properties = {
@@ -1833,20 +1906,20 @@ var Jn = ":host { display: inline-flex; vertical-align: middle; }\n:host([stacke
1833
1906
  </span>`;
1834
1907
  }
1835
1908
  };
1836
- M("lintje-spinner", Yn);
1909
+ M("lintje-spinner", $n);
1837
1910
  //#endregion
1838
1911
  //#region src/primitives/tooltip/tooltip.css?inline
1839
- 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;
1840
- 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) {
1841
1914
  return e ? {
1842
1915
  top: e.top === null ? null : `${e.top}px`,
1843
1916
  bottom: e.bottom === null ? null : `${e.bottom}px`,
1844
1917
  left: `${e.left}px`
1845
1918
  } : {};
1846
1919
  }
1847
- var er = class extends j {
1920
+ var ir = class extends j {
1848
1921
  constructor(...e) {
1849
- super(...e), this.text = "", this.noDescribe = !1, this.open = !1, this.spot = null, this.reflowFrame = 0, this.#e = "", this.onPointerEnter = () => {
1922
+ super(...e), this.text = "", this.noDescribe = !1, this.placement = "top", this.open = !1, this.spot = null, this.reflowFrame = 0, this.#e = "", this.onPointerEnter = () => {
1850
1923
  this.open ? clearTimeout(this.timer) : this.show(300);
1851
1924
  }, this.onPointerLeave = () => {
1852
1925
  clearTimeout(this.timer), this.open && (this.timer = setTimeout(() => this.open = !1, 150));
@@ -1859,7 +1932,7 @@ var er = class extends j {
1859
1932
  };
1860
1933
  }
1861
1934
  static {
1862
- this.styles = A(Xn);
1935
+ this.styles = A(er);
1863
1936
  }
1864
1937
  static {
1865
1938
  this.properties = {
@@ -1868,6 +1941,7 @@ var er = class extends j {
1868
1941
  type: Boolean,
1869
1942
  attribute: "no-describe"
1870
1943
  },
1944
+ placement: { type: String },
1871
1945
  open: { state: !0 },
1872
1946
  spot: { state: !0 }
1873
1947
  };
@@ -1897,8 +1971,8 @@ var er = class extends j {
1897
1971
  let t = this.renderRoot.querySelector(".lintje-tooltip"), n = {
1898
1972
  width: t?.offsetWidth ?? 0,
1899
1973
  height: t?.offsetHeight ?? 0
1900
- }, r = Vn(e.getBoundingClientRect(), n, Un(), "top-center", 8);
1901
- Hn(this.spot, r) || (this.spot = r);
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);
1902
1976
  }
1903
1977
  willUpdate(e) {
1904
1978
  super.willUpdate(e), (e.has("text") || e.has("noDescribe")) && this.describe(), e.has("open") && (this.open ? this.measure() : this.spot = null);
@@ -1919,28 +1993,28 @@ var er = class extends j {
1919
1993
  } else n ? e.setAttribute("aria-description", n) : e.removeAttribute("aria-description");
1920
1994
  }
1921
1995
  render() {
1922
- 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))}
1923
1997
  >${this.text}</span
1924
1998
  >` : T}`;
1925
1999
  }
1926
2000
  };
1927
- M("lintje-tooltip", er);
2001
+ M("lintje-tooltip", ir);
1928
2002
  //#endregion
1929
2003
  //#region src/primitives/icon-button/icon-button.css?inline
1930
- 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";
1931
2005
  //#endregion
1932
2006
  //#region src/core/length.ts
1933
- function nr(e, t, n) {
2007
+ function or(e, t, n) {
1934
2008
  let r = getComputedStyle(e).getPropertyValue(t).trim(), i = parseFloat(r);
1935
- return Number.isFinite(i) ? r.endsWith("rem") ? i * rr() : i : n;
2009
+ return Number.isFinite(i) ? r.endsWith("rem") ? i * sr() : i : n;
1936
2010
  }
1937
- function rr() {
2011
+ function sr() {
1938
2012
  let e = parseFloat(getComputedStyle(document.documentElement).fontSize);
1939
2013
  return Number.isFinite(e) && e > 0 ? e : 16;
1940
2014
  }
1941
2015
  //#endregion
1942
2016
  //#region src/primitives/shared/grid-item-element.ts
1943
- 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 {
1944
2018
  static {
1945
2019
  this.properties = { span: {
1946
2020
  type: Number,
@@ -1950,15 +2024,82 @@ var ir = A("/* `min-width: auto` is the default; tiles hold long words and wide
1950
2024
  willUpdate(e) {
1951
2025
  super.willUpdate(e), this.span ? this.style.setProperty("--lintje-span", String(this.span)) : this.style.removeProperty("--lintje-span");
1952
2026
  }
1953
- }, or = /^-?\d+(?:\.\d+)?$/;
1954
- function sr(e) {
1955
- 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;
1956
2093
  }
1957
2094
  //#endregion
1958
2095
  //#region src/primitives/icon-button/icon-button.ts
1959
- var cr = class extends j {
2096
+ var br = class extends j {
1960
2097
  static {
1961
- this.styles = [G, A(tr)];
2098
+ this.styles = [
2099
+ G,
2100
+ A(ar),
2101
+ A(xn)
2102
+ ];
1962
2103
  }
1963
2104
  static {
1964
2105
  this.properties = {
@@ -2022,20 +2163,25 @@ var cr = class extends j {
2022
2163
  </button>`;
2023
2164
  }
2024
2165
  };
2025
- M("lintje-icon-button", cr);
2166
+ M("lintje-icon-button", br);
2026
2167
  //#endregion
2027
2168
  //#region src/primitives/status-dot/status-dot.css?inline
2028
- 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 = {
2029
2175
  complete: "compleet",
2030
2176
  delayed: "vertraagd",
2031
2177
  outage: "storing",
2032
2178
  "no-data": "geen data"
2033
- }, dr = class extends j {
2179
+ }, wr = class extends j {
2034
2180
  constructor(...e) {
2035
2181
  super(...e), this.tone = "complete", this.size = 10;
2036
2182
  }
2037
2183
  static {
2038
- this.styles = A(lr);
2184
+ this.styles = A(xr);
2039
2185
  }
2040
2186
  static {
2041
2187
  this.properties = {
@@ -2048,27 +2194,28 @@ var lr = ":host { display: inline-flex; vertical-align: middle; }\n:host([hidden
2048
2194
  };
2049
2195
  }
2050
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];
2051
2198
  return C`<span class="lintje-status">
2052
2199
  <span
2053
- class="lintje-status__dot lintje-status__dot--${this.tone}"
2200
+ class="lintje-status__dot lintje-status__dot--${t}"
2054
2201
  ${B({
2055
2202
  width: `${this.size}px`,
2056
2203
  height: `${this.size}px`
2057
2204
  })}
2058
2205
  ></span>
2059
- <span>${this.label ?? ur[this.tone]}</span>
2206
+ <span>${this.label ?? n}</span>
2060
2207
  </span>`;
2061
2208
  }
2062
2209
  };
2063
- M("lintje-status-dot", dr);
2210
+ M("lintje-status-dot", wr);
2064
2211
  //#endregion
2065
2212
  //#region src/primitives/skeleton/skeleton.css?inline
2066
- 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 {
2067
2214
  constructor(...e) {
2068
2215
  super(...e), this.width = "100%", this.height = 12;
2069
2216
  }
2070
2217
  static {
2071
- this.styles = A(fr);
2218
+ this.styles = A(Tr);
2072
2219
  }
2073
2220
  static {
2074
2221
  this.properties = {
@@ -2077,25 +2224,57 @@ var fr = "/* The size is on the host so a percentage has a box to resolve agains
2077
2224
  };
2078
2225
  }
2079
2226
  willUpdate(e) {
2080
- 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) ?? "";
2081
2228
  }
2082
2229
  render() {
2083
2230
  return C`<span class="lintje-skeleton" aria-hidden="true"></span>`;
2084
2231
  }
2085
2232
  };
2086
- 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
+ }
2087
2265
  //#endregion
2088
2266
  //#region src/primitives/tile/tile.css?inline
2089
- 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.lintje-tile__actions { display: flex; gap: var(--space-2); flex: none; }\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 {
2090
2268
  constructor(...e) {
2091
- 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;
2092
2270
  }
2093
2271
  static {
2094
2272
  this.styles = [
2095
- ir,
2273
+ cr,
2096
2274
  G,
2097
- A(mr),
2098
- A(hr)
2275
+ A(jr),
2276
+ mr,
2277
+ Dr
2099
2278
  ];
2100
2279
  }
2101
2280
  static {
@@ -2132,6 +2311,10 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2132
2311
  reflect: !0
2133
2312
  },
2134
2313
  flush: { type: Boolean },
2314
+ breakable: {
2315
+ type: Boolean,
2316
+ reflect: !0
2317
+ },
2135
2318
  filled: { state: !0 }
2136
2319
  };
2137
2320
  }
@@ -2143,7 +2326,7 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2143
2326
  this.#e && cancelAnimationFrame(this.#e), this.#e = 0, super.disconnectedCallback();
2144
2327
  }
2145
2328
  get regionText() {
2146
- 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;
2147
2330
  }
2148
2331
  willUpdate(e) {
2149
2332
  super.willUpdate(e), e.has("state") && (this.filled = null);
@@ -2178,7 +2361,7 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2178
2361
  "lintje-tile__heading--icon": !!this.icon
2179
2362
  })}
2180
2363
  >
2181
- ${hn(this.icon, "lintje-tile__icon")}
2364
+ ${mn(this.icon, "lintje-tile__icon")}
2182
2365
  ${this.heading ? C`<h3 id=${t ?? T} class="lintje-tile__title">${this.heading}</h3>` : T}
2183
2366
  ${this.subtitle ? C`<p class="lintje-tile__sub">${this.subtitle}</p>` : T}
2184
2367
  </div>
@@ -2222,44 +2405,45 @@ var mr = "/*\n * Above the divider: the host, the grid item the tile fills by it
2222
2405
  </section>`;
2223
2406
  }
2224
2407
  content() {
2225
- let e = sr(this.contentHeight);
2408
+ let e = yr(this.contentHeight);
2226
2409
  switch (this.state) {
2227
2410
  case "loading": return C`<div ${B({ height: e })} role="status">
2228
- <span class="visually-hidden">${this.filled === gr ? gr : T}</span>
2411
+ <span class="visually-hidden">${this.filled === Mr ? Mr : T}</span>
2229
2412
  <slot name="loading"><lintje-skeleton height="100%"></lintje-skeleton></slot>
2230
2413
  </div>`;
2231
2414
  case "empty": return C`<div class="lintje-chart-state lintje-chart-state--empty" ${B({ height: e })}>
2232
- <p>${this.message}</p>
2415
+ ${kr({
2416
+ text: this.message,
2417
+ compact: !0,
2418
+ status: !0,
2419
+ filled: this.filled === this.regionText
2420
+ })}
2233
2421
  </div>`;
2234
2422
  case "error": return C`<div
2235
2423
  class="lintje-chart-state lintje-chart-state--error"
2236
2424
  ${B({ minHeight: e })}
2237
2425
  >
2238
- <div class="lintje-announcement lintje-announcement--warning" role="status">
2239
- <span class="lintje-announcement__icon" aria-hidden="true"
2240
- >${K("functioneel-waarschuwing", { size: 16 })}</span
2241
- >
2242
- <div class="lintje-announcement__body">
2243
- ${this.filled === this.regionText ? C`<p class="lintje-announcement__text">
2244
- <span class="visually-hidden">Waarschuwing: </span>${this.message}
2245
- </p>` : T}
2246
- </div>
2247
- </div>
2426
+ ${hr({
2427
+ kind: "warning",
2428
+ text: this.message,
2429
+ live: !0,
2430
+ filled: this.filled === this.regionText
2431
+ })}
2248
2432
  ${this.lastKnown ? C`<div class="lintje-chart-state__last-known">${this.lastKnown}</div>` : T}
2249
2433
  </div>`;
2250
2434
  default: return C`<slot></slot>`;
2251
2435
  }
2252
2436
  }
2253
2437
  };
2254
- M("lintje-tile", _r);
2438
+ M("lintje-tile", Nr);
2255
2439
  //#endregion
2256
2440
  //#region src/primitives/grid/grid.css?inline
2257
- 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 {
2258
2442
  constructor(...e) {
2259
2443
  super(...e), this.columns = 12;
2260
2444
  }
2261
2445
  static {
2262
- this.styles = A(vr);
2446
+ this.styles = A(Pr);
2263
2447
  }
2264
2448
  static {
2265
2449
  this.properties = {
@@ -2277,45 +2461,45 @@ var vr = "/*\n * Written with `:host(…)` and `::slotted()`: a selector from ou
2277
2461
  return C`<slot></slot>`;
2278
2462
  }
2279
2463
  };
2280
- M("lintje-grid", yr);
2464
+ M("lintje-grid", Fr);
2281
2465
  //#endregion
2282
2466
  //#region src/primitives/grid-item/grid-item.ts
2283
- var br = class extends ar {
2467
+ var Ir = class extends lr {
2284
2468
  static {
2285
- this.styles = ir;
2469
+ this.styles = cr;
2286
2470
  }
2287
2471
  render() {
2288
2472
  return C`<slot></slot>`;
2289
2473
  }
2290
2474
  };
2291
- M("lintje-grid-item", br);
2475
+ M("lintje-grid-item", Ir);
2292
2476
  //#endregion
2293
2477
  //#region src/icons/visible.ts
2294
- var xr = "400px", Sr = /* @__PURE__ */ new WeakMap(), X = null, Cr = !1;
2295
- function wr() {
2296
- 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) => {
2297
2481
  for (let t of e) {
2298
2482
  if (!t.isIntersecting) continue;
2299
- let e = Sr.get(t.target);
2300
- Er(t.target), e?.();
2483
+ let e = Rr.get(t.target);
2484
+ Hr(t.target), e?.();
2301
2485
  }
2302
- }, { rootMargin: xr }), X) : (Cr = !0, null);
2486
+ }, { rootMargin: Lr }), X) : (zr = !0, null);
2303
2487
  }
2304
- function Tr(e, t) {
2305
- let n = wr();
2306
- 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();
2307
2491
  }
2308
- function Er(e) {
2309
- Sr.delete(e), X?.unobserve(e);
2492
+ function Hr(e) {
2493
+ Rr.delete(e), X?.unobserve(e);
2310
2494
  }
2311
2495
  //#endregion
2312
2496
  //#region src/icons/icon/icon.css?inline
2313
- 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 {
2314
2498
  constructor(...e) {
2315
2499
  super(...e), this.size = 16, this.lazy = !1, this.#e = null, this.#t = !1;
2316
2500
  }
2317
2501
  static {
2318
- this.styles = [G, A(Dr)];
2502
+ this.styles = [G, A(Ur)];
2319
2503
  }
2320
2504
  static {
2321
2505
  this.properties = {
@@ -2329,14 +2513,14 @@ var Dr = "/* `<lintje-icon>`'s own box: the host is the flex child; the glyph in
2329
2513
  #e;
2330
2514
  #t;
2331
2515
  connectedCallback() {
2332
- super.connectedCallback(), this.#e = on((e) => {
2516
+ super.connectedCallback(), this.#e = an((e) => {
2333
2517
  (e === void 0 || e === this.name) && this.requestUpdate();
2334
- }), this.lazy && !this.#t && Tr(this, () => {
2518
+ }), this.lazy && !this.#t && Vr(this, () => {
2335
2519
  this.#t = !0, this.requestUpdate();
2336
2520
  });
2337
2521
  }
2338
2522
  disconnectedCallback() {
2339
- this.#e?.(), this.#e = null, Er(this), super.disconnectedCallback();
2523
+ this.#e?.(), this.#e = null, Hr(this), super.disconnectedCallback();
2340
2524
  }
2341
2525
  render() {
2342
2526
  return K(this.name, {
@@ -2347,37 +2531,38 @@ var Dr = "/* `<lintje-icon>`'s own box: the host is the flex child; the glyph in
2347
2531
  });
2348
2532
  }
2349
2533
  };
2350
- M("lintje-icon", kr);
2534
+ M("lintje-icon", Gr);
2351
2535
  //#endregion
2352
2536
  //#region src/core/motion.ts
2353
- function Ar(e, t) {
2537
+ function Kr(e, t) {
2354
2538
  let n = getComputedStyle(e).getPropertyValue(t).trim(), r = parseFloat(n);
2355
2539
  return Number.isFinite(r) ? n.endsWith("ms") ? r : n.endsWith("s") ? r * 1e3 : r : 0;
2356
2540
  }
2357
- 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() {
2358
2556
  return typeof matchMedia < "u" && matchMedia("(prefers-reduced-motion: reduce)").matches;
2359
2557
  }
2360
2558
  //#endregion
2361
2559
  //#region src/primitives/progress-bar/progress-bar.css?inline
2362
- 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 = {
2363
- done: {
2364
- word: "klaar",
2365
- icon: "functioneel-cirkel-vinkje"
2366
- },
2367
- error: {
2368
- word: "mislukt",
2369
- icon: "functioneel-waarschuwing"
2370
- },
2371
- paused: {
2372
- word: "gepauzeerd",
2373
- icon: "multimedia-player-pauze"
2374
- }
2375
- }, 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 {
2376
2561
  constructor(...e) {
2377
- super(...e), this.label = "", this.hideLabel = !1, this.tone = "run";
2562
+ super(...e), this.label = "", this.hideLabel = !1, this.state = "busy";
2378
2563
  }
2379
2564
  static {
2380
- this.styles = [G, A(Mr)];
2565
+ this.styles = [G, A(Yr)];
2381
2566
  }
2382
2567
  static {
2383
2568
  this.properties = {
@@ -2388,7 +2573,7 @@ var Mr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: no
2388
2573
  attribute: "hide-label"
2389
2574
  },
2390
2575
  detail: { type: String },
2391
- tone: {
2576
+ state: {
2392
2577
  type: String,
2393
2578
  reflect: !0
2394
2579
  }
@@ -2400,14 +2585,17 @@ var Mr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: no
2400
2585
  get percent() {
2401
2586
  return Math.max(0, Math.min(100, this.value ?? 0));
2402
2587
  }
2403
- get resolvedTone() {
2404
- 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;
2405
2590
  }
2406
2591
  valueText(e) {
2407
2592
  return [this.detail ?? (e && this.known ? `${this.percent}%` : void 0), e?.word].filter(Boolean).join(", ") || void 0;
2408
2593
  }
2409
2594
  render() {
2410
- 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);
2411
2599
  return C`<div class=${q({
2412
2600
  "lintje-progress": !0,
2413
2601
  [`lintje-progress--${e}`]: !0
@@ -2441,14 +2629,14 @@ var Mr = ":host { display: block; min-width: 0; }\n:host([hidden]) { display: no
2441
2629
  </div>`;
2442
2630
  }
2443
2631
  };
2444
- M("lintje-progress-bar", Pr);
2632
+ M("lintje-progress-bar", Xr);
2445
2633
  //#endregion
2446
2634
  //#region node_modules/lit-html/directives/repeat.js
2447
- var Fr = (e, t, n) => {
2635
+ var Zr = (e, t, n) => {
2448
2636
  let r = /* @__PURE__ */ new Map();
2449
2637
  for (let i = t; i <= n; i++) r.set(e[i], i);
2450
2638
  return r;
2451
- }, Ir = R(class extends z {
2639
+ }, Qr = R(class extends z {
2452
2640
  constructor(e) {
2453
2641
  if (super(e), e.type !== L.CHILD) throw Error("repeat() can only be used in text expressions");
2454
2642
  }
@@ -2466,7 +2654,7 @@ var Fr = (e, t, n) => {
2466
2654
  return this.dt(e, t, n).values;
2467
2655
  }
2468
2656
  update(e, [t, n, r]) {
2469
- 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);
2470
2658
  if (!Array.isArray(i)) return this.ut = o, a;
2471
2659
  let s = this.ut ??= [], c = [], l, u, d = 0, f = i.length - 1, p = 0, m = a.length - 1;
2472
2660
  for (; d <= f && p <= m;) if (i[d] === null) d++;
@@ -2475,7 +2663,7 @@ var Fr = (e, t, n) => {
2475
2663
  else if (s[f] === o[m]) c[m] = Y(i[f], a[m]), f--, m--;
2476
2664
  else if (s[d] === o[m]) c[m] = Y(i[d], a[m]), J(e, c[m + 1], i[d]), d++, m--;
2477
2665
  else if (s[f] === o[p]) c[p] = Y(i[f], a[p]), J(e, i[d], i[f]), f--, p++;
2478
- 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])) {
2479
2667
  if (l.has(s[f])) {
2480
2668
  let t = u.get(o[p]), n = t === void 0 ? null : i[t];
2481
2669
  if (n === null) {
@@ -2483,22 +2671,22 @@ var Fr = (e, t, n) => {
2483
2671
  Y(t, a[p]), c[p] = t;
2484
2672
  } else c[p] = Y(n, a[p]), J(e, i[d], n), i[t] = null;
2485
2673
  p++;
2486
- } else Ln(i[f]), f--;
2487
- } else Ln(i[d]), d++;
2674
+ } else Vn(i[f]), f--;
2675
+ } else Vn(i[d]), d++;
2488
2676
  for (; p <= m;) {
2489
2677
  let t = J(e, c[m + 1]);
2490
2678
  Y(t, a[p]), c[p++] = t;
2491
2679
  }
2492
2680
  for (; d <= f;) {
2493
2681
  let e = i[d++];
2494
- e !== null && Ln(e);
2682
+ e !== null && Vn(e);
2495
2683
  }
2496
- return this.ut = o, Fn(e, c), w;
2684
+ return this.ut = o, zn(e, c), w;
2497
2685
  }
2498
- }), Lr = R(class extends z {
2686
+ }), $r = R(class extends z {
2499
2687
  constructor(e) {
2500
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");
2501
- 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");
2502
2690
  }
2503
2691
  render(e) {
2504
2692
  return e;
@@ -2511,116 +2699,53 @@ var Fr = (e, t, n) => {
2511
2699
  } else if (e.type === L.BOOLEAN_ATTRIBUTE) {
2512
2700
  if (!!t === n.hasAttribute(r)) return w;
2513
2701
  } else if (e.type === L.ATTRIBUTE && n.getAttribute(r) === t + "") return w;
2514
- return Fn(e), t;
2515
- }
2516
- }), Rr = [
2517
- "sky-blue",
2518
- "dark-yellow",
2519
- "red",
2520
- "green",
2521
- "mint-green",
2522
- "violet",
2523
- "orange",
2524
- "pink",
2525
- "dark-green",
2526
- "purple",
2527
- "ruby-red",
2528
- "yellow",
2529
- "dark-brown",
2530
- "brown",
2531
- "dark-blue",
2532
- "light-blue",
2533
- "moss-green"
2534
- ];
2535
- function zr(e) {
2536
- return typeof e == "string" && Rr.includes(e);
2537
- }
2538
- function Br(e) {
2539
- return `var(--color-chart-${e})`;
2540
- }
2541
- //#endregion
2542
- //#region src/core/format.ts
2543
- function Z(e, t = 0) {
2544
- return e.toLocaleString("nl-NL", {
2545
- minimumFractionDigits: t,
2546
- maximumFractionDigits: t
2547
- });
2548
- }
2549
- function Vr(e) {
2550
- return Math.abs(e) >= 1e6 ? `${Z(e / 1e6, 1)} mln` : Math.abs(e) >= 1e4 ? `${Math.round(e / 1e3)}k` : Z(e);
2551
- }
2552
- function Hr(e, t) {
2553
- let n = Z(e);
2554
- return Wr(n, t) ? n : Vr(e);
2555
- }
2556
- var Ur = 6.5;
2557
- function Wr(e, t) {
2558
- return e.length * Ur <= t;
2559
- }
2560
- var Gr = "'RijksSans', 'Source Sans 3', sans-serif", Q;
2561
- function Kr(e, t, n = "") {
2562
- if (qr(e, n) <= t) return e;
2563
- let r = e.length;
2564
- for (; r > 1;) {
2565
- --r;
2566
- let i = `${e.slice(0, r).trimEnd()}…`;
2567
- if (qr(i, n) <= t) return i;
2702
+ return zn(e), t;
2568
2703
  }
2569
- return "…";
2570
- }
2571
- function qr(e, t = "") {
2572
- return Q === void 0 && (Q = typeof document > "u" ? null : document.createElement("canvas").getContext("2d") ?? null), Q ? (Q.font = `400 12px ${t.trim() || Gr}`, Q.measureText(e).width) : e.length * Ur;
2573
- }
2574
- function Jr(e, t = 0) {
2575
- return `${Z(e, t)}%`;
2576
- }
2577
- //#endregion
2578
- //#region node_modules/lit-html/async-directive.js
2579
- var $ = (e, t) => {
2704
+ }), Z = (e, t) => {
2580
2705
  let n = e._$AN;
2581
2706
  if (n === void 0) return !1;
2582
- for (let e of n) e._$AO?.(t, !1), $(e, t);
2707
+ for (let e of n) e._$AO?.(t, !1), Z(e, t);
2583
2708
  return !0;
2584
- }, Yr = (e) => {
2709
+ }, ei = (e) => {
2585
2710
  let t, n;
2586
2711
  do {
2587
2712
  if ((t = e._$AM) === void 0) break;
2588
2713
  n = t._$AN, n.delete(e), e = t;
2589
2714
  } while (n?.size === 0);
2590
- }, Xr = (e) => {
2715
+ }, ti = (e) => {
2591
2716
  for (let t; t = e._$AM; e = t) {
2592
2717
  let n = t._$AN;
2593
2718
  if (n === void 0) t._$AN = n = /* @__PURE__ */ new Set();
2594
2719
  else if (n.has(e)) break;
2595
- n.add(e), $r(t);
2720
+ n.add(e), ii(t);
2596
2721
  }
2597
2722
  };
2598
- function Zr(e) {
2599
- this._$AN === void 0 ? this._$AM = e : (Yr(this), this._$AM = e, Xr(this));
2723
+ function ni(e) {
2724
+ this._$AN === void 0 ? this._$AM = e : (ei(this), this._$AM = e, ti(this));
2600
2725
  }
2601
- function Qr(e, t = !1, n = 0) {
2726
+ function ri(e, t = !1, n = 0) {
2602
2727
  let r = this._$AH, i = this._$AN;
2603
2728
  if (i !== void 0 && i.size !== 0) {
2604
2729
  if (t) {
2605
- if (Array.isArray(r)) for (let e = n; e < r.length; e++) $(r[e], !1), Yr(r[e]);
2606
- else r != null && ($(r, !1), Yr(r));
2607
- } else $(this, e);
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));
2732
+ } else Z(this, e);
2608
2733
  }
2609
2734
  }
2610
- var $r = (e) => {
2611
- e.type == L.CHILD && (e._$AP ??= Qr, e._$AQ ??= Zr);
2612
- }, ei = class extends z {
2735
+ var ii = (e) => {
2736
+ e.type == L.CHILD && (e._$AP ??= ri, e._$AQ ??= ni);
2737
+ }, ai = class extends z {
2613
2738
  constructor() {
2614
2739
  super(...arguments), this._$AN = void 0;
2615
2740
  }
2616
2741
  _$AT(e, t, n) {
2617
- super._$AT(e, t, n), Xr(this), this.isConnected = e._$AU;
2742
+ super._$AT(e, t, n), ti(this), this.isConnected = e._$AU;
2618
2743
  }
2619
2744
  _$AO(e, t = !0) {
2620
- e !== this.isConnected && (this.isConnected = e, e ? this.reconnected?.() : this.disconnected?.()), t && ($(this, e), Yr(this));
2745
+ e !== this.isConnected && (this.isConnected = e, e ? this.reconnected?.() : this.disconnected?.()), t && (Z(this, e), ei(this));
2621
2746
  }
2622
2747
  setValue(e) {
2623
- if (Mn(this._$Ct)) this._$Ct._$AI(e, this);
2748
+ if (In(this._$Ct)) this._$Ct._$AI(e, this);
2624
2749
  else {
2625
2750
  let t = [...this._$Ct._$AH];
2626
2751
  t[this._$Ci] = e, this._$Ct._$AI(t, this, 0);
@@ -2628,7 +2753,7 @@ var $r = (e) => {
2628
2753
  }
2629
2754
  disconnected() {}
2630
2755
  reconnected() {}
2631
- }, ti = /* @__PURE__ */ new WeakMap(), ni = R(class extends ei {
2756
+ }, oi = /* @__PURE__ */ new WeakMap(), si = R(class extends ai {
2632
2757
  render(e) {
2633
2758
  return T;
2634
2759
  }
@@ -2639,13 +2764,13 @@ var $r = (e) => {
2639
2764
  rt(e) {
2640
2765
  if (this.G !== void 0) {
2641
2766
  if (this.isConnected || (e = void 0), typeof this.G == "function") {
2642
- let t = this.ht ?? globalThis, n = ti.get(t);
2643
- n === void 0 && (n = /* @__PURE__ */ new WeakMap(), ti.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);
2644
2769
  } else this.G.value = e;
2645
2770
  }
2646
2771
  }
2647
2772
  get lt() {
2648
- return typeof this.G == "function" ? ti.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;
2649
2774
  }
2650
2775
  disconnected() {
2651
2776
  this.lt === this.ct && this.rt(void 0);
@@ -2653,6 +2778,82 @@ var $r = (e) => {
2653
2778
  reconnected() {
2654
2779
  this.rt(this.ct);
2655
2780
  }
2656
- });
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
+ }
2795
+ //#endregion
2796
+ //#region src/core/format.ts
2797
+ function Q(e, t = 0) {
2798
+ return e.toLocaleString("nl-NL", {
2799
+ minimumFractionDigits: t,
2800
+ maximumFractionDigits: t
2801
+ });
2802
+ }
2803
+ function gi(e) {
2804
+ return Math.abs(e) >= 1e6 ? `${Q(e / 1e6, 1)} mln` : Math.abs(e) >= 1e4 ? `${Math.round(e / 1e3)}k` : Q(e);
2805
+ }
2806
+ function _i(e, t) {
2807
+ let n = Q(e);
2808
+ return yi(n, t) ? n : gi(e);
2809
+ }
2810
+ var vi = 6.5;
2811
+ function yi(e, t) {
2812
+ return e.length * vi <= t;
2813
+ }
2814
+ var bi = "'RijksSans', 'Source Sans 3', sans-serif", $;
2815
+ function xi(e, t, n = "") {
2816
+ if (Si(e, n) <= t) return e;
2817
+ let r = e.length;
2818
+ for (; r > 1;) {
2819
+ --r;
2820
+ let i = `${e.slice(0, r).trimEnd()}…`;
2821
+ if (Si(i, n) <= t) return i;
2822
+ }
2823
+ return "…";
2824
+ }
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;
2827
+ }
2828
+ function Ci(e, t = 0) {
2829
+ return `${Q(e, t)}%`;
2830
+ }
2831
+ //#endregion
2832
+ //#region src/tokens/colors.ts
2833
+ var wi = [
2834
+ "sky-blue",
2835
+ "dark-yellow",
2836
+ "red",
2837
+ "green",
2838
+ "mint-green",
2839
+ "violet",
2840
+ "orange",
2841
+ "pink",
2842
+ "dark-green",
2843
+ "purple",
2844
+ "ruby-red",
2845
+ "yellow",
2846
+ "dark-brown",
2847
+ "brown",
2848
+ "dark-blue",
2849
+ "light-blue",
2850
+ "moss-green"
2851
+ ];
2852
+ function Ti(e) {
2853
+ return typeof e == "string" && wi.includes(e);
2854
+ }
2855
+ function Ei(e) {
2856
+ return `var(--color-chart-${e})`;
2857
+ }
2657
2858
  //#endregion
2658
- 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, o as Jt, Cn as K, C 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, vn as Y, e as Yt, q as Z, Or as _, Ft as _t, Z as a, nn as at, yr as b, At as bt, Kr as c, cn as ct, zr 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, Hr as i, ln as it, tr as j, ht as jt, ir as k, mt as kt, Rr as l, en as lt, Pr as m, z as mt, Wr as n, rn as nt, Jr as o, an as ot, Ir as p, R as pt, xn as q, Ce as qt, Vr as r, tn as rt, qr as s, on as st, ni as t, hn as tt, Br 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 };