lintje 0.2.0 → 0.4.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 (320) hide show
  1. package/README.md +2 -2
  2. package/dist-elements/actions.js +1 -1
  3. package/dist-elements/chunks/{base-Bg-IFOPG.js → base-DRGvkF-r.js} +484 -309
  4. package/dist-elements/chunks/{controls-B1455oPG.js → controls-_4ac1Lpz.js} +7 -1
  5. package/dist-elements/chunks/{date-format-mHtZyBys.js → date-format-DxP9yfDp.js} +1 -1
  6. package/dist-elements/chunks/dialog-B7aRBtjy.js +28 -0
  7. package/dist-elements/chunks/{disclosure-BXTX04gM.js → disclosure-D39vAR5q.js} +1 -1
  8. package/dist-elements/chunks/{disclosure-CMXhX-Vb.js → disclosure-DirPLy2E.js} +6 -6
  9. package/dist-elements/chunks/download-C68kcwPj.js +206 -0
  10. package/dist-elements/chunks/{focus-trap-9BnE-xWv.js → focus-trap-Dv8zu64A.js} +1 -1
  11. package/dist-elements/chunks/input-BGMLam-O.js +195 -0
  12. package/dist-elements/chunks/input-lQTmOMOz.js +4 -0
  13. package/dist-elements/chunks/{player-DXOZEyEy.js → player-BApadXr8.js} +27 -27
  14. package/dist-elements/chunks/{sentence-BI3lwEuT.js → sentence-0wO85ZdJ.js} +3 -3
  15. package/dist-elements/chunks/{stagger-qGD3wmhg.js → stagger-BB_gcxBI.js} +88 -74
  16. package/dist-elements/content.js +1 -0
  17. package/dist-elements/core.js +1 -1
  18. package/dist-elements/custom-elements.json +8858 -7715
  19. package/dist-elements/data-types.json +6900 -0
  20. package/dist-elements/feedback.js +2 -1
  21. package/dist-elements/frame.js +0 -2
  22. package/dist-elements/guides/dashboard.md +8 -0
  23. package/dist-elements/guides/events.md +4 -5
  24. package/dist-elements/guides/loading.md +10 -9
  25. package/dist-elements/guides/page-contents.md +110 -0
  26. package/dist-elements/guides/start.md +12 -0
  27. package/dist-elements/inputs.js +3 -1
  28. package/dist-elements/layout.js +1 -1
  29. package/dist-elements/lintje.js +8562 -7138
  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 +15 -15
  34. package/dist-elements/tag/ai-label.js +10 -10
  35. package/dist-elements/tag/announcement.js +36 -76
  36. package/dist-elements/tag/app-search.js +49 -49
  37. package/dist-elements/tag/audio-player.js +57 -57
  38. package/dist-elements/tag/badge.d.ts +1 -1
  39. package/dist-elements/tag/badge.js +1 -1
  40. package/dist-elements/tag/breadcrumbs.js +15 -15
  41. package/dist-elements/tag/button.d.ts +1 -1
  42. package/dist-elements/tag/button.js +1 -1
  43. package/dist-elements/tag/card-list.js +12 -12
  44. package/dist-elements/tag/card.js +39 -44
  45. package/dist-elements/tag/chart.js +1357 -787
  46. package/dist-elements/tag/chat-answer.js +49 -49
  47. package/dist-elements/tag/chat-composer.js +75 -71
  48. package/dist-elements/tag/chat-message.js +8 -8
  49. package/dist-elements/tag/chat-strip.js +22 -22
  50. package/dist-elements/tag/chat-suggestions.js +12 -12
  51. package/dist-elements/tag/chat.js +56 -56
  52. package/dist-elements/tag/checkbox-group.d.ts +1 -0
  53. package/dist-elements/tag/checkbox-group.js +60 -0
  54. package/dist-elements/tag/checkbox.js +9 -8
  55. package/dist-elements/tag/code.js +9 -9
  56. package/dist-elements/tag/combobox.js +19 -18
  57. package/dist-elements/tag/conflict-alert.js +12 -12
  58. package/dist-elements/tag/copy-button.js +14 -14
  59. package/dist-elements/tag/data-table.js +880 -532
  60. package/dist-elements/tag/date-input.js +30 -29
  61. package/dist-elements/tag/date-range.js +39 -38
  62. package/dist-elements/tag/description-list.js +29 -32
  63. package/dist-elements/tag/dialog.d.ts +1 -0
  64. package/dist-elements/tag/dialog.js +144 -0
  65. package/dist-elements/tag/document-viewer.js +23 -23
  66. package/dist-elements/tag/drawer.js +28 -32
  67. package/dist-elements/tag/empty-state.js +19 -30
  68. package/dist-elements/tag/error-page.d.ts +1 -0
  69. package/dist-elements/tag/error-page.js +109 -0
  70. package/dist-elements/tag/error-summary.js +10 -10
  71. package/dist-elements/tag/expander.js +8 -8
  72. package/dist-elements/tag/explainer.js +11 -11
  73. package/dist-elements/tag/field.js +5 -5
  74. package/dist-elements/tag/file-upload.js +35 -34
  75. package/dist-elements/tag/filter-bar.js +56 -56
  76. package/dist-elements/tag/filter-sheet.js +11 -11
  77. package/dist-elements/tag/filter-zone.js +31 -31
  78. package/dist-elements/tag/find.d.ts +1 -0
  79. package/dist-elements/tag/find.js +128 -0
  80. package/dist-elements/tag/footer.js +21 -21
  81. package/dist-elements/tag/form-actions.js +29 -25
  82. package/dist-elements/tag/form-section.js +6 -6
  83. package/dist-elements/tag/form.js +12 -12
  84. package/dist-elements/tag/gallery.js +14 -14
  85. package/dist-elements/tag/grid-item.d.ts +1 -1
  86. package/dist-elements/tag/grid-item.js +1 -1
  87. package/dist-elements/tag/grid.d.ts +1 -1
  88. package/dist-elements/tag/grid.js +1 -1
  89. package/dist-elements/tag/hero.js +12 -12
  90. package/dist-elements/tag/highlight.js +5 -5
  91. package/dist-elements/tag/icon-button.d.ts +1 -1
  92. package/dist-elements/tag/icon-button.js +1 -1
  93. package/dist-elements/tag/icon.d.ts +1 -1
  94. package/dist-elements/tag/icon.js +1 -1
  95. package/dist-elements/tag/job-list.js +22 -44
  96. package/dist-elements/tag/kpi-row.js +12 -10
  97. package/dist-elements/tag/kpi.js +149 -140
  98. package/dist-elements/tag/level-meter.js +11 -11
  99. package/dist-elements/tag/list.js +55 -55
  100. package/dist-elements/tag/logo.js +30 -30
  101. package/dist-elements/tag/map.js +702 -671
  102. package/dist-elements/tag/menu-button.js +70 -69
  103. package/dist-elements/tag/modal.js +28 -37
  104. package/dist-elements/tag/multiselect.js +35 -34
  105. package/dist-elements/tag/note.js +5 -5
  106. package/dist-elements/tag/notifications.js +36 -36
  107. package/dist-elements/tag/number-input.js +13 -12
  108. package/dist-elements/tag/page-header.js +140 -37
  109. package/dist-elements/tag/pagination.js +54 -49
  110. package/dist-elements/tag/popover.d.ts +1 -1
  111. package/dist-elements/tag/popover.js +1 -1
  112. package/dist-elements/tag/progress-bar.d.ts +1 -1
  113. package/dist-elements/tag/progress-bar.js +1 -1
  114. package/dist-elements/tag/prose.js +6 -6
  115. package/dist-elements/tag/qr-code.js +7 -7
  116. package/dist-elements/tag/radio-group.js +13 -12
  117. package/dist-elements/tag/range.js +23 -22
  118. package/dist-elements/tag/recording-status.js +14 -14
  119. package/dist-elements/tag/repeater.js +10 -10
  120. package/dist-elements/tag/segmented.js +14 -13
  121. package/dist-elements/tag/select.js +11 -10
  122. package/dist-elements/tag/shell.js +356 -339
  123. package/dist-elements/tag/skeleton.d.ts +1 -1
  124. package/dist-elements/tag/skeleton.js +1 -1
  125. package/dist-elements/tag/slot-picker.js +16 -15
  126. package/dist-elements/tag/sortable-list.js +14 -14
  127. package/dist-elements/tag/spinner.d.ts +1 -1
  128. package/dist-elements/tag/spinner.js +1 -1
  129. package/dist-elements/tag/split-pane.js +12 -12
  130. package/dist-elements/tag/status-dot.d.ts +1 -1
  131. package/dist-elements/tag/status-dot.js +1 -1
  132. package/dist-elements/tag/stepper.js +21 -21
  133. package/dist-elements/tag/streaming-text.js +13 -13
  134. package/dist-elements/tag/sub-nav.js +39 -38
  135. package/dist-elements/tag/tabs.js +38 -38
  136. package/dist-elements/tag/tag-input.js +20 -19
  137. package/dist-elements/tag/text-editor.js +25 -24
  138. package/dist-elements/tag/text-input.js +15 -14
  139. package/dist-elements/tag/textarea.js +15 -14
  140. package/dist-elements/tag/tile.d.ts +1 -1
  141. package/dist-elements/tag/tile.js +1 -1
  142. package/dist-elements/tag/time-input.js +20 -19
  143. package/dist-elements/tag/toast.js +32 -23
  144. package/dist-elements/tag/toggle.js +9 -8
  145. package/dist-elements/tag/toggletip.js +27 -27
  146. package/dist-elements/tag/token-value.d.ts +1 -0
  147. package/dist-elements/tag/token-value.js +75 -0
  148. package/dist-elements/tag/tooltip.d.ts +1 -1
  149. package/dist-elements/tag/tooltip.js +1 -1
  150. package/dist-elements/tag/transcript.js +48 -48
  151. package/dist-elements/tag/translator.js +13 -13
  152. package/dist-elements/tag/tree-view.js +13 -13
  153. package/dist-elements/tag/user-menu.js +37 -37
  154. package/dist-elements/tag/video-player.js +21 -21
  155. package/dist-elements/tokens.css +120 -96
  156. package/dist-elements/tokens.json +1244 -0
  157. package/dist-elements/types/bundle/actions.d.ts +3 -3
  158. package/dist-elements/types/bundle/content.d.ts +1 -0
  159. package/dist-elements/types/bundle/feedback.d.ts +6 -5
  160. package/dist-elements/types/bundle/frame.d.ts +0 -2
  161. package/dist-elements/types/bundle/index.d.ts +0 -10
  162. package/dist-elements/types/bundle/inputs.d.ts +2 -0
  163. package/dist-elements/types/bundle/layout.d.ts +3 -3
  164. package/dist-elements/types/bundle/overlays.d.ts +3 -3
  165. package/dist-elements/types/categories.d.ts +4 -0
  166. package/dist-elements/types/{primitives → components/actions}/button/button.d.ts +13 -10
  167. package/dist-elements/types/components/actions/copy-button/copy-button.d.ts +8 -9
  168. package/dist-elements/types/{icons → components/actions}/icon/icon.d.ts +4 -5
  169. package/dist-elements/types/{primitives → components/actions}/icon-button/icon-button.d.ts +8 -6
  170. package/dist-elements/types/components/actions/menu-button/menu-button.d.ts +16 -18
  171. package/dist-elements/types/components/actions/qr-code/qr-code.d.ts +10 -10
  172. package/dist-elements/types/components/charts/chart/chart.d.ts +6 -5
  173. package/dist-elements/types/components/charts/explainer/explainer.d.ts +1 -1
  174. package/dist-elements/types/components/charts/kpi/kpi.d.ts +19 -11
  175. package/dist-elements/types/components/charts/kpi-row/kpi-row.d.ts +2 -8
  176. package/dist-elements/types/components/charts/note/note.d.ts +2 -2
  177. package/dist-elements/types/components/chat/chat/chat.d.ts +9 -11
  178. package/dist-elements/types/components/chat/chat-answer/chat-answer.d.ts +10 -11
  179. package/dist-elements/types/components/chat/chat-composer/chat-composer.d.ts +10 -12
  180. package/dist-elements/types/components/chat/chat-message/chat-message.d.ts +7 -8
  181. package/dist-elements/types/components/chat/chat-strip/chat-strip.d.ts +5 -5
  182. package/dist-elements/types/components/chat/chat-suggestions/chat-suggestions.d.ts +9 -10
  183. package/dist-elements/types/components/content/audio-player/audio-player.d.ts +15 -17
  184. package/dist-elements/types/components/content/code/code.d.ts +3 -4
  185. package/dist-elements/types/components/content/document-viewer/document-viewer.d.ts +10 -11
  186. package/dist-elements/types/components/content/gallery/gallery.d.ts +5 -4
  187. package/dist-elements/types/components/content/highlight/highlight.d.ts +5 -4
  188. package/dist-elements/types/components/content/prose/prose.d.ts +3 -4
  189. package/dist-elements/types/components/content/token-value/token-value.d.ts +42 -0
  190. package/dist-elements/types/components/content/transcript/transcript.d.ts +15 -28
  191. package/dist-elements/types/components/content/translator/translator.d.ts +12 -16
  192. package/dist-elements/types/components/content/video-player/video-player.d.ts +12 -14
  193. package/dist-elements/types/components/feedback/ai-label/ai-label.d.ts +3 -4
  194. package/dist-elements/types/components/feedback/announcement/announcement.d.ts +5 -9
  195. package/dist-elements/types/{primitives → components/feedback}/badge/badge.d.ts +10 -6
  196. package/dist-elements/types/components/feedback/conflict-alert/conflict-alert.d.ts +4 -5
  197. package/dist-elements/types/components/feedback/empty-state/empty-state.d.ts +5 -8
  198. package/dist-elements/types/components/feedback/error-page/error-page.d.ts +52 -0
  199. package/dist-elements/types/components/feedback/job-list/job-list.d.ts +9 -12
  200. package/dist-elements/types/components/feedback/level-meter/level-meter.d.ts +4 -6
  201. package/dist-elements/types/{primitives → components/feedback}/progress-bar/progress-bar.d.ts +9 -7
  202. package/dist-elements/types/components/feedback/recording-status/recording-status.d.ts +5 -6
  203. package/dist-elements/types/{primitives → components/feedback}/skeleton/skeleton.d.ts +2 -2
  204. package/dist-elements/types/{primitives → components/feedback}/spinner/spinner.d.ts +2 -3
  205. package/dist-elements/types/{primitives → components/feedback}/status-dot/status-dot.d.ts +5 -6
  206. package/dist-elements/types/components/feedback/streaming-text/streaming-text.d.ts +12 -9
  207. package/dist-elements/types/components/feedback/toast/toast.d.ts +8 -9
  208. package/dist-elements/types/components/filters/filter-bar/filter-bar.d.ts +9 -4
  209. package/dist-elements/types/components/filters/filter-sheet/filter-sheet.d.ts +7 -7
  210. package/dist-elements/types/components/filters/filter-zone/filter-zone.d.ts +4 -4
  211. package/dist-elements/types/components/forms/error-summary/error-summary.d.ts +6 -7
  212. package/dist-elements/types/components/forms/form/form.d.ts +5 -5
  213. package/dist-elements/types/components/forms/form-actions/form-actions.d.ts +10 -8
  214. package/dist-elements/types/components/forms/form-section/form-section.d.ts +6 -5
  215. package/dist-elements/types/components/forms/repeater/repeater.d.ts +15 -9
  216. package/dist-elements/types/components/forms/stepper/stepper.d.ts +6 -5
  217. package/dist-elements/types/components/frame/app-search/app-search.d.ts +7 -8
  218. package/dist-elements/types/components/frame/breadcrumbs/breadcrumbs.d.ts +2 -2
  219. package/dist-elements/types/components/frame/footer/footer.d.ts +3 -2
  220. package/dist-elements/types/components/frame/hero/hero.d.ts +7 -9
  221. package/dist-elements/types/components/frame/notifications/notifications.d.ts +7 -11
  222. package/dist-elements/types/components/frame/page-header/page-header.d.ts +13 -16
  223. package/dist-elements/types/components/frame/shell/shell.d.ts +15 -14
  224. package/dist-elements/types/components/frame/sub-nav/sub-nav.d.ts +10 -6
  225. package/dist-elements/types/components/frame/user-menu/user-menu.d.ts +13 -12
  226. package/dist-elements/types/components/index.d.ts +51 -12
  227. package/dist-elements/types/components/inputs/checkbox/checkbox.d.ts +4 -4
  228. package/dist-elements/types/components/inputs/checkbox-group/checkbox-group.d.ts +33 -0
  229. package/dist-elements/types/components/inputs/combobox/combobox.d.ts +14 -8
  230. package/dist-elements/types/components/inputs/date-input/date-input.d.ts +6 -6
  231. package/dist-elements/types/components/inputs/date-range/date-range.d.ts +13 -8
  232. package/dist-elements/types/components/inputs/field/field.d.ts +5 -3
  233. package/dist-elements/types/components/inputs/file-upload/file-upload.d.ts +8 -10
  234. package/dist-elements/types/components/inputs/find/find.d.ts +51 -0
  235. package/dist-elements/types/components/inputs/multiselect/multiselect.d.ts +4 -6
  236. package/dist-elements/types/components/inputs/number-input/number-input.d.ts +8 -7
  237. package/dist-elements/types/components/inputs/radio-group/radio-group.d.ts +2 -4
  238. package/dist-elements/types/components/inputs/range/range.d.ts +5 -6
  239. package/dist-elements/types/components/inputs/segmented/segmented.d.ts +7 -4
  240. package/dist-elements/types/components/inputs/select/select.d.ts +6 -3
  241. package/dist-elements/types/components/inputs/shared/input.d.ts +1 -1
  242. package/dist-elements/types/components/inputs/slot-picker/slot-picker.d.ts +6 -5
  243. package/dist-elements/types/components/inputs/tag-input/tag-input.d.ts +8 -6
  244. package/dist-elements/types/components/inputs/text-editor/text-editor.d.ts +8 -8
  245. package/dist-elements/types/components/inputs/text-input/text-input.d.ts +12 -7
  246. package/dist-elements/types/components/inputs/textarea/textarea.d.ts +12 -11
  247. package/dist-elements/types/components/inputs/time-input/time-input.d.ts +8 -9
  248. package/dist-elements/types/components/inputs/toggle/toggle.d.ts +3 -1
  249. package/dist-elements/types/components/layout/expander/expander.d.ts +10 -11
  250. package/dist-elements/types/{primitives → components/layout}/grid/grid.d.ts +4 -4
  251. package/dist-elements/types/{primitives → components/layout}/grid-item/grid-item.d.ts +2 -2
  252. package/dist-elements/types/components/layout/split-pane/split-pane.d.ts +6 -6
  253. package/dist-elements/types/components/layout/tabs/tabs.d.ts +12 -10
  254. package/dist-elements/types/{primitives → components/layout}/tile/tile.d.ts +22 -10
  255. package/dist-elements/types/components/map/map/map.d.ts +12 -11
  256. package/dist-elements/types/components/overlays/dialog/dialog.d.ts +49 -0
  257. package/dist-elements/types/components/overlays/drawer/drawer.d.ts +6 -5
  258. package/dist-elements/types/components/overlays/modal/modal.d.ts +9 -14
  259. package/dist-elements/types/{primitives → components/overlays}/popover/popover.d.ts +7 -6
  260. package/dist-elements/types/components/overlays/toggletip/toggletip.d.ts +4 -8
  261. package/dist-elements/types/{primitives → components/overlays}/tooltip/tooltip.d.ts +8 -8
  262. package/dist-elements/types/components/shared/announcement-block.d.ts +38 -0
  263. package/dist-elements/types/components/shared/charts/index.d.ts +5 -1
  264. package/dist-elements/types/components/shared/charts/kinds.d.ts +92 -0
  265. package/dist-elements/types/components/shared/charts/line-chart/line-chart.d.ts +2 -2
  266. package/dist-elements/types/components/shared/charts/map-chart/leaflet.d.ts +5 -0
  267. package/dist-elements/types/components/shared/charts/map-chart/map-chart.d.ts +1 -1
  268. package/dist-elements/types/components/shared/charts/radar-chart/radar-chart.d.ts +31 -0
  269. package/dist-elements/types/components/shared/charts/shared/axes.d.ts +3 -1
  270. package/dist-elements/types/components/shared/charts/shared/chart-states.d.ts +8 -19
  271. package/dist-elements/types/components/shared/charts/shared/controller.d.ts +12 -0
  272. package/dist-elements/types/components/shared/charts/shared/types.d.ts +62 -0
  273. package/dist-elements/types/components/shared/charts/stacked-area-chart/stacked-area-chart.d.ts +13 -0
  274. package/dist-elements/types/components/shared/content-tile.d.ts +1 -1
  275. package/dist-elements/types/components/{forms/form → shared}/controls.d.ts +3 -2
  276. package/dist-elements/types/components/shared/dialog.d.ts +9 -0
  277. package/dist-elements/types/components/shared/empty-state-block.d.ts +26 -0
  278. package/dist-elements/types/components/shared/overflow.d.ts +58 -0
  279. package/dist-elements/types/components/shared/tone.d.ts +18 -0
  280. package/dist-elements/types/components/tables/activity-log/activity-log.d.ts +3 -4
  281. package/dist-elements/types/components/tables/card/card.d.ts +17 -23
  282. package/dist-elements/types/components/tables/card-list/card-list.d.ts +9 -11
  283. package/dist-elements/types/components/tables/data-table/actions.d.ts +1 -1
  284. package/dist-elements/types/components/tables/data-table/data-table.d.ts +88 -19
  285. package/dist-elements/types/components/tables/data-table/editing.d.ts +1 -1
  286. package/dist-elements/types/components/tables/data-table/filters.d.ts +15 -6
  287. package/dist-elements/types/components/tables/description-list/description-list.d.ts +13 -12
  288. package/dist-elements/types/components/tables/list/list.d.ts +13 -24
  289. package/dist-elements/types/components/tables/pagination/pagination.d.ts +12 -11
  290. package/dist-elements/types/components/tables/sortable-list/sortable-list.d.ts +5 -6
  291. package/dist-elements/types/components/tables/tree-view/tree-view.d.ts +5 -5
  292. package/dist-elements/types/core/focus.d.ts +1 -1
  293. package/dist-elements/types/core/media.d.ts +2 -2
  294. package/dist-elements/types/core/motion.d.ts +5 -0
  295. package/dist-elements/types/core/print.d.ts +15 -0
  296. package/dist-elements/types/core/shortcuts.d.ts +2 -2
  297. package/dist-elements/types/icons/register.d.ts +1 -1
  298. package/dist-elements/types/types.d.ts +70 -10
  299. package/dist-icons/functioneel-kolommen.svg +1 -0
  300. package/dist-icons/functioneel-trechter.svg +1 -0
  301. package/package.json +1 -1
  302. package/dist-elements/chunks/confirm-dialog-D5EVGuil.js +0 -4
  303. package/dist-elements/chunks/download-y528pIHP.js +0 -230
  304. package/dist-elements/chunks/input-BtuNFSWk.js +0 -195
  305. package/dist-elements/tag/confirm-dialog.d.ts +0 -1
  306. package/dist-elements/tag/confirm-dialog.js +0 -118
  307. package/dist-elements/tag/session-expiry.d.ts +0 -1
  308. package/dist-elements/tag/session-expiry.js +0 -184
  309. package/dist-elements/tag/shortcuts.d.ts +0 -1
  310. package/dist-elements/tag/shortcuts.js +0 -104
  311. package/dist-elements/types/components/frame/session-expiry/session-expiry.d.ts +0 -55
  312. package/dist-elements/types/components/frame/shortcuts/shortcuts.d.ts +0 -41
  313. package/dist-elements/types/components/overlays/confirm-dialog/confirm-dialog.d.ts +0 -41
  314. package/dist-elements/types/primitives/index.d.ts +0 -33
  315. /package/dist-elements/types/components/content/{audio-player → shared}/playback.d.ts +0 -0
  316. /package/dist-elements/types/components/content/{audio-player → shared}/player.d.ts +0 -0
  317. /package/dist-elements/types/components/{inputs/date-input → shared}/date-format.d.ts +0 -0
  318. /package/dist-elements/types/{primitives → components}/shared/grid-item-element.d.ts +0 -0
  319. /package/dist-elements/types/{primitives → components}/shared/length.d.ts +0 -0
  320. /package/dist-elements/types/{primitives → components}/shared/place.d.ts +0 -0
@@ -1,15 +1,13 @@
1
1
  /**
2
- * `<lintje-pagination>` — the "21–40 van 131 documenten" count on the left, "Vorige", page
3
- * numbers and "Volgende" in the middle and, with `page-sizes`, the choice how many stand on a page
4
- * on the right. Where the three do not fit on one line the count and the choice go below.
2
+ * `<lintje-pagination>` — the "21–40 van 131 documenten" count, "Vorige", the page numbers and
3
+ * "Volgende" and, with `page-sizes`, the choice how many stand on a page.
5
4
  *
6
- * It does not write the URL. With `href-template` every page is a link and a plain click is
7
- * handed to the host as `lintje-navigate`; without one they are buttons. A choice shows at once
8
- * and the host confirms it through `page` and `page-size`. Pages count from 1.
5
+ * It does not write the URL: a choice shows at once, and the host confirms it through `page` and
6
+ * `page-size`. With `href-template` every page is a link; without one they are buttons. Pages
7
+ * count from 1.
9
8
  *
10
- * Events: `lintje-page-change` `{ page }`; `lintje-page-size-change` `{ pageSize, page }`, where
11
- * `page` is the one that keeps the first row in view; with `href-template` also
12
- * `lintje-navigate` `{ href }`.
9
+ * Events: `lintje-page-change` `{ page }`, `lintje-page-size-change` `{ pageSize, page }` (`page`
10
+ * keeps the first row in view), `lintje-navigate` `{ href }` (with `href-template`).
13
11
  */
14
12
  import { type PropertyDeclarations, type PropertyValues, type TemplateResult } from 'lit';
15
13
  import { LintjeElement } from '../../../core/element.js';
@@ -27,9 +25,10 @@ export interface CountUnit {
27
25
  }
28
26
  /**
29
27
  * "21–40 van 131 documenten": the rows on `page`, or `null` when the host gave no total. When
30
- * everything fits on one page the range would repeat the total, so only the total stands.
28
+ * everything fits on one page the range would repeat the total, so only the total stands. With
29
+ * `from`, a filter narrowed the total: "· gefilterd uit 980" follows.
31
30
  */
32
- export declare function rangeText(page: number, pageSize?: number, total?: number, unit?: CountUnit): string | null;
31
+ export declare function rangeText(page: number, pageSize?: number, total?: number, unit?: CountUnit, from?: number): string | null;
33
32
  /** `"10, 20, 50"` → `[10, 20, 50]`: whole, positive, each once, in the host's order. */
34
33
  export declare function parsePageSizes(value: string | null): number[] | undefined;
35
34
  export declare class LintjePagination extends LintjeElement {
@@ -41,6 +40,8 @@ export declare class LintjePagination extends LintjeElement {
41
40
  pageCount?: number;
42
41
  /** Rows over all pages, for the count. */
43
42
  total?: number;
43
+ /** The rows before a filter narrowed them to `total`; the count then says it was filtered. */
44
+ filteredFrom?: number;
44
45
  pageSize?: number;
45
46
  /** `"10, 20, 50"`: draws the choice how many stand on a page. */
46
47
  pageSizes?: number[];
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * `<lintje-sortable-list>` — rows reordered by dragging a grip or with the keyboard.
3
3
  *
4
- * Only the grip starts a drag, so on a phone the list still scrolls under a finger on the row. A
5
- * tap on a grip picks its row up as the keyboard does, and a tap on a grip puts it down there.
6
- * It reorders its own copy of `items` until the host sends new ones and tells an order once, when
7
- * a row is put down at a new place. Every step is read out by a `role="status"`.
4
+ * Only the grip starts a drag, so on a phone the list still scrolls under a finger. It reorders
5
+ * its own copy of `items` until the host sends new ones, and tells an order once, when a row is
6
+ * put down at a new place.
8
7
  *
9
- * Events: `lintje-change` (ids, not composed); `lintje-values-change` `{ [name]: ids }` with a
10
- * `name`; `lintje-checked-change` (ids) with `checkable`.
8
+ * Events: `lintje-change` `string[]` (the ids in order), `lintje-values-change`
9
+ * `{ [name]: value }` (with a `name`), `lintje-checked-change` `string[]` (with `checkable`).
11
10
  */
12
11
  import { type PropertyDeclarations, type PropertyValues, type TemplateResult } from 'lit';
13
12
  import { LintjeElement } from '../../../core/element.js';
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * `<lintje-tree-view>` — a hierarchy that folds open and shut, one tab stop with roving focus.
3
3
  *
4
- * `expanded` is the host's: the element folds its own copy and reports each fold, so a host that
5
- * loads children on demand answers with `loading` and then `children`. It fetches nothing.
4
+ * It fetches nothing: it folds its own copy of `expanded` and reports each fold, so a host that
5
+ * loads children on demand answers with `loading` and then `children`.
6
6
  *
7
- * Events: `lintje-node-toggle` `{ id, open }`; `lintje-change` (id, not composed);
8
- * `lintje-values-change` `{ [name]: id }` with a `name`.
7
+ * Events: `lintje-node-toggle` `{ id, open }`, `lintje-change` `string` (the chosen node's id),
8
+ * `lintje-values-change` `{ [name]: value }` (with a `name`).
9
9
  */
10
10
  import { type PropertyDeclarations, type PropertyValues, type TemplateResult } from 'lit';
11
11
  import { LintjeElement } from '../../../core/element.js';
12
- import '../../../primitives/spinner/spinner.js';
12
+ import '../../feedback/spinner/spinner.js';
13
13
  export interface TreeNode {
14
14
  id: string;
15
15
  label: string;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Where the focus is, through every shadow root, and whether a modal dialog stands around a
3
- * node. In `core/` because primitives and components both need it.
3
+ * node. In `core/` because tags in every category need it.
4
4
  */
5
5
  /** The element that really has focus, through every shadow root below it. */
6
6
  export declare function deepActiveElement(): HTMLElement | null;
@@ -3,8 +3,8 @@
3
3
  * per query string is shared by every controller.
4
4
  */
5
5
  import type { ReactiveController, ReactiveControllerHost } from 'lit';
6
- /** Below this the views take their phone representation (rule 9). */
7
- export declare const MOBILE = "(max-width: 767px)";
6
+ /** Below this the views take their phone representation (rule 9); on screen only, so paper keeps the desktop form. */
7
+ export declare const MOBILE = "screen and (max-width: 767px)";
8
8
  /** From here the menu can be pinned. The frame's markup changes at both breakpoints. */
9
9
  export declare const WIDE = "(min-width: 1440px)";
10
10
  export declare class MediaController implements ReactiveController {
@@ -4,5 +4,10 @@
4
4
  * The unit is parsed: a minifier writes `900ms` as `.9s`, which `parseFloat` alone reads as 0.9 ms.
5
5
  */
6
6
  export declare function durationMs(element: Element, token: string): number;
7
+ /**
8
+ * A timing-function token as a function of progress, for motion drawn frame by frame: `linear`
9
+ * or `cubic-bezier(…)`; anything else runs linear.
10
+ */
11
+ export declare function easing(element: Element, token: string): (t: number) => number;
7
12
  /** Whether the reader asked for less motion. */
8
13
  export declare function prefersReducedMotion(): boolean;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * What an element finishes before the page goes to paper: one `beforeprint` listener for the
3
+ * page, and every element that registers runs before the browser lays out the print.
4
+ *
5
+ * A callback must leave its final state in the DOM before it returns. "Afdrukken" in the shell
6
+ * calls `window.print()` inside a frame callback, so `beforeprint` fires with a script on the
7
+ * stack and a Lit update queued as a microtask would land after the print layout.
8
+ */
9
+ /** Runs `callback` before every print; the returned function unregisters it. */
10
+ export declare function onBeforePrint(callback: () => void): () => void;
11
+ /**
12
+ * Runs `callback` with `true` when the page is laid out for paper and `false` when it is back on
13
+ * screen. Inside the call a box measures its paper size, which `beforeprint` is too early for.
14
+ */
15
+ export declare function onPrintMedia(callback: (printing: boolean) => void): () => void;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The page's one register of keyboard shortcuts: one `keydown` listener; `shortcuts()` lists
3
- * them for `<lintje-shortcuts>`. Without Ctrl, Alt or Meta a key never fires in a field; with
4
- * one, only when registered with `inFields`. A key registered twice warns in development.
3
+ * them for the overview a page shows. Without Ctrl, Alt or Meta a key never fires in a field;
4
+ * with one, only when registered with `inFields`. A key registered twice warns in development.
5
5
  *
6
6
  * A one-character key (`/`, `?`) can be switched off by the reader (WCAG 2.1.4, for speech
7
7
  * input and stray keystrokes): `setCharacterKeys(false)`, remembered in `localStorage`.
@@ -5,7 +5,7 @@
5
5
  * Every other icon is fetched by name when a name needs it
6
6
  * (`src/icons/loader.ts`); the name is always the file name.
7
7
  *
8
- * 62 icons, of 1198 in `dist-icons/`.
8
+ * 63 icons, of 1200 in `dist-icons/`.
9
9
  */
10
10
  export interface IconGlyph {
11
11
  /** The file's own viewBox: 64 or 48 in RVO's set, 24 for an own icon, 346x75 for an emblem. */
@@ -5,30 +5,36 @@
5
5
  * names come from their one list, `tokens/colors.ts`.
6
6
  */
7
7
  import type { DataColor } from './tokens/colors.js';
8
+ import type { ContentStateKind, Tone } from './components/shared/tone.js';
9
+ import type { StatusTone } from './components/feedback/status-dot/status-dot.js';
10
+ import type { AnnouncementKind } from './components/shared/announcement-block.js';
8
11
  import type { ChartSpec, MapSpec } from './components/shared/charts/shared/types.js';
9
12
  import type { MenuEntry } from './components/actions/menu-button/menu-button.js';
10
13
  import type { NotificationItem } from './components/frame/notifications/notifications.js';
11
- export type { BarSeriesData, ChartColor, ChartKind, ChartSpec, LineSeriesData, MapSpec, MapValue, MapPlotData, MapPlotVariant, MapVariant, ScatterPoint, ScatterSeriesData, WmsBasemap, MapArea, MapControls, } from './components/shared/charts/shared/types.js';
14
+ export type { BarSeriesData, ChartColor, ChartEvent, ChartKind, ChartSpec, LineSeriesData, MapSpec, MapValue, MapPlotData, MapPlotVariant, MapVariant, ScatterPoint, ScatterSeriesData, WmsBasemap, MapArea, MapControls, RadarSeriesData, } from './components/shared/charts/shared/types.js';
12
15
  export type { DataColor } from './tokens/colors.js';
16
+ export type { Tone, WorkState, ContentStateKind } from './components/shared/tone.js';
13
17
  /** Settings every view receives, taken from the URL by the host. */
14
18
  export interface FrameSettings {
15
19
  mode?: 'light' | 'dark';
16
20
  }
17
21
  export interface ContentState {
18
- state?: 'ready' | 'loading' | 'empty' | 'error';
22
+ state?: ContentStateKind;
19
23
  /** Empty: why there is nothing, and the way out. Error: what failed. */
20
24
  message?: string;
21
25
  /** Error: the last known value, shown in the warning. */
22
26
  lastKnown?: string;
23
27
  }
24
- export type StatusTone = 'complete' | 'delayed' | 'outage' | 'no-data';
28
+ /** A source's delivery status: the status column's and `lintje-status-dot`'s own words, each a `Tone`. */
29
+ export type { StatusTone } from './components/feedback/status-dot/status-dot.js';
25
30
  export type TrendDirection = 'up' | 'down' | 'flat';
26
31
  /**
27
32
  * One colour per variable, named after the Rijkshuisstijl colour it is: a `DataColor`, the
28
33
  * names of `tokens/colors.ts`. `coverage` is a role, not a variable: gray.
29
34
  */
30
35
  export type KpiVariable = DataColor | 'coverage';
31
- export type KpiState = 'ready' | 'loading' | 'empty' | 'error';
36
+ /** The same four as every tile's `ContentState`. */
37
+ export type KpiState = ContentStateKind;
32
38
  export interface KpiItem {
33
39
  /** A string or number with one number in it; counts up like `value`. */
34
40
  value: string | number;
@@ -67,7 +73,8 @@ export interface KpiGauge {
67
73
  /** The word before the target's number: "doel" (default) or "norm". */
68
74
  targetLabel?: string;
69
75
  }
70
- export interface KpiData {
76
+ /** `message` is the empty or error line under the figure, `lastKnown` the figure it had. */
77
+ export interface KpiData extends ContentState {
71
78
  label: string;
72
79
  /** An icon file name (`dist-icons/`, without `.svg`). Decorative. */
73
80
  icon?: string;
@@ -84,7 +91,6 @@ export interface KpiData {
84
91
  /** A single figure on its scale; ignored with `items`. */
85
92
  gauge?: KpiGauge;
86
93
  variable?: KpiVariable;
87
- state?: KpiState;
88
94
  }
89
95
  /** Events: none. */
90
96
  export interface KpiRowData extends FrameSettings {
@@ -155,8 +161,9 @@ export interface TableColumnData {
155
161
  * `change-compact`: only the ▲ ▼ ● of `change`; a screen reader hears the whole change, and
156
162
  * below 768 px the row's measure shows it whole.
157
163
  * `status`: a `StatusTone` (or mapped through `status.tones`) as the status dot with its label.
164
+ * `label`: the value as a badge with the word, tone and icon from `labels`.
158
165
  */
159
- format?: 'text' | 'number' | 'percent' | 'decimal' | 'change' | 'change-compact' | 'status';
166
+ format?: 'text' | 'number' | 'percent' | 'decimal' | 'change' | 'change-compact' | 'status' | 'label';
160
167
  decimals?: number;
161
168
  /** Suffix after the value, e.g. "min". */
162
169
  unit?: string;
@@ -172,6 +179,11 @@ export interface TableColumnData {
172
179
  tones?: Record<string, StatusTone>;
173
180
  labels?: Record<string, string>;
174
181
  };
182
+ /**
183
+ * `label` format: value → the word, the badge's tone and an icon file name before the word. A
184
+ * value without an entry stands as plain text. Sorting and the CSV use the word.
185
+ */
186
+ labels?: Record<string, TableLabel>;
175
187
  /** Shown muted instead of an exact 0, where 0 means "none" (e.g. "—"). Missing stays `null`. */
176
188
  zeroText?: string;
177
189
  mobileSubline?: boolean;
@@ -271,13 +283,58 @@ export interface DataTableData extends FrameSettings, TileData, ContentState {
271
283
  filters?: Record<string, string[] | string>;
272
284
  /** The number of rows before filtering: "14 van 131 rijen" while a filter is active. */
273
285
  totalRows?: number;
274
- /** A "Kolommen kiezen" button in the head of the actions column, to order and hide columns
275
- * (`lintje-columns-change`). Without row actions it adds that column. */
286
+ /**
287
+ * "Kolommen kiezen", a quiet icon in the head of the last column, to order and hide columns
288
+ * (`lintje-columns-change`). Without row actions it adds that column.
289
+ */
276
290
  columnChooser?: boolean;
277
291
  /** The keys of the columns not shown. The first column is always shown. */
278
292
  hiddenColumns?: string[];
293
+ /**
294
+ * The totals row under the rows, as the host computed it over every filtered row: the table
295
+ * never computes. A column without an entry stays empty.
296
+ */
297
+ totals?: Record<string, TableTotal>;
298
+ /** The first cell of the totals row; default "Totaal". */
299
+ totalsLabel?: string;
300
+ /**
301
+ * Fields shown under a row that opens, after the columns the chooser hides. With them, or with a
302
+ * hidden column, every row gets a button that opens its detail.
303
+ */
304
+ detailFields?: TableDetailField[];
305
+ /**
306
+ * Groups the rows on this column's value, in the order the groups first occur in `rows`. Rows
307
+ * sort within their group, a page holds whole groups, and the column itself is not shown.
308
+ */
309
+ groupBy?: string;
310
+ /** Per group value: its subtotal row, as the host computed it. */
311
+ groupTotals?: Record<string, Record<string, TableTotal>>;
312
+ /** With `groupBy`: groups per page, default 5; `pageSize` does not apply. */
313
+ groupsPerPage?: number;
314
+ }
315
+ /** A badge in a `label` column. */
316
+ export interface TableLabel {
317
+ label: string;
318
+ /** One of the shared tones, as `lintje-badge` draws it; default `neutral`. */
319
+ tone?: Tone;
320
+ /** An icon file name, drawn before the word. */
321
+ icon?: string;
279
322
  }
280
- export type AnnouncementKind = 'warning' | 'outage' | 'info' | 'ok';
323
+ /** A total: a value, or a value with the word that says how it was made ("gem."). */
324
+ export type TableTotal = CellValue | {
325
+ value: CellValue;
326
+ how?: string;
327
+ };
328
+ /** A field in a row's detail: a key of the row, with its label and how its value shows. */
329
+ export interface TableDetailField {
330
+ key: string;
331
+ label: string;
332
+ format?: TableColumnData['format'];
333
+ decimals?: number;
334
+ unit?: string;
335
+ }
336
+ /** `outage` interrupts and cannot be closed; `error` is a failure the reader may put away. */
337
+ export type { AnnouncementKind } from './components/shared/announcement-block.js';
281
338
  export interface AnnouncementData {
282
339
  kind?: AnnouncementKind;
283
340
  title?: string;
@@ -344,6 +401,8 @@ export interface FilterOption {
344
401
  * `lintje-segmented` the chosen option's, in a box under the options.
345
402
  */
346
403
  description?: string;
404
+ /** The number of items with this value, as a count badge after the label where the control draws one (`lintje-segmented`). */
405
+ count?: number;
347
406
  }
348
407
  /** The control a declaration draws in. `range` has two handles, `slider` one. */
349
408
  export type FilterKind = 'select' | 'segmented' | 'multiselect' | 'date-range' | 'range' | 'slider' | 'toggle' | 'text' | 'number';
@@ -628,6 +687,7 @@ export interface ChatData extends FrameSettings {
628
687
  }
629
688
  export type { FormValues, FormErrors, StoredDraft } from './components/forms/form/form.js';
630
689
  export type { ErrorSummaryItem } from './components/forms/error-summary/error-summary.js';
690
+ export type { ErrorPageLink } from './components/feedback/error-page/error-page.js';
631
691
  export type { UploadFile } from './components/inputs/file-upload/file-upload.js';
632
692
  export type { DateRange } from './components/inputs/date-range/date-range.js';
633
693
  export type { SlotDay, TimeSlot } from './components/inputs/slot-picker/slot-picker.js';
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><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"/></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><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"/></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lintje",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Lintje: the Rijkshuisstijl design system as Lit web components",
6
6
  "license": "EUPL-1.2",
@@ -1,4 +0,0 @@
1
- //#region src/components/overlays/confirm-dialog/confirm-dialog.css?inline
2
- var e = ":host { display: contents; }\n\n/* ------------------------------------------------------------------------ */\n\n.lintje-confirm-dialog__scrim {\n position: fixed;\n z-index: 80;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--space-6);\n background: var(--color-overlay-page);\n animation: lintje-fade-in var(--dur-scrim) var(--ease-in-motion);\n}\n\n.lintje-confirm-dialog {\n width: min(440px, 100%);\n max-height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-6);\n background: var(--color-bg-surface);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border-strong);\n border-radius: var(--radius);\n box-shadow: var(--shadow-popover);\n animation: lintje-rise var(--dur-modal) var(--ease-in-motion);\n}\n/* The window takes focus only when the trap pulls stray focus back; it draws no ring. */\n.lintje-confirm-dialog:focus { outline: none; }\n.lintje-confirm-dialog__heading { font: var(--text-h2); }\n.lintje-confirm-dialog__text { font: var(--text-body); }\n\n.lintje-confirm-dialog__actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--space-2);\n margin-top: var(--space-3);\n}\n\n/* Phone: the buttons stack, the confirm on top and the safe one at the bottom. */\n@media (max-width: 767px) {\n .lintje-confirm-dialog__scrim { padding: var(--space-4); }\n .lintje-confirm-dialog { width: 100%; }\n .lintje-confirm-dialog__actions { flex-direction: column; }\n .lintje-confirm-dialog__confirm { order: 1; }\n .lintje-confirm-dialog__action { order: 2; }\n .lintje-confirm-dialog__cancel { order: 3; }\n}\n";
3
- //#endregion
4
- export { e as t };
@@ -1,230 +0,0 @@
1
- import { $ as e, Gt as t, O as n, Yt as r, et as i, qt as a, ut as o } from "./base-Bg-IFOPG.js";
2
- import "../tag/modal.js";
3
- //#region src/components/shared/content-tile.ts
4
- var s = class extends n {
5
- constructor(...e) {
6
- super(...e), this.expanded = !1;
7
- }
8
- static {
9
- this.properties = { expanded: { state: !0 } };
10
- }
11
- expand(e) {
12
- this.expanded !== e && (this.expanded = e, this.expandChanged(e));
13
- }
14
- expandChanged(e) {}
15
- renderExpandModal(e, n) {
16
- let { heading: r, subtitle: i, footnote: o, csv: s, png: c } = n;
17
- return a`<lintje-modal
18
- .open=${this.expanded}
19
- heading=${r ?? "Vergroot"}
20
- subtitle=${i ?? t}
21
- .csv=${s !== void 0}
22
- .png=${c !== void 0}
23
- @lintje-close=${(e) => {
24
- e.stopPropagation(), this.expand(!1);
25
- }}
26
- @lintje-download-csv=${(e) => {
27
- e.stopPropagation(), s?.();
28
- }}
29
- @lintje-download-png=${(e) => {
30
- e.stopPropagation(), c?.();
31
- }}
32
- >
33
- ${e}${o ? a`<span slot="footer">${o}</span>` : t}
34
- </lintje-modal>`;
35
- }
36
- };
37
- //#endregion
38
- //#region src/components/shared/charts/shared/chart-icons.ts
39
- function c(e, n, r = 16, a) {
40
- let o = i(e, {
41
- size: r,
42
- flip: a
43
- });
44
- return o === t ? n : o;
45
- }
46
- var l = [
47
- {
48
- action: "in",
49
- name: "functioneel-plus",
50
- text: "+",
51
- label: "Inzoomen"
52
- },
53
- {
54
- action: "out",
55
- name: "functioneel-minus",
56
- text: "−",
57
- label: "Uitzoomen"
58
- },
59
- {
60
- action: "home",
61
- name: "functioneel-refresh",
62
- flip: "horizontal",
63
- text: "Terug",
64
- label: "Kaart terugzetten"
65
- }
66
- ];
67
- //#endregion
68
- //#region src/components/shared/charts/shared/chart-states.ts
69
- function u(e = "100%", t = 12, n = "") {
70
- let r = (e) => typeof e == "number" ? `${e}px` : e;
71
- return a`<span class="lintje-skeleton ${n}"
72
- ${o({
73
- width: r(e),
74
- height: r(t)
75
- })} aria-hidden="true"></span>`;
76
- }
77
- function d({ kind: e = "line", height: n } = {}) {
78
- return a`
79
- <div class="lintje-chart-skeleton lintje-chart-skeleton--${e}"
80
- ${o({ height: n ?? (e === "table" ? void 0 : "var(--chart-h-main)") })}
81
- role="status">
82
- <!-- In words, not only in a label: a status region is spoken from its content. -->
83
- <span class="visually-hidden">Gegevens laden…</span>
84
- ${e === "line" || e === "bar" ? a`
85
- <div class="lintje-chart-skeleton__y-labels">
86
- ${[
87
- 0,
88
- 1,
89
- 2,
90
- 3
91
- ].map(() => u(24, 10))}
92
- </div>
93
- <div class="lintje-chart-skeleton__x-labels">
94
- ${[
95
- 0,
96
- 1,
97
- 2
98
- ].map(() => u(32, 10))}
99
- </div>
100
- <div class="lintje-chart-skeleton__plot">
101
- ${u("100%", "100%", "lintje-chart-skeleton__fill")}
102
- </div>
103
- ` : t}
104
- ${e === "pie" || e === "donut" ? a`
105
- <!-- Sized by the skeleton's own box, so it always fits beside its lines. -->
106
- ${u("min(100cqh, 60cqw, 200px)", "auto", "lintje-chart-skeleton__disc")}
107
- <div class="lintje-chart-skeleton__lines">
108
- ${[
109
- "80%",
110
- "64%",
111
- "48%"
112
- ].map((e) => u(e, 13))}
113
- </div>
114
- ` : t}
115
- ${e === "heatmap" ? Array.from({ length: 35 }, () => u("100%", "100%")) : t}
116
- ${e === "map" ? a`
117
- ${u("100%", "100%", "lintje-chart-skeleton__fill")}
118
- <div class="lintje-chart-skeleton__zoom" aria-hidden="true">
119
- ${l.map((e) => a`
120
- <span class="lintje-chart-skeleton__zoom-button">${c(e.name, e.text, 16, "flip" in e ? e.flip : void 0)}</span>
121
- `)}
122
- </div>
123
- ` : t}
124
- ${e === "table" ? Array.from({ length: 5 }, () => a`
125
- <div class="lintje-chart-skeleton__row">
126
- ${u("32%")}
127
- ${u("12%", 12, "lintje-chart-skeleton__measure")}
128
- ${u("12%")}
129
- </div>
130
- `) : t}
131
- </div>
132
- `;
133
- }
134
- function f(e, t = "var(--chart-h-main)") {
135
- return a`
136
- <div class="lintje-chart-state lintje-chart-state--empty" ${o({ height: t })}>
137
- <p>${e}</p>
138
- </div>
139
- `;
140
- }
141
- function p(e) {
142
- return a`<lintje-announcement
143
- compact
144
- .data=${{
145
- kind: "warning",
146
- text: String(e ?? ""),
147
- live: !0
148
- }}
149
- ></lintje-announcement>`;
150
- }
151
- function m({ message: e, lastKnown: n, height: r = "var(--chart-h-main)", announcement: i = p }) {
152
- return a`
153
- <div class="lintje-chart-state lintje-chart-state--error" ${o({ "min-height": r })}>
154
- ${i(e)}
155
- ${n ? a`<div class="lintje-chart-state__last-known">${n}</div>` : t}
156
- </div>
157
- `;
158
- }
159
- //#endregion
160
- //#region src/components/shared/charts/shared/chart.css?inline
161
- var h = ".lintje-chart { display: flex; flex-direction: column; gap: 6px; min-width: 0; margin: 0; }\n/* Charts that are as high as their rows (horizontal bars, target progress) center in a taller\n tile instead of leaving the space below them empty. */\n.lintje-chart--rows { margin-block: auto; }\n.lintje-chart__axis-title { font: var(--text-axis); color: var(--color-text-muted); }\n/* The title of the x axis (`xTitle` in `renderChartFrame`): the axis title's type, in the\n drawing, under the x labels at the right. */\n.lintje-chart__x-title { font: var(--text-axis); fill: var(--color-text-muted); }\n.lintje-chart__svg {\n width: 100%;\n display: block;\n overflow: visible;\n}\n\n.lintje-chart__axis-label {\n font-family: var(--font-ui);\n font-size: 0.75rem;\n font-weight: 400;\n fill: var(--color-chart-axis);\n}\n/* Data labels are bold so they read as values rather than axis labels. */\n.lintje-chart__data-label {\n font-family: var(--font-ui);\n font-size: 0.75rem;\n font-weight: 700;\n fill: var(--color-text-primary);\n}\n/* On a mark the label takes the text of the fill it stands on: white on a dark rung, ink on a\n light one. The fills are the same in both modes, so the label is too. */\n.lintje-chart__data-label--inside { fill: var(--color-text-on-fill); }\n.lintje-chart__data-label--inside-light { fill: var(--color-text-on-light-fill); }\n/* On a threshold line (horizontal bars) or beside one (histogram, scatter): a halo in the surface color.\n Invisible on the tile, it cuts a line or a bar where the label crosses it. */\n.lintje-chart__data-label--halo,\n.lintje-chart__axis-label--halo {\n stroke: var(--color-bg-surface);\n stroke-width: 4px;\n stroke-linejoin: round;\n paint-order: stroke fill;\n}\n.lintje-chart__as-of-label {\n font-family: var(--font-ui);\n font-size: 0.75rem;\n font-weight: 700;\n fill: var(--color-text-primary);\n}\n.lintje-chart__as-of-note {\n font-family: var(--font-ui);\n font-size: 0.75rem;\n fill: var(--color-text-muted);\n}\n\n.lintje-chart__line { stroke-width: 2.5; fill: none; stroke-linejoin: round; }\n/* 1 px either side of the line, under it (`lineCasing`). */\n.lintje-chart__line--casing { stroke-width: 4.5; }\n\n/* Bars. transform-box: fill-box puts the origin in the bar's own box instead of the svg's:\n a bar widens around its own middle. A horizontal bar is anchored at the category axis. */\n.lintje-chart__bar {\n transform-box: fill-box;\n transform-origin: 50% 100%;\n transition: transform var(--dur-hover) var(--ease-in-motion), filter var(--dur-hover) var(--ease-in-motion);\n}\n.lintje-chart__bar--horizontal { transform-origin: 0 50%; }\n\n/* The bar under the pointer widens a little and lifts with a light\n shadow, so it is clear what the tooltip describes — the same lift as a pie segment. Only the\n width grows: the length carries the value. A stacked column lifts as a whole. */\n.lintje-chart__bar-group:hover .lintje-chart__bar,\n.lintje-chart__bar-group.is-hovered .lintje-chart__bar {\n transform: scaleX(1.06);\n filter: drop-shadow(var(--shadow-chart-hover));\n}\n/* A histogram's classes touch: its lift is a copy drawn over its neighbours. */\n.lintje-chart__bar--lifted {\n transform: scaleX(1.06);\n filter: drop-shadow(var(--shadow-chart-hover));\n pointer-events: none;\n}\n.lintje-chart__bar-row:hover .lintje-chart__bar--horizontal,\n.lintje-chart__bar-row.is-hovered .lintje-chart__bar--horizontal {\n transform: scaleY(1.12);\n filter: drop-shadow(var(--shadow-chart-hover));\n}\n\n/* A mark that drills. The same three states wherever a mark can carry a\n href — bars, stacked segments, pie slices — and the same ones the map draws: the chosen\n mark takes the text colour as a 2 px outline (the outline is the carrier, not the colour,\n rule 13) and every other mark steps back so it reads against them; .45 is the legend's own\n dimming. The focus ring is the orange 3 px of every other control, around the shape with\n a 1 px gap in the surface (`renderFocusRing`, axes.ts), so an orange mark keeps it too: the\n box an outline draws around a slice or a stacked segment is not the shape the reader is on. */\n.lintje-chart__mark.is-clickable { cursor: pointer; }\n.lintje-chart__mark.is-selected { stroke: var(--color-text-primary); stroke-width: 2; }\n.lintje-chart__mark.is-muted { fill-opacity: .45; }\n/* A focused SVG element with a tabindex gets the browser's own box even where `:focus-visible`\n does not match, after a click: the ring below is the only one. */\n.lintje-chart__mark:focus { outline: none; }\n/* Weighs as much as the hover's lift and stands after it, so the ring is what a focused bar\n under the pointer shows. Only a clickable mark takes the focus. */\n.lintje-chart__mark.is-clickable:focus-visible {\n outline: none;\n filter: var(--lintje-focus-ring);\n}\n.lintje-chart__focus-ring { flood-color: var(--color-focus); }\n.lintje-chart__focus-gap { flood-color: var(--color-bg-surface); }\n/* Stacked segments and slices of neighbouring tints part with a 1 px line in the surface:\n two rungs of the ladder differ by 1.2–1.5:1. */\n.lintje-chart__segment { stroke: var(--color-bg-surface); stroke-width: 1px; }\n\n/* Draw-in takes 900 ms for data marks only. Axes, grid and titles appear immediately. */\n@media (prefers-reduced-motion: no-preference) {\n /* A line and the area below it are uncovered together from left to right. The clip opens over the box\n of the series; the negative insets leave room for the stroke outside that box. */\n .lintje-chart__reveal { animation: lintje-reveal var(--dur-draw) var(--ease-in-motion) backwards; }\n /* Bars grow from the axis one after another: left to right, or top to bottom when horizontal\n --lintje-stagger (0 to 1, set per bar) spreads the starts over the first\n 40 % of the draw and each bar grows in the other 60 %, so all are done at --dur-draw. A\n column grows as a whole, so stacked segments stay together. Fill mode `backwards`, not\n `both`: a transform held after the end would override the hover transform. */\n .lintje-chart__bar-group,\n .lintje-chart__bar--horizontal {\n animation-duration: calc(var(--dur-draw) * 0.6);\n animation-timing-function: var(--ease-in-motion);\n animation-delay: calc(var(--dur-draw) * 0.4 * var(--lintje-stagger, 0));\n animation-fill-mode: backwards;\n }\n .lintje-chart__bar-group {\n transform-box: fill-box;\n transform-origin: 50% 100%;\n animation-name: lintje-grow;\n }\n .lintje-chart__bar--horizontal { animation-name: lintje-grow-x; }\n .lintje-chart__bar--lifted { animation: lintje-lift var(--dur-hover) var(--ease-in-motion) backwards; }\n /* Data labels fade in once the marks are drawn, eased at both ends. */\n .lintje-chart__data-label { animation: lintje-fade-in var(--dur-data-label) ease-in-out var(--dur-draw) both; }\n /* A reference line comes in with its label once the marks are drawn, as a data label does;\n a data label inside it does not fade a second time. */\n .lintje-chart__reference { animation: lintje-fade-in var(--dur-data-label) ease-in-out var(--dur-draw) both; }\n /* A scatter point grows from its middle as a map point does, one after another along x, with\n the bars' timing. */\n .lintje-chart__point {\n transform-box: fill-box;\n transform-origin: 50% 50%;\n animation: lintje-point-grow calc(var(--dur-draw) * 0.6) var(--ease-in-motion)\n calc(var(--dur-draw) * 0.4 * var(--lintje-stagger, 0)) backwards;\n }\n .lintje-chart__reference .lintje-chart__data-label { animation: none; }\n\n /* Draw in only once the chart comes into view. By default the marks are\n paused on their first frame (series covered, bar flat, label gone); as soon\n as usePlotArea sets data-in-view on the outermost chart element, they run.\n These rules come after the `animation` shorthands above: those set\n animation-play-state back to running and would otherwise win at equal\n specificity. They sit inside this media block because with reduced motion\n there is no animation — and a paused fill-mode would keep the marks\n invisible there. */\n .lintje-chart__reveal,\n .lintje-chart__bar-group,\n .lintje-chart__bar--horizontal,\n .lintje-chart__data-label,\n .lintje-chart__reference,\n .lintje-chart__point { animation-play-state: paused; }\n [data-in-view] .lintje-chart__reveal,\n [data-in-view] .lintje-chart__bar-group,\n [data-in-view] .lintje-chart__bar--horizontal,\n [data-in-view] .lintje-chart__data-label,\n [data-in-view] .lintje-chart__reference,\n [data-in-view] .lintje-chart__point { animation-play-state: running; }\n}\n@keyframes lintje-reveal {\n from { clip-path: inset(-8px calc(100% + 8px) -8px -8px); }\n to { clip-path: inset(-8px); }\n}\n@keyframes lintje-grow { from { transform: scaleY(0); } to { transform: scaleY(1); } }\n@keyframes lintje-lift { from { transform: none; filter: none; } }\n@keyframes lintje-grow-x { from { transform: scaleX(0); } to { transform: scaleX(1); } }\n\n/* --- Legend -------------------------------------------------------------- */\n.lintje-legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2) var(--space-4);\n font: var(--text-small);\n color: var(--color-text-primary);\n}\n/* A legend above the chart keeps 12 px to the axis title below it. */\n.lintje-chart-wrap > .lintje-legend { margin-bottom: var(--space-3); }\n.lintje-legend--right { flex-direction: column; flex-wrap: nowrap; }\n.lintje-legend__item { display: flex; align-items: center; gap: 6px; }\n.lintje-legend__button { display: flex; align-items: center; gap: 6px; font: inherit; color: inherit; }\n/* A series switched off: the marker steps back and the name is struck through, at full\n contrast — the strike and `aria-pressed` carry the state, not a faded word. */\n.lintje-legend__item.is-hidden .lintje-legend__marker { opacity: 0.45; }\n.lintje-legend__item.is-hidden .lintje-legend__label { text-decoration: line-through; }\n\n.lintje-legend__marker { flex: none; display: block; }\n.lintje-legend__marker--symbol { width: 14px; height: 14px; }\n.lintje-legend__marker--square { width: 12px; height: 12px; background: currentColor; }\n.lintje-legend__marker--line { width: 14px; height: 3px; background: currentColor; }\n/* \"No data\" on a map: the hatch the mark carries, on the surface (rule 15). */\n.lintje-legend__marker--hatch {\n width: 16px; height: 10px;\n background: repeating-linear-gradient(45deg, var(--color-chart-hatch) 0 2px, transparent 2px 6px);\n border: 1px solid var(--color-border-default);\n}\n.lintje-legend__marker--dashed {\n width: 14px; height: 0;\n border-top: 2px dashed currentColor;\n}\n\n/* --- Tooltip ------------------------------------------------------------- */\n.lintje-chart-tooltip {\n position: absolute;\n z-index: 55;\n pointer-events: none;\n background: var(--color-bg-surface);\n border: 1px solid var(--color-border-popover);\n box-shadow: var(--shadow-popover);\n padding: var(--space-2) 10px;\n font: var(--text-small);\n min-width: 160px;\n /* Its own width, whatever its position: shrink-to-fit narrowed it near the right edge. */\n width: max-content;\n max-width: 320px;\n}\n.lintje-chart-tooltip__title { font-weight: 700; margin-bottom: 4px; }\n.lintje-chart-tooltip__row { display: flex; align-items: center; gap: 6px; justify-content: space-between; }\n.lintje-chart-tooltip__label { display: flex; align-items: center; gap: 6px; }\n.lintje-chart-tooltip__marker { width: 10px; height: 10px; flex: none; }\n.lintje-chart-tooltip__marker--symbol { width: 14px; height: 14px; }\n.lintje-chart-tooltip__value { font-weight: 700; margin-left: var(--space-3); }\n\n.lintje-chart-wrap { position: relative; min-width: 0; }\n\n/* Chart tooltip anchor: coordinates and positioning both share this element. */\n[data-tooltip-anchor] { position: relative; }\n\n/* Hover point on a line: 4 px in the series color — the size of the as-of point —\n with a ring in the surface color, so it stays legible on the line and on the\n filled area below it. No animation: hover does not redraw. */\n.lintje-chart__hover-point { stroke: var(--color-bg-surface); stroke-width: 2; pointer-events: none; }\n/* A point of a series the legend hides keeps its node, so it does not grow again. */\n.lintje-chart__point.is-hidden { visibility: hidden; }\n/* The edge of a dark-yellow hover point (`lineCasing`), over its ring. */\n.lintje-chart__hover-casing { fill: none; stroke-width: 1; pointer-events: none; }\n\n/* The scatter plot's one pointer target, under its points: the nearest point within half of\n --h-target answers (`pick`, scatter-chart.ts), so a small point is a full target. */\n.lintje-chart__hit { fill: transparent; }\n.lintje-chart__hit.is-clickable { cursor: pointer; }\n\n\n/* --- States -------------------------------------------------------------- */\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/* Loading uses a skeleton per chart type, exactly as tall as the chart it stands in for. */\n/* The stand-in grows into a tile that is taller than it: a tile that holds its height\n while it fetches again or stretches to its row. `height` stays\n the basis, so where there is no room to take nothing changes; in a held box that is\n shorter than the stand-in it shrinks to fit. */\n.lintje-chart-skeleton { position: relative; min-width: 0; overflow: hidden; flex: 1 1 auto; min-height: 0; }\n/* Line, area and bars: \"assen echt, datavlak één glanzend blok\". Real axis lines around one\n shimmering block, in the charts' plot area (left 52, right 8, top 16, bottom 28). The axis\n labels load with the data: four bars in the gutter, from the top line to the zero line where\n the labels sit, and three below the axis, so the gutter doesn't read as empty. */\n.lintje-chart-skeleton__plot {\n position: absolute;\n top: 16px; right: 8px; bottom: 28px; left: 52px;\n border-left: 1px solid var(--color-chart-grid);\n border-bottom: 1px solid var(--color-chart-zero);\n}\n.lintje-chart-skeleton__fill { position: absolute; inset: 0; }\n.lintje-chart-skeleton__y-labels {\n position: absolute;\n top: 11px; bottom: 23px; left: 0; width: 44px;\n display: flex; flex-direction: column; justify-content: space-between; align-items: flex-end;\n}\n.lintje-chart-skeleton__x-labels {\n position: absolute;\n right: 8px; bottom: 7px; left: 52px;\n display: flex; justify-content: space-between;\n}\n/* Pie and donut: \"ring + drie legendaregels\", a disc for the pie and a ring\n with a 62 % hole for the donut, beside three lines. The skeleton is a size container: the disc\n is never taller than the skeleton, never wider than 60 % of it and at most 200 px, so the lines\n keep their room in a narrow tile. */\n.lintje-chart-skeleton--pie,\n.lintje-chart-skeleton--donut { container-type: size; display: flex; align-items: center; gap: var(--space-5); }\n.lintje-chart-skeleton__disc {\n position: relative;\n flex: none;\n aspect-ratio: 1;\n border-radius: var(--radius-round);\n}\n.lintje-chart-skeleton--donut .lintje-chart-skeleton__disc::after {\n content: '';\n position: absolute;\n inset: 19%;\n border-radius: var(--radius-round);\n background: var(--color-bg-surface);\n}\n.lintje-chart-skeleton__lines {\n flex: 1;\n min-width: 0;\n max-width: 240px;\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n/* Heatmap: \"cellen glanzen individueel\" — cells with the heatmap's 3 px gutter, each with its\n own sweep. */\n.lintje-chart-skeleton--heatmap {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n grid-template-rows: repeat(5, minmax(0, 1fr));\n gap: 3px;\n}\n/* Map: \"kaartvlak glanst, overlays echt\" — the map area shimmers; the zoom buttons are drawn\n as on the map (48 px, top right). */\n.lintje-chart-skeleton__zoom {\n position: absolute;\n top: var(--space-2); right: var(--space-2);\n display: flex;\n flex-direction: column;\n}\n.lintje-chart-skeleton__zoom-button {\n width: var(--h-target); height: var(--h-target);\n display: flex; align-items: center; justify-content: center;\n background: var(--color-bg-surface);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border-strong);\n margin-top: -1px;\n}\n.lintje-chart-skeleton__zoom-button:first-child { margin-top: 0; }\n/* Table: \"5 rijen\" — five rows at the table's row height. */\n.lintje-chart-skeleton--table { display: flex; flex-direction: column; }\n.lintje-chart-skeleton__row {\n flex: none;\n height: var(--h-table-row);\n display: flex;\n align-items: center;\n gap: var(--space-6);\n padding: 0 var(--space-3);\n border-bottom: 1px solid var(--color-border-default);\n}\n.lintje-chart-skeleton__measure { margin-left: auto; }\n\n/* --- Forced colours ------------------------------------------------------- */\n/* One colour per variable is what tells the series apart, and the legend's\n marker is what ties a colour to a name: with the reader's palette they would\n all come out one colour. So the data marks and the markers keep their drawing\n (`forced-color-adjust: none`) — the bars, segments and slices, the lines and\n their areas, the hover point, the legend's and the tooltip's markers — and\n nothing else does: the axes, the grid, the labels and the titles take the\n reader's palette. A data label is forced again even where it stands in a\n group that is not (the stacked column), except one drawn ON a mark, which keeps\n its own colour against that mark. The halo behind a label is the surface, so\n Canvas, and so are the gap between segments and the one inside the focus\n ring. The chosen mark is outlined in CanvasText and the focused one ringed in\n Highlight. */\n@media (forced-colors: active) {\n .lintje-chart__bar,\n .lintje-chart__mark,\n .lintje-chart__line,\n .lintje-chart__reveal,\n .lintje-chart__hover-point,\n .lintje-chart__hover-casing,\n .lintje-chart__hit,\n .lintje-legend__marker,\n .lintje-chart-tooltip__marker { forced-color-adjust: none; }\n .lintje-chart__data-label { forced-color-adjust: auto; }\n /* Text in the reader's palette by name, not left to the engine: not every\n engine repaints an SVG `fill`, and near-black on a black Canvas is nothing. */\n .lintje-chart__axis-label,\n .lintje-chart__data-label,\n .lintje-chart__as-of-label,\n .lintje-chart__as-of-note,\n .lintje-chart__x-title { fill: CanvasText; }\n .lintje-chart__data-label--inside { forced-color-adjust: none; fill: var(--color-text-on-fill); }\n .lintje-chart__data-label--inside-light { forced-color-adjust: none; fill: var(--color-text-on-light-fill); }\n .lintje-chart__data-label--halo,\n .lintje-chart__axis-label--halo { stroke: Canvas; }\n .lintje-chart__segment { stroke: Canvas; }\n .lintje-chart__mark.is-selected { stroke: CanvasText; }\n .lintje-chart__focus-ring { flood-color: Highlight; }\n .lintje-chart__focus-gap { flood-color: Canvas; }\n}\n", g = ".lintje-pie-chart {\n display: flex; gap: var(--space-8); align-items: center; justify-content: center; flex-wrap: wrap;\n padding-top: var(--space-3);\n}\n.lintje-pie-chart--expanded { gap: var(--space-10); height: 100%; padding-top: 0; }\n.lintje-pie-chart--expanded .lintje-pie-chart__table { flex: 0 1 440px; min-width: 260px; }\n.lintje-pie-chart__center { font-family: var(--font-ui); font-size: 1.5rem; font-weight: 700; fill: var(--color-text-primary); }\n.lintje-pie-chart__table { flex: 1; min-width: 200px; border-collapse: collapse; font: var(--text-small); }\n.lintje-pie-chart__column-label,\n.lintje-pie-chart__label,\n.lintje-pie-chart__value,\n.lintje-pie-chart__total-label,\n.lintje-pie-chart__total { padding: 5px 0; text-align: left; font-weight: 400; }\n.lintje-pie-chart__column-label {\n font-size: var(--label-size); font-weight: var(--label-weight);\n letter-spacing: var(--label-tracking); text-transform: uppercase;\n color: var(--color-text-muted);\n border-bottom: 1px solid var(--color-border-default);\n}\n/* The numeric columns sit right-aligned under their heading, a fixed step from their neighbour. */\n.lintje-pie-chart__column-label--numeric,\n.lintje-pie-chart__value,\n.lintje-pie-chart__total { padding-left: var(--space-4); text-align: right; }\n.lintje-pie-chart__value,\n.lintje-pie-chart__total { font-variant-numeric: tabular-nums; }\n.lintje-pie-chart__label { display: flex; align-items: center; gap: 6px; }\n.lintje-pie-chart__total-label,\n.lintje-pie-chart__total {\n font-weight: 700; border-top: 1px solid var(--color-border-default); padding-top: 6px;\n}\n.lintje-pie-chart__marker { width: 10px; height: 10px; flex: none; display: block; }\n\n/* Hover scales the segment around the center, so its side edges keep their angle. The shadow\n sits on a copy on top (`__lift`); the segment itself only scales and eases back. */\n.lintje-pie-chart__svg { overflow: visible; flex: none; }\n.lintje-pie-chart__segment { transition: transform var(--dur-hover) var(--ease-in-motion); }\n.lintje-pie-chart__segment.is-hovered { transform: scale(1.03); }\n.lintje-pie-chart__lift {\n pointer-events: none;\n transform: scale(1.03);\n filter: drop-shadow(var(--shadow-chart-hover));\n animation: lintje-pie-lift var(--dur-hover) var(--ease-in-motion) backwards;\n}\n@keyframes lintje-pie-lift { from { transform: none; filter: none; } }\n.lintje-pie-chart__row.is-hovered { background: var(--color-bg-subtle); }\n/* The chosen row carries the outline the chosen slice has (rule 13). */\n.lintje-pie-chart__row.is-muted .lintje-pie-chart__marker { opacity: .45; }\n.lintje-pie-chart__row.is-selected .lintje-pie-chart__marker { outline: 2px solid var(--color-text-primary); }\n.lintje-pie-chart__row.is-selected .lintje-pie-chart__label { font-weight: 700; }\n\n/* Forced colours: the slices, the lifted copy and the table's swatches keep their colours (as\n `chart.css`); the chosen row's swatch is outlined in CanvasText. */\n@media (forced-colors: active) {\n .lintje-pie-chart__lift,\n .lintje-pie-chart__marker { forced-color-adjust: none; }\n .lintje-pie-chart__center { fill: CanvasText; }\n .lintje-pie-chart__row.is-selected .lintje-pie-chart__marker { outline-color: CanvasText; }\n}\n", _ = ".lintje-heatmap { display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }\n.lintje-heatmap__grid { border-collapse: separate; border-spacing: 3px; width: 100%; }\n.lintje-heatmap__column-label,\n.lintje-heatmap__row-label {\n font: var(--text-axis);\n font-weight: 400;\n color: var(--color-text-muted);\n text-align: center;\n padding: 2px;\n}\n/* `width: 1%` keeps the auto table layout from handing the label column surplus width; a longer\n label ends in an ellipsis. */\n.lintje-heatmap__row-label { text-align: right; padding-right: var(--space-2); white-space: nowrap; width: 1%; }\n.lintje-heatmap__row-label-text { display: block; max-width: 160px; overflow: hidden; text-overflow: ellipsis; }\n.lintje-heatmap__slot { padding: 0; }\n\n.lintje-heatmap__cell {\n width: 100%;\n height: 34px;\n display: flex; align-items: center; justify-content: center;\n font-size: 0.75rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n /* The class range is the same in both modes, so the text on it is too: ink up to the fourth\n rung (5.9:1), white on the darkest (4.5:1). */\n background: var(--lintje-cell);\n color: var(--color-text-on-light-fill);\n transition: background-color var(--dur-hover) var(--ease-in-motion);\n}\n.lintje-heatmap__cell--class-4 { color: var(--color-text-on-fill); }\n.lintje-heatmap__cell--class-0 { box-shadow: inset 0 0 0 1px var(--color-border-default); }\n.lintje-heatmap__cell.is-selected { outline: 2px solid currentColor; outline-offset: -2px; }\n/* A cell steps back by its fill alone, mixed into the surface; the figure stays in the text\n colour, which reaches 4.5:1 on every rung so mixed, in both modes. */\n.lintje-heatmap__cell.is-dimmed {\n background: color-mix(in srgb, var(--lintje-cell) 25%, var(--color-bg-surface));\n color: var(--color-text-primary);\n}\n/* A drilling cell that is not chosen steps back while a cell is chosen; less than the legend's\n dimming, which answers \"show me this class\". */\n.lintje-heatmap__cell.is-muted {\n background: color-mix(in srgb, var(--lintje-cell) 40%, var(--color-bg-surface));\n color: var(--color-text-primary);\n}\n.lintje-heatmap__cell.is-empty { background: var(--color-bg-subtle); }\n\n/* Cells fade in left to right, then top to bottom. Fill mode `backwards`: a held opacity would\n override a dimmed class. The paused declaration follows the shorthand, see chart.css. */\n@media (prefers-reduced-motion: no-preference) {\n .lintje-heatmap__cell:not(.is-empty) {\n animation: lintje-fade-in calc(var(--dur-draw) * 0.6) ease-in-out calc(var(--dur-draw) * 0.4 * var(--lintje-stagger, 0)) backwards;\n animation-play-state: paused;\n }\n [data-in-view] .lintje-heatmap__cell:not(.is-empty) { animation-play-state: running; }\n}\n\n.lintje-heatmap__selection {\n min-height: var(--h-touch);\n display: flex; align-items: center; gap: 6px;\n padding: 0 var(--space-3);\n background: var(--color-bg-subtle);\n font: var(--text-small);\n}\n\n.lintje-heatmap__legend { display: flex; gap: var(--space-2) var(--space-4); flex-wrap: wrap; font: var(--text-small); }\n.lintje-heatmap__legend-item {\n display: flex; align-items: center; gap: 6px;\n font: inherit; color: var(--color-text-primary);\n}\n.lintje-heatmap__legend-item[aria-pressed='true'] { font-weight: 700; }\n/* Only the swatch steps back: the word keeps its contrast. */\n.lintje-heatmap__legend-item.is-dimmed .lintje-heatmap__swatch { opacity: 0.45; }\n.lintje-heatmap__swatch {\n width: 12px; height: 12px; display: block; flex: none;\n transition: opacity var(--dur-hover) var(--ease-in-motion);\n}\n.lintje-heatmap__swatch--class-0 { box-shadow: inset 0 0 0 1px var(--color-border-default); }\n\n/* Forced colours: the class colours are the heatmap, so cells and swatches keep them\n (`forced-color-adjust: none`). */\n@media (forced-colors: active) {\n .lintje-heatmap__cell,\n .lintje-heatmap__swatch { forced-color-adjust: none; }\n}\n", v = r(h), y = [
162
- v,
163
- r(g),
164
- r(_),
165
- e
166
- ];
167
- //#endregion
168
- //#region src/components/shared/download.ts
169
- function b(e) {
170
- if (e == null) return "";
171
- let t = typeof e == "number" ? String(e).replace(".", ",") : e;
172
- return /[";\n\r]/.test(t) ? `"${t.replace(/"/g, "\"\"")}"` : t;
173
- }
174
- function x(e) {
175
- return e.map((e) => e.map(b).join(";")).join("\r\n");
176
- }
177
- function S(e, t) {
178
- let n = URL.createObjectURL(e), r = document.createElement("a");
179
- r.href = n, r.download = t, r.click(), setTimeout(() => URL.revokeObjectURL(n), 0);
180
- }
181
- function C(e, t) {
182
- let n = e.toLowerCase().endsWith(".csv") ? e : `${e}.csv`;
183
- S(new Blob(["", x(t)], { type: "text/csv;charset=utf-8" }), n);
184
- }
185
- var w = [
186
- "fill",
187
- "fill-opacity",
188
- "stroke",
189
- "stroke-width",
190
- "stroke-dasharray",
191
- "stroke-linecap",
192
- "stroke-linejoin",
193
- "opacity",
194
- "font-family",
195
- "font-size",
196
- "font-weight",
197
- "text-anchor",
198
- "dominant-baseline",
199
- "letter-spacing"
200
- ];
201
- function T(e, t) {
202
- let n = getComputedStyle(e), r = t.style;
203
- for (let e of w) r.setProperty(e, n.getPropertyValue(e));
204
- let i = e.children, a = t.children;
205
- for (let e = 0; e < i.length; e += 1) {
206
- let t = a[e];
207
- t && T(i[e], t);
208
- }
209
- }
210
- function E(e) {
211
- let t = (e) => getComputedStyle(e).getPropertyValue("--color-bg-surface").trim();
212
- return t(e) || t(document.documentElement);
213
- }
214
- async function D(e, t) {
215
- let n = e.toLowerCase().endsWith(".png") ? e : `${e}.png`, r = t.getBoundingClientRect(), i = Math.max(1, Math.round(r.width)), a = Math.max(1, Math.round(r.height)), o = t.cloneNode(!0);
216
- o.setAttribute("xmlns", "http://www.w3.org/2000/svg"), o.setAttribute("width", String(i)), o.setAttribute("height", String(a)), T(t, o);
217
- let s = E(t), c = new XMLSerializer().serializeToString(o), l = new Image();
218
- l.decoding = "sync", await new Promise((e, t) => {
219
- l.onload = () => e(), l.onerror = () => t(/* @__PURE__ */ Error("svg")), l.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(c)}`;
220
- });
221
- let u = document.createElement("canvas");
222
- u.width = i * 2, u.height = a * 2;
223
- let d = u.getContext("2d");
224
- if (!d) return;
225
- s && (d.fillStyle = s, d.fillRect(0, 0, u.width, u.height)), d.drawImage(l, 0, 0, u.width, u.height);
226
- let f = await new Promise((e) => u.toBlob(e, "image/png"));
227
- f && S(f, n);
228
- }
229
- //#endregion
230
- export { p as a, d as c, s as d, y as i, l, D as n, f as o, v as r, m as s, C as t, c as u };