lintje 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +2 -2
  2. package/dist-elements/actions.js +1 -1
  3. package/dist-elements/chunks/{base-Bg-IFOPG.js → base-CbmWxUig.js} +444 -272
  4. package/dist-elements/chunks/{controls-B1455oPG.js → controls-DxmnDSBr.js} +6 -0
  5. package/dist-elements/chunks/dialog-DChINFxD.js +28 -0
  6. package/dist-elements/chunks/{disclosure-BXTX04gM.js → disclosure-D39vAR5q.js} +1 -1
  7. package/dist-elements/chunks/{disclosure-CMXhX-Vb.js → disclosure-DLkXPUpV.js} +6 -6
  8. package/dist-elements/chunks/download-Ct9q2anY.js +206 -0
  9. package/dist-elements/chunks/{focus-trap-9BnE-xWv.js → focus-trap-BwOxE5BX.js} +1 -1
  10. package/dist-elements/chunks/input-CRW_exv_.js +195 -0
  11. package/dist-elements/chunks/{player-DXOZEyEy.js → player-B8QXJ0Z5.js} +26 -26
  12. package/dist-elements/chunks/{sentence-BI3lwEuT.js → sentence-B19AyZBS.js} +3 -3
  13. package/dist-elements/chunks/{stagger-qGD3wmhg.js → stagger-BHoOgy0g.js} +81 -75
  14. package/dist-elements/core.js +1 -1
  15. package/dist-elements/custom-elements.json +980 -670
  16. package/dist-elements/data-types.json +6798 -0
  17. package/dist-elements/feedback.js +2 -1
  18. package/dist-elements/frame.js +0 -2
  19. package/dist-elements/guides/dashboard.md +8 -0
  20. package/dist-elements/guides/events.md +4 -5
  21. package/dist-elements/guides/loading.md +8 -7
  22. package/dist-elements/guides/page-contents.md +110 -0
  23. package/dist-elements/guides/start.md +12 -0
  24. package/dist-elements/inputs.js +2 -1
  25. package/dist-elements/layout.js +1 -1
  26. package/dist-elements/lintje.js +6975 -6120
  27. package/dist-elements/overlays.js +2 -2
  28. package/dist-elements/skills/lintje/SKILL.md +1 -1
  29. package/dist-elements/tables.js +1 -1
  30. package/dist-elements/tag/activity-log.js +15 -15
  31. package/dist-elements/tag/ai-label.js +10 -10
  32. package/dist-elements/tag/announcement.js +36 -76
  33. package/dist-elements/tag/app-search.js +49 -49
  34. package/dist-elements/tag/audio-player.js +57 -57
  35. package/dist-elements/tag/badge.js +1 -1
  36. package/dist-elements/tag/breadcrumbs.js +15 -15
  37. package/dist-elements/tag/button.js +1 -1
  38. package/dist-elements/tag/card-list.js +12 -12
  39. package/dist-elements/tag/card.js +39 -44
  40. package/dist-elements/tag/chart.js +1050 -795
  41. package/dist-elements/tag/chat-answer.js +49 -49
  42. package/dist-elements/tag/chat-composer.js +75 -71
  43. package/dist-elements/tag/chat-message.js +8 -8
  44. package/dist-elements/tag/chat-strip.js +22 -22
  45. package/dist-elements/tag/chat-suggestions.js +12 -12
  46. package/dist-elements/tag/chat.js +56 -56
  47. package/dist-elements/tag/checkbox-group.d.ts +1 -0
  48. package/dist-elements/tag/checkbox-group.js +59 -0
  49. package/dist-elements/tag/checkbox.js +8 -8
  50. package/dist-elements/tag/code.js +9 -9
  51. package/dist-elements/tag/combobox.js +18 -18
  52. package/dist-elements/tag/conflict-alert.js +12 -12
  53. package/dist-elements/tag/copy-button.js +14 -14
  54. package/dist-elements/tag/data-table.js +878 -530
  55. package/dist-elements/tag/date-input.js +30 -30
  56. package/dist-elements/tag/date-range.js +37 -37
  57. package/dist-elements/tag/description-list.js +29 -32
  58. package/dist-elements/tag/dialog.d.ts +1 -0
  59. package/dist-elements/tag/dialog.js +144 -0
  60. package/dist-elements/tag/document-viewer.js +23 -23
  61. package/dist-elements/tag/drawer.js +28 -32
  62. package/dist-elements/tag/empty-state.js +19 -30
  63. package/dist-elements/tag/error-page.d.ts +1 -0
  64. package/dist-elements/tag/error-page.js +109 -0
  65. package/dist-elements/tag/error-summary.js +10 -10
  66. package/dist-elements/tag/expander.js +8 -8
  67. package/dist-elements/tag/explainer.js +11 -11
  68. package/dist-elements/tag/field.js +5 -5
  69. package/dist-elements/tag/file-upload.js +34 -34
  70. package/dist-elements/tag/filter-bar.js +56 -56
  71. package/dist-elements/tag/filter-sheet.js +11 -11
  72. package/dist-elements/tag/filter-zone.js +31 -31
  73. package/dist-elements/tag/footer.js +21 -21
  74. package/dist-elements/tag/form-actions.js +29 -25
  75. package/dist-elements/tag/form-section.js +6 -6
  76. package/dist-elements/tag/form.js +12 -12
  77. package/dist-elements/tag/gallery.js +14 -14
  78. package/dist-elements/tag/grid-item.js +1 -1
  79. package/dist-elements/tag/grid.js +1 -1
  80. package/dist-elements/tag/hero.js +12 -12
  81. package/dist-elements/tag/highlight.js +5 -5
  82. package/dist-elements/tag/icon-button.js +1 -1
  83. package/dist-elements/tag/icon.js +1 -1
  84. package/dist-elements/tag/job-list.js +22 -44
  85. package/dist-elements/tag/kpi-row.js +12 -10
  86. package/dist-elements/tag/kpi.js +146 -137
  87. package/dist-elements/tag/level-meter.js +11 -11
  88. package/dist-elements/tag/list.js +55 -55
  89. package/dist-elements/tag/logo.js +30 -30
  90. package/dist-elements/tag/map.js +690 -665
  91. package/dist-elements/tag/menu-button.js +70 -69
  92. package/dist-elements/tag/modal.js +28 -37
  93. package/dist-elements/tag/multiselect.js +34 -34
  94. package/dist-elements/tag/note.js +5 -5
  95. package/dist-elements/tag/notifications.js +36 -36
  96. package/dist-elements/tag/number-input.js +12 -12
  97. package/dist-elements/tag/page-header.js +140 -37
  98. package/dist-elements/tag/pagination.js +53 -48
  99. package/dist-elements/tag/popover.js +1 -1
  100. package/dist-elements/tag/progress-bar.js +1 -1
  101. package/dist-elements/tag/prose.js +6 -6
  102. package/dist-elements/tag/qr-code.js +7 -7
  103. package/dist-elements/tag/radio-group.js +12 -12
  104. package/dist-elements/tag/range.js +22 -22
  105. package/dist-elements/tag/recording-status.js +14 -14
  106. package/dist-elements/tag/repeater.js +10 -10
  107. package/dist-elements/tag/segmented.js +13 -13
  108. package/dist-elements/tag/select.js +10 -10
  109. package/dist-elements/tag/shell.js +356 -339
  110. package/dist-elements/tag/skeleton.js +1 -1
  111. package/dist-elements/tag/slot-picker.js +14 -14
  112. package/dist-elements/tag/sortable-list.js +14 -14
  113. package/dist-elements/tag/spinner.js +1 -1
  114. package/dist-elements/tag/split-pane.js +12 -12
  115. package/dist-elements/tag/status-dot.js +1 -1
  116. package/dist-elements/tag/stepper.js +21 -21
  117. package/dist-elements/tag/streaming-text.js +13 -13
  118. package/dist-elements/tag/sub-nav.js +39 -38
  119. package/dist-elements/tag/tabs.js +38 -38
  120. package/dist-elements/tag/tag-input.js +19 -19
  121. package/dist-elements/tag/text-editor.js +24 -24
  122. package/dist-elements/tag/text-input.js +14 -14
  123. package/dist-elements/tag/textarea.js +14 -14
  124. package/dist-elements/tag/tile.js +1 -1
  125. package/dist-elements/tag/time-input.js +19 -19
  126. package/dist-elements/tag/toast.js +32 -23
  127. package/dist-elements/tag/toggle.js +8 -8
  128. package/dist-elements/tag/toggletip.js +27 -27
  129. package/dist-elements/tag/tooltip.js +1 -1
  130. package/dist-elements/tag/transcript.js +48 -48
  131. package/dist-elements/tag/translator.js +13 -13
  132. package/dist-elements/tag/tree-view.js +13 -13
  133. package/dist-elements/tag/user-menu.js +37 -37
  134. package/dist-elements/tag/video-player.js +21 -21
  135. package/dist-elements/tokens.css +120 -96
  136. package/dist-elements/types/bundle/feedback.d.ts +1 -0
  137. package/dist-elements/types/bundle/frame.d.ts +0 -2
  138. package/dist-elements/types/bundle/inputs.d.ts +1 -0
  139. package/dist-elements/types/bundle/overlays.d.ts +1 -1
  140. package/dist-elements/types/components/actions/copy-button/copy-button.d.ts +6 -7
  141. package/dist-elements/types/components/actions/menu-button/menu-button.d.ts +13 -15
  142. package/dist-elements/types/components/actions/qr-code/qr-code.d.ts +9 -9
  143. package/dist-elements/types/components/charts/chart/chart.d.ts +5 -4
  144. package/dist-elements/types/components/charts/kpi/kpi.d.ts +16 -8
  145. package/dist-elements/types/components/charts/kpi-row/kpi-row.d.ts +1 -7
  146. package/dist-elements/types/components/charts/note/note.d.ts +1 -1
  147. package/dist-elements/types/components/chat/chat/chat.d.ts +8 -10
  148. package/dist-elements/types/components/chat/chat-answer/chat-answer.d.ts +7 -8
  149. package/dist-elements/types/components/chat/chat-composer/chat-composer.d.ts +8 -10
  150. package/dist-elements/types/components/chat/chat-message/chat-message.d.ts +6 -7
  151. package/dist-elements/types/components/chat/chat-strip/chat-strip.d.ts +5 -5
  152. package/dist-elements/types/components/chat/chat-suggestions/chat-suggestions.d.ts +9 -10
  153. package/dist-elements/types/components/content/audio-player/audio-player.d.ts +10 -12
  154. package/dist-elements/types/components/content/code/code.d.ts +2 -3
  155. package/dist-elements/types/components/content/document-viewer/document-viewer.d.ts +8 -9
  156. package/dist-elements/types/components/content/gallery/gallery.d.ts +5 -4
  157. package/dist-elements/types/components/content/highlight/highlight.d.ts +4 -3
  158. package/dist-elements/types/components/content/prose/prose.d.ts +2 -3
  159. package/dist-elements/types/components/content/transcript/transcript.d.ts +12 -25
  160. package/dist-elements/types/components/content/translator/translator.d.ts +11 -15
  161. package/dist-elements/types/components/content/video-player/video-player.d.ts +11 -13
  162. package/dist-elements/types/components/feedback/ai-label/ai-label.d.ts +3 -4
  163. package/dist-elements/types/components/feedback/announcement/announcement.d.ts +3 -7
  164. package/dist-elements/types/components/feedback/conflict-alert/conflict-alert.d.ts +3 -4
  165. package/dist-elements/types/components/feedback/empty-state/empty-state.d.ts +5 -8
  166. package/dist-elements/types/components/feedback/error-page/error-page.d.ts +52 -0
  167. package/dist-elements/types/components/feedback/job-list/job-list.d.ts +9 -12
  168. package/dist-elements/types/components/feedback/level-meter/level-meter.d.ts +4 -6
  169. package/dist-elements/types/components/feedback/recording-status/recording-status.d.ts +5 -6
  170. package/dist-elements/types/components/feedback/streaming-text/streaming-text.d.ts +10 -7
  171. package/dist-elements/types/components/feedback/toast/toast.d.ts +8 -9
  172. package/dist-elements/types/components/filters/filter-bar/filter-bar.d.ts +9 -4
  173. package/dist-elements/types/components/filters/filter-sheet/filter-sheet.d.ts +5 -5
  174. package/dist-elements/types/components/filters/filter-zone/filter-zone.d.ts +4 -4
  175. package/dist-elements/types/components/forms/error-summary/error-summary.d.ts +5 -6
  176. package/dist-elements/types/components/forms/form/form.d.ts +5 -5
  177. package/dist-elements/types/components/forms/form-actions/form-actions.d.ts +9 -7
  178. package/dist-elements/types/components/forms/form-section/form-section.d.ts +6 -5
  179. package/dist-elements/types/components/forms/repeater/repeater.d.ts +13 -7
  180. package/dist-elements/types/components/forms/stepper/stepper.d.ts +5 -4
  181. package/dist-elements/types/components/frame/app-search/app-search.d.ts +6 -7
  182. package/dist-elements/types/components/frame/breadcrumbs/breadcrumbs.d.ts +2 -2
  183. package/dist-elements/types/components/frame/footer/footer.d.ts +3 -2
  184. package/dist-elements/types/components/frame/hero/hero.d.ts +7 -9
  185. package/dist-elements/types/components/frame/notifications/notifications.d.ts +5 -9
  186. package/dist-elements/types/components/frame/page-header/page-header.d.ts +12 -15
  187. package/dist-elements/types/components/frame/shell/shell.d.ts +14 -13
  188. package/dist-elements/types/components/frame/sub-nav/sub-nav.d.ts +10 -6
  189. package/dist-elements/types/components/frame/user-menu/user-menu.d.ts +11 -10
  190. package/dist-elements/types/components/index.d.ts +8 -9
  191. package/dist-elements/types/components/inputs/checkbox/checkbox.d.ts +4 -4
  192. package/dist-elements/types/components/inputs/checkbox-group/checkbox-group.d.ts +33 -0
  193. package/dist-elements/types/components/inputs/combobox/combobox.d.ts +12 -6
  194. package/dist-elements/types/components/inputs/date-input/date-input.d.ts +5 -5
  195. package/dist-elements/types/components/inputs/date-range/date-range.d.ts +11 -6
  196. package/dist-elements/types/components/inputs/field/field.d.ts +5 -3
  197. package/dist-elements/types/components/inputs/file-upload/file-upload.d.ts +6 -8
  198. package/dist-elements/types/components/inputs/multiselect/multiselect.d.ts +4 -6
  199. package/dist-elements/types/components/inputs/number-input/number-input.d.ts +8 -7
  200. package/dist-elements/types/components/inputs/radio-group/radio-group.d.ts +2 -4
  201. package/dist-elements/types/components/inputs/range/range.d.ts +5 -6
  202. package/dist-elements/types/components/inputs/segmented/segmented.d.ts +7 -4
  203. package/dist-elements/types/components/inputs/select/select.d.ts +6 -3
  204. package/dist-elements/types/components/inputs/slot-picker/slot-picker.d.ts +6 -5
  205. package/dist-elements/types/components/inputs/tag-input/tag-input.d.ts +7 -5
  206. package/dist-elements/types/components/inputs/text-editor/text-editor.d.ts +6 -6
  207. package/dist-elements/types/components/inputs/text-input/text-input.d.ts +11 -6
  208. package/dist-elements/types/components/inputs/textarea/textarea.d.ts +12 -11
  209. package/dist-elements/types/components/inputs/time-input/time-input.d.ts +7 -8
  210. package/dist-elements/types/components/inputs/toggle/toggle.d.ts +3 -1
  211. package/dist-elements/types/components/layout/expander/expander.d.ts +9 -10
  212. package/dist-elements/types/components/layout/split-pane/split-pane.d.ts +6 -6
  213. package/dist-elements/types/components/layout/tabs/tabs.d.ts +11 -9
  214. package/dist-elements/types/components/map/map/map.d.ts +10 -9
  215. package/dist-elements/types/components/overlays/dialog/dialog.d.ts +49 -0
  216. package/dist-elements/types/components/overlays/drawer/drawer.d.ts +6 -5
  217. package/dist-elements/types/components/overlays/modal/modal.d.ts +7 -12
  218. package/dist-elements/types/components/overlays/toggletip/toggletip.d.ts +3 -7
  219. package/dist-elements/types/components/shared/charts/index.d.ts +4 -1
  220. package/dist-elements/types/components/shared/charts/kinds.d.ts +86 -0
  221. package/dist-elements/types/components/shared/charts/line-chart/line-chart.d.ts +2 -2
  222. package/dist-elements/types/components/shared/charts/map-chart/leaflet.d.ts +5 -0
  223. package/dist-elements/types/components/shared/charts/shared/chart-states.d.ts +8 -19
  224. package/dist-elements/types/components/shared/charts/shared/controller.d.ts +7 -0
  225. package/dist-elements/types/components/shared/charts/shared/types.d.ts +29 -0
  226. package/dist-elements/types/components/shared/charts/stacked-area-chart/stacked-area-chart.d.ts +13 -0
  227. package/dist-elements/types/components/shared/dialog.d.ts +9 -0
  228. package/dist-elements/types/components/shared/overflow.d.ts +58 -0
  229. package/dist-elements/types/components/tables/activity-log/activity-log.d.ts +2 -3
  230. package/dist-elements/types/components/tables/card/card.d.ts +14 -20
  231. package/dist-elements/types/components/tables/card-list/card-list.d.ts +9 -11
  232. package/dist-elements/types/components/tables/data-table/data-table.d.ts +85 -16
  233. package/dist-elements/types/components/tables/data-table/filters.d.ts +13 -4
  234. package/dist-elements/types/components/tables/description-list/description-list.d.ts +12 -11
  235. package/dist-elements/types/components/tables/list/list.d.ts +9 -20
  236. package/dist-elements/types/components/tables/pagination/pagination.d.ts +12 -11
  237. package/dist-elements/types/components/tables/sortable-list/sortable-list.d.ts +5 -6
  238. package/dist-elements/types/components/tables/tree-view/tree-view.d.ts +4 -4
  239. package/dist-elements/types/core/media.d.ts +2 -2
  240. package/dist-elements/types/core/motion.d.ts +5 -0
  241. package/dist-elements/types/core/print.d.ts +15 -0
  242. package/dist-elements/types/core/shortcuts.d.ts +2 -2
  243. package/dist-elements/types/icons/icon/icon.d.ts +2 -3
  244. package/dist-elements/types/icons/register.d.ts +1 -1
  245. package/dist-elements/types/primitives/badge/badge.d.ts +9 -5
  246. package/dist-elements/types/primitives/button/button.d.ts +12 -9
  247. package/dist-elements/types/primitives/grid/grid.d.ts +3 -3
  248. package/dist-elements/types/primitives/grid-item/grid-item.d.ts +1 -1
  249. package/dist-elements/types/primitives/icon-button/icon-button.d.ts +7 -5
  250. package/dist-elements/types/primitives/index.d.ts +3 -1
  251. package/dist-elements/types/primitives/popover/popover.d.ts +5 -4
  252. package/dist-elements/types/primitives/progress-bar/progress-bar.d.ts +8 -6
  253. package/dist-elements/types/primitives/shared/announcement-block.d.ts +38 -0
  254. package/dist-elements/types/primitives/shared/empty-state-block.d.ts +26 -0
  255. package/dist-elements/types/primitives/shared/tone.d.ts +18 -0
  256. package/dist-elements/types/primitives/skeleton/skeleton.d.ts +1 -1
  257. package/dist-elements/types/primitives/spinner/spinner.d.ts +1 -2
  258. package/dist-elements/types/primitives/status-dot/status-dot.d.ts +4 -5
  259. package/dist-elements/types/primitives/tile/tile.d.ts +17 -5
  260. package/dist-elements/types/primitives/tooltip/tooltip.d.ts +6 -6
  261. package/dist-elements/types/types.d.ts +70 -10
  262. package/dist-icons/functioneel-kolommen.svg +1 -0
  263. package/dist-icons/functioneel-trechter.svg +1 -0
  264. package/package.json +1 -1
  265. package/dist-elements/chunks/confirm-dialog-D5EVGuil.js +0 -4
  266. package/dist-elements/chunks/download-y528pIHP.js +0 -230
  267. package/dist-elements/chunks/input-BtuNFSWk.js +0 -195
  268. package/dist-elements/tag/confirm-dialog.d.ts +0 -1
  269. package/dist-elements/tag/confirm-dialog.js +0 -118
  270. package/dist-elements/tag/session-expiry.d.ts +0 -1
  271. package/dist-elements/tag/session-expiry.js +0 -184
  272. package/dist-elements/tag/shortcuts.d.ts +0 -1
  273. package/dist-elements/tag/shortcuts.js +0 -104
  274. package/dist-elements/types/components/frame/session-expiry/session-expiry.d.ts +0 -55
  275. package/dist-elements/types/components/frame/shortcuts/shortcuts.d.ts +0 -41
  276. package/dist-elements/types/components/overlays/confirm-dialog/confirm-dialog.d.ts +0 -41
@@ -11,7 +11,7 @@
11
11
  "name": "LintjeCopyButton",
12
12
  "tagName": "lintje-copy-button",
13
13
  "customElement": true,
14
- "description": "`<lintje-copy-button>` — text to the clipboard, with a confirmation.\n\nCopies `text`, or the text of the element whose id is in `for` (same root, read on press).\nDisabled with nothing to copy; a `for` target that appears later enables it. A second copy\nempties the status first so a screen reader hears it again.\n\nEvents: `lintje-copy` (detail: the text) after a copy, `lintje-copy-error` (detail: the\ntext) when the browser refused.",
14
+ "description": "`<lintje-copy-button>` — a button that copies text to the clipboard, and confirms it.\n\nIt copies `text`, or the text of the element named in `for`, read on press. With nothing to\ncopy it is disabled; a `for` target that appears later enables it.\n\nEvents: `lintje-copy` `string` (the text copied), `lintje-copy-error` `string` (the browser\nrefused).",
15
15
  "superclass": {
16
16
  "name": "LintjeElement"
17
17
  },
@@ -361,7 +361,7 @@
361
361
  "name": "LintjeMenuButton",
362
362
  "tagName": "lintje-menu-button",
363
363
  "customElement": true,
364
- "description": "`<lintje-menu-button>` — a button with a menu of actions.\n\nThe trigger is a native `<button>` so `aria-haspopup`, `aria-expanded` and `aria-controls` sit\non the focused element; `aria-controls` names the popover because the `role=\"menu\"` panel is\nin the popover's shadow root. A disabled trigger is `aria-disabled`: it stays in the tab order\nand refuses to open. Keys reach disabled rows too, so their `reason` tooltip shows on focus.\nWhile `busyLabel` is set the trigger is disabled and the sentence stands beside it with a\nspinner; the `role=\"status\"` is always present so the sentence is read out when it appears.\n\n`split` makes it two halves of one button, 1 px apart: the label does the usual action\n(`action`), the arrow beside it opens the other ways to do it. Busy, a split button keeps its\nsize and colours: only its icon turns into the spinner, and the sentence is for the screen\nreader.\n\nEvents: `lintje-action` (the row's value, or `action` from a split button's own half),\n`lintje-navigate` `{ href }` for a link row.",
364
+ "description": "`<lintje-menu-button>` — a button with a menu of actions.\n\nA disabled trigger stays in the tab order and refuses to open. The keys reach disabled rows\ntoo, so their `reason` tooltip shows on focus.\n\nEvents: `lintje-action` `string` (the row's value, or `action` from a split button's own half),\n`lintje-navigate` `{ href }` (a link row).",
365
365
  "superclass": {
366
366
  "name": "LintjeElement"
367
367
  },
@@ -444,7 +444,7 @@
444
444
  "text": "string"
445
445
  },
446
446
  "default": "''",
447
- "description": "An action is under way: the sentence beside the spinner. Empty when none is.",
447
+ "description": "An action is under way: the trigger is disabled and this sentence stands beside the spinner,\nread out when it appears. A split button keeps its size and colours: only its icon turns into\nthe spinner, and the sentence is for the screen reader. Empty when none is.",
448
448
  "attribute": "busy-label"
449
449
  },
450
450
  {
@@ -482,7 +482,7 @@
482
482
  "text": "boolean"
483
483
  },
484
484
  "default": "false",
485
- "description": "The label is a button of its own, and the arrow beside it opens the menu.",
485
+ "description": "Two halves of one button, 1 px apart: the label does the usual action (`action`), the arrow\nbeside it opens the other ways to do it.",
486
486
  "attribute": "split",
487
487
  "reflects": true
488
488
  },
@@ -564,7 +564,7 @@
564
564
  "text": "string"
565
565
  },
566
566
  "default": "''",
567
- "description": "An action is under way: the sentence beside the spinner. Empty when none is."
567
+ "description": "An action is under way: the trigger is disabled and this sentence stands beside the spinner,\nread out when it appears. A split button keeps its size and colours: only its icon turns into\nthe spinner, and the sentence is for the screen reader. Empty when none is."
568
568
  },
569
569
  {
570
570
  "name": "placement",
@@ -590,7 +590,7 @@
590
590
  "text": "boolean"
591
591
  },
592
592
  "default": "false",
593
- "description": "The label is a button of its own, and the arrow beside it opens the menu."
593
+ "description": "Two halves of one button, 1 px apart: the label does the usual action (`action`), the arrow\nbeside it opens the other ways to do it."
594
594
  },
595
595
  {
596
596
  "name": "action",
@@ -639,7 +639,7 @@
639
639
  "name": "LintjeQrCode",
640
640
  "tagName": "lintje-qr-code",
641
641
  "customElement": true,
642
- "description": "`<lintje-qr-code>` — a QR code a phone camera reads, with a button that copies it as an\nimage.\n\nThe host sets `value`, the text the code holds, and the element makes the code. A host that\nmakes its own sets `src` instead: an image of only the dark modules, without a margin. The\nelement sets the code on a light quiet zone in every mode and theme, because many camera apps do\nnot read an inverted code.\n\nEvents: `lintje-copy` after the image is on the clipboard, `lintje-copy-error` when the\nbrowser refused.",
642
+ "description": "`<lintje-qr-code>` — a QR code a phone camera reads, with a button that copies it as an image.\n\nThe element makes the code from `value`, or shows the host's own image in `src`. The code stands\non a light quiet zone in every mode and theme, because many camera apps do not read an inverted\ncode.\n\nEvents: `lintje-copy` (the image is on the clipboard), `lintje-copy-error` (the browser refused).",
643
643
  "superclass": {
644
644
  "name": "LintjeElement"
645
645
  },
@@ -662,7 +662,7 @@
662
662
  "text": "string"
663
663
  },
664
664
  "default": "''",
665
- "description": "URL or data URI of an image of the code the host made; it goes before `value`.",
665
+ "description": "URL or data URI of an image of the code the host made: only the dark modules, without a\nmargin. It goes before `value`.",
666
666
  "attribute": "src"
667
667
  },
668
668
  {
@@ -701,7 +701,7 @@
701
701
  "text": "string"
702
702
  },
703
703
  "default": "''",
704
- "description": "URL or data URI of an image of the code the host made; it goes before `value`."
704
+ "description": "URL or data URI of an image of the code the host made: only the dark modules, without a\nmargin. It goes before `value`."
705
705
  },
706
706
  {
707
707
  "name": "value",
@@ -758,7 +758,7 @@
758
758
  "name": "LintjeChart",
759
759
  "tagName": "lintje-chart",
760
760
  "customElement": true,
761
- "description": "`<lintje-chart>` — a chart in its tile, with loading, empty and error states.\n\nEvents: `lintje-mark-select` `{id, label, href}` when a mark with a `href` is clicked, and\n`{id: null, label: null, href: clearHref}` when it is deselected. Expand and download stay here.\n\nTwo controllers: the tile and the modal draw the same chart and must not share hover or width.\nThe table view is built from the CSV rows; it is element state, not URL state (rule 14).",
761
+ "description": "`<lintje-chart>` — a chart in its tile, with loading, empty and error states.\n\nExpand and download are handled here. The table view is the element's own state, built from the\nCSV rows; it never reaches the URL.\n\nEvents: `lintje-mark-select` `{ id, label, href }` (a mark with an `href` was clicked;\ndeselected, `{ id: null, label: null, href: data.clearHref }`).",
762
762
  "superclass": {
763
763
  "name": "LintjeContentTileElement"
764
764
  },
@@ -923,7 +923,7 @@
923
923
  "name": "LintjeKpiRow",
924
924
  "tagName": "lintje-kpi-row",
925
925
  "customElement": true,
926
- "description": "`<lintje-kpi-row>` — the KPI row: one grid, the KPIs staggered in from left to right.\n\nThe grid and the KPIs share one shadow root, so `kpi-row.css` reaches the `<lintje-kpi>` hosts.\n`dividers` is set as a property: a boolean attribute can't turn off a `true` default.\nEvents: none.",
926
+ "description": "`<lintje-kpi-row>` — the KPI row: one grid, the KPIs staggered in from left to right.",
927
927
  "superclass": {
928
928
  "name": "LintjeGridItemElement"
929
929
  },
@@ -1002,7 +1002,7 @@
1002
1002
  "name": "LintjeKpi",
1003
1003
  "tagName": "lintje-kpi",
1004
1004
  "customElement": true,
1005
- "description": "`<lintje-kpi>` — the KPI tile: one figure, or several of the same variable (`items`). Rich\nvalues go in as properties. The value counts up from zero and the sparkline draws in once\n35 % of the tile is in view, and not under `prefers-reduced-motion`. A single figure can stand\non its scale (`gauge`): a half circle around the value or a bar under it, with the target\ndashed; the trend or note says in words how the figure stands to the target. Events: none.",
1005
+ "description": "`<lintje-kpi>` — the KPI tile: one figure, or several of the same variable (`items`).\n\nThe value counts up from zero and the sparkline draws in once 35 % of the tile is in view; under\n`prefers-reduced-motion` both stand at once.",
1006
1006
  "superclass": {
1007
1007
  "name": "LintjeGridItemElement"
1008
1008
  },
@@ -1125,7 +1125,7 @@
1125
1125
  "type": {
1126
1126
  "text": "KpiGauge"
1127
1127
  },
1128
- "description": "The single figure on its scale, as a half circle (`arc`) or a bar (`linear`); not with `items`."
1128
+ "description": "The single figure on its scale, as a half circle (`arc`) or a bar (`linear`), the target\ndashed; not with `items`. The trend or note says in words how the figure stands to the target."
1129
1129
  },
1130
1130
  {
1131
1131
  "kind": "field",
@@ -1165,6 +1165,24 @@
1165
1165
  "attribute": "state",
1166
1166
  "reflects": true
1167
1167
  },
1168
+ {
1169
+ "kind": "field",
1170
+ "name": "message",
1171
+ "type": {
1172
+ "text": "string"
1173
+ },
1174
+ "description": "Explains an empty or failed result instead of the default message.",
1175
+ "attribute": "message"
1176
+ },
1177
+ {
1178
+ "kind": "field",
1179
+ "name": "lastKnown",
1180
+ "type": {
1181
+ "text": "string"
1182
+ },
1183
+ "description": "The last known value and its date, shown below a failed result.",
1184
+ "attribute": "last-known"
1185
+ },
1168
1186
  {
1169
1187
  "kind": "field",
1170
1188
  "name": "index",
@@ -1282,6 +1300,22 @@
1282
1300
  },
1283
1301
  "default": "'ready'"
1284
1302
  },
1303
+ {
1304
+ "name": "message",
1305
+ "fieldName": "message",
1306
+ "type": {
1307
+ "text": "string"
1308
+ },
1309
+ "description": "Explains an empty or failed result instead of the default message."
1310
+ },
1311
+ {
1312
+ "name": "last-known",
1313
+ "fieldName": "lastKnown",
1314
+ "type": {
1315
+ "text": "string"
1316
+ },
1317
+ "description": "The last known value and its date, shown below a failed result."
1318
+ },
1285
1319
  {
1286
1320
  "name": "index",
1287
1321
  "fieldName": "index",
@@ -1315,7 +1349,7 @@
1315
1349
  "name": "LintjeNote",
1316
1350
  "tagName": "lintje-note",
1317
1351
  "customElement": true,
1318
- "description": "`<lintje-note>` — the analyst's note (\"Toelichting analist\"). Events: none.",
1352
+ "description": "`<lintje-note>` — the analyst's note (\"Toelichting analist\").",
1319
1353
  "superclass": {
1320
1354
  "name": "LintjeGridItemElement"
1321
1355
  },
@@ -1394,7 +1428,7 @@
1394
1428
  "name": "LintjeChatAnswer",
1395
1429
  "tagName": "lintje-chat-answer",
1396
1430
  "customElement": true,
1397
- "description": "`<lintje-chat-answer>` — what the assistant answered, as a list of existing blocks.\n\nIt draws none of the blocks itself; only the bold lead, strip, actions and follow-ups are its\nown. A block still to come is that block with `state: 'loading'`. Only the `current` answer\ncan be retried, changed through its strip or followed up. The thumbs and \"Gekopieerd\" are\nthe element's own state; the conversation is not stored.\n\nEvents: `lintje-answer-retry` `{turnId}` and `lintje-answer-rate` `{turnId, rating, reason}`\n(`rating` is `'up'`, `'down'` or `null` when taken back; a `'down'` is followed by a second\nevent once the reader picks a reason). The strip's, the suggestions' and the blocks' events\npass through untouched.",
1431
+ "description": "`<lintje-chat-answer>` — what the assistant answered, as a list of existing blocks.\n\nIt draws none of the blocks itself: a block still to come is that block with `state: 'loading'`.\nThe thumbs and \"Gekopieerd\" are its own state; it stores nothing of the conversation. The events\nof its strip, suggestions and blocks pass through unchanged.\n\nEvents: `lintje-answer-retry` `{ turnId }`, `lintje-answer-rate` `{ turnId, rating, reason }`\n(`rating` is `'up'`, `'down'` or `null` when taken back; a `'down'` comes again with the\n`reason` once the reader picks one).",
1398
1432
  "superclass": {
1399
1433
  "name": "LintjeElement"
1400
1434
  },
@@ -1491,6 +1525,7 @@
1491
1525
  "text": "boolean"
1492
1526
  },
1493
1527
  "default": "false",
1528
+ "description": "The latest answer: only it can be retried, changed through its strip or followed up.",
1494
1529
  "attribute": "current",
1495
1530
  "reflects": true
1496
1531
  },
@@ -1550,7 +1585,8 @@
1550
1585
  "type": {
1551
1586
  "text": "boolean"
1552
1587
  },
1553
- "default": "false"
1588
+ "default": "false",
1589
+ "description": "The latest answer: only it can be retried, changed through its strip or followed up."
1554
1590
  },
1555
1591
  {
1556
1592
  "name": "turn-id",
@@ -1598,7 +1634,7 @@
1598
1634
  "name": "LintjeChatComposer",
1599
1635
  "tagName": "lintje-chat-composer",
1600
1636
  "customElement": true,
1601
- "description": "`<lintje-chat-composer>` — the question box: text field, source picker and split send button.\n\nThe field is a plain-text `contenteditable`; the element never writes markup into it. Terms\nare painted with the CSS Custom Highlight API so typing, input methods and undo stay the\nbrowser's; without the API the field is unmarked. Terms come from `vocabulary` (matched while\ntyping) or from the host's `draftTerms`, which win while the text is unchanged.\nThe source selection is the host's; the draft, send key (in `localStorage`) and answer form\nare the element's own.\n\nEvents: `lintje-message-send` `{text, terms, sources, form}`, `lintje-answer-stop`,\n`lintje-sources-change` `{ids}`, `lintje-draft-change` `{text}` (200 ms after the last key).\nIn `variant=\"edit\"` it sends `lintje-submit` `{text, terms}` and `lintje-cancel` instead, both\nnot composed.",
1637
+ "description": "`<lintje-chat-composer>` — the question box: text field, source picker and split send button.\n\nThe field is plain text; the element never writes markup into it. Terms are marked through the\nCSS Custom Highlight API, so typing and undo stay the browser's; without it the field is\nunmarked. The source selection is the host's; the draft, the send key (kept in `localStorage`)\nand the answer form are the element's own.\n\nEvents: `lintje-message-send` `{ text, terms, sources, form }`, `lintje-answer-stop`,\n`lintje-sources-change` `{ ids }`, `lintje-draft-change` `{ text }` (200 ms after the last key);\nwith `variant=\"edit\"` instead `lintje-submit` `{ text, terms }` and `lintje-cancel`.",
1602
1638
  "superclass": {
1603
1639
  "name": "LintjeElement"
1604
1640
  },
@@ -1696,7 +1732,8 @@
1696
1732
  "name": "vocabulary",
1697
1733
  "type": {
1698
1734
  "text": "ChatTermData[]"
1699
- }
1735
+ },
1736
+ "description": "The terms marked in the field while the reader types."
1700
1737
  },
1701
1738
  {
1702
1739
  "kind": "field",
@@ -1888,7 +1925,7 @@
1888
1925
  "name": "LintjeChatMessage",
1889
1926
  "tagName": "lintje-chat-message",
1890
1927
  "customElement": true,
1891
- "description": "`<lintje-chat-message>` — what the reader asked: a filled bar on the right. A visually hidden\n\"Jij:\" carries the role.\n\nEditing is the message's own state (`lintje-chat-composer variant=\"edit\"`). The message never\nchanges its own text: asking again is an event and the host replaces the turn.\n\nEvents: `lintje-message-edit` `{turnId, text, terms}` — ask this instead, replacing the answer\nand everything after it. `lintje-editing-change` `{turnId, editing}` is not composed: it tells\nthe holding view which answers are about to be replaced.",
1928
+ "description": "`<lintje-chat-message>` — what the reader asked: a filled bar on the right.\n\nEditing is the message's own state, in a `lintje-chat-composer`. It never changes its own text:\nasking again is an event, and the host replaces the turn.\n\nEvents: `lintje-message-edit` `{ turnId, text, terms }` (ask this instead, replacing the answer\nand all after it), `lintje-editing-change` `{ turnId, editing }` (tells the holding view which\nanswers are about to be replaced).",
1892
1929
  "superclass": {
1893
1930
  "name": "LintjeElement"
1894
1931
  },
@@ -2060,7 +2097,7 @@
2060
2097
  "name": "LintjeChatStrip",
2061
2098
  "tagName": "lintje-chat-strip",
2062
2099
  "customElement": true,
2063
- "description": "`<lintje-chat-strip>` — the strip under an answer's text: what the answer assumed, as\nlabel/value pairs, and how it was calculated.\n\nA fixed value is plain text; one with `options` is a native `<select>` drawn as a term (the\nbrowser's own list and phone picker); one with `pressed` is a suggestion. The strip keeps only\nwhether its details are open; a change is an event and the host sets the items again.\n\nEvents: `lintje-strip-change` `{turnId, key, value}` — a state; `value` is the\nchosen option's value, or the suggestion's new `pressed`.",
2100
+ "description": "`<lintje-chat-strip>` — the strip under an answer's text: what the answer assumed, as\nlabel/value pairs, and how it was calculated.\n\nA value with `options` is a choice, one with `pressed` a suggestion, the rest plain text. The\nstrip keeps only whether its details are open: a change is an event, and the host sets the\nitems again.\n\nEvents: `lintje-strip-change` `{ turnId, key, value }` (`value` is the chosen option's value, or\nthe suggestion's new `pressed`).",
2064
2101
  "superclass": {
2065
2102
  "name": "LintjeElement"
2066
2103
  },
@@ -2204,7 +2241,7 @@
2204
2241
  "name": "LintjeChatSuggestions",
2205
2242
  "tagName": "lintje-chat-suggestions",
2206
2243
  "customElement": true,
2207
- "description": "`<lintje-chat-suggestions>` — sentences the reader can send with one press.\n\n`kind` is a rule, not decoration: `suggestion` (dashed) is something the reader could ask;\n`choice` (solid) is an answer the assistant is waiting for. In a conversation they stand on the\nreader's side, on the right; `align=\"start\"` sets them left and side by side, as the examples\nunder a question box on a start page.\n\nEvents: `lintje-suggestion-select` `{turnId, kind, label, value}` — a trigger;\n`value` is the item's own, or its label.",
2244
+ "description": "`<lintje-chat-suggestions>` — sentences the reader can send with one press, on the reader's side.\n\nEvents: `lintje-suggestion-select` `{ turnId, kind, label, value }` (`value` is the item's own,\nor its label).",
2208
2245
  "superclass": {
2209
2246
  "name": "LintjeElement"
2210
2247
  },
@@ -2245,6 +2282,7 @@
2245
2282
  "text": "'suggestion' | 'choice'"
2246
2283
  },
2247
2284
  "default": "'suggestion'",
2285
+ "description": "A rule, not decoration: `suggestion` (dashed) is something the reader could ask, `choice`\n(solid) an answer the assistant is waiting for.",
2248
2286
  "attribute": "kind",
2249
2287
  "reflects": true
2250
2288
  },
@@ -2255,7 +2293,7 @@
2255
2293
  "text": "'end' | 'start'"
2256
2294
  },
2257
2295
  "default": "'end'",
2258
- "description": "`start`: left and side by side, outside a conversation.",
2296
+ "description": "`start`: left and side by side, outside a conversation, as examples under a question box.",
2259
2297
  "attribute": "align",
2260
2298
  "reflects": true
2261
2299
  },
@@ -2307,7 +2345,8 @@
2307
2345
  "type": {
2308
2346
  "text": "'suggestion' | 'choice'"
2309
2347
  },
2310
- "default": "'suggestion'"
2348
+ "default": "'suggestion'",
2349
+ "description": "A rule, not decoration: `suggestion` (dashed) is something the reader could ask, `choice`\n(solid) an answer the assistant is waiting for."
2311
2350
  },
2312
2351
  {
2313
2352
  "name": "align",
@@ -2316,7 +2355,7 @@
2316
2355
  "text": "'end' | 'start'"
2317
2356
  },
2318
2357
  "default": "'end'",
2319
- "description": "`start`: left and side by side, outside a conversation."
2358
+ "description": "`start`: left and side by side, outside a conversation, as examples under a question box."
2320
2359
  },
2321
2360
  {
2322
2361
  "name": "turn-id",
@@ -2358,7 +2397,7 @@
2358
2397
  "name": "LintjeChat",
2359
2398
  "tagName": "lintje-chat",
2360
2399
  "customElement": true,
2361
- "description": "`<lintje-chat>` — a conversation with data; takes `ChatData`. The host owns the transport.\n\nAn answer arrives by setting `data` again; keep the objects of what did not change so only\nthe changed part is redrawn. It stands in the flow and scrolls with what scrolls around it —\nthe page, or the nearest box that scrolls — and its question box stays in view at the bottom.\n\nEvents: none of its own; its parts' events reach the host as they are (`lintje-message-send`,\n`lintje-answer-stop`, `lintje-sources-change`, `lintje-draft-change`) and, with the `turnId`,\n`lintje-suggestion-select`, `lintje-message-edit`, `lintje-answer-retry`,\n`lintje-answer-rate`, `lintje-strip-change`, `lintje-mark-select`, `lintje-row-click` and\n`lintje-sort-change`. The host replies: send adds a turn and answers it; message-edit asks\nagain and drops that turn and all after it; strip-change answers again with the new assumption.",
2400
+ "description": "`<lintje-chat>` — a conversation with data, from `ChatData`; the host owns the transport.\n\nAn answer arrives by setting `data` again: keep the objects that did not change, so only the\nchanged part is redrawn. It scrolls with what scrolls around it, and its question box stays in\nview at the bottom.\n\nIt sends no events of its own: those of its question box, messages and answers reach the host,\nwith the `turnId` where a turn sent them. The host answers `lintje-message-send` with a new turn,\n`lintje-message-edit` by asking again without that turn and all after it, and\n`lintje-strip-change` by answering again with the new assumption.",
2362
2401
  "superclass": {
2363
2402
  "name": "LintjeElement"
2364
2403
  },
@@ -2416,7 +2455,7 @@
2416
2455
  "name": "LintjeAudioPlayer",
2417
2456
  "tagName": "lintje-audio-player",
2418
2457
  "customElement": true,
2419
- "description": "`<lintje-audio-player>` — plays a recording: play between two 15-second skips, the position\nas a slider, the time, the volume and the speed.\n\nWith `.peaks` (0–1) the slider is the waveform, without them a bar. With `.segments` — the\ntranscript's `{ start, speaker }[]` — every speaker takes a colour, named in a legend above\n(`no-legend` leaves it to the transcript, which names the same colours).\n`compact` puts everything on one line; a phone has no room for it and keeps the column.\n`flush` drops its own frame, for a bar the page draws around it. Never autoplays.\n`.currentTime` seeks.\n\nEvents: `lintje-time-change` (seconds, at most four times a second), `lintje-seek` (seconds:\nthe reader moved the position), `lintje-play`, `lintje-pause`.",
2458
+ "description": "`<lintje-audio-player>` — plays a recording: play between two 15-second skips, the position as a\nslider, the time, the volume and the speed.\n\nIt never autoplays.\n\nEvents: `lintje-time-change` `number` (seconds, at most four times a second), `lintje-seek`\n`number` (seconds: the reader moved the position), `lintje-play`, `lintje-pause`.",
2420
2459
  "superclass": {
2421
2460
  "name": "LintjePlayerElement"
2422
2461
  },
@@ -2485,7 +2524,7 @@
2485
2524
  "text": "SpeakerTurn[]"
2486
2525
  },
2487
2526
  "default": "[]",
2488
- "description": "Who speaks when: the transcript's segments, or any `{ start, speaker }[]` in time order."
2527
+ "description": "Who speaks when: the transcript's segments, or any `{ start, speaker }[]` in time order. Every\nspeaker takes a colour, named in a legend above."
2489
2528
  },
2490
2529
  {
2491
2530
  "kind": "field",
@@ -2504,7 +2543,7 @@
2504
2543
  "text": "boolean"
2505
2544
  },
2506
2545
  "default": "false",
2507
- "description": "Everything on one line, for a row or a tile.",
2546
+ "description": "Everything on one line, for a row or a tile; a phone has no room and keeps the column.",
2508
2547
  "attribute": "compact",
2509
2548
  "reflects": true
2510
2549
  },
@@ -2590,7 +2629,7 @@
2590
2629
  "text": "boolean"
2591
2630
  },
2592
2631
  "default": "false",
2593
- "description": "Everything on one line, for a row or a tile."
2632
+ "description": "Everything on one line, for a row or a tile; a phone has no room and keeps the column."
2594
2633
  },
2595
2634
  {
2596
2635
  "name": "flush",
@@ -2651,7 +2690,7 @@
2651
2690
  "name": "LintjeCode",
2652
2691
  "tagName": "lintje-code",
2653
2692
  "customElement": true,
2654
- "description": "`<lintje-code>` — a block of code or JSON, on `--font-mono`; the host pretty-prints JSON.\n\nScrolls sideways by default because a broken line is a changed line; the block is\n`tabindex=\"0\"` so the scroll is keyboard reachable (WCAG 2.1.1). `numbered` uses a CSS\ncounter, so a copy of the block is a copy of the code. No syntax colouring.",
2693
+ "description": "`<lintje-code>` — a block of code or JSON, on `--font-mono`; the host pretty-prints JSON.\n\nIt scrolls sideways by default, because a broken line is a changed line. No syntax colouring.",
2655
2694
  "superclass": {
2656
2695
  "name": "LintjeGridItemElement"
2657
2696
  },
@@ -2704,6 +2743,7 @@
2704
2743
  "text": "boolean"
2705
2744
  },
2706
2745
  "default": "false",
2746
+ "description": "Line numbers beside the text, not in it: a copy of the block is a copy of the code.",
2707
2747
  "attribute": "numbered",
2708
2748
  "reflects": true
2709
2749
  },
@@ -2759,7 +2799,8 @@
2759
2799
  "type": {
2760
2800
  "text": "boolean"
2761
2801
  },
2762
- "default": "false"
2802
+ "default": "false",
2803
+ "description": "Line numbers beside the text, not in it: a copy of the block is a copy of the code."
2763
2804
  },
2764
2805
  {
2765
2806
  "name": "wrap",
@@ -2807,7 +2848,7 @@
2807
2848
  "name": "LintjeDocumentViewer",
2808
2849
  "tagName": "lintje-document-viewer",
2809
2850
  "customElement": true,
2810
- "description": "`<lintje-document-viewer>` — a document page by page: leaf, zoom and download.\n\nShows images only: `.pages` is one URL per page, `src` a single image. The host renders a PDF\nto page images; no PDF library is shipped. An image is no text: give each page's text in\n`.texts` (same order), which a screen reader reads after the page. The file behind\n\"Downloaden\" is the accessible version, so it is a tagged, accessible PDF, not a scan.\n\n`page` (from 1) and `zoom` (50–400 in steps of 25, or `fit`) are the element's; every change\nis reported.\n\nEvents: `lintje-page-change` (the page, from 1), `lintje-zoom-change` (a percentage or\n`'fit'`), `lintje-download`.",
2851
+ "description": "`<lintje-document-viewer>` — a document page by page: leaf, zoom and download.\n\nIt shows images only: the host renders a PDF to page images, and gives each page's text in\n`texts`, which a screen reader reads after the page. The file behind \"Downloaden\" is the\naccessible version: a tagged PDF, not a scan. Page and zoom are the element's; every change is\nreported.\n\nEvents: `lintje-page-change` `number` (the page, from 1), `lintje-zoom-change`\n`number | 'fit'` (a percentage), `lintje-download`.",
2811
2852
  "superclass": {
2812
2853
  "name": "LintjeElement"
2813
2854
  },
@@ -2867,6 +2908,7 @@
2867
2908
  "text": "number"
2868
2909
  },
2869
2910
  "default": "1",
2911
+ "description": "The page shown, from 1.",
2870
2912
  "attribute": "page",
2871
2913
  "reflects": true
2872
2914
  },
@@ -2877,6 +2919,7 @@
2877
2919
  "text": "number | 'fit'"
2878
2920
  },
2879
2921
  "default": "'fit'",
2922
+ "description": "A percentage, 50–400 in steps of 25, or `fit`.",
2880
2923
  "attribute": "zoom",
2881
2924
  "reflects": true
2882
2925
  }
@@ -2914,7 +2957,8 @@
2914
2957
  "type": {
2915
2958
  "text": "number"
2916
2959
  },
2917
- "default": "1"
2960
+ "default": "1",
2961
+ "description": "The page shown, from 1."
2918
2962
  },
2919
2963
  {
2920
2964
  "name": "zoom",
@@ -2922,7 +2966,8 @@
2922
2966
  "type": {
2923
2967
  "text": "number | 'fit'"
2924
2968
  },
2925
- "default": "'fit'"
2969
+ "default": "'fit'",
2970
+ "description": "A percentage, 50–400 in steps of 25, or `fit`."
2926
2971
  }
2927
2972
  ],
2928
2973
  "events": [
@@ -2968,7 +3013,7 @@
2968
3013
  "name": "LintjeGallery",
2969
3014
  "tagName": "lintje-gallery",
2970
3015
  "customElement": true,
2971
- "description": "`<lintje-gallery>` — pictures of one thing, such as the screens of an application: one large\nwith its caption, and under it a thumbnail of each to choose another. A single picture has no\nthumbnails. Which picture stands is the element's; every change is reported, and read out\nfrom a status region: \"Afbeelding 2 van 4: <alt>\".\n\nEvents: `lintje-gallery-change` `{ index }`.",
3016
+ "description": "`<lintje-gallery>` — pictures of one thing, such as the screens of an application: one large with\nits caption, and under it a thumbnail of each to choose another; a single picture has none.\n\nWhich picture stands is the element's; every change is reported, and read out as \"Afbeelding 2\nvan 4: <alt>\".\n\nEvents: `lintje-gallery-change` `{ index }`.",
2972
3017
  "superclass": {
2973
3018
  "name": "LintjeElement"
2974
3019
  },
@@ -3072,7 +3117,7 @@
3072
3117
  "name": "LintjeHighlight",
3073
3118
  "tagName": "lintje-highlight",
3074
3119
  "customElement": true,
3075
- "description": "`<lintje-highlight>` — a marking in running text: low confidence, a glossary term, a search\nmatch, or a difference. Each kind draws the element that means it and a line of its own, so\ncolour is never the only carrier. A difference also says what it is in hidden words, since a\nscreen reader does not name `<del>` and `<ins>`. The host wraps the words. Events: none.",
3120
+ "description": "`<lintje-highlight>` — a marking in running text: low confidence, a glossary term, a search\nmatch, or a difference.\n\nThe host wraps the words. Each kind draws the element that means it and a line of its own, so\ncolour is never the only carrier.",
3076
3121
  "superclass": {
3077
3122
  "name": "LintjeElement"
3078
3123
  },
@@ -3199,7 +3244,7 @@
3199
3244
  "name": "LintjeProse",
3200
3245
  "tagName": "lintje-prose",
3201
3246
  "customElement": true,
3202
- "description": "`<lintje-prose>` — a block of text on the type scale. `html` wins over `text`, which wins over\nthe slot.\n\nThe host renders the markdown and sanitises it: `html` is written into the shadow root as it\nstands, and no sanitiser lives here. Events: none.",
3247
+ "description": "`<lintje-prose>` — a block of text on the type scale: `html`, else `text`, else the slot.\n\nThe host renders the markdown and sanitises it: `html` is written into the shadow root as it\nstands.",
3203
3248
  "superclass": {
3204
3249
  "name": "LintjeGridItemElement"
3205
3250
  },
@@ -3320,7 +3365,7 @@
3320
3365
  "name": "LintjeTranscript",
3321
3366
  "tagName": "lintje-transcript",
3322
3367
  "customElement": true,
3323
- "description": "`<lintje-transcript>` — a recording's text in fragments, each with its speaker and timecode.\n\n`readonly` shows the text only, as a preview beside a running recording does: no editing, no\nspeaker menu and no seeking.\n\nEvery speaker takes a colour, the same as in the player's waveform: a bar along the fragment,\nthe name beside it says who it is. `layout=\"chat\"` draws each fragment as a message instead of\na row; `tinted` lays the speaker's colour under the whole fragment; `grouped` names a speaker\nonce over consecutive fragments, each keeping its own time. The fragment that sounds stands out\nwith a ring. Live, `speakingId` says who speaks now and a fragment's `pending` text is still\nprovisional.\n\nAbove the fragments stands a row in the same columns: `note-label` beside `note` — the label\nthat a model made the text, and the host's sentence about it — and under it what the host\nslots in `lead` (the AI work, each in its own expander).\n\nA fragment is edited from its pencil or by a double click on its text.\n\nEditing and the speakers are the host's state: the element asks, the host changes `segments`,\n`editingId`, `busyId` and `errors`. It plays, saves and renames nothing itself. The search\nproperty is `searchMatches`, not `matches` (that is `Element.matches()`).\n\nEvents: `lintje-seek` (seconds), `lintje-segment-edit` (id), `lintje-segment-save`\n`{ id, text }`, `lintje-segment-cancel` (id), `lintje-segment-speaker` `{ id, speaker }` (this\nfragment to another speaker), `lintje-speaker-new` (id: this fragment to a speaker not named\nyet), `lintje-speaker-rename` (the name to change everywhere).",
3368
+ "description": "`<lintje-transcript>` — a recording's text in fragments, each with its speaker and timecode.\n\nEditing and the speakers are the host's state: the element asks, and the host changes\n`segments`, `editingId`, `busyId` and `errors`. It plays, saves and renames nothing itself. A\nspeaker has the colour it has in the player's waveform. Above the fragments, the `note-label` and\n`note` slots say that a model made the text, and `lead` holds the AI work.\n\nEvents: `lintje-seek` `number` (seconds), `lintje-segment-edit` `string` (the id),\n`lintje-segment-save` `{ id, text }`, `lintje-segment-cancel` `string` (the id),\n`lintje-segment-speaker` `{ id, speaker }` (to another speaker), `lintje-speaker-new` `string`\n(the id, to a speaker not named yet), `lintje-speaker-rename` `string` (the speaker's name).",
3324
3369
  "superclass": {
3325
3370
  "name": "LintjeElement"
3326
3371
  },
@@ -3358,7 +3403,7 @@
3358
3403
  "type": {
3359
3404
  "text": "number | null"
3360
3405
  },
3361
- "description": "The recording's position in seconds.",
3406
+ "description": "The recording's position in seconds; the fragment that sounds stands out with a ring.",
3362
3407
  "attribute": "current-time"
3363
3408
  },
3364
3409
  {
@@ -3393,7 +3438,8 @@
3393
3438
  "type": {
3394
3439
  "text": "Record<string, [number, number][]>"
3395
3440
  },
3396
- "default": "{}"
3441
+ "default": "{}",
3442
+ "description": "The search hits; not `matches`, which is `Element.matches()`."
3397
3443
  },
3398
3444
  {
3399
3445
  "kind": "field",
@@ -3410,6 +3456,7 @@
3410
3456
  "text": "boolean"
3411
3457
  },
3412
3458
  "default": "false",
3459
+ "description": "The text only, as a preview beside a live recording: no editing, speaker menu or seeking.",
3413
3460
  "attribute": "readonly",
3414
3461
  "reflects": true
3415
3462
  },
@@ -3462,7 +3509,7 @@
3462
3509
  "text": "boolean"
3463
3510
  },
3464
3511
  "default": "false",
3465
- "description": "A speaker's consecutive fragments under one name.",
3512
+ "description": "A speaker's consecutive fragments under one name, each keeping its own time.",
3466
3513
  "attribute": "grouped",
3467
3514
  "reflects": true
3468
3515
  }
@@ -3492,7 +3539,7 @@
3492
3539
  "type": {
3493
3540
  "text": "number | null"
3494
3541
  },
3495
- "description": "The recording's position in seconds."
3542
+ "description": "The recording's position in seconds; the fragment that sounds stands out with a ring."
3496
3543
  },
3497
3544
  {
3498
3545
  "name": "editing-id",
@@ -3515,7 +3562,8 @@
3515
3562
  "type": {
3516
3563
  "text": "boolean"
3517
3564
  },
3518
- "default": "false"
3565
+ "default": "false",
3566
+ "description": "The text only, as a preview beside a live recording: no editing, speaker menu or seeking."
3519
3567
  },
3520
3568
  {
3521
3569
  "name": "speaking-id",
@@ -3559,7 +3607,7 @@
3559
3607
  "text": "boolean"
3560
3608
  },
3561
3609
  "default": "false",
3562
- "description": "A speaker's consecutive fragments under one name."
3610
+ "description": "A speaker's consecutive fragments under one name, each keeping its own time."
3563
3611
  }
3564
3612
  ],
3565
3613
  "events": [
@@ -3639,7 +3687,7 @@
3639
3687
  "name": "LintjeTranslator",
3640
3688
  "tagName": "lintje-translator",
3641
3689
  "customElement": true,
3642
- "description": "`<lintje-translator>` — a text and its translation in one surface of two halves: the source on\nthe left, the translation on the right, each with its language above and its actions below.\nThe two languages flank the swap on the line between them. Below 768 px the halves stack.\n\nThe source is a plain `lintje-textarea`; the host keeps `value`. The translation, the language\nchoices and the actions are the host's, in slots: `source-language`, `target-language`,\n`target` (a plain `lintje-streaming-text`), `source-actions`, `target-note` (the AI label, right\nunder the translation) and `target-actions`.\n\n`variant=\"documents\"` keeps the language bar and the swap and puts the default slot under them\nat full width, for documents to translate: the upload and the queue.\n\nAfter the swap a status region says so, with the languages the host's choices then show\n(\"Talen omgewisseld: Engels naar Nederlands\").\n\nEvents: `lintje-text-change` (the source text), `lintje-languages-swap`.",
3690
+ "description": "`<lintje-translator>` — a text and its translation in one surface of two halves, each with its\nlanguage above and its actions below; below 768 px the halves stack.\n\nThe source is a `lintje-textarea` whose `value` the host keeps. The translation, the language\nchoices and the actions are the host's, in slots: `target` takes a plain\n`lintje-streaming-text`, `target-note` the AI label under it. After a swap a status region says\nso, with the languages the host's choices then show.\n\nEvents: `lintje-text-change` `string` (the source text), `lintje-languages-swap`.",
3643
3691
  "superclass": {
3644
3692
  "name": "LintjeElement"
3645
3693
  },
@@ -3709,7 +3757,7 @@
3709
3757
  "text": "'text' | 'documents'"
3710
3758
  },
3711
3759
  "default": "'text'",
3712
- "description": "`text` (default): the source and its translation; `documents`: the languages over the default slot.",
3760
+ "description": "`text` (default): the source and its translation. `documents`: the language bar and the swap\nover the default slot at full width, for documents to translate: the upload and the queue.",
3713
3761
  "attribute": "variant",
3714
3762
  "reflects": true
3715
3763
  }
@@ -3772,7 +3820,7 @@
3772
3820
  "text": "'text' | 'documents'"
3773
3821
  },
3774
3822
  "default": "'text'",
3775
- "description": "`text` (default): the source and its translation; `documents`: the languages over the default slot."
3823
+ "description": "`text` (default): the source and its translation. `documents`: the language bar and the swap\nover the default slot at full width, for documents to translate: the upload and the queue."
3776
3824
  }
3777
3825
  ],
3778
3826
  "events": [
@@ -3834,7 +3882,7 @@
3834
3882
  "name": "LintjeVideoPlayer",
3835
3883
  "tagName": "lintje-video-player",
3836
3884
  "customElement": true,
3837
- "description": "`<lintje-video-player>` — the picture of a recording, with the audio player's controls.\n\nThe controls stand under the picture, never over it, also in full screen: the bar with the time\non one line; play, mute, \"Meer opties\" and full screen on the next, at any width. The menu holds\nthe captions (also on C), the audio description when `described-src` gives a version with one\n(it switches at the same moment) and the speed; a speed other than 1× stands beside the time. The\ncontrols are `aria-disabled` (in the tab order, the press swallowed) while the video loads or\ncannot be loaded; a failed load says so on the picture, with \"Opnieuw proberen\". The `<video>`\nhas no controls of its own and never starts by itself. It does not fetch the captions. The big\nplay button stands on the picture only before the start, and the caption shows only without\nit, so the two never cover each other.\n\nEvents: `lintje-time-change` (seconds, at most four times a second), `lintje-play`,\n`lintje-pause`.",
3885
+ "description": "`<lintje-video-player>` — the picture of a recording, with the audio player's controls.\n\nThe controls stand under the picture, never over it, also in full screen. The video never starts\nby itself, and the element does not fetch the captions: the host gives them in `segments`. While\nthe video loads or cannot be loaded, the controls stay in the tab order but do nothing; a failed\nload says so on the picture, with \"Opnieuw proberen\".\n\nEvents: `lintje-time-change` `number` (seconds, at most four times a second), `lintje-seek`\n`number` (seconds: the reader moved the position), `lintje-play`, `lintje-pause`.",
3838
3886
  "superclass": {
3839
3887
  "name": "LintjePlayerElement"
3840
3888
  },
@@ -3904,7 +3952,7 @@
3904
3952
  "text": "boolean"
3905
3953
  },
3906
3954
  "default": "false",
3907
- "description": "Whether the captions show; the reader switches it.",
3955
+ "description": "Whether the captions show; the reader switches it, in \"Meer opties\" or with C.",
3908
3956
  "attribute": "captions",
3909
3957
  "reflects": true
3910
3958
  },
@@ -3914,7 +3962,7 @@
3914
3962
  "type": {
3915
3963
  "text": "string"
3916
3964
  },
3917
- "description": "The same video with an audio description: \"Meer opties\" offers it when given.",
3965
+ "description": "The same video with an audio description: \"Meer opties\" offers it when given, and the switch\nkeeps the moment.",
3918
3966
  "attribute": "described-src"
3919
3967
  },
3920
3968
  {
@@ -3990,7 +4038,7 @@
3990
4038
  "text": "boolean"
3991
4039
  },
3992
4040
  "default": "false",
3993
- "description": "Whether the captions show; the reader switches it."
4041
+ "description": "Whether the captions show; the reader switches it, in \"Meer opties\" or with C."
3994
4042
  },
3995
4043
  {
3996
4044
  "name": "described-src",
@@ -3998,7 +4046,7 @@
3998
4046
  "type": {
3999
4047
  "text": "string"
4000
4048
  },
4001
- "description": "The same video with an audio description: \"Meer opties\" offers it when given."
4049
+ "description": "The same video with an audio description: \"Meer opties\" offers it when given, and the switch\nkeeps the moment."
4002
4050
  },
4003
4051
  {
4004
4052
  "name": "described",
@@ -4059,7 +4107,7 @@
4059
4107
  "name": "LintjeAiLabel",
4060
4108
  "tagName": "lintje-ai-label",
4061
4109
  "customElement": true,
4062
- "description": "`<lintje-ai-label>` — says that a model made the content below it.\n\nA neutral badge (provenance, not a verdict) and the one badge that may wrap, so a long name\nstays on a 390 px screen. Place it above the block, once. `checked-by` turns it into\n\"Gecontroleerd door …\", and the gear-and-brain mark into a check.",
4110
+ "description": "`<lintje-ai-label>` — says that a model made the content below it.\n\nA neutral badge: provenance, not a verdict. It is the one badge that may wrap, so a long name\nstays on a 390 px screen. Place it above the block, once.",
4063
4111
  "superclass": {
4064
4112
  "name": "LintjeElement"
4065
4113
  },
@@ -4081,7 +4129,7 @@
4081
4129
  "type": {
4082
4130
  "text": "string"
4083
4131
  },
4084
- "description": "Who checked the text: \"J. de Vries\".",
4132
+ "description": "Who checked the text: \"J. de Vries\". The label reads \"Gecontroleerd door …\", with a check.",
4085
4133
  "attribute": "checked-by"
4086
4134
  },
4087
4135
  {
@@ -4109,7 +4157,7 @@
4109
4157
  "type": {
4110
4158
  "text": "string"
4111
4159
  },
4112
- "description": "Who checked the text: \"J. de Vries\"."
4160
+ "description": "Who checked the text: \"J. de Vries\". The label reads \"Gecontroleerd door …\", with a check."
4113
4161
  },
4114
4162
  {
4115
4163
  "name": "hint",
@@ -4144,7 +4192,7 @@
4144
4192
  "name": "LintjeAnnouncement",
4145
4193
  "tagName": "lintje-announcement",
4146
4194
  "customElement": true,
4147
- "description": "`<lintje-announcement>` — a status message: warning, outage, info or ok.\n\nA live region only with `live: true`; drawn empty first and filled on the next frame so screen\nreaders announce it. `slot=\"action\"` stands under the text, `slot=\"media\"` beside it: an image\nthat belongs to the message, such as a code to scan. Closed with the focus on its close button,\nit hands the focus to the next stop on the page (else the one before) before it goes.",
4195
+ "description": "`<lintje-announcement>` — a status message: warning, outage, info or ok.\n\nIt is a live region only with `live: true` in its data. `slot=\"media\"` stands beside the text:\nan image that belongs to the message, such as a code to scan. Closed with the focus on its close\nbutton, it hands the focus to the next stop on the page, else the one before.",
4148
4196
  "superclass": {
4149
4197
  "name": "LintjeGridItemElement"
4150
4198
  },
@@ -4179,17 +4227,6 @@
4179
4227
  "type": {
4180
4228
  "text": "AnnouncementViewData | null"
4181
4229
  }
4182
- },
4183
- {
4184
- "kind": "field",
4185
- "name": "compact",
4186
- "type": {
4187
- "text": "boolean"
4188
- },
4189
- "default": "false",
4190
- "description": "The tighter form. Below 768 px every announcement is compact.",
4191
- "attribute": "compact",
4192
- "reflects": true
4193
4230
  }
4194
4231
  ],
4195
4232
  "methods": [],
@@ -4208,15 +4245,6 @@
4208
4245
  "text": "number"
4209
4246
  },
4210
4247
  "description": "Columns of the 12-column grid; default one."
4211
- },
4212
- {
4213
- "name": "compact",
4214
- "fieldName": "compact",
4215
- "type": {
4216
- "text": "boolean"
4217
- },
4218
- "default": "false",
4219
- "description": "The tighter form. Below 768 px every announcement is compact."
4220
4248
  }
4221
4249
  ],
4222
4250
  "events": [],
@@ -4250,7 +4278,7 @@
4250
4278
  "name": "LintjeConflictAlert",
4251
4279
  "tagName": "lintje-conflict-alert",
4252
4280
  "customElement": true,
4253
- "description": "`<lintje-conflict-alert>` — someone else changed the item while the reader was editing it.\n\nA compact live warning announcement above the form with three actions. It takes the focus when\nit appears, so the keyboard continues at its buttons. It saves nothing; the host answers the\nevents. `lintje-conflict-compare` lets a host fetch the differences only when asked.\n\nEvents: `lintje-conflict-keep-mine`, `lintje-conflict-take-theirs`, `lintje-conflict-compare`\n`{ open }`.",
4281
+ "description": "`<lintje-conflict-alert>` — someone else changed the item while the reader was editing it.\n\nA live warning above the form, with three actions; it takes the focus when it appears. It saves\nnothing: the host answers the events, and fetches the differences only when asked.\n\nEvents: `lintje-conflict-keep-mine`, `lintje-conflict-take-theirs`, `lintje-conflict-compare`\n`{ open }` (the differences open or close).",
4254
4282
  "superclass": {
4255
4283
  "name": "LintjeElement"
4256
4284
  },
@@ -4399,7 +4427,7 @@
4399
4427
  "name": "LintjeEmptyState",
4400
4428
  "tagName": "lintje-empty-state",
4401
4429
  "customElement": true,
4402
- "description": "`<lintje-empty-state>` — the empty state on its own, outside a tile.\n\nNot an error: a failure is the tile's error state or an inline alert. It brings no action or\nwords of its own; the host chooses them and slots the action. `compact` is one muted line\nwith a link button after it. `status` puts it in a `role=\"status\"` for when it appears after\nan action: drawn empty first and filled on the next frame, since a region that arrives with\nits words is not announced.",
4430
+ "description": "`<lintje-empty-state>` — the empty state on its own, outside a tile.\n\nNot an error: a failure is the tile's error state or an inline alert. It brings no words or\naction of its own; the host chooses them and slots the action.",
4403
4431
  "superclass": {
4404
4432
  "name": "LintjeElement"
4405
4433
  },
@@ -4449,6 +4477,7 @@
4449
4477
  "text": "boolean"
4450
4478
  },
4451
4479
  "default": "false",
4480
+ "description": "One muted line, with a link button after it.",
4452
4481
  "attribute": "compact",
4453
4482
  "reflects": true
4454
4483
  },
@@ -4511,7 +4540,8 @@
4511
4540
  "type": {
4512
4541
  "text": "boolean"
4513
4542
  },
4514
- "default": "false"
4543
+ "default": "false",
4544
+ "description": "One muted line, with a link button after it."
4515
4545
  },
4516
4546
  {
4517
4547
  "name": "level",
@@ -4550,6 +4580,184 @@
4550
4580
  }
4551
4581
  ]
4552
4582
  },
4583
+ {
4584
+ "kind": "javascript-module",
4585
+ "path": "src/components/feedback/error-page/error-page.ts",
4586
+ "declarations": [
4587
+ {
4588
+ "kind": "class",
4589
+ "name": "LintjeErrorPage",
4590
+ "tagName": "lintje-error-page",
4591
+ "customElement": true,
4592
+ "description": "`<lintje-error-page>` — the page in place of the one the reader asked for: not found, no\naccess, a failure, or not available.\n\nIt says why in words and shows the way onward. The server sends the HTTP status and the\ndocument's `<title>`; the element only draws. The default slot takes what helps under the text,\nsuch as a search field. Below 768 px the actions stand under each other, and a `lintje-button`\nwith `block` fills the width.\n\nEvents: `lintje-navigate` `{ href }` (a plain click on one of `links`).",
4593
+ "superclass": {
4594
+ "name": "LintjeElement"
4595
+ },
4596
+ "members": [
4597
+ {
4598
+ "kind": "field",
4599
+ "name": "mode",
4600
+ "type": {
4601
+ "text": "'light' | 'dark'"
4602
+ },
4603
+ "attribute": "mode",
4604
+ "inheritedFrom": {
4605
+ "name": "LintjeElement"
4606
+ }
4607
+ },
4608
+ {
4609
+ "kind": "field",
4610
+ "name": "code",
4611
+ "type": {
4612
+ "text": "string"
4613
+ },
4614
+ "description": "The HTTP status as the server sent it (\"404\"): a small line above the heading, with the lock\nfor 401 and 403 and the outage mark for a 5xx. Without it there is no code line.",
4615
+ "attribute": "code"
4616
+ },
4617
+ {
4618
+ "kind": "field",
4619
+ "name": "heading",
4620
+ "type": {
4621
+ "text": "string"
4622
+ },
4623
+ "description": "What is the matter, in words: \"Deze pagina bestaat niet\".",
4624
+ "attribute": "heading"
4625
+ },
4626
+ {
4627
+ "kind": "field",
4628
+ "name": "text",
4629
+ "type": {
4630
+ "text": "string"
4631
+ },
4632
+ "description": "Why, and what the reader can do.",
4633
+ "attribute": "text"
4634
+ },
4635
+ {
4636
+ "kind": "field",
4637
+ "name": "level",
4638
+ "type": {
4639
+ "text": "1 | 2"
4640
+ },
4641
+ "default": "2",
4642
+ "description": "2 in `lintje-shell`, whose `name` is the page's h1; 1 for a page outside the shell.",
4643
+ "attribute": "level"
4644
+ },
4645
+ {
4646
+ "kind": "field",
4647
+ "name": "links",
4648
+ "type": {
4649
+ "text": "ErrorPageLink[]"
4650
+ },
4651
+ "default": "[]",
4652
+ "description": "\"Verder naar\": the pages a reader most likely wanted instead."
4653
+ },
4654
+ {
4655
+ "kind": "field",
4656
+ "name": "reference",
4657
+ "type": {
4658
+ "text": "string"
4659
+ },
4660
+ "description": "The code the service desk looks the failure up by, with a copy button.",
4661
+ "attribute": "reference"
4662
+ },
4663
+ {
4664
+ "kind": "field",
4665
+ "name": "occurred",
4666
+ "type": {
4667
+ "text": "string"
4668
+ },
4669
+ "description": "When it happened, as the host wrote it (\"11 oktober 2026, 14.32 uur\").",
4670
+ "attribute": "occurred"
4671
+ }
4672
+ ],
4673
+ "methods": [],
4674
+ "attributes": [
4675
+ {
4676
+ "name": "mode",
4677
+ "fieldName": "mode",
4678
+ "type": {
4679
+ "text": "'light' | 'dark'"
4680
+ }
4681
+ },
4682
+ {
4683
+ "name": "code",
4684
+ "fieldName": "code",
4685
+ "type": {
4686
+ "text": "string"
4687
+ },
4688
+ "description": "The HTTP status as the server sent it (\"404\"): a small line above the heading, with the lock\nfor 401 and 403 and the outage mark for a 5xx. Without it there is no code line."
4689
+ },
4690
+ {
4691
+ "name": "heading",
4692
+ "fieldName": "heading",
4693
+ "type": {
4694
+ "text": "string"
4695
+ },
4696
+ "description": "What is the matter, in words: \"Deze pagina bestaat niet\"."
4697
+ },
4698
+ {
4699
+ "name": "text",
4700
+ "fieldName": "text",
4701
+ "type": {
4702
+ "text": "string"
4703
+ },
4704
+ "description": "Why, and what the reader can do."
4705
+ },
4706
+ {
4707
+ "name": "level",
4708
+ "fieldName": "level",
4709
+ "type": {
4710
+ "text": "1 | 2"
4711
+ },
4712
+ "default": "2",
4713
+ "description": "2 in `lintje-shell`, whose `name` is the page's h1; 1 for a page outside the shell."
4714
+ },
4715
+ {
4716
+ "name": "reference",
4717
+ "fieldName": "reference",
4718
+ "type": {
4719
+ "text": "string"
4720
+ },
4721
+ "description": "The code the service desk looks the failure up by, with a copy button."
4722
+ },
4723
+ {
4724
+ "name": "occurred",
4725
+ "fieldName": "occurred",
4726
+ "type": {
4727
+ "text": "string"
4728
+ },
4729
+ "description": "When it happened, as the host wrote it (\"11 oktober 2026, 14.32 uur\")."
4730
+ }
4731
+ ],
4732
+ "events": [
4733
+ {
4734
+ "name": "lintje-navigate",
4735
+ "type": {
4736
+ "text": "CustomEvent<{ href }>"
4737
+ }
4738
+ }
4739
+ ],
4740
+ "slots": [
4741
+ {
4742
+ "name": ""
4743
+ },
4744
+ {
4745
+ "name": "actions"
4746
+ }
4747
+ ]
4748
+ }
4749
+ ],
4750
+ "exports": [
4751
+ {
4752
+ "kind": "custom-element-definition",
4753
+ "name": "lintje-error-page",
4754
+ "declaration": {
4755
+ "name": "LintjeErrorPage",
4756
+ "module": "src/components/feedback/error-page/error-page.ts"
4757
+ }
4758
+ }
4759
+ ]
4760
+ },
4553
4761
  {
4554
4762
  "kind": "javascript-module",
4555
4763
  "path": "src/components/feedback/job-list/job-list.ts",
@@ -4559,7 +4767,7 @@
4559
4767
  "name": "LintjeJobList",
4560
4768
  "tagName": "lintje-job-list",
4561
4769
  "customElement": true,
4562
- "description": "`<lintje-job-list>` — the queue of long tasks: what runs, what is done and what went wrong. Its\nrows are the work list's rows (`lintje-list`): the state as a word, the progress as a bar, one\naction in plain sight per state, and a row with an `href` opening it: a done job's result, or\nwhat runs where it can be followed (a live recording). \"Verwijderen\" is behind a done job's ⋮. Where every job is done, \"Klaar\" is left out: in a list of finished work alone\nthe state is noise.\n\nA job that changes state is read out once, as a sentence (\"Rapport.docx is mislukt. Het\nbestand is beschadigd.\"), from a status region of its own; the list itself is not live, so a\nmoving percentage does not chatter. It never fetches: the host sets `jobs` again when a job\nmoves. When the last job goes with the focus on it, the focus goes to that region.\n\nEvents: `lintje-job-cancel`, `lintje-job-retry`, `lintje-job-resume`, `lintje-job-remove`\n(detail: the job's id), `lintje-navigate` `{ href }` (a row with an `href`; cancel it to route).",
4770
+ "description": "`<lintje-job-list>` — the queue of long tasks: what runs, what is done and what went wrong, in\nthe work list's rows (`lintje-list`).\n\nIt never fetches: the host sets `jobs` again when a job moves. A job that changes state is read\nout once, as a sentence, from a status region of its own; the list itself is not live. A row\nwith an `href` opens a done job's result, or what runs where it can be followed.\n\nEvents: `lintje-job-cancel`, `lintje-job-retry`, `lintje-job-resume`, `lintje-job-remove`, each\n`string` (the job's id), `lintje-navigate` `{ href }` (a row with an `href`; cancel it to route).",
4563
4771
  "superclass": {
4564
4772
  "name": "LintjeElement"
4565
4773
  },
@@ -4674,7 +4882,7 @@
4674
4882
  "name": "LintjeLevelMeter",
4675
4883
  "tagName": "lintje-level-meter",
4676
4884
  "customElement": true,
4677
- "description": "`<lintje-level-meter>` — how loud the sound comes in, as bars with a word beside them: before a\nrecording to show the microphone works, during it to show it still does. The host measures and\nsets `level` as often as it likes; the bars follow, without motion under reduced motion.\n\n`null` is not measured yet: flat bars and a dash, never \"Stil\" (rule 15).\n\nEvents: none.",
4885
+ "description": "`<lintje-level-meter>` — how loud the sound comes in, as bars with a word beside them: before a\nrecording to show the microphone works, during it to show it still does.\n\nThe host measures and sets `level` as often as it likes; the bars follow, without motion under\nreduced motion.",
4678
4886
  "superclass": {
4679
4887
  "name": "LintjeElement"
4680
4888
  },
@@ -4696,7 +4904,7 @@
4696
4904
  "type": {
4697
4905
  "text": "number | null"
4698
4906
  },
4699
- "description": "The sound coming in, 0 to 1; `null` before it is measured.",
4907
+ "description": "The sound coming in, 0 to 1; `null` before it is measured: flat bars, a dash, never \"Stil\".",
4700
4908
  "attribute": "level"
4701
4909
  },
4702
4910
  {
@@ -4726,7 +4934,7 @@
4726
4934
  "type": {
4727
4935
  "text": "number | null"
4728
4936
  },
4729
- "description": "The sound coming in, 0 to 1; `null` before it is measured."
4937
+ "description": "The sound coming in, 0 to 1; `null` before it is measured: flat bars, a dash, never \"Stil\"."
4730
4938
  },
4731
4939
  {
4732
4940
  "name": "words",
@@ -4762,7 +4970,7 @@
4762
4970
  "name": "LintjeRecordingStatus",
4763
4971
  "tagName": "lintje-recording-status",
4764
4972
  "customElement": true,
4765
- "description": "`<lintje-recording-status>` — how a running recording is doing, in the description list's cells:\nhow long it runs, how the sound comes in and, for a recording made elsewhere (a phone), how the\nconnection holds. Each meter has its word beside it, so the colour never speaks alone (rule 13).\n\nThe host measures; the element only shows. A value it does not have is a dash, never zero.\n\nEvents: none.",
4973
+ "description": "`<lintje-recording-status>` — how a running recording is doing, in the description list's\ncells: how long it runs, how the sound comes in and, for a recording made elsewhere (a phone),\nhow the connection holds.\n\nThe host measures; the element only shows. Each meter has its word beside it, and a value it\ndoes not have is a dash, never zero.",
4766
4974
  "superclass": {
4767
4975
  "name": "LintjeElement"
4768
4976
  },
@@ -4881,7 +5089,7 @@
4881
5089
  "name": "LintjeStreamingText",
4882
5090
  "tagName": "lintje-streaming-text",
4883
5091
  "customElement": true,
4884
- "description": "`<lintje-streaming-text>` — text that streams in while the server writes it. Plain text, never\nHTML; a host wanting prose slots a `<lintje-prose>` once the stream is `done`. A screen reader\nhears it per sentence from a polite live region; the visible box is `aria-busy` until the end.\nThe host owns the connection and sets `text` and `state`. `variant=\"plain\"` drops the box and\ntakes the type of where it stands, for a surface that frames the text itself.\n\nEvents: `lintje-stop` (\"Stoppen\"), `lintje-retry` (\"Opnieuw\").",
5092
+ "description": "`<lintje-streaming-text>` — text that streams in while the server writes it.\n\nThe host owns the connection and sets `text` and `state`. Plain text, never HTML: a host that\nwants prose slots a `<lintje-prose>` once the stream is `done`. A screen reader hears it per\nsentence.\n\nEvents: `lintje-stop` (\"Stoppen\" was pressed), `lintje-retry` (\"Opnieuw\" was pressed).",
4885
5093
  "superclass": {
4886
5094
  "name": "LintjeElement"
4887
5095
  },
@@ -4941,7 +5149,7 @@
4941
5149
  "text": "'box' | 'plain'"
4942
5150
  },
4943
5151
  "default": "'box'",
4944
- "description": "`box` (default): the text in a framed box; `plain`: no box, the type of where it stands.",
5152
+ "description": "`box` (default): the text in a framed box. `plain`: no box and the type of where it stands, for\na surface that frames the text itself.",
4945
5153
  "attribute": "variant",
4946
5154
  "reflects": true
4947
5155
  }
@@ -4994,7 +5202,7 @@
4994
5202
  "text": "'box' | 'plain'"
4995
5203
  },
4996
5204
  "default": "'box'",
4997
- "description": "`box` (default): the text in a framed box; `plain`: no box, the type of where it stands."
5205
+ "description": "`box` (default): the text in a framed box. `plain`: no box and the type of where it stands, for\na surface that frames the text itself."
4998
5206
  }
4999
5207
  ],
5000
5208
  "events": [
@@ -5038,7 +5246,7 @@
5038
5246
  "name": "LintjeToast",
5039
5247
  "tagName": "lintje-toast",
5040
5248
  "customElement": true,
5041
- "description": "`<lintje-toast>` — the toast: a glyph carries the meaning, so colour is not the only signal\n(rule 13). An error, and a toast with an action, stay until closed. A plain `ok` toast closes\nafter six seconds; the pointer on it or the focus in it holds it, and its six seconds start\nagain when both have left. Closing with the focus inside, it gives the focus back first.\n\nIt is a `role=\"status\"` region drawn empty first, its content going in on the next frame: a\nregion that arrives together with its text is not announced, one that is filled is.\n\nEvents: `lintje-close` (timed out or closed), `lintje-action`. The host owns whether it exists.",
5249
+ "description": "`<lintje-toast>` — a short message about what just happened; a glyph carries its meaning.\n\nThe host owns whether it exists. A toast that closes by itself is held while the pointer is on\nit or the focus in it, and its six seconds start again when both have left. Closing with the\nfocus inside, it gives the focus back first.\n\nEvents: `lintje-close` (timed out or closed), `lintje-action` (its action was pressed).",
5042
5250
  "superclass": {
5043
5251
  "name": "LintjeElement"
5044
5252
  },
@@ -5058,10 +5266,10 @@
5058
5266
  "kind": "field",
5059
5267
  "name": "kind",
5060
5268
  "type": {
5061
- "text": "'ok' | 'error'"
5269
+ "text": "'ok' | 'error' | 'info' | 'warning'"
5062
5270
  },
5063
5271
  "default": "'ok'",
5064
- "description": "`ok` closes itself after six seconds, unless it has an action; `error` stays.",
5272
+ "description": "`ok` and `info` close after six seconds unless they have an action; `error` and `warning` stay.",
5065
5273
  "attribute": "kind",
5066
5274
  "reflects": true
5067
5275
  },
@@ -5088,10 +5296,10 @@
5088
5296
  "name": "kind",
5089
5297
  "fieldName": "kind",
5090
5298
  "type": {
5091
- "text": "'ok' | 'error'"
5299
+ "text": "'ok' | 'error' | 'info' | 'warning'"
5092
5300
  },
5093
5301
  "default": "'ok'",
5094
- "description": "`ok` closes itself after six seconds, unless it has an action; `error` stays."
5302
+ "description": "`ok` and `info` close after six seconds unless they have an action; `error` and `warning` stay."
5095
5303
  },
5096
5304
  {
5097
5305
  "name": "action",
@@ -5143,7 +5351,7 @@
5143
5351
  "name": "LintjeFilterBar",
5144
5352
  "tagName": "lintje-filter-bar",
5145
5353
  "customElement": true,
5146
- "description": "`<lintje-filter-bar>` — the host's declared filters in the filter zone and, below 768 px,\nthe sheet. Values cross as the canonical strings the host writes to the URL. A change in the\nbar commits at once; the sheet commits on \"Toepassen\". The host confirms with the next\n`data`. Put one filter bar on a page: two would both write the count and own the sheet.",
5354
+ "description": "`<lintje-filter-bar>` — the host's declared filters in the filter zone and, below 768 px, the\nsheet.\n\nValues cross as the canonical strings the host writes to the URL. A change in the bar commits at\nonce, the sheet on \"Toepassen\"; the host confirms with the next `data`. Put one filter bar on a\npage: two would both write the count and own the sheet.\n\nEvents: `lintje-values-change` `{ [key]: value }` (the filters that commit),\n`lintje-filters-open-change` `boolean` (the reader shows or hides the controls).",
5147
5355
  "superclass": {
5148
5356
  "name": "LintjeElement"
5149
5357
  },
@@ -5214,7 +5422,7 @@
5214
5422
  "name": "LintjeFilterSheet",
5215
5423
  "tagName": "lintje-filter-sheet",
5216
5424
  "customElement": true,
5217
- "description": "`<lintje-filter-sheet>` — the filters below 768 px. Nothing applies before \"Toepassen\"; the\nowner keeps the draft and supplies the controls. Escape in an open popover closes only that\npopover. Focus is trapped while open (`FocusTrap`).\n\nEvents (bubbling, not composed): `lintje-filters-apply`, `lintje-sheet-close`,\n`lintje-filters-reset`.",
5425
+ "description": "`<lintje-filter-sheet>` — the filters below 768 px, in a sheet that traps the focus while open.\n\nNothing applies before \"Toepassen\": the owner keeps the draft and supplies the controls. Escape\nin an open popover closes only that popover.\n\nEvents: `lintje-filters-apply`, `lintje-sheet-close`, `lintje-filters-reset`.",
5218
5426
  "superclass": {
5219
5427
  "name": "LintjeElement"
5220
5428
  },
@@ -5360,7 +5568,7 @@
5360
5568
  "name": "LintjeFilterZone",
5361
5569
  "tagName": "lintje-filter-zone",
5362
5570
  "customElement": true,
5363
- "description": "`<lintje-filter-zone>` — the filter bar: one place for everything that narrows the numbers.\n\nExpanded, scrolled (a sticky summary bar) and mobile (sentence only) states: see `zone-state.ts`.\nThe controls come in through the slot, the sentence as parts; the owner keeps the state.\n\nEvents (bubbling, not composed): `lintje-filters-reset`, `lintje-zone-open-change` (boolean),\n`lintje-zone-scrolled-change` (boolean).",
5571
+ "description": "`<lintje-filter-zone>` — the filter bar: one place for everything that narrows the numbers.\n\nThe controls come in through the slot and the sentence as parts; the owner keeps the state. The\nzone is expanded, scrolled (a sticky summary bar) or, below 768 px, the sentence only.\n\nEvents: `lintje-filters-reset`, `lintje-zone-open-change` `boolean`,\n`lintje-zone-scrolled-change` `boolean`.",
5364
5572
  "superclass": {
5365
5573
  "name": "LintjeElement"
5366
5574
  },
@@ -5534,7 +5742,7 @@
5534
5742
  "name": "LintjeErrorSummary",
5535
5743
  "tagName": "lintje-error-summary",
5536
5744
  "customElement": true,
5537
- "description": "`<lintje-error-summary>` — the error summary above a form, with a link to each field.\n\nWith nothing to show it draws nothing. A link focuses the field, found by `name` or `id` in\nthe summary's own tree and, from a shadow root, in its host's light DOM (where `lintje-form`\ndraws it). The field is scrolled to the middle of the view, clear of a sticky top bar and of the\naction bar below, however deep it stands in the form.\nIt never validates. `focus()` puts the focus on the frame (`tabindex=\"-1\"`).\n\nEvents: `lintje-retry` from the \"Opnieuw proberen\" button.",
5745
+ "description": "`<lintje-error-summary>` — the error summary above a form, with a link to each field.\n\nIt never validates, and with nothing to show it draws nothing. A link focuses the field, found\nby `name` or `id` in the summary's own tree or, from a shadow root, in its host's light DOM, and\nscrolls it into view clear of a sticky top bar and the form's action bar.\n\nEvents: `lintje-retry` (\"Opnieuw proberen\" was pressed).",
5538
5746
  "superclass": {
5539
5747
  "name": "LintjeElement"
5540
5748
  },
@@ -5587,7 +5795,17 @@
5587
5795
  "attribute": "retry"
5588
5796
  }
5589
5797
  ],
5590
- "methods": [],
5798
+ "methods": [
5799
+ {
5800
+ "kind": "method",
5801
+ "name": "focus",
5802
+ "description": "Puts the focus on the frame (`tabindex=\"-1\"`).",
5803
+ "parameters": "(options?: FocusOptions)",
5804
+ "return": {
5805
+ "text": "void"
5806
+ }
5807
+ }
5808
+ ],
5591
5809
  "attributes": [
5592
5810
  {
5593
5811
  "name": "mode",
@@ -5652,7 +5870,7 @@
5652
5870
  "name": "LintjeFormActions",
5653
5871
  "tagName": "lintje-form-actions",
5654
5872
  "customElement": true,
5655
- "description": "`<lintje-form-actions>` — the sticky action bar of a form: draft status left, slotted\n`lintje-button`s right (the last, primary one). On `busy` the primary button turns `busy` and\nthe others `disabled`; leaving `busy` restores what each had. No shadow while stuck:\n`--shadow-sticky` falls downwards, off-screen under a bottom bar. While connected it reserves\nits height as the page scroller's `scroll-padding-bottom`, so a field the focus scrolls to is\nnot hidden behind it (WCAG 2.4.11). Events: none.",
5873
+ "description": "`<lintje-form-actions>` — the sticky action bar of a form: the draft status on the left, the\nslotted `lintje-button`s on the right, the last one primary.\n\nWhile connected it reserves its height as the page scroller's `scroll-padding-bottom`, so a\nfield the focus scrolls to is not hidden behind it.",
5656
5874
  "superclass": {
5657
5875
  "name": "LintjeElement"
5658
5876
  },
@@ -5675,7 +5893,7 @@
5675
5893
  "text": "'' | 'dirty' | 'busy' | 'saved' | 'draft'"
5676
5894
  },
5677
5895
  "default": "''",
5678
- "description": "Set by the surrounding `lintje-form` (with `saved-at`); standing alone, the host sets it.",
5896
+ "description": "Set by the surrounding `lintje-form` (with `saved-at`); standing alone, the host sets it. On\n`busy` the primary button turns `busy` and the others `disabled`; after, each has what it had.",
5679
5897
  "attribute": "state",
5680
5898
  "reflects": true
5681
5899
  },
@@ -5705,7 +5923,7 @@
5705
5923
  "text": "'' | 'dirty' | 'busy' | 'saved' | 'draft'"
5706
5924
  },
5707
5925
  "default": "''",
5708
- "description": "Set by the surrounding `lintje-form` (with `saved-at`); standing alone, the host sets it."
5926
+ "description": "Set by the surrounding `lintje-form` (with `saved-at`); standing alone, the host sets it. On\n`busy` the primary button turns `busy` and the others `disabled`; after, each has what it had."
5709
5927
  },
5710
5928
  {
5711
5929
  "name": "saved-at",
@@ -5744,7 +5962,7 @@
5744
5962
  "name": "LintjeFormSection",
5745
5963
  "tagName": "lintje-form-section",
5746
5964
  "customElement": true,
5747
- "description": "`<lintje-form-section>` — a group of fields with a heading and an explanation: a `<fieldset>`\nwith its `<legend>`, which holds an `<h3>` so the heading is in the page's outline. Bare inside\na tile, or a tile itself (`variant=\"tile\"`).\n\n`disabled` sets `disabled` on every slotted control itself and hands back what each had: a\n`<fieldset disabled>` in a shadow root disables nothing slotted.",
5965
+ "description": "`<lintje-form-section>` — a group of fields with a heading and an explanation: a `<fieldset>`\nwhose legend holds an `<h3>`, so the heading is in the page's outline.",
5748
5966
  "superclass": {
5749
5967
  "name": "LintjeElement"
5750
5968
  },
@@ -5785,6 +6003,7 @@
5785
6003
  "text": "'plain' | 'tile'"
5786
6004
  },
5787
6005
  "default": "'plain'",
6006
+ "description": "`plain`: bare, inside a tile; `tile`: a tile itself.",
5788
6007
  "attribute": "variant",
5789
6008
  "reflects": true
5790
6009
  },
@@ -5830,7 +6049,8 @@
5830
6049
  "type": {
5831
6050
  "text": "'plain' | 'tile'"
5832
6051
  },
5833
- "default": "'plain'"
6052
+ "default": "'plain'",
6053
+ "description": "`plain`: bare, inside a tile; `tile`: a tile itself."
5834
6054
  },
5835
6055
  {
5836
6056
  "name": "disabled",
@@ -5869,7 +6089,7 @@
5869
6089
  "name": "LintjeForm",
5870
6090
  "tagName": "lintje-form",
5871
6091
  "customElement": true,
5872
- "description": "`<lintje-form>` — collects the values of its light-DOM fields, keeps the draft, asks for one\nsubmit and puts the host's errors under their fields.\n\nIts `<form>` is in the shadow root, so slotted fields have no form owner: the form's own key\nand click handlers are the one submit. `lintje-values-change` is stopped so form input never\nreaches the URL.\n\nEvents: `lintje-submit` `{ values }`, `lintje-invalid` (the errors), `lintje-dirty-change`\n(boolean).",
6092
+ "description": "`<lintje-form>` — collects the values of its light-DOM fields, keeps the draft, asks for one\nsubmit and puts the host's errors under their fields.\n\nIts `<form>` is in the shadow root, so slotted fields have no form owner: Enter and a submit\nbutton reach it through the element's own handlers, once. It stops `lintje-values-change`, so\nform input never reaches the URL.\n\nEvents: `lintje-submit` `{ values }`, `lintje-invalid` `FormErrors`, `lintje-dirty-change`\n`boolean`.",
5873
6093
  "superclass": {
5874
6094
  "name": "LintjeElement"
5875
6095
  },
@@ -6115,7 +6335,7 @@
6115
6335
  "name": "LintjeRepeaterRow",
6116
6336
  "tagName": "lintje-repeater-row",
6117
6337
  "customElement": true,
6118
- "description": "`<lintje-repeater>` — a group of fields that repeats. The host writes the rows and owns the\nlist; the repeater asks, numbers and names the rows, and bounds them by `min` and `max`.\nAfter an add, focus goes to the new row's first field; after a remove, to the remove button\nof the row above (the add button when none is left). A live region says both.\nIt keeps no values and draws no undo toast.\n\nEvents: `lintje-row-add` (detail: the index the new row gets) from the repeater, and\n`lintje-row-remove` (detail: the row's index) from the row; both bubble and are composed.",
6338
+ "description": "`<lintje-repeater-row>` — one row of a `lintje-repeater`, which numbers and names it.\n\nEvents: `lintje-row-remove` `number` (the row's index).",
6119
6339
  "superclass": {
6120
6340
  "name": "LintjeElement"
6121
6341
  },
@@ -6237,7 +6457,7 @@
6237
6457
  "name": "LintjeRepeater",
6238
6458
  "tagName": "lintje-repeater",
6239
6459
  "customElement": true,
6240
- "description": "`<lintje-repeater>` — a group of fields that repeats. The host writes the rows and owns the\nlist; the repeater asks, numbers and names the rows, and bounds them by `min` and `max`.\nAfter an add, focus goes to the new row's first field; after a remove, to the remove button\nof the row above (the add button when none is left). A live region says both.\nIt keeps no values and draws no undo toast.\n\nEvents: `lintje-row-add` (detail: the index the new row gets) from the repeater, and\n`lintje-row-remove` (detail: the row's index) from the row; both bubble and are composed.",
6460
+ "description": "`<lintje-repeater>` — a group of fields that repeats.\n\nThe host writes the rows and owns the list; the repeater asks, numbers and names the rows, and\nbounds them by `min` and `max`. It keeps no values and draws no undo toast. After an add the\nfocus goes to the new row's first field, after a remove to the remove button of the row above,\nelse the add button.\n\nEvents: `lintje-row-add` `number` (the index the new row gets), `lintje-row-remove` `number`\n(the row's index, from the row).",
6241
6461
  "superclass": {
6242
6462
  "name": "LintjeElement"
6243
6463
  },
@@ -6416,7 +6636,7 @@
6416
6636
  "name": "LintjeStepper",
6417
6637
  "tagName": "lintje-stepper",
6418
6638
  "customElement": true,
6419
- "description": "`<lintje-stepper>` — the steps of a form that takes more than one screen, or the phases of a\nprocess. A line joins the markers: drawn through up to the current step, dashed after it. A\nstep still to come does nothing: jumping ahead is not possible. The host decides which step is\ncurrent; the element never reads the URL. A plain click on a done step is sent as\n`lintje-navigate`, which a host that routes cancels; a modified click is the browser's.\n\nEvents: `lintje-navigate` `{ href }`.",
6639
+ "description": "`<lintje-stepper>` — the steps of a form that takes more than one screen, or the phases of a\nprocess.\n\nThe host decides which step is current; the element never reads the URL. A step still to come\ndoes nothing: jumping ahead is not possible. A plain click on a done step is sent as\n`lintje-navigate`, which a host that routes cancels.\n\nEvents: `lintje-navigate` `{ href }`.",
6420
6640
  "superclass": {
6421
6641
  "name": "LintjeElement"
6422
6642
  },
@@ -6518,7 +6738,7 @@
6518
6738
  "name": "LintjeAppSearch",
6519
6739
  "tagName": "lintje-app-search",
6520
6740
  "customElement": true,
6521
- "description": "`<lintje-app-search>` — one search field over everything in an application, opened with `/`.\n\nThe owner holds `open`, `groups` and `loading`. A dialog on the shared focus-trap stack. The\nfield is a native `<input>`: `aria-controls` and `aria-activedescendant` cannot cross a root.\n\nBelow 768 px it opens from below as a sheet, with the filter sheet's head — its name and a close\nbutton — and the line of keys goes.\n\nEvents: `lintje-open`, `lintje-search` (the term), `lintje-navigate` `{ href }`, `lintje-action`\n(the id), `lintje-close` `{ reason: 'escape' | 'scrim' | 'button' | 'choice' }`.",
6741
+ "description": "`<lintje-app-search>` — one search field over everything in an application, opened with `/`.\n\nThe host holds `open`, `groups` and `loading`: the element asks to be opened and closed, and\nsearches nothing itself. It is a dialog that traps the focus; below 768 px it opens from below\nas a sheet.\n\nEvents: `lintje-open`, `lintje-search` `string` (the term), `lintje-navigate` `{ href }`,\n`lintje-action` `string` (the row's id),\n`lintje-close` `{ reason: 'escape' | 'scrim' | 'button' | 'choice' }`.",
6522
6742
  "superclass": {
6523
6743
  "name": "LintjeElement"
6524
6744
  },
@@ -6684,7 +6904,7 @@
6684
6904
  "name": "LintjeBreadcrumbs",
6685
6905
  "tagName": "lintje-breadcrumbs",
6686
6906
  "customElement": true,
6687
- "description": "`<lintje-breadcrumbs>` — the breadcrumb trail above a page's title.\n\nThe last item is the current page (`aria-current`), never a link. Past `MAX_LEVELS` the middle\ncollapses into a \"…\" menu. It never reads the URL: the host passes the levels.\n\nEvents: `lintje-navigate` `{ href }`.",
6907
+ "description": "`<lintje-breadcrumbs>` — the breadcrumb trail above a page's title.\n\nThe last item is the current page, never a link. Past four levels the middle collapses into a\n\"…\" menu. It never reads the URL: the host passes the levels.\n\nEvents: `lintje-navigate` `{ href }`.",
6688
6908
  "superclass": {
6689
6909
  "name": "LintjeElement"
6690
6910
  },
@@ -6767,7 +6987,7 @@
6767
6987
  "name": "LintjeFooter",
6768
6988
  "tagName": "lintje-footer",
6769
6989
  "customElement": true,
6770
- "description": "`<lintje-footer>` — the foot of a site or an application: a line that says what it is, columns\nof links under a heading, and a row of the links every page carries (privacy, accessibility).\nIt stands on the menu's own fill and runs edge to edge; in `lintje-shell` it goes in the\n`footer` slot. Below 768 px the columns stand under each other.\n\nEvents: `lintje-navigate` `{ href }` for a plain click on a link.",
6990
+ "description": "`<lintje-footer>` — the foot of a site or an application: a line that says what it is, columns\nof links under a heading, and a row of the links every page carries (privacy, accessibility).\n\nIt stands on the menu's own fill and runs edge to edge; in `lintje-shell` it goes in the\n`footer` slot. Below 768 px the columns stand under each other.\n\nEvents: `lintje-navigate` `{ href }` (a plain click on a link).",
6771
6991
  "superclass": {
6772
6992
  "name": "LintjeElement"
6773
6993
  },
@@ -6832,7 +7052,7 @@
6832
7052
  "name": "LintjeHero",
6833
7053
  "tagName": "lintje-hero",
6834
7054
  "customElement": true,
6835
- "description": "`<lintje-hero>` — the opening band of a start page: a large title, a line of introduction and\none way onward, on the theme's wash. It runs from edge to edge; its text keeps to the\ncontent column. In `lintje-shell` it goes in the `full` slot, above the page's content.\n\nThe title is an h2, as the page header's: the page's h1 is the shell's `name`.\nSlots: the default slot under the description (a search field, a short form); `status` above\nthe title (a badge); `aside` for one picture beside the text (an emblem, an illustration), left\nout below 1024 px; `panel` for content beside the text (what is said now in a running\nrecording), half the band from 1024 px and under the text below it; `overlap` for what stands\nhalf over the band's lower edge, such as a panel of tabs.\n\nEvents: `lintje-navigate` `{ href }` for the action.",
7055
+ "description": "`<lintje-hero>` — the opening band of a start page: a large title, a line of introduction and\none way onward, on the theme's wash.\n\nIt runs from edge to edge, its text in the content column; in `lintje-shell` it goes in the\n`full` slot. The title is an h2: the page's h1 is the shell's `name`. The default slot takes a\nsearch field or a short form under the introduction, `aside` one picture beside the text (left\nout below 1024 px), `panel` content beside the text, and `overlap` what stands half over the\nband's lower edge, such as a panel of tabs.\n\nEvents: `lintje-navigate` `{ href }` (the action).",
6836
7056
  "superclass": {
6837
7057
  "name": "LintjeElement"
6838
7058
  },
@@ -6970,7 +7190,7 @@
6970
7190
  "name": "LintjeNotifications",
6971
7191
  "tagName": "lintje-notifications",
6972
7192
  "customElement": true,
6973
- "description": "`<lintje-notifications>` — the bell with its unread counter, and the panel it opens.\n\nAn unread item has the selected surface, a bold title and a dot, so colour is never the only\ncarrier (rule 13). A new counter pops in; a figure that replaces another rises in, as a KPI tile\ndoes. Above 768 px the panel is a non-modal popover; below it a full-screen modal sheet on the\nfocus-trap stack. It fetches and marks nothing: the host sets `.items`.\n\nMore unread items than before are spoken from a status region beside the bell (\"2 nieuwe\nmeldingen\"). When \"Alles gelezen\" goes with the focus on it, the focus moves to the first item.\n\nEvents: `lintje-notification-open` `{ id, href? }` — a plain click on a title with an `href`\nis cancelled and left to the host —, `lintje-notifications-read` (\"Alles gelezen\").",
7193
+ "description": "`<lintje-notifications>` — the bell with its unread counter, and the panel it opens.\n\nIt fetches and marks nothing: the host sets `items`. More unread items than before are spoken\nfrom a status region beside the bell. Above 768 px the panel is a popover; below, a full-screen\nsheet that traps the focus.\n\nEvents: `lintje-notification-open` `{ id, href? }` (a title was clicked; with an `href`, cancel\nit to route), `lintje-notifications-read` (\"Alles gelezen\" was pressed).",
6974
7194
  "superclass": {
6975
7195
  "name": "LintjeElement"
6976
7196
  },
@@ -7079,7 +7299,7 @@
7079
7299
  "name": "LintjePageHeader",
7080
7300
  "tagName": "lintje-page-header",
7081
7301
  "customElement": true,
7082
- "description": "`<lintje-page-header>` — the title zone of a page, with an announcement above it.\n\nThe title is an h2: the page's h1 is the shell's `name`.\nSlots: `breadcrumbs` above the title, `actions` on its right.\n\nIn the page's content it is a band, and tells the shell through the shared store when the\ntitle scrolls under the top bar. The observer watches the title itself: a sentinel element in\nthis column would pick up the gap and push the page down 6 px.\n\nIn `lintje-shell`'s `header` slot it stands flush in the shell's content column, as an\napplication's title row: no band, the description at every width, no observer.\n\n`editable` puts a pencil beside the title, shown while the title is pointed at or focused: the\nway to rename what the page is about. The page renames; the header only asks.\n\nEvents: `lintje-title-edit` (the pencil was pressed).",
7302
+ "description": "`<lintje-page-header>` — the title zone of a page, with an announcement above it.\n\nThe title is an h2: the page's h1 is the shell's `name`. Actions that do not fit on one line go\ninto one menu, \"Meer\": the first goes first, the last never, and a chosen row clicks its button,\nso the host's own listener sees the click. In the page's content it is a band that tells the\nshell when the title scrolls under the top bar.\n\nEvents: `lintje-title-edit` (the pencil was pressed: the page renames, the header only asks).",
7083
7303
  "superclass": {
7084
7304
  "name": "LintjeElement"
7085
7305
  },
@@ -7109,7 +7329,7 @@
7109
7329
  "text": "boolean"
7110
7330
  },
7111
7331
  "default": "false",
7112
- "description": "A pencil beside the title asks to rename it.",
7332
+ "description": "A pencil beside the title, shown while it is pointed at or focused, asks to rename it.",
7113
7333
  "attribute": "editable",
7114
7334
  "reflects": true
7115
7335
  }
@@ -7130,7 +7350,7 @@
7130
7350
  "text": "boolean"
7131
7351
  },
7132
7352
  "default": "false",
7133
- "description": "A pencil beside the title asks to rename it."
7353
+ "description": "A pencil beside the title, shown while it is pointed at or focused, asks to rename it."
7134
7354
  }
7135
7355
  ],
7136
7356
  "events": [
@@ -7164,14 +7384,14 @@
7164
7384
  },
7165
7385
  {
7166
7386
  "kind": "javascript-module",
7167
- "path": "src/components/frame/session-expiry/session-expiry.ts",
7387
+ "path": "src/components/frame/shell/shell.ts",
7168
7388
  "declarations": [
7169
7389
  {
7170
7390
  "kind": "class",
7171
- "name": "LintjeSessionExpiry",
7172
- "tagName": "lintje-session-expiry",
7391
+ "name": "LintjeShell",
7392
+ "tagName": "lintje-shell",
7173
7393
  "customElement": true,
7174
- "description": "`<lintje-session-expiry>` — the warning before the session runs out, the notice after it, and\nthe \"Je concept is teruggezet\" announcement (`restored-at`).\n\nThe window is a `role=\"alertdialog\"` in `<lintje-confirm-dialog>`'s frame (its stylesheet).\nEscape and the scrim do nothing, because the session runs out either way. The element never\ncalls a server: the host sets `busy`, moves `expires-at` or sets `expired`.\n\nEvents: `lintje-session-extend`, `lintje-logout`, `lintje-login`, `lintje-draft-discard`.",
7394
+ "description": "`<lintje-shell>` — the frame around a page: the Rijkshuisstijl header above it or the menu\nbeside it, the mobile header and menu below 768 px, and a `<main>` with the host's content.\n\nIt never fetches and never reads the URL: the active page and the reader's settings are the\nhost's, and a change goes out as `lintje-view-change` and comes back as data. `full` runs edge\nto edge above the content, `header` holds the `lintje-page-header` and `footer` the\n`lintje-footer`. The events of its parts (`lintje-action`, `lintje-logout`,\n`lintje-notification-open`, `lintje-notifications-read`) reach the host as they are.\n\nEvents: `lintje-navigate` `{ href }`, `lintje-view-change` `ShellViewChange`,\n`lintje-search-open`.",
7175
7395
  "superclass": {
7176
7396
  "name": "LintjeElement"
7177
7397
  },
@@ -7189,243 +7409,41 @@
7189
7409
  },
7190
7410
  {
7191
7411
  "kind": "field",
7192
- "name": "expiresAt",
7412
+ "name": "data",
7193
7413
  "type": {
7194
- "text": "string"
7195
- },
7196
- "description": "When the session ends, as an ISO moment.",
7197
- "attribute": "expires-at"
7414
+ "text": "ShellData | null"
7415
+ }
7198
7416
  },
7199
7417
  {
7200
7418
  "kind": "field",
7201
- "name": "warnBefore",
7419
+ "name": "layout",
7202
7420
  "type": {
7203
- "text": "number"
7421
+ "text": "'side' | 'top'"
7204
7422
  },
7205
- "default": "120",
7206
- "description": "Seconds before the end that the warning opens; at least `MIN_WARNING`.",
7207
- "attribute": "warn-before"
7208
- },
7423
+ "default": "'top'",
7424
+ "description": "`data.layout`, mirrored on the element so its stylesheet can tell the two apart.",
7425
+ "attribute": "layout",
7426
+ "reflects": true
7427
+ }
7428
+ ],
7429
+ "methods": [
7209
7430
  {
7210
- "kind": "field",
7211
- "name": "restoredAt",
7212
- "type": {
7213
- "text": "string"
7214
- },
7215
- "description": "When the restored draft was saved; set, the announcement shows.",
7216
- "attribute": "restored-at"
7431
+ "kind": "method",
7432
+ "name": "measureFit",
7433
+ "description": "Like the navigation bar's entries, the bars' tools give way when they do not fit, measured and\nnot by breakpoint: the top bar's to bare icons, the mobile header's words to their glyphs.\nEach width compared is independent of the outcome, so neither can flip back and forth.",
7434
+ "parameters": "()",
7435
+ "return": {
7436
+ "text": "void"
7437
+ }
7217
7438
  },
7218
7439
  {
7219
- "kind": "field",
7220
- "name": "restoredReason",
7221
- "type": {
7222
- "text": "'logout' | 'reload'"
7223
- },
7224
- "default": "'logout'",
7225
- "description": "Why the draft came back; it picks the announcement's words.",
7226
- "attribute": "restored-reason"
7227
- },
7228
- {
7229
- "kind": "field",
7230
- "name": "busy",
7231
- "type": {
7232
- "text": "boolean"
7233
- },
7234
- "default": "false",
7235
- "attribute": "busy",
7236
- "reflects": true
7237
- },
7238
- {
7239
- "kind": "field",
7240
- "name": "expired",
7241
- "type": {
7242
- "text": "boolean"
7243
- },
7244
- "default": "false",
7245
- "description": "The host's word that the session is gone (extending failed).",
7246
- "attribute": "expired",
7247
- "reflects": true
7248
- },
7249
- {
7250
- "kind": "field",
7251
- "name": "now",
7252
- "type": {
7253
- "text": "() => number"
7254
- },
7255
- "default": "Date.now",
7256
- "description": "The clock, read once a second while there is an `expires-at`. A test replaces it."
7257
- }
7258
- ],
7259
- "methods": [],
7260
- "attributes": [
7261
- {
7262
- "name": "mode",
7263
- "fieldName": "mode",
7264
- "type": {
7265
- "text": "'light' | 'dark'"
7266
- }
7267
- },
7268
- {
7269
- "name": "expires-at",
7270
- "fieldName": "expiresAt",
7271
- "type": {
7272
- "text": "string"
7273
- },
7274
- "description": "When the session ends, as an ISO moment."
7275
- },
7276
- {
7277
- "name": "warn-before",
7278
- "fieldName": "warnBefore",
7279
- "type": {
7280
- "text": "number"
7281
- },
7282
- "default": "120",
7283
- "description": "Seconds before the end that the warning opens; at least `MIN_WARNING`."
7284
- },
7285
- {
7286
- "name": "restored-at",
7287
- "fieldName": "restoredAt",
7288
- "type": {
7289
- "text": "string"
7290
- },
7291
- "description": "When the restored draft was saved; set, the announcement shows."
7292
- },
7293
- {
7294
- "name": "restored-reason",
7295
- "fieldName": "restoredReason",
7296
- "type": {
7297
- "text": "'logout' | 'reload'"
7298
- },
7299
- "default": "'logout'",
7300
- "description": "Why the draft came back; it picks the announcement's words."
7301
- },
7302
- {
7303
- "name": "busy",
7304
- "fieldName": "busy",
7305
- "type": {
7306
- "text": "boolean"
7307
- },
7308
- "default": "false"
7309
- },
7310
- {
7311
- "name": "expired",
7312
- "fieldName": "expired",
7313
- "type": {
7314
- "text": "boolean"
7315
- },
7316
- "default": "false",
7317
- "description": "The host's word that the session is gone (extending failed)."
7318
- }
7319
- ],
7320
- "events": [
7321
- {
7322
- "name": "lintje-draft-discard",
7323
- "type": {
7324
- "text": "CustomEvent"
7325
- }
7326
- },
7327
- {
7328
- "name": "lintje-login",
7329
- "type": {
7330
- "text": "CustomEvent"
7331
- }
7332
- },
7333
- {
7334
- "name": "lintje-logout",
7335
- "type": {
7336
- "text": "CustomEvent"
7337
- }
7338
- },
7339
- {
7340
- "name": "lintje-session-extend",
7341
- "type": {
7342
- "text": "CustomEvent"
7343
- }
7344
- }
7345
- ],
7346
- "slots": [
7347
- {
7348
- "name": ""
7349
- },
7350
- {
7351
- "name": "expired"
7352
- }
7353
- ]
7354
- }
7355
- ],
7356
- "exports": [
7357
- {
7358
- "kind": "custom-element-definition",
7359
- "name": "lintje-session-expiry",
7360
- "declaration": {
7361
- "name": "LintjeSessionExpiry",
7362
- "module": "src/components/frame/session-expiry/session-expiry.ts"
7363
- }
7364
- }
7365
- ]
7366
- },
7367
- {
7368
- "kind": "javascript-module",
7369
- "path": "src/components/frame/shell/shell.ts",
7370
- "declarations": [
7371
- {
7372
- "kind": "class",
7373
- "name": "LintjeShell",
7374
- "tagName": "lintje-shell",
7375
- "customElement": true,
7376
- "description": "`<lintje-shell>` — the frame around a page: the Rijkshuisstijl header above it (`layout`\n`top`, the default) or the menu beside it (`side`), the mobile header and menu below 768 px,\nand a `<main>` with the host's content.\n\nIt never fetches and never reads the URL: the active page (`active`) and the reader's settings\n(`view`, `menu`, `layout`) are the host's. A change goes out as `lintje-view-change` and comes\nback as data. `name` is the page's one `h1`.\n\nSlots: `full` runs edge to edge above the content (a hero, a filter bar, a conversation); `header`\nholds the page's title (`lintje-page-header`); the default slot the content, at the page's\nwidth and padding; `footer` runs edge to edge under it all (`lintje-footer`).\n\nEvents: `lintje-navigate` `{ href }`, `lintje-view-change`, `lintje-search-open`; from its\nparts `lintje-action`, `lintje-logout`, `lintje-notification-open`, `lintje-notifications-read`.",
7377
- "superclass": {
7378
- "name": "LintjeElement"
7379
- },
7380
- "members": [
7381
- {
7382
- "kind": "field",
7383
- "name": "mode",
7384
- "type": {
7385
- "text": "'light' | 'dark'"
7386
- },
7387
- "attribute": "mode",
7388
- "inheritedFrom": {
7389
- "name": "LintjeElement"
7390
- }
7391
- },
7392
- {
7393
- "kind": "field",
7394
- "name": "data",
7395
- "type": {
7396
- "text": "ShellData | null"
7397
- }
7398
- },
7399
- {
7400
- "kind": "field",
7401
- "name": "layout",
7402
- "type": {
7403
- "text": "'side' | 'top'"
7404
- },
7405
- "default": "'top'",
7406
- "description": "`data.layout`, mirrored on the element so its stylesheet can tell the two apart.",
7407
- "attribute": "layout",
7408
- "reflects": true
7409
- }
7410
- ],
7411
- "methods": [
7412
- {
7413
- "kind": "method",
7414
- "name": "measureFit",
7415
- "description": "Like the navigation bar's entries, the bars' tools give way when they do not fit, measured and\nnot by breakpoint: the top bar's to bare icons, the mobile header's words to their glyphs.\nEach width compared is independent of the outcome, so neither can flip back and forth.",
7416
- "parameters": "()",
7417
- "return": {
7418
- "text": "void"
7419
- }
7420
- },
7421
- {
7422
- "kind": "method",
7423
- "name": "measureScroll",
7424
- "description": "The bar pins once its place in the flow has left the viewport and unpins on return.",
7425
- "parameters": "()",
7426
- "return": {
7427
- "text": "void"
7428
- }
7440
+ "kind": "method",
7441
+ "name": "measureScroll",
7442
+ "description": "The bar pins once its place in the flow has left the viewport and unpins on return.",
7443
+ "parameters": "()",
7444
+ "return": {
7445
+ "text": "void"
7446
+ }
7429
7447
  },
7430
7448
  {
7431
7449
  "kind": "method",
@@ -7540,14 +7558,14 @@
7540
7558
  },
7541
7559
  {
7542
7560
  "kind": "javascript-module",
7543
- "path": "src/components/frame/shortcuts/shortcuts.ts",
7561
+ "path": "src/components/frame/sub-nav/sub-nav.ts",
7544
7562
  "declarations": [
7545
7563
  {
7546
7564
  "kind": "class",
7547
- "name": "LintjeShortcuts",
7548
- "tagName": "lintje-shortcuts",
7565
+ "name": "LintjeSubNav",
7566
+ "tagName": "lintje-sub-nav",
7549
7567
  "customElement": true,
7550
- "description": "`<lintje-shortcuts>` — the overview of the keyboard shortcuts this page has registered.\n\nThe list is the register's (`core/shortcuts.ts`), read when the window opens. The element\nregisters `?` itself and asks to be opened (`lintje-open`). The owner holds `open`, as with\n`<lintje-confirm-dialog>`, whose frame and stylesheet this uses. Under the list a switch turns\nthe one-character keys off and on (WCAG 2.1.4); with them off, `?` opens nothing, so a page\nalso opens the overview from a button or a menu.\n\nEvents: `lintje-open`, `lintje-close` `{ reason: 'escape' | 'scrim' | 'button' }`.",
7568
+ "description": "`<lintje-sub-nav>` — the navigation within one part of an application, beside its content.\n\nGroups of links and one action below them (\"Nieuw …\"). The host marks the reader's page with\n`active`; the element never reads the URL. Below 768 px it is one button with the reader's\npage, which opens the list in place.\n\nEvents: `lintje-navigate` `{ href }`, `lintje-action` `{ value }` (the action was pressed).",
7551
7569
  "superclass": {
7552
7570
  "name": "LintjeElement"
7553
7571
  },
@@ -7565,23 +7583,40 @@
7565
7583
  },
7566
7584
  {
7567
7585
  "kind": "field",
7568
- "name": "open",
7586
+ "name": "groups",
7569
7587
  "type": {
7570
- "text": "boolean"
7588
+ "text": "SubNavGroup[]"
7571
7589
  },
7572
- "default": "false",
7573
- "description": "The owner's: the window asks to be closed and never closes itself.",
7574
- "attribute": "open",
7575
- "reflects": true
7590
+ "default": "[]",
7591
+ "description": "The groups, in order. One group without a label is a plain list."
7576
7592
  },
7577
7593
  {
7578
7594
  "kind": "field",
7579
- "name": "heading",
7595
+ "name": "action",
7596
+ "type": {
7597
+ "text": "SubNavAction"
7598
+ },
7599
+ "description": "The action below the groups, or none."
7600
+ },
7601
+ {
7602
+ "kind": "field",
7603
+ "name": "label",
7580
7604
  "type": {
7581
7605
  "text": "string"
7582
7606
  },
7583
- "default": "'Sneltoetsen'",
7584
- "attribute": "heading"
7607
+ "default": "'Submenu'",
7608
+ "description": "The navigation's accessible name: \"Instellingen\".",
7609
+ "attribute": "label"
7610
+ },
7611
+ {
7612
+ "kind": "field",
7613
+ "name": "expanded",
7614
+ "type": {
7615
+ "text": "boolean"
7616
+ },
7617
+ "default": "false",
7618
+ "description": "Every level shows, not only the one on the reader's path: for the list of a long page's\nsections, which must not shift while it is read.",
7619
+ "attribute": "expanded"
7585
7620
  }
7586
7621
  ],
7587
7622
  "methods": [],
@@ -7594,34 +7629,35 @@
7594
7629
  }
7595
7630
  },
7596
7631
  {
7597
- "name": "open",
7598
- "fieldName": "open",
7632
+ "name": "label",
7633
+ "fieldName": "label",
7599
7634
  "type": {
7600
- "text": "boolean"
7635
+ "text": "string"
7601
7636
  },
7602
- "default": "false",
7603
- "description": "The owner's: the window asks to be closed and never closes itself."
7637
+ "default": "'Submenu'",
7638
+ "description": "The navigation's accessible name: \"Instellingen\"."
7604
7639
  },
7605
7640
  {
7606
- "name": "heading",
7607
- "fieldName": "heading",
7641
+ "name": "expanded",
7642
+ "fieldName": "expanded",
7608
7643
  "type": {
7609
- "text": "string"
7644
+ "text": "boolean"
7610
7645
  },
7611
- "default": "'Sneltoetsen'"
7646
+ "default": "false",
7647
+ "description": "Every level shows, not only the one on the reader's path: for the list of a long page's\nsections, which must not shift while it is read."
7612
7648
  }
7613
7649
  ],
7614
7650
  "events": [
7615
7651
  {
7616
- "name": "lintje-close",
7652
+ "name": "lintje-action",
7617
7653
  "type": {
7618
- "text": "CustomEvent<{ reason }>"
7654
+ "text": "CustomEvent<{ value }>"
7619
7655
  }
7620
7656
  },
7621
7657
  {
7622
- "name": "lintje-open",
7658
+ "name": "lintje-navigate",
7623
7659
  "type": {
7624
- "text": "CustomEvent"
7660
+ "text": "CustomEvent<{ href }>"
7625
7661
  }
7626
7662
  }
7627
7663
  ],
@@ -7631,24 +7667,24 @@
7631
7667
  "exports": [
7632
7668
  {
7633
7669
  "kind": "custom-element-definition",
7634
- "name": "lintje-shortcuts",
7670
+ "name": "lintje-sub-nav",
7635
7671
  "declaration": {
7636
- "name": "LintjeShortcuts",
7637
- "module": "src/components/frame/shortcuts/shortcuts.ts"
7672
+ "name": "LintjeSubNav",
7673
+ "module": "src/components/frame/sub-nav/sub-nav.ts"
7638
7674
  }
7639
7675
  }
7640
7676
  ]
7641
7677
  },
7642
7678
  {
7643
7679
  "kind": "javascript-module",
7644
- "path": "src/components/frame/sub-nav/sub-nav.ts",
7680
+ "path": "src/components/frame/user-menu/user-menu.ts",
7645
7681
  "declarations": [
7646
7682
  {
7647
7683
  "kind": "class",
7648
- "name": "LintjeSubNav",
7649
- "tagName": "lintje-sub-nav",
7684
+ "name": "LintjeUserMenu",
7685
+ "tagName": "lintje-user-menu",
7650
7686
  "customElement": true,
7651
- "description": "`<lintje-sub-nav>` — the navigation within one part of an application, beside its content.\n\nGroups of links, optionally under a label, and one action below them (\"Nieuw …\"). The host\nmarks the reader's page with `active`; an item's `items` show while it or one of them is active.\nBelow 768 px it is one button with the reader's page, which opens the list in place. It never\nreads the URL.\n\nEvents: `lintje-navigate` `{ href }`, `lintje-action` `{ value }` (the action).",
7687
+ "description": "`<lintje-user-menu>` — the user's avatar in the navigation bar and the menu it opens: name and\nrole, the host's rows (`MenuEntry`), \"Afmelden\" and the version.\n\nA menu, not a dialog: it traps no focus, and an Escape in a dialog opened over it is the\ndialog's.\n\nEvents: `lintje-action` `string` (the row's value), `lintje-navigate` `{ href }` (a link row),\n`lintje-logout` (without `logout-action`).",
7652
7688
  "superclass": {
7653
7689
  "name": "LintjeElement"
7654
7690
  },
@@ -7666,32 +7702,69 @@
7666
7702
  },
7667
7703
  {
7668
7704
  "kind": "field",
7669
- "name": "groups",
7705
+ "name": "user",
7670
7706
  "type": {
7671
- "text": "SubNavGroup[]"
7672
- },
7673
- "default": "[]",
7674
- "description": "The groups, in order. One group without a label is a plain list."
7707
+ "text": "UserMenuUser | null"
7708
+ }
7675
7709
  },
7676
7710
  {
7677
7711
  "kind": "field",
7678
- "name": "action",
7712
+ "name": "items",
7679
7713
  "type": {
7680
- "text": "SubNavAction"
7714
+ "text": "MenuEntry[]"
7681
7715
  },
7682
- "description": "The action below the groups, or none."
7716
+ "default": "[]"
7683
7717
  },
7684
7718
  {
7685
7719
  "kind": "field",
7686
- "name": "label",
7720
+ "name": "version",
7687
7721
  "type": {
7688
7722
  "text": "string"
7689
7723
  },
7690
- "default": "'Submenu'",
7691
- "description": "The navigation's accessible name: \"Instellingen\".",
7692
- "attribute": "label"
7693
- }
7694
- ],
7724
+ "description": "Shown at the bottom: \"Versie 2.4.1\".",
7725
+ "attribute": "version"
7726
+ },
7727
+ {
7728
+ "kind": "field",
7729
+ "name": "logoutAction",
7730
+ "type": {
7731
+ "text": "string"
7732
+ },
7733
+ "description": "The URL \"Afmelden\" posts a real `<form>` to: signing out leaves the page, which a fetch\ncannot do. Without it \"Afmelden\" sends `lintje-logout`.",
7734
+ "attribute": "logout-action"
7735
+ },
7736
+ {
7737
+ "kind": "field",
7738
+ "name": "csrf",
7739
+ "type": {
7740
+ "text": "string"
7741
+ },
7742
+ "default": "''",
7743
+ "description": "The session's CSRF token, posted with \"Afmelden\" in a hidden `csrf_token` field.",
7744
+ "attribute": "csrf"
7745
+ },
7746
+ {
7747
+ "kind": "field",
7748
+ "name": "inline",
7749
+ "type": {
7750
+ "text": "boolean"
7751
+ },
7752
+ "default": "false",
7753
+ "description": "The content without button and popover, on the navigation's colours: for the mobile sheet.",
7754
+ "attribute": "inline",
7755
+ "reflects": true
7756
+ },
7757
+ {
7758
+ "kind": "field",
7759
+ "name": "open",
7760
+ "type": {
7761
+ "text": "boolean"
7762
+ },
7763
+ "default": "false",
7764
+ "attribute": "open",
7765
+ "reflects": true
7766
+ }
7767
+ ],
7695
7768
  "methods": [],
7696
7769
  "attributes": [
7697
7770
  {
@@ -7702,20 +7775,59 @@
7702
7775
  }
7703
7776
  },
7704
7777
  {
7705
- "name": "label",
7706
- "fieldName": "label",
7778
+ "name": "version",
7779
+ "fieldName": "version",
7707
7780
  "type": {
7708
7781
  "text": "string"
7709
7782
  },
7710
- "default": "'Submenu'",
7711
- "description": "The navigation's accessible name: \"Instellingen\"."
7783
+ "description": "Shown at the bottom: \"Versie 2.4.1\"."
7784
+ },
7785
+ {
7786
+ "name": "logout-action",
7787
+ "fieldName": "logoutAction",
7788
+ "type": {
7789
+ "text": "string"
7790
+ },
7791
+ "description": "The URL \"Afmelden\" posts a real `<form>` to: signing out leaves the page, which a fetch\ncannot do. Without it \"Afmelden\" sends `lintje-logout`."
7792
+ },
7793
+ {
7794
+ "name": "csrf",
7795
+ "fieldName": "csrf",
7796
+ "type": {
7797
+ "text": "string"
7798
+ },
7799
+ "default": "''",
7800
+ "description": "The session's CSRF token, posted with \"Afmelden\" in a hidden `csrf_token` field."
7801
+ },
7802
+ {
7803
+ "name": "inline",
7804
+ "fieldName": "inline",
7805
+ "type": {
7806
+ "text": "boolean"
7807
+ },
7808
+ "default": "false",
7809
+ "description": "The content without button and popover, on the navigation's colours: for the mobile sheet."
7810
+ },
7811
+ {
7812
+ "name": "open",
7813
+ "fieldName": "open",
7814
+ "type": {
7815
+ "text": "boolean"
7816
+ },
7817
+ "default": "false"
7712
7818
  }
7713
7819
  ],
7714
7820
  "events": [
7715
7821
  {
7716
7822
  "name": "lintje-action",
7717
7823
  "type": {
7718
- "text": "CustomEvent<{ value }>"
7824
+ "text": "CustomEvent<item.value>"
7825
+ }
7826
+ },
7827
+ {
7828
+ "name": "lintje-logout",
7829
+ "type": {
7830
+ "text": "CustomEvent"
7719
7831
  }
7720
7832
  },
7721
7833
  {
@@ -7731,26 +7843,26 @@
7731
7843
  "exports": [
7732
7844
  {
7733
7845
  "kind": "custom-element-definition",
7734
- "name": "lintje-sub-nav",
7846
+ "name": "lintje-user-menu",
7735
7847
  "declaration": {
7736
- "name": "LintjeSubNav",
7737
- "module": "src/components/frame/sub-nav/sub-nav.ts"
7848
+ "name": "LintjeUserMenu",
7849
+ "module": "src/components/frame/user-menu/user-menu.ts"
7738
7850
  }
7739
7851
  }
7740
7852
  ]
7741
7853
  },
7742
7854
  {
7743
7855
  "kind": "javascript-module",
7744
- "path": "src/components/frame/user-menu/user-menu.ts",
7856
+ "path": "src/components/inputs/checkbox-group/checkbox-group.ts",
7745
7857
  "declarations": [
7746
7858
  {
7747
7859
  "kind": "class",
7748
- "name": "LintjeUserMenu",
7749
- "tagName": "lintje-user-menu",
7860
+ "name": "LintjeCheckboxGroup",
7861
+ "tagName": "lintje-checkbox-group",
7750
7862
  "customElement": true,
7751
- "description": "`<lintje-user-menu>` — the user's avatar in the navigation bar and the menu it opens: name and\nrole, the host's rows (`MenuEntry`, as `lintje-menu-button`), \"Afmelden\", the version.\n\nA menu, not a dialog: no trap, and an Escape pressed in a dialog opened over it is the\ndialog's. With `logout-action` \"Afmelden\" is a real `<form method=\"post\">` with the CSRF\ntoken in a hidden `csrf_token` field: signing out leaves the page, which a fetch cannot do.\n`inline` draws the content without button and popover, for the shell's mobile sheet.\n\nEvents: `lintje-action` (the row's value), `lintje-navigate` `{ href }` for a link row,\n`lintje-logout` (only without `logout-action`).",
7863
+ "description": "`<lintje-checkbox-group>` — several options under one label, a checkbox per line, with one hint\nand one message for the group.\n\nOnly the group tells the host: its rows carry no `name`. `required` draws nothing and sets no\nARIA, since a group cannot carry `aria-required`: the host's message says what is missing.\n\nEvents: `lintje-change` `string[]` (the checked values), `lintje-values-change`\n`{ [name]: value }` (with a `name`), `lintje-reset` (the reset link was pressed).",
7752
7864
  "superclass": {
7753
- "name": "LintjeElement"
7865
+ "name": "LintjeInputElement"
7754
7866
  },
7755
7867
  "members": [
7756
7868
  {
@@ -7766,138 +7878,302 @@
7766
7878
  },
7767
7879
  {
7768
7880
  "kind": "field",
7769
- "name": "user",
7881
+ "name": "span",
7770
7882
  "type": {
7771
- "text": "UserMenuUser | null"
7883
+ "text": "number"
7884
+ },
7885
+ "description": "Columns of the 12-column grid; default one.",
7886
+ "attribute": "span",
7887
+ "reflects": true,
7888
+ "inheritedFrom": {
7889
+ "name": "LintjeGridItemElement"
7772
7890
  }
7773
7891
  },
7774
7892
  {
7775
7893
  "kind": "field",
7776
- "name": "items",
7894
+ "name": "name",
7777
7895
  "type": {
7778
- "text": "MenuEntry[]"
7896
+ "text": "string"
7779
7897
  },
7780
- "default": "[]"
7898
+ "default": "''",
7899
+ "description": "The filter key, e.g. `p.threshold`. Without it no `lintje-values-change` is sent.",
7900
+ "attribute": "name",
7901
+ "inheritedFrom": {
7902
+ "name": "LintjeInputElement"
7903
+ }
7781
7904
  },
7782
7905
  {
7783
7906
  "kind": "field",
7784
- "name": "version",
7907
+ "name": "label",
7785
7908
  "type": {
7786
7909
  "text": "string"
7787
7910
  },
7788
- "description": "Shown at the bottom: \"Versie 2.4.1\".",
7789
- "attribute": "version"
7911
+ "default": "''",
7912
+ "attribute": "label",
7913
+ "inheritedFrom": {
7914
+ "name": "LintjeInputElement"
7915
+ }
7916
+ },
7917
+ {
7918
+ "kind": "field",
7919
+ "name": "hideLabel",
7920
+ "type": {
7921
+ "text": "boolean"
7922
+ },
7923
+ "default": "false",
7924
+ "attribute": "hide-label",
7925
+ "inheritedFrom": {
7926
+ "name": "LintjeInputElement"
7927
+ }
7928
+ },
7929
+ {
7930
+ "kind": "field",
7931
+ "name": "hint",
7932
+ "type": {
7933
+ "text": "string"
7934
+ },
7935
+ "attribute": "hint",
7936
+ "inheritedFrom": {
7937
+ "name": "LintjeInputElement"
7938
+ }
7939
+ },
7940
+ {
7941
+ "kind": "field",
7942
+ "name": "error",
7943
+ "type": {
7944
+ "text": "string"
7945
+ },
7946
+ "description": "The Dutch error message.",
7947
+ "attribute": "error",
7948
+ "inheritedFrom": {
7949
+ "name": "LintjeInputElement"
7950
+ }
7951
+ },
7952
+ {
7953
+ "kind": "field",
7954
+ "name": "disabled",
7955
+ "type": {
7956
+ "text": "boolean"
7957
+ },
7958
+ "default": "false",
7959
+ "attribute": "disabled",
7960
+ "reflects": true,
7961
+ "inheritedFrom": {
7962
+ "name": "LintjeInputElement"
7963
+ }
7964
+ },
7965
+ {
7966
+ "kind": "field",
7967
+ "name": "modified",
7968
+ "type": {
7969
+ "text": "boolean"
7970
+ },
7971
+ "default": "false",
7972
+ "description": "Differs from the default: draws the orange dot by the label.",
7973
+ "attribute": "modified",
7974
+ "reflects": true,
7975
+ "inheritedFrom": {
7976
+ "name": "LintjeInputElement"
7977
+ }
7978
+ },
7979
+ {
7980
+ "kind": "field",
7981
+ "name": "required",
7982
+ "type": {
7983
+ "text": "boolean"
7984
+ },
7985
+ "default": "false",
7986
+ "description": "The field must be filled. Draws nothing; sets `aria-required` and form validity.",
7987
+ "attribute": "required",
7988
+ "reflects": true,
7989
+ "inheritedFrom": {
7990
+ "name": "LintjeInputElement"
7991
+ }
7992
+ },
7993
+ {
7994
+ "kind": "field",
7995
+ "name": "optional",
7996
+ "type": {
7997
+ "text": "boolean"
7998
+ },
7999
+ "default": "false",
8000
+ "description": "Marks the label \"(niet verplicht)\", inside the label so it is in the accessible name.",
8001
+ "attribute": "optional",
8002
+ "inheritedFrom": {
8003
+ "name": "LintjeInputElement"
8004
+ }
8005
+ },
8006
+ {
8007
+ "kind": "field",
8008
+ "name": "layout",
8009
+ "type": {
8010
+ "text": "'row'"
8011
+ },
8012
+ "description": "`row`: a setting's row — the name and its hint on the left, the control on the right; stacked\nagain when the field itself is narrower than 35rem (a phone, a drawer). Left out, the label\nstands above the control.",
8013
+ "attribute": "layout",
8014
+ "reflects": true,
8015
+ "inheritedFrom": {
8016
+ "name": "LintjeInputElement"
8017
+ }
8018
+ },
8019
+ {
8020
+ "kind": "field",
8021
+ "name": "resetLabel",
8022
+ "type": {
8023
+ "text": "string"
8024
+ },
8025
+ "description": "With `modified`: a link under the field (\"Terugzetten naar 2 tot 12\") that sends `lintje-reset`.",
8026
+ "attribute": "reset-label",
8027
+ "inheritedFrom": {
8028
+ "name": "LintjeInputElement"
8029
+ }
8030
+ },
8031
+ {
8032
+ "kind": "field",
8033
+ "name": "options",
8034
+ "type": {
8035
+ "text": "FilterOption[]"
8036
+ },
8037
+ "description": "A `description` stands under its option."
8038
+ },
8039
+ {
8040
+ "kind": "field",
8041
+ "name": "selected",
8042
+ "type": {
8043
+ "text": "string[]"
8044
+ },
8045
+ "default": "[]",
8046
+ "description": "The checked values, in the order of `options`; a value the options do not hold is kept after\nthem. A property, not an attribute: a server-rendered page sets it as data."
8047
+ }
8048
+ ],
8049
+ "methods": [],
8050
+ "attributes": [
8051
+ {
8052
+ "name": "mode",
8053
+ "fieldName": "mode",
8054
+ "type": {
8055
+ "text": "'light' | 'dark'"
8056
+ }
7790
8057
  },
7791
8058
  {
7792
- "kind": "field",
7793
- "name": "logoutAction",
8059
+ "name": "span",
8060
+ "fieldName": "span",
7794
8061
  "type": {
7795
- "text": "string"
8062
+ "text": "number"
7796
8063
  },
7797
- "description": "The URL \"Afmelden\" posts to; without it \"Afmelden\" sends `lintje-logout`.",
7798
- "attribute": "logout-action"
8064
+ "description": "Columns of the 12-column grid; default one."
7799
8065
  },
7800
8066
  {
7801
- "kind": "field",
7802
- "name": "csrf",
8067
+ "name": "name",
8068
+ "fieldName": "name",
7803
8069
  "type": {
7804
8070
  "text": "string"
7805
8071
  },
7806
8072
  "default": "''",
7807
- "description": "The session's CSRF token, posted with \"Afmelden\".",
7808
- "attribute": "csrf"
8073
+ "description": "The filter key, e.g. `p.threshold`. Without it no `lintje-values-change` is sent."
7809
8074
  },
7810
8075
  {
7811
- "kind": "field",
7812
- "name": "inline",
8076
+ "name": "label",
8077
+ "fieldName": "label",
7813
8078
  "type": {
7814
- "text": "boolean"
8079
+ "text": "string"
7815
8080
  },
7816
- "default": "false",
7817
- "description": "The content without button and popover, on the navigation's colours.",
7818
- "attribute": "inline",
7819
- "reflects": true
8081
+ "default": "''"
7820
8082
  },
7821
8083
  {
7822
- "kind": "field",
7823
- "name": "open",
8084
+ "name": "hide-label",
8085
+ "fieldName": "hideLabel",
7824
8086
  "type": {
7825
8087
  "text": "boolean"
7826
8088
  },
7827
- "default": "false",
7828
- "attribute": "open",
7829
- "reflects": true
7830
- }
7831
- ],
7832
- "methods": [],
7833
- "attributes": [
8089
+ "default": "false"
8090
+ },
7834
8091
  {
7835
- "name": "mode",
7836
- "fieldName": "mode",
8092
+ "name": "hint",
8093
+ "fieldName": "hint",
7837
8094
  "type": {
7838
- "text": "'light' | 'dark'"
8095
+ "text": "string"
7839
8096
  }
7840
8097
  },
7841
8098
  {
7842
- "name": "version",
7843
- "fieldName": "version",
8099
+ "name": "error",
8100
+ "fieldName": "error",
7844
8101
  "type": {
7845
8102
  "text": "string"
7846
8103
  },
7847
- "description": "Shown at the bottom: \"Versie 2.4.1\"."
8104
+ "description": "The Dutch error message."
7848
8105
  },
7849
8106
  {
7850
- "name": "logout-action",
7851
- "fieldName": "logoutAction",
8107
+ "name": "disabled",
8108
+ "fieldName": "disabled",
7852
8109
  "type": {
7853
- "text": "string"
8110
+ "text": "boolean"
7854
8111
  },
7855
- "description": "The URL \"Afmelden\" posts to; without it \"Afmelden\" sends `lintje-logout`."
8112
+ "default": "false"
7856
8113
  },
7857
8114
  {
7858
- "name": "csrf",
7859
- "fieldName": "csrf",
8115
+ "name": "modified",
8116
+ "fieldName": "modified",
7860
8117
  "type": {
7861
- "text": "string"
8118
+ "text": "boolean"
7862
8119
  },
7863
- "default": "''",
7864
- "description": "The session's CSRF token, posted with \"Afmelden\"."
8120
+ "default": "false",
8121
+ "description": "Differs from the default: draws the orange dot by the label."
7865
8122
  },
7866
8123
  {
7867
- "name": "inline",
7868
- "fieldName": "inline",
8124
+ "name": "required",
8125
+ "fieldName": "required",
7869
8126
  "type": {
7870
8127
  "text": "boolean"
7871
8128
  },
7872
8129
  "default": "false",
7873
- "description": "The content without button and popover, on the navigation's colours."
8130
+ "description": "The field must be filled. Draws nothing; sets `aria-required` and form validity."
7874
8131
  },
7875
8132
  {
7876
- "name": "open",
7877
- "fieldName": "open",
8133
+ "name": "optional",
8134
+ "fieldName": "optional",
7878
8135
  "type": {
7879
8136
  "text": "boolean"
7880
8137
  },
7881
- "default": "false"
8138
+ "default": "false",
8139
+ "description": "Marks the label \"(niet verplicht)\", inside the label so it is in the accessible name."
8140
+ },
8141
+ {
8142
+ "name": "layout",
8143
+ "fieldName": "layout",
8144
+ "type": {
8145
+ "text": "'row'"
8146
+ },
8147
+ "description": "`row`: a setting's row — the name and its hint on the left, the control on the right; stacked\nagain when the field itself is narrower than 35rem (a phone, a drawer). Left out, the label\nstands above the control."
8148
+ },
8149
+ {
8150
+ "name": "reset-label",
8151
+ "fieldName": "resetLabel",
8152
+ "type": {
8153
+ "text": "string"
8154
+ },
8155
+ "description": "With `modified`: a link under the field (\"Terugzetten naar 2 tot 12\") that sends `lintje-reset`."
7882
8156
  }
7883
8157
  ],
7884
8158
  "events": [
7885
8159
  {
7886
- "name": "lintje-action",
8160
+ "name": "lintje-change",
7887
8161
  "type": {
7888
- "text": "CustomEvent<item.value>"
7889
- }
8162
+ "text": "CustomEvent<value>"
8163
+ },
8164
+ "description": "Not composed: it stops at the shadow root."
7890
8165
  },
7891
8166
  {
7892
- "name": "lintje-logout",
8167
+ "name": "lintje-reset",
7893
8168
  "type": {
7894
8169
  "text": "CustomEvent"
7895
- }
8170
+ },
8171
+ "description": "Not composed: it stops at the shadow root."
7896
8172
  },
7897
8173
  {
7898
- "name": "lintje-navigate",
8174
+ "name": "lintje-values-change",
7899
8175
  "type": {
7900
- "text": "CustomEvent<{ href }>"
8176
+ "text": "CustomEvent<{ [this.name] }>"
7901
8177
  }
7902
8178
  }
7903
8179
  ],
@@ -7907,10 +8183,10 @@
7907
8183
  "exports": [
7908
8184
  {
7909
8185
  "kind": "custom-element-definition",
7910
- "name": "lintje-user-menu",
8186
+ "name": "lintje-checkbox-group",
7911
8187
  "declaration": {
7912
- "name": "LintjeUserMenu",
7913
- "module": "src/components/frame/user-menu/user-menu.ts"
8188
+ "name": "LintjeCheckboxGroup",
8189
+ "module": "src/components/inputs/checkbox-group/checkbox-group.ts"
7914
8190
  }
7915
8191
  }
7916
8192
  ]
@@ -7924,7 +8200,7 @@
7924
8200
  "name": "LintjeCheckbox",
7925
8201
  "tagName": "lintje-checkbox",
7926
8202
  "customElement": true,
7927
- "description": "`<lintje-checkbox>` — a checkbox; `indeterminate` shows a dash. The value is `checked`, a\nboolean, not `value` (the string a native checkbox submits). `lintje-values-change` goes out\nonly with a `name`, so `lintje-multiselect`'s unnamed rows leak nothing to the host.\n\nEvents: `lintje-change` with the boolean; with a `name` also `lintje-values-change`.",
8203
+ "description": "`<lintje-checkbox>` — a checkbox; `indeterminate` shows a dash.\n\nEvents: `lintje-change` `boolean`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
7928
8204
  "superclass": {
7929
8205
  "name": "LintjeInputElement"
7930
8206
  },
@@ -8099,6 +8375,7 @@
8099
8375
  "text": "boolean"
8100
8376
  },
8101
8377
  "default": "false",
8378
+ "description": "The value: a boolean, not `value` (the string a native checkbox submits).",
8102
8379
  "attribute": "checked",
8103
8380
  "reflects": true
8104
8381
  },
@@ -8227,7 +8504,8 @@
8227
8504
  "type": {
8228
8505
  "text": "boolean"
8229
8506
  },
8230
- "default": "false"
8507
+ "default": "false",
8508
+ "description": "The value: a boolean, not `value` (the string a native checkbox submits)."
8231
8509
  },
8232
8510
  {
8233
8511
  "name": "indeterminate",
@@ -8283,7 +8561,7 @@
8283
8561
  "name": "LintjeCombobox",
8284
8562
  "tagName": "lintje-combobox",
8285
8563
  "customElement": true,
8286
- "description": "`<lintje-combobox>` — search while typing and choose one value. Typing narrows `.options`\nitself; with `remote` it sends `lintje-search` after typing stops and shows a busy row until\nthe host sets new `.options` (it never fetches). Text that matches no option is never a value;\nemptying the field commits `null`. Escape closes and restores the previous value.\n\nEvents: `lintje-change`; with a `name` also the composed `lintje-values-change`. With\n`remote`: composed `lintje-search` `{ query }`.",
8564
+ "description": "`<lintje-combobox>` — search while typing and choose one value.\n\nTyping narrows `options` itself, unless `remote`; the element never fetches. Text that matches\nno option is never a value, and emptying the field commits `null`. Escape closes and restores\nthe previous value.\n\nEvents: `lintje-change` `string | null`, `lintje-values-change` `{ [name]: value }` (with a\n`name`), `lintje-reset` (the reset link was pressed), `lintje-search` `{ query }` (with\n`remote`, after typing stops).",
8287
8565
  "superclass": {
8288
8566
  "name": "LintjeInputElement"
8289
8567
  },
@@ -8483,6 +8761,7 @@
8483
8761
  "text": "boolean"
8484
8762
  },
8485
8763
  "default": "false",
8764
+ "description": "The host searches: `lintje-search` goes out after typing stops, and a busy row shows until\nthe host sets new `options`.",
8486
8765
  "attribute": "remote"
8487
8766
  },
8488
8767
  {
@@ -8654,7 +8933,8 @@
8654
8933
  "type": {
8655
8934
  "text": "boolean"
8656
8935
  },
8657
- "default": "false"
8936
+ "default": "false",
8937
+ "description": "The host searches: `lintje-search` goes out after typing stops, and a busy row shows until\nthe host sets new `options`."
8658
8938
  },
8659
8939
  {
8660
8940
  "name": "loading-label",
@@ -8740,7 +9020,7 @@
8740
9020
  "name": "LintjeDateInput",
8741
9021
  "tagName": "lintje-date-input",
8742
9022
  "customElement": true,
8743
- "description": "`<lintje-date-input>` — one day, typed or picked in a calendar popover.\n\nThe field shows `dd-mm-jjjj`; what crosses is ISO, or `null` when empty. Typed text is read on\nleaving the field or Enter (`date-format.ts`). The element checks its own text and shows a\nmessage in place of the hint; a host's `error` wins. A calendar day is no time zone. Tab out of\nthe element closes the calendar, so it does not cover the next field.\n\nEvents: `lintje-change` with the ISO day or `null`; with a `name` also `lintje-values-change`.",
9023
+ "description": "`<lintje-date-input>` — one day, typed or picked in a calendar popover.\n\nThe field shows `dd-mm-jjjj`; what crosses is ISO, or `null` when empty. The element reads typed\ntext on leaving the field or Enter, checks it and shows a message in place of the hint; a host's\n`error` wins. A calendar day knows no time zone. Tab out of the element closes the calendar.\n\nEvents: `lintje-change` `string | null` (the ISO day), `lintje-values-change`\n`{ [name]: value }` (with a `name`), `lintje-reset` (the reset link was pressed).",
8744
9024
  "superclass": {
8745
9025
  "name": "LintjeInputElement"
8746
9026
  },
@@ -9188,7 +9468,7 @@
9188
9468
  "name": "LintjeDateRange",
9189
9469
  "tagName": "lintje-date-range",
9190
9470
  "customElement": true,
9191
- "description": "`<lintje-date-range>` — the date range picker: a field and a popover with a calendar, presets\nand \"Wissen\"/\"Toepassen\". Dates cross as `dd-mm-yyyy`; a change carries `{from, to}`.\n\n`accessible-name` names the field inside, which `aria-label` on the host would not; the field's\nname ends in the chosen range. The calendar is one tab stop, walked with the date input's keys.\nEscape closes only the popover (`ownsEscape`); it and \"Toepassen\" give the focus back to the\nfield. Tab out of the element closes the popover. Events: `lintje-change`; with a `name` also\n`lintje-values-change` (`shared/input.ts`).",
9471
+ "description": "`<lintje-date-range>` — the date range picker: a field and a popover with a calendar, presets\nand \"Wissen\"/\"Toepassen\".\n\nEscape closes only the popover; it and \"Toepassen\" give the focus back to the field. Tab out of\nthe element closes the popover.\n\nEvents: `lintje-change` `{ from, to }`, `lintje-values-change` `{ [name]: value }` (with a\n`name`), `lintje-reset` (the reset link was pressed).",
9192
9472
  "superclass": {
9193
9473
  "name": "LintjeInputElement"
9194
9474
  },
@@ -9363,6 +9643,7 @@
9363
9643
  "text": "string"
9364
9644
  },
9365
9645
  "default": "''",
9646
+ "description": "Names the field inside, which `aria-label` on the host would not; the name ends in the\nchosen range.",
9366
9647
  "attribute": "accessible-name"
9367
9648
  },
9368
9649
  {
@@ -9391,7 +9672,8 @@
9391
9672
  "type": {
9392
9673
  "text": "DateRange"
9393
9674
  },
9394
- "default": "{ from: null, to: null }"
9675
+ "default": "{ from: null, to: null }",
9676
+ "description": "The chosen days, as `dd-mm-yyyy`."
9395
9677
  },
9396
9678
  {
9397
9679
  "kind": "field",
@@ -9524,7 +9806,8 @@
9524
9806
  "type": {
9525
9807
  "text": "string"
9526
9808
  },
9527
- "default": "''"
9809
+ "default": "''",
9810
+ "description": "Names the field inside, which `aria-label` on the host would not; the name ends in the\nchosen range."
9528
9811
  },
9529
9812
  {
9530
9813
  "name": "stacked",
@@ -9588,7 +9871,7 @@
9588
9871
  "name": "LintjeField",
9589
9872
  "tagName": "lintje-field",
9590
9873
  "customElement": true,
9591
- "description": "`<lintje-field>` — the label above a filter control. No `for`: a `<label for>` cannot name a\ncontrol in another shadow root, so each control carries its own `aria-label`; a click on the\nlabel focuses the first slotted control that takes focus.",
9874
+ "description": "`<lintje-field>` — the label above a filter control.\n\nA click on the label focuses the first slotted control that takes focus. There is no `for`: a\n`<label for>` cannot name a control in another shadow root, so each control carries its own\n`aria-label`.",
9592
9875
  "superclass": {
9593
9876
  "name": "LintjeElement"
9594
9877
  },
@@ -9696,7 +9979,7 @@
9696
9979
  "name": "LintjeFileUpload",
9697
9980
  "tagName": "lintje-file-upload",
9698
9981
  "customElement": true,
9699
- "description": "`<lintje-file-upload>` — choose or drop files, and see per file how far it is and how it ended.\nIt never uploads: it checks files against `accept` and `max-size`, sends the ones that pass\nwith `lintje-files-add`, and draws the rows from `.files`. A file it refuses itself never\nreaches the host. Its value is the ids of the rows that are done.\n\nThe button is the one control: it carries the label in its name and the types, the size and\nthe hint or error as its description. When a row with the focus goes, the focus moves to the\nrow in its place, else the one before, else the button.\n\nEvents: `lintje-files-add` (the `File[]`), `lintje-file-remove` `{ id }`, `lintje-file-cancel`\n`{ id }` — composed; `lintje-change` and, with a `name`, `lintje-values-change`.",
9982
+ "description": "`<lintje-file-upload>` — choose or drop files, and see per file how far it is and how it ended.\n\nIt never uploads: it checks files against `accept` and `max-size`, sends the ones that pass with\n`lintje-files-add` and draws the rows from `files`. A file it refuses never reaches the host.\nIts value is the ids of the rows that are done.\n\nEvents: `lintje-files-add` `File[]`, `lintje-file-remove` `{ id }`, `lintje-file-cancel`\n`{ id }`, `lintje-change` `string[]`, `lintje-values-change` `{ [name]: value }` (with a\n`name`), `lintje-reset` (the reset link was pressed).",
9700
9983
  "superclass": {
9701
9984
  "name": "LintjeInputElement"
9702
9985
  },
@@ -10118,7 +10401,7 @@
10118
10401
  "name": "LintjeMultiselect",
10119
10402
  "tagName": "lintje-multiselect",
10120
10403
  "customElement": true,
10121
- "description": "`<lintje-multiselect>` — several values in one field: chips in the field, a search and a\ncheckbox list in the popover.\n\nRows are `<lintje-checkbox>` without a `name`, so no filter change escapes the popover. The\npopover is a dialog, not a listbox: it holds a search field and buttons besides the rows. It is\nfixed to the viewport and anchored to the field: an absolute one is cut off by the scrolling\nfilter bar and sheet around it. Escape closes only the popover (`ownsEscape`) and gives the\nfocus back to the field; so does Tab out of the element, without taking the focus back.\n\nEvents: `lintje-change`; with a `name` also `lintje-values-change` (`shared/input.ts`).",
10404
+ "description": "`<lintje-multiselect>` — several values in one field: chips in the field, a search and a\ncheckbox list in the popover.\n\nThe popover is fixed to the viewport, so a scrolling filter bar or sheet around it does not cut\nit off. Escape and Tab out of the element close only the popover.\n\nEvents: `lintje-change` `string[]`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
10122
10405
  "superclass": {
10123
10406
  "name": "LintjeInputElement"
10124
10407
  },
@@ -10525,7 +10808,7 @@
10525
10808
  "name": "LintjeNumberInput",
10526
10809
  "tagName": "lintje-number-input",
10527
10810
  "customElement": true,
10528
- "description": "`<lintje-number-input>` — a −/+ stepper around a centred value, or a unit on the right\nwithout the stepper. Commits on `change`; a press on − or + commits at once.\n\n`stepper` defaults to `true`, so it can only be turned off as a property: `?stepper=${false}`\nremoves an attribute that was never there. A shown unit describes the field. At `min` or `max`\nthe step is `aria-disabled`, not disabled, so the focus on it stays. Events: `lintje-change`,\nand `lintje-values-change` with a `name`.",
10811
+ "description": "`<lintje-number-input>` — a −/+ stepper around a centred value, or a unit on the right without\nthe stepper.\n\nIt commits on `change`; a press on − or + commits at once. At `min` or `max` the step stays\nfocusable but does nothing.\n\nEvents: `lintje-change` `number | null`, `lintje-values-change` `{ [name]: value }` (with a\n`name`), `lintje-reset` (the reset link was pressed).",
10529
10812
  "superclass": {
10530
10813
  "name": "LintjeFormInputElement"
10531
10814
  },
@@ -10746,7 +11029,7 @@
10746
11029
  "type": {
10747
11030
  "text": "string"
10748
11031
  },
10749
- "description": "The unit on the right, e.g. \"min\"; shown only without the stepper.",
11032
+ "description": "The unit on the right, e.g. \"min\", which describes the field; only without the stepper.",
10750
11033
  "attribute": "unit"
10751
11034
  },
10752
11035
  {
@@ -10921,7 +11204,7 @@
10921
11204
  "type": {
10922
11205
  "text": "string"
10923
11206
  },
10924
- "description": "The unit on the right, e.g. \"min\"; shown only without the stepper."
11207
+ "description": "The unit on the right, e.g. \"min\", which describes the field; only without the stepper."
10925
11208
  },
10926
11209
  {
10927
11210
  "name": "stepper",
@@ -10986,7 +11269,7 @@
10986
11269
  "name": "LintjeRadioGroup",
10987
11270
  "tagName": "lintje-radio-group",
10988
11271
  "customElement": true,
10989
- "description": "`<lintje-radio-group>` — one option per line, for options that do not fit `lintje-segmented`.\nOptions are `FilterOption[]`. Arrow keys are the browser's: the inputs share one `name` inside\nthis shadow root, so two groups never collide. `variant=\"cards\"` draws each option as a card in\na grid, its `description` under the label, the chosen one quiet as in `lintje-segmented`.\n\nEvents: `lintje-change`; with a `name` also `lintje-values-change` (`shared/input.ts`).",
11272
+ "description": "`<lintje-radio-group>` — one option per line, for options that do not fit `lintje-segmented`.\n\nEvents: `lintje-change` `string`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
10990
11273
  "superclass": {
10991
11274
  "name": "LintjeInputElement"
10992
11275
  },
@@ -11353,7 +11636,7 @@
11353
11636
  "name": "LintjeRange",
11354
11637
  "tagName": "lintje-range",
11355
11638
  "customElement": true,
11356
- "description": "`<lintje-range>` — one track, one or two handles, over labeled steps.\n\nTwo handles: `from` and `to` are indexes into `steps`, and a change is `[from, to]`. With\n`single`, `value` is the step itself, not its index, and a change is that step. A drag commits\nwhen the pointer is let go (`draft`/`draftPair` show it meanwhile); a key press commits at once.\nWith two handles only the thumbs take the pointer, so a press on the track moves the nearer\nhandle there; on stacked handles the side of the press decides.\n\nEvents: `lintje-change`; with a `name` also `lintje-values-change` (`shared/input.ts`).",
11639
+ "description": "`<lintje-range>` — one track, one or two handles, over labeled steps.\n\nWith two handles `from` and `to` are indexes into `steps`, and a change is `[from, to]`; with\n`single`, `value` is the step itself, and a change is that step. A drag commits when the pointer\nis let go, a key press at once.\n\nEvents: `lintje-change` `[number, number] | number | string`, `lintje-values-change`\n`{ [name]: value }` (with a `name`), `lintje-reset` (the reset link was pressed).",
11357
11640
  "superclass": {
11358
11641
  "name": "LintjeInputElement"
11359
11642
  },
@@ -11791,7 +12074,7 @@
11791
12074
  "name": "LintjeSegmented",
11792
12075
  "tagName": "lintje-segmented",
11793
12076
  "customElement": true,
11794
- "description": "`<lintje-segmented>` — one row of options, the chosen one marked. A row wider than its room\nstands as a column instead, each option a row of its own.\nIn a filter bar it is `hide-label` and nameless; the bar decides what to commit.\n\nEvents: `lintje-change`; with a `name` also the composed `lintje-values-change`.",
12077
+ "description": "`<lintje-segmented>` — one row of options, the chosen one marked; a row wider than its room\nstands as a column.\n\nIn a filter bar it is `hide-label` and nameless: the bar decides what to commit.\n\nEvents: `lintje-change` `string`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
11795
12078
  "superclass": {
11796
12079
  "name": "LintjeInputElement"
11797
12080
  },
@@ -12175,7 +12458,7 @@
12175
12458
  "name": "LintjeSelect",
12176
12459
  "tagName": "lintje-select",
12177
12460
  "customElement": true,
12178
- "description": "`<lintje-select>` — a select, bold once the value differs from the default.\nThe filter bar passes no `name` and sets `hide-label`. The width is the host's, not inline,\nso `filter-layout.css` can narrow it from outside.\n\nEvents: `lintje-change`; with a `name` also the composed `lintje-values-change`.",
12461
+ "description": "`<lintje-select>` — a select, bold once the value differs from the default.\n\nIn a filter bar it is `hide-label` and nameless. Its width is the host's, so the filter layout\ncan narrow it from outside.\n\nEvents: `lintje-change` `string`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
12179
12462
  "superclass": {
12180
12463
  "name": "LintjeInputElement"
12181
12464
  },
@@ -12359,6 +12642,7 @@
12359
12642
  "text": "boolean"
12360
12643
  },
12361
12644
  "default": "false",
12645
+ "description": "Bold the value, as a modified filter does.",
12362
12646
  "attribute": "bold"
12363
12647
  },
12364
12648
  {
@@ -12501,7 +12785,8 @@
12501
12785
  "type": {
12502
12786
  "text": "boolean"
12503
12787
  },
12504
- "default": "false"
12788
+ "default": "false",
12789
+ "description": "Bold the value, as a modified filter does."
12505
12790
  },
12506
12791
  {
12507
12792
  "name": "stacked",
@@ -12557,7 +12842,7 @@
12557
12842
  "name": "LintjeSlotPicker",
12558
12843
  "tagName": "lintje-slot-picker",
12559
12844
  "customElement": true,
12560
- "description": "`<lintje-slot-picker>` — a time for an appointment: days side by side, each with its times as\noptions. One radio group over every day, so the arrow keys walk the times and Tab stops once;\na time's name carries its day. A full time stays, disabled, with the word \"Vol\" beside it\n(rule 13), and a day without times says so. The days are the host's: it sends the ones it\noffers, and pages them itself.\n\nEvents: `lintje-change` with the chosen time's `value`; with a `name` also `lintje-values-change`.",
12845
+ "description": "`<lintje-slot-picker>` — a time for an appointment: days side by side, each with its times as\noptions.\n\nThe days are the host's: it sends the ones it offers, and pages them itself. One radio group\nspans every day, so Tab stops once. A full time stays, disabled, with the word \"Vol\" beside it.\n\nEvents: `lintje-change` `string` (the chosen time's `value`), `lintje-values-change`\n`{ [name]: value }` (with a `name`), `lintje-reset` (the reset link was pressed).",
12561
12846
  "superclass": {
12562
12847
  "name": "LintjeInputElement"
12563
12848
  },
@@ -12906,7 +13191,7 @@
12906
13191
  "name": "LintjeTagInput",
12907
13192
  "tagName": "lintje-tag-input",
12908
13193
  "customElement": true,
12909
- "description": "`<lintje-tag-input>` — free keywords as chips in one field. Enter, a comma, a paste with commas\nor leaving the field makes chips; a duplicate lights up its chip and is said instead of being\nadded. With `.options` it also suggests options, and still takes a word that is not among them.\nA chip's cross is its one control: the arrows walk the crosses, Backspace and Delete remove.\n\nEvents: `lintje-change`; with a `name` also the composed `lintje-values-change`.",
13194
+ "description": "`<lintje-tag-input>` — free keywords as chips in one field.\n\nEnter, a comma, a paste with commas or leaving the field makes chips; a duplicate is pointed out\ninstead of added. With `options` it also suggests, and still takes a word that is not among\nthem.\n\nEvents: `lintje-change` `string[]`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
12910
13195
  "superclass": {
12911
13196
  "name": "LintjeInputElement"
12912
13197
  },
@@ -13280,7 +13565,7 @@
13280
13565
  "name": "LintjeTextEditor",
13281
13566
  "tagName": "lintje-text-editor",
13282
13567
  "customElement": true,
13283
- "description": "`<lintje-text-editor>` — formatted text (bold, italic, one heading, a bullet list, a link);\nthe value is markdown (`markdown.ts`). Formatting uses `document.execCommand`, the one API\nevery browser has for a `contenteditable` selection; the markdown writer reads only the five\nformats from whatever markup it leaves. Commits when the surface loses focus, if changed.\nA link is http(s), mailto, tel or relative; any other scheme is dropped.\n\nEvents: `lintje-change` with the markdown; with a `name` also the composed `lintje-values-change`.",
13568
+ "description": "`<lintje-text-editor>` — formatted text: bold, italic, one heading, a bullet list and a link.\n\nThe value is markdown, committed when the surface loses focus, if changed. A link is http(s),\nmailto, tel or relative; any other scheme is dropped.\n\nEvents: `lintje-change` `string` (the markdown), `lintje-values-change` `{ [name]: value }`\n(with a `name`), `lintje-reset` (the reset link was pressed).",
13284
13569
  "superclass": {
13285
13570
  "name": "LintjeInputElement"
13286
13571
  },
@@ -13620,7 +13905,7 @@
13620
13905
  "name": "LintjeTextInput",
13621
13906
  "tagName": "lintje-text-input",
13622
13907
  "customElement": true,
13623
- "description": "`<lintje-text-input>` — a text field: `clearable`, `error`, `readonly`, and `type` text,\nsearch, password or email. It checks nothing itself; the host sets `error`.\n\nIt commits on `change` (leaving the field, Enter), since every commit is a URL change and a\ntile reload. `commit=\"input\"` bundles keystrokes and commits 300 ms after the last. The same\nvalue is never committed twice. Events: `lintje-change`, and `lintje-values-change` with `name`.",
13908
+ "description": "`<lintje-text-input>` — a text field: text, search, password or email.\n\nIt checks nothing itself: the host sets `error`. It commits on `change` (leaving the field,\nEnter), since every commit is a URL change and a tile reload, and never commits the same value\ntwice.\n\nEvents: `lintje-change` `string`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
13624
13909
  "superclass": {
13625
13910
  "name": "LintjeFormInputElement"
13626
13911
  },
@@ -13854,7 +14139,7 @@
13854
14139
  "text": "'change' | 'input'"
13855
14140
  },
13856
14141
  "default": "'change'",
13857
- "description": "The attribute `commit`; `commit()` is the method every input commits through.",
14142
+ "description": "The attribute `commit`; `commit()` is the method every input commits through. `input`\nbundles keystrokes and commits 300 ms after the last.",
13858
14143
  "attribute": "commit"
13859
14144
  },
13860
14145
  {
@@ -14030,7 +14315,7 @@
14030
14315
  "text": "'change' | 'input'"
14031
14316
  },
14032
14317
  "default": "'change'",
14033
- "description": "The attribute `commit`; `commit()` is the method every input commits through."
14318
+ "description": "The attribute `commit`; `commit()` is the method every input commits through. `input`\nbundles keystrokes and commits 300 ms after the last."
14034
14319
  },
14035
14320
  {
14036
14321
  "name": "autocomplete",
@@ -14087,7 +14372,7 @@
14087
14372
  "name": "LintjeTextarea",
14088
14373
  "tagName": "lintje-textarea",
14089
14374
  "customElement": true,
14090
- "description": "`<lintje-textarea>` — the multi-line text field: three to twelve lines (`rows` sets the least),\nwith a counter when there is a `maxlength`. `variant=\"plain\"` drops the field's box and its\nfocus ring, takes the type of where it stands and fills its height, for a surface that frames\nthe text and draws the ring itself (`lintje-translator`). Typing past the limit is allowed (a paste lands whole); the field\nshows the error, alerted once as the text crosses the limit. The counter is read out from 90 %\nof the limit on.\n\nThe counter is `part=\"counter\"`, so a surface can stand it on its own line.\n\nCommits like `lintje-text-input`; Ctrl+Enter commits and submits a host's form.\nEvents: `lintje-change`, and `lintje-values-change` with a `name`.",
14375
+ "description": "`<lintje-textarea>` — the multi-line text field: three to twelve lines, with a counter when\nthere is a `maxlength`.\n\nIt commits like `lintje-text-input`; Ctrl+Enter commits and submits a host's form. Typing past\nthe limit is allowed, so a paste lands whole: the field shows the error. The counter is\n`part=\"counter\"`, so a surface can stand it on its own line.\n\nEvents: `lintje-change` `string`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
14091
14376
  "superclass": {
14092
14377
  "name": "LintjeFormInputElement"
14093
14378
  },
@@ -14291,7 +14576,7 @@
14291
14576
  "type": {
14292
14577
  "text": "number"
14293
14578
  },
14294
- "description": "The limit the counter counts to.",
14579
+ "description": "The limit the counter counts to; the counter is read out from 90 % of it on.",
14295
14580
  "attribute": "maxlength"
14296
14581
  },
14297
14582
  {
@@ -14331,7 +14616,7 @@
14331
14616
  "text": "'field' | 'plain'"
14332
14617
  },
14333
14618
  "default": "'field'",
14334
- "description": "`field` (default): the bordered field; `plain`: no box, the type of where it stands.",
14619
+ "description": "`field` (default): the bordered field. `plain`: no box and no focus ring, the type of where it\nstands and the full height, for a surface that frames the text and draws the ring itself.",
14335
14620
  "attribute": "variant",
14336
14621
  "reflects": true
14337
14622
  }
@@ -14472,7 +14757,7 @@
14472
14757
  "type": {
14473
14758
  "text": "number"
14474
14759
  },
14475
- "description": "The limit the counter counts to."
14760
+ "description": "The limit the counter counts to; the counter is read out from 90 % of it on."
14476
14761
  },
14477
14762
  {
14478
14763
  "name": "commit",
@@ -14507,7 +14792,7 @@
14507
14792
  "text": "'field' | 'plain'"
14508
14793
  },
14509
14794
  "default": "'field'",
14510
- "description": "`field` (default): the bordered field; `plain`: no box, the type of where it stands."
14795
+ "description": "`field` (default): the bordered field. `plain`: no box and no focus ring, the type of where it\nstands and the full height, for a surface that frames the text and draws the ring itself."
14511
14796
  }
14512
14797
  ],
14513
14798
  "events": [
@@ -14555,7 +14840,7 @@
14555
14840
  "name": "LintjeTimeInput",
14556
14841
  "tagName": "lintje-time-input",
14557
14842
  "customElement": true,
14558
- "description": "`<lintje-time-input>` — a time of day, `HH:MM` on a 24-hour clock, or `null` when empty, typed\nor picked from a list. Typed text is read on leaving the field or Enter (`time-format.ts`).\nThe list holds the times from `min` to `max`, `step` minutes apart; a typed value between two\nof them stays as typed, and the list opens on the first time at or after it without selecting\none. The element checks its own text and shows a message in place of the hint; a host's\n`error` wins. It knows no day or time zone. Tab out of the element closes the list, so it does\nnot cover the next field.\n\nEvents: `lintje-change` with `HH:MM` or `null`; with a `name` also `lintje-values-change`.",
14843
+ "description": "`<lintje-time-input>` — a time of day, `HH:MM` on a 24-hour clock, typed or picked from a list.\n\nThe element reads typed text on leaving the field or Enter, checks it and shows a message in\nplace of the hint; a host's `error` wins. A typed time between two in the list stays as typed.\nIt knows no day or time zone. Tab out of the element closes the list.\n\nEvents: `lintje-change` `string | null` (`HH:MM`), `lintje-values-change` `{ [name]: value }`\n(with a `name`), `lintje-reset` (the reset link was pressed).",
14559
14844
  "superclass": {
14560
14845
  "name": "LintjeInputElement"
14561
14846
  },
@@ -15003,7 +15288,7 @@
15003
15288
  "name": "LintjeToggle",
15004
15289
  "tagName": "lintje-toggle",
15005
15290
  "customElement": true,
15006
- "description": "`<lintje-toggle>` — a switch for immediate effect: it commits when switched, never in a form.\nA value that waits for a button is a checkbox.\n\nEvents: `lintje-change`; with a `name` also the composed `lintje-values-change`.",
15291
+ "description": "`<lintje-toggle>` — a switch for immediate effect: it commits when switched, never in a form.\n\nA value that waits for a button is a checkbox.\n\nEvents: `lintje-change` `boolean`, `lintje-values-change` `{ [name]: value }` (with a `name`),\n`lintje-reset` (the reset link was pressed).",
15007
15292
  "superclass": {
15008
15293
  "name": "LintjeInputElement"
15009
15294
  },
@@ -15344,7 +15629,7 @@
15344
15629
  "name": "LintjeExpander",
15345
15630
  "tagName": "lintje-expander",
15346
15631
  "customElement": true,
15347
- "description": "`<lintje-expander>` — a title you press; what is slotted under it shows or hides.\n\nShares its disclosure (`shared/disclosure.ts`) with `lintje-explainer` (rule 2). Closed, the\ncontent stays in the DOM, out of the tab order and the accessibility tree. What is slotted in\n`actions` stands beside the title, outside its button: a few icon buttons about the content.\n`leading` puts the chevron before the title and the content in line with the title's text, for\na stack of expanders that read as rows. `columns` sets the title in a column of its own\n(`--lintje-expander-label`) with the content beside it, as rows of text do beside their speaker;\na narrow expander stacks them again.\n\nEvents: `lintje-toggle` (open, after the reader pressed the title).",
15632
+ "description": "`<lintje-expander>` — a title you press; what is slotted under it shows or hides.\n\nClosed, the content stays in the DOM, out of the tab order and the accessibility tree. What is\nslotted in `actions` stands beside the title, outside its button: a few icon buttons about the\ncontent.\n\nEvents: `lintje-toggle` `boolean` (open, after the reader pressed the title).",
15348
15633
  "superclass": {
15349
15634
  "name": "LintjeGridItemElement"
15350
15635
  },
@@ -15427,7 +15712,7 @@
15427
15712
  "text": "boolean"
15428
15713
  },
15429
15714
  "default": "false",
15430
- "description": "The chevron before the title, the content under the title's text.",
15715
+ "description": "The chevron before the title, the content under the title's text: expanders read as rows.",
15431
15716
  "attribute": "leading",
15432
15717
  "reflects": true
15433
15718
  },
@@ -15438,7 +15723,7 @@
15438
15723
  "text": "boolean"
15439
15724
  },
15440
15725
  "default": "false",
15441
- "description": "The title in a column of its own, the content beside it.",
15726
+ "description": "The title in a column of its own (`--lintje-expander-label`), the content beside it, as rows\nof text beside their speaker; a narrow expander stacks them again.",
15442
15727
  "attribute": "columns",
15443
15728
  "reflects": true
15444
15729
  }
@@ -15507,7 +15792,7 @@
15507
15792
  "text": "boolean"
15508
15793
  },
15509
15794
  "default": "false",
15510
- "description": "The chevron before the title, the content under the title's text."
15795
+ "description": "The chevron before the title, the content under the title's text: expanders read as rows."
15511
15796
  },
15512
15797
  {
15513
15798
  "name": "columns",
@@ -15516,7 +15801,7 @@
15516
15801
  "text": "boolean"
15517
15802
  },
15518
15803
  "default": "false",
15519
- "description": "The title in a column of its own, the content beside it."
15804
+ "description": "The title in a column of its own (`--lintje-expander-label`), the content beside it, as rows\nof text beside their speaker; a narrow expander stacks them again."
15520
15805
  }
15521
15806
  ],
15522
15807
  "events": [
@@ -15557,7 +15842,7 @@
15557
15842
  "name": "LintjeSplitPane",
15558
15843
  "tagName": "lintje-split-pane",
15559
15844
  "customElement": true,
15560
- "description": "`<lintje-split-pane>` — two panels side by side with a split the reader moves.\n\nWithout dragging (WCAG 2.5.7): a click on the strip lifts the split, and the next click places\nit where it lands; Escape or a click outside puts it back. A double click returns to 50/50.\n\nBelow 768 px there are never two panels: a `<lintje-segmented>` chooses which one shows. That\nchoice is `pane`; a host that keeps it in the URL sets `pane` back.\n\nEvents: `lintje-split-change` (the percentage), `lintje-pane-change` (`'start'` | `'end'`).",
15845
+ "description": "`<lintje-split-pane>` — two panels side by side with a split the reader moves.\n\nIt moves without dragging too: a click on the strip lifts the split and the next click places\nit; Escape or a click outside puts it back, a double click returns to 50/50. Below 768 px there\nare never two panels: a segmented control chooses which one shows.\n\nEvents: `lintje-split-change` `number` (the percentage), `lintje-pane-change`\n`'start' | 'end'`.",
15561
15846
  "superclass": {
15562
15847
  "name": "LintjeElement"
15563
15848
  },
@@ -15636,6 +15921,7 @@
15636
15921
  "text": "'start' | 'end'"
15637
15922
  },
15638
15923
  "default": "'start'",
15924
+ "description": "The panel shown below 768 px; a host that keeps it in the URL sets it back.",
15639
15925
  "attribute": "pane",
15640
15926
  "reflects": true
15641
15927
  }
@@ -15705,7 +15991,8 @@
15705
15991
  "type": {
15706
15992
  "text": "'start' | 'end'"
15707
15993
  },
15708
- "default": "'start'"
15994
+ "default": "'start'",
15995
+ "description": "The panel shown below 768 px; a host that keeps it in the URL sets it back."
15709
15996
  }
15710
15997
  ],
15711
15998
  "events": [
@@ -15752,7 +16039,7 @@
15752
16039
  "name": "LintjeTabs",
15753
16040
  "tagName": "lintje-tabs",
15754
16041
  "customElement": true,
15755
- "description": "`<lintje-tabs>` — switches between panels slotted under each tab's `value`. The host holds\n`value`; the tabs only ask. A modified click on a link tab is the browser's.\nThe row is one tab stop: arrows choose at once, and a disabled tab is reached but not chosen.\n`variant=\"panel\"` draws large tabs that head a panel: each with an icon and a hint, the chosen\none running into the panel below; on a phone the icon stands above the label and the hint goes.\nWhen every tab is a link, the row is a `<nav>` of links, the chosen one `aria-current=\"page\"`,\nwith the same look: pages are no tabs, and the content under it is the page's, not a tabpanel.\n\nEvents: `lintje-tab-change` (the value), `lintje-navigate` `{ href }` for a tab with an `href`.",
16042
+ "description": "`<lintje-tabs>` — switches between panels slotted under each tab's `value`.\n\nThe host holds `value`: the tabs only ask. The row is one tab stop; arrows choose at once. When\nevery tab is a link, the row is a `<nav>` of links with the same look, and the content under it\nis the page's, not a tab panel.\n\nEvents: `lintje-tab-change` `string` (the value), `lintje-navigate` `{ href }` (a tab with an\n`href`).",
15756
16043
  "superclass": {
15757
16044
  "name": "LintjeElement"
15758
16045
  },
@@ -15801,7 +16088,7 @@
15801
16088
  "text": "'line' | 'panel'"
15802
16089
  },
15803
16090
  "default": "'line'",
15804
- "description": "`line` (default): a row over the content; `panel`: large tabs that head a bordered panel.",
16091
+ "description": "`line` (default): a row over the content. `panel`: large tabs that head a bordered panel, each\nwith an icon and a hint; on a phone the icon stands above the label and the hint goes.",
15805
16092
  "attribute": "variant",
15806
16093
  "reflects": true
15807
16094
  }
@@ -15838,7 +16125,7 @@
15838
16125
  "text": "'line' | 'panel'"
15839
16126
  },
15840
16127
  "default": "'line'",
15841
- "description": "`line` (default): a row over the content; `panel`: large tabs that head a bordered panel."
16128
+ "description": "`line` (default): a row over the content. `panel`: large tabs that head a bordered panel, each\nwith an icon and a hint; on a phone the icon stands above the label and the hint goes."
15842
16129
  }
15843
16130
  ],
15844
16131
  "events": [
@@ -15882,7 +16169,7 @@
15882
16169
  "name": "LintjeMap",
15883
16170
  "tagName": "lintje-map",
15884
16171
  "customElement": true,
15885
- "description": "`<lintje-map>` — a map in its tile. The map shows a new layer at once and expects the host\nto confirm it in the next `data`. `tile.expandable` shows the same map again in the modal; the\nmodal's own events stop here.\n\nEvents: `lintje-mark-select` `{id, label, href?}` (`href` is the one the server minted on that\nmark) and `lintje-layer-change` (the chosen layer's `value`). Undoing a selection is\n`lintje-mark-select` with `id: null` and `data.clearHref`, so a page that keeps the selection\nin the URL can drop it. With `data.controls.lasso`, `.circle` or `.rect` a drawn area chooses\nevery mark in it — two or more tools share one button that opens their menu:\n`lintje-area-select` `{area, ids}`, and `{area: null, ids: []}` when it is undone; the host\nkeeps the area in its URL and sends it back as `selectedArea`.",
16172
+ "description": "`<lintje-map>` — a map in its tile.\n\nA new layer shows at once and expects the host to confirm it in the next `data`. With\n`tile.expandable` the same map shows again in the modal, whose own events stop here. With\n`data.controls.lasso`, `.circle` or `.rect` a drawn area chooses every mark in it; the host\nkeeps the area in its URL and sends it back as `selectedArea`.\n\nEvents: `lintje-mark-select` `{ id, label, href? }` (deselected, `id: null` and\n`href: data.clearHref`), `lintje-layer-change` `string` (the chosen layer's value),\n`lintje-area-select` `{ area, ids }` (undone, `{ area: null, ids: [] }`).",
15886
16173
  "superclass": {
15887
16174
  "name": "LintjeContentTileElement"
15888
16175
  },
@@ -15973,14 +16260,14 @@
15973
16260
  },
15974
16261
  {
15975
16262
  "kind": "javascript-module",
15976
- "path": "src/components/overlays/confirm-dialog/confirm-dialog.ts",
16263
+ "path": "src/components/overlays/dialog/dialog.ts",
15977
16264
  "declarations": [
15978
16265
  {
15979
16266
  "kind": "class",
15980
- "name": "LintjeConfirmDialog",
15981
- "tagName": "lintje-confirm-dialog",
16267
+ "name": "LintjeDialog",
16268
+ "tagName": "lintje-dialog",
15982
16269
  "customElement": true,
15983
- "description": "`<lintje-confirm-dialog>` — a question that needs an answer before anything goes on.\n\nThe owner holds `open`; Escape, the scrim and cancel only ask (`lintje-close`). The cancel\nbutton has the focus on open, so Enter never confirms by itself. While `busy` nothing closes.\nA dialog on the shared focus-trap stack.\n\nEvents: `lintje-confirm`, `lintje-close` `{ reason: 'cancel' | 'escape' | 'scrim' }`,\n`lintje-action` from the third button.",
16270
+ "description": "`<lintje-dialog>` — the small window: a question that needs an answer, or a short form. The\nlarge window for content is `<lintje-modal>`.\n\nThe host holds `open` and puts its own buttons in `actions`: Escape, the close button and the\nscrim only ask. Focus goes to the slotted element with `autofocus`, else the first field; an\nalert without one takes it itself, so Enter never confirms. Below 768 px the buttons stack\nwith the last on top: put the safe one first.\n\nEvents: `lintje-close` `{ reason: 'escape' | 'scrim' | 'button' }`.",
15984
16271
  "superclass": {
15985
16272
  "name": "LintjeElement"
15986
16273
  },
@@ -16014,45 +16301,40 @@
16014
16301
  "text": "string"
16015
16302
  },
16016
16303
  "default": "''",
16017
- "description": "The question, and the dialog's accessible name.",
16304
+ "description": "The question or the task, and the dialog's accessible name.",
16018
16305
  "attribute": "heading"
16019
16306
  },
16020
16307
  {
16021
16308
  "kind": "field",
16022
- "name": "confirmLabel",
16023
- "type": {
16024
- "text": "string"
16025
- },
16026
- "default": "'Bevestigen'",
16027
- "description": "The verb of the action (\"Verwijderen\"), never \"OK\".",
16028
- "attribute": "confirm-label"
16029
- },
16030
- {
16031
- "kind": "field",
16032
- "name": "cancelLabel",
16309
+ "name": "alert",
16033
16310
  "type": {
16034
- "text": "string"
16311
+ "text": "boolean"
16035
16312
  },
16036
- "default": "'Annuleren'",
16037
- "attribute": "cancel-label"
16313
+ "default": "false",
16314
+ "description": "A question that needs an answer: an `alertdialog`, without a close button.",
16315
+ "attribute": "alert",
16316
+ "reflects": true
16038
16317
  },
16039
16318
  {
16040
16319
  "kind": "field",
16041
- "name": "actionLabel",
16320
+ "name": "persistent",
16042
16321
  "type": {
16043
- "text": "string"
16322
+ "text": "boolean"
16044
16323
  },
16045
- "description": "A third, tertiary button in front (\"Weggooien\").",
16046
- "attribute": "action-label"
16324
+ "default": "false",
16325
+ "description": "Escape and the scrim ask nothing, for a question that must be answered.",
16326
+ "attribute": "persistent",
16327
+ "reflects": true
16047
16328
  },
16048
16329
  {
16049
16330
  "kind": "field",
16050
- "name": "tone",
16331
+ "name": "wide",
16051
16332
  "type": {
16052
- "text": "'danger' | 'primary'"
16333
+ "text": "boolean"
16053
16334
  },
16054
- "default": "'danger'",
16055
- "attribute": "tone",
16335
+ "default": "false",
16336
+ "description": "As wide as a short form reads, instead of a question.",
16337
+ "attribute": "wide",
16056
16338
  "reflects": true
16057
16339
  },
16058
16340
  {
@@ -16061,8 +16343,7 @@
16061
16343
  "type": {
16062
16344
  "text": "boolean"
16063
16345
  },
16064
- "default": "false",
16065
- "description": "The confirmed action is under way: nothing else can be pressed, Escape does nothing.",
16346
+ "default": "new PropertyHold('busy')",
16066
16347
  "attribute": "busy",
16067
16348
  "reflects": true
16068
16349
  }
@@ -16092,40 +16373,34 @@
16092
16373
  "text": "string"
16093
16374
  },
16094
16375
  "default": "''",
16095
- "description": "The question, and the dialog's accessible name."
16096
- },
16097
- {
16098
- "name": "confirm-label",
16099
- "fieldName": "confirmLabel",
16100
- "type": {
16101
- "text": "string"
16102
- },
16103
- "default": "'Bevestigen'",
16104
- "description": "The verb of the action (\"Verwijderen\"), never \"OK\"."
16376
+ "description": "The question or the task, and the dialog's accessible name."
16105
16377
  },
16106
16378
  {
16107
- "name": "cancel-label",
16108
- "fieldName": "cancelLabel",
16379
+ "name": "alert",
16380
+ "fieldName": "alert",
16109
16381
  "type": {
16110
- "text": "string"
16382
+ "text": "boolean"
16111
16383
  },
16112
- "default": "'Annuleren'"
16384
+ "default": "false",
16385
+ "description": "A question that needs an answer: an `alertdialog`, without a close button."
16113
16386
  },
16114
16387
  {
16115
- "name": "action-label",
16116
- "fieldName": "actionLabel",
16388
+ "name": "persistent",
16389
+ "fieldName": "persistent",
16117
16390
  "type": {
16118
- "text": "string"
16391
+ "text": "boolean"
16119
16392
  },
16120
- "description": "A third, tertiary button in front (\"Weggooien\")."
16393
+ "default": "false",
16394
+ "description": "Escape and the scrim ask nothing, for a question that must be answered."
16121
16395
  },
16122
16396
  {
16123
- "name": "tone",
16124
- "fieldName": "tone",
16397
+ "name": "wide",
16398
+ "fieldName": "wide",
16125
16399
  "type": {
16126
- "text": "'danger' | 'primary'"
16400
+ "text": "boolean"
16127
16401
  },
16128
- "default": "'danger'"
16402
+ "default": "false",
16403
+ "description": "As wide as a short form reads, instead of a question."
16129
16404
  },
16130
16405
  {
16131
16406
  "name": "busy",
@@ -16133,33 +16408,26 @@
16133
16408
  "type": {
16134
16409
  "text": "boolean"
16135
16410
  },
16136
- "default": "false",
16137
- "description": "The confirmed action is under way: nothing else can be pressed, Escape does nothing."
16411
+ "default": "new PropertyHold('busy')"
16138
16412
  }
16139
16413
  ],
16140
16414
  "events": [
16141
- {
16142
- "name": "lintje-action",
16143
- "type": {
16144
- "text": "CustomEvent"
16145
- }
16146
- },
16147
16415
  {
16148
16416
  "name": "lintje-close",
16149
16417
  "type": {
16150
16418
  "text": "CustomEvent<{ reason }>"
16151
16419
  }
16152
- },
16153
- {
16154
- "name": "lintje-confirm",
16155
- "type": {
16156
- "text": "CustomEvent"
16157
- }
16158
16420
  }
16159
16421
  ],
16160
16422
  "slots": [
16161
16423
  {
16162
16424
  "name": ""
16425
+ },
16426
+ {
16427
+ "name": "actions"
16428
+ },
16429
+ {
16430
+ "name": "footer"
16163
16431
  }
16164
16432
  ]
16165
16433
  }
@@ -16167,10 +16435,10 @@
16167
16435
  "exports": [
16168
16436
  {
16169
16437
  "kind": "custom-element-definition",
16170
- "name": "lintje-confirm-dialog",
16438
+ "name": "lintje-dialog",
16171
16439
  "declaration": {
16172
- "name": "LintjeConfirmDialog",
16173
- "module": "src/components/overlays/confirm-dialog/confirm-dialog.ts"
16440
+ "name": "LintjeDialog",
16441
+ "module": "src/components/overlays/dialog/dialog.ts"
16174
16442
  }
16175
16443
  }
16176
16444
  ]
@@ -16184,7 +16452,7 @@
16184
16452
  "name": "LintjeDrawer",
16185
16453
  "tagName": "lintje-drawer",
16186
16454
  "customElement": true,
16187
- "description": "`<lintje-drawer>` — a side panel over the page, for a detail or a short form.\n\nThe host holds `open`: Escape, the close button and the scrim only ask. Whether unsaved input\nneeds confirming first is the host's call. While `busy` none of them asks. The footer slot is\nhidden when empty. A dialog on the shared focus-trap stack; focus goes to the first field,\nelse the close button.\n\nEvents: `lintje-close` `{ reason: 'escape' | 'button' | 'scrim' }`.",
16455
+ "description": "`<lintje-drawer>` — a side panel over the page, for a detail or a short form.\n\nThe host holds `open`: Escape, the close button and the scrim only ask. While `busy` none\nof them asks. Focus goes to the first field, else the close button.\n\nEvents: `lintje-close` `{ reason: 'escape' | 'button' | 'scrim' }`.",
16188
16456
  "superclass": {
16189
16457
  "name": "LintjeElement"
16190
16458
  },
@@ -16207,7 +16475,7 @@
16207
16475
  "text": "boolean"
16208
16476
  },
16209
16477
  "default": "false",
16210
- "description": "The host's: the drawer only asks to be closed.",
16478
+ "description": "The host's: the drawer only asks to be closed. Whether unsaved input needs confirming first\nis the host's call.",
16211
16479
  "attribute": "open",
16212
16480
  "reflects": true
16213
16481
  },
@@ -16257,7 +16525,7 @@
16257
16525
  "text": "boolean"
16258
16526
  },
16259
16527
  "default": "false",
16260
- "description": "The host's: the drawer only asks to be closed."
16528
+ "description": "The host's: the drawer only asks to be closed. Whether unsaved input needs confirming first\nis the host's call."
16261
16529
  },
16262
16530
  {
16263
16531
  "name": "heading",
@@ -16323,7 +16591,7 @@
16323
16591
  "name": "LintjeModal",
16324
16592
  "tagName": "lintje-modal",
16325
16593
  "customElement": true,
16326
- "description": "`<lintje-modal>` — the expand modal: title, subtitle, slotted content, a footer.\n\nIt is `position: fixed` above the app frame, so no ancestor may carry a `transform`, `filter`\nor `contain`. The footer is hidden, not unrendered, when empty: an unrendered slot never\nreports its content again.\n\n`narrow` makes it a dialog with a form: as high as its content and as wide as a form reads,\nwith a sentence in `footer` on the left and its buttons in `actions` on the right.\n\nEvents: `lintje-close` (the host owns `open`), `lintje-download-csv`, `lintje-download-png`.",
16594
+ "description": "`<lintje-modal>` — the large window for content: a title, the content and a footer. A question\nor a short form goes in the small `<lintje-dialog>`.\n\nThe host holds `open`: Escape, the close button and the scrim only ask. It is `position: fixed`\nabove the app frame, so no ancestor may carry a `transform`, `filter` or `contain`.\n\nEvents: `lintje-close`, `lintje-download-csv`, `lintje-download-png`.",
16327
16595
  "superclass": {
16328
16596
  "name": "LintjeElement"
16329
16597
  },
@@ -16356,8 +16624,8 @@
16356
16624
  "type": {
16357
16625
  "text": "string"
16358
16626
  },
16359
- "default": "'Vergroot'",
16360
- "description": "The dialog's accessible name and its title line.",
16627
+ "default": "''",
16628
+ "description": "The dialog's accessible name and its title line; without it the dialog is \"Venster\".",
16361
16629
  "attribute": "heading"
16362
16630
  },
16363
16631
  {
@@ -16374,8 +16642,8 @@
16374
16642
  "type": {
16375
16643
  "text": "boolean"
16376
16644
  },
16377
- "default": "true",
16378
- "description": "The footer's CSV and PNG buttons. Default `true`: bind as a property, `.csv=${false}`.",
16645
+ "default": "false",
16646
+ "description": "The footer's CSV and PNG buttons, for content that can be downloaded.",
16379
16647
  "attribute": "csv"
16380
16648
  },
16381
16649
  {
@@ -16384,19 +16652,8 @@
16384
16652
  "type": {
16385
16653
  "text": "boolean"
16386
16654
  },
16387
- "default": "true",
16388
- "attribute": "png"
16389
- },
16390
- {
16391
- "kind": "field",
16392
- "name": "narrow",
16393
- "type": {
16394
- "text": "boolean"
16395
- },
16396
16655
  "default": "false",
16397
- "description": "A dialog with a form: its content's height, a form's width.",
16398
- "attribute": "narrow",
16399
- "reflects": true
16656
+ "attribute": "png"
16400
16657
  }
16401
16658
  ],
16402
16659
  "methods": [],
@@ -16423,8 +16680,8 @@
16423
16680
  "type": {
16424
16681
  "text": "string"
16425
16682
  },
16426
- "default": "'Vergroot'",
16427
- "description": "The dialog's accessible name and its title line."
16683
+ "default": "''",
16684
+ "description": "The dialog's accessible name and its title line; without it the dialog is \"Venster\"."
16428
16685
  },
16429
16686
  {
16430
16687
  "name": "subtitle",
@@ -16439,8 +16696,8 @@
16439
16696
  "type": {
16440
16697
  "text": "boolean"
16441
16698
  },
16442
- "default": "true",
16443
- "description": "The footer's CSV and PNG buttons. Default `true`: bind as a property, `.csv=${false}`."
16699
+ "default": "false",
16700
+ "description": "The footer's CSV and PNG buttons, for content that can be downloaded."
16444
16701
  },
16445
16702
  {
16446
16703
  "name": "png",
@@ -16448,16 +16705,7 @@
16448
16705
  "type": {
16449
16706
  "text": "boolean"
16450
16707
  },
16451
- "default": "true"
16452
- },
16453
- {
16454
- "name": "narrow",
16455
- "fieldName": "narrow",
16456
- "type": {
16457
- "text": "boolean"
16458
- },
16459
- "default": "false",
16460
- "description": "A dialog with a form: its content's height, a form's width."
16708
+ "default": "false"
16461
16709
  }
16462
16710
  ],
16463
16711
  "events": [
@@ -16513,7 +16761,7 @@
16513
16761
  "name": "LintjeToggletip",
16514
16762
  "tagName": "lintje-toggletip",
16515
16763
  "customElement": true,
16516
- "description": "`<lintje-toggletip>` — a small \"i\" button that shows a short explanation on a click.\n\nThe trigger is a real `<button>` in this root, not a nested `<lintje-icon-button>`, because\n`aria-controls` cannot point across a shadow boundary. The explanation is a `role=\"status\"`\nregion that is always rendered, empty and `.visually-hidden` while closed: filling a region\nthat already exists is what a screen reader announces. Escape is taken in the capture phase\nand stopped, so a modal or sheet around it stays open. The popover is fixed to the viewport\nand placed by `place()`, so a scrolling tile cannot cut it off.\n\nEvents: `lintje-toggle` (composed, bubbling), detail `{ open }`.",
16764
+ "description": "`<lintje-toggletip>` — a small \"i\" button that shows a short explanation on a click.\n\nEscape closes it and stops there, so a modal or sheet around it stays open. The explanation is\nfixed to the viewport, so a scrolling tile cannot cut it off.\n\nEvents: `lintje-toggle` `{ open }`.",
16517
16765
  "superclass": {
16518
16766
  "name": "LintjeElement"
16519
16767
  },
@@ -16630,7 +16878,7 @@
16630
16878
  "name": "LintjeActivityLog",
16631
16879
  "tagName": "lintje-activity-log",
16632
16880
  "customElement": true,
16633
- "description": "`<lintje-activity-log>` — a timeline of what happened to one item, newest first.\n\nShows `limit` entries and \"Toon eerdere\" for ten more; when that press removes the button,\nfocus moves to the first new entry. The host sends the entries in order with `when` already\nwritten in Dutch.",
16881
+ "description": "`<lintje-activity-log>` — a timeline of what happened to one item, newest first.\n\nThe host sends the entries in order, with `when` already written in Dutch. \"Toon eerdere\" shows\nten more.",
16634
16882
  "superclass": {
16635
16883
  "name": "LintjeElement"
16636
16884
  },
@@ -16742,7 +16990,7 @@
16742
16990
  "name": "LintjeCardList",
16743
16991
  "tagName": "lintje-card-list",
16744
16992
  "customElement": true,
16745
- "description": "`<lintje-card-list>` — a collection as cards: a real list, in as many columns as fit up to\n`max-columns`, every card in a row as tall as the tallest. Below 768 px one column.\n`layout=\"horizontal\"` draws every card across, two side by side at most where they fit.\n\nSlots: `empty` for the way out under the empty text (a link, a button).\n\nIt draws `lintje-card` for each item and adds nothing of its own; the cards' events pass\nthrough. While `loading` it holds skeleton cards, so the page does not jump; a status region\nthat is always there says it loads, and then how many it loaded.\n\nEvents: those of its cards.",
16993
+ "description": "`<lintje-card-list>` — a collection as cards: a real list, in as many columns as fit, every\ncard in a row as tall as the tallest; below 768 px one column.\n\nIt draws a `lintje-card` for each item and adds nothing of its own: the cards' events reach the\nhost as they are. While `loading` it holds skeleton cards, so the page does not jump. The\n`empty` slot takes the way out under the empty text, such as a link.",
16746
16994
  "superclass": {
16747
16995
  "name": "LintjeElement"
16748
16996
  },
@@ -16782,7 +17030,7 @@
16782
17030
  "text": "'vertical' | 'horizontal'"
16783
17031
  },
16784
17032
  "default": "'vertical'",
16785
- "description": "`horizontal`: every card with its picture in a column on the left, for a long list.",
17033
+ "description": "`horizontal`: every card with its picture in a column on the left, for a long list; two side\nby side at most, where they fit.",
16786
17034
  "attribute": "layout",
16787
17035
  "reflects": true
16788
17036
  },
@@ -16870,7 +17118,7 @@
16870
17118
  "text": "'vertical' | 'horizontal'"
16871
17119
  },
16872
17120
  "default": "'vertical'",
16873
- "description": "`horizontal`: every card with its picture in a column on the left, for a long list."
17121
+ "description": "`horizontal`: every card with its picture in a column on the left, for a long list; two side\nby side at most, where they fit."
16874
17122
  },
16875
17123
  {
16876
17124
  "name": "heading-level",
@@ -16952,7 +17200,7 @@
16952
17200
  "name": "LintjeCard",
16953
17201
  "tagName": "lintje-card",
16954
17202
  "customElement": true,
16955
- "description": "`<lintje-card>` — one item of a collection: a product, a dataset, a recording, an app. A muted\nline above the title (its kind, its owner), the title, a line of text, optionally a few facts\nas a small table, a status as a glyph and its word, and at most two actions. A screenshot stands above it, a logo beside the title.\nSquare and flat; in a grid it is drawn by `lintje-card-list`.\n\n`layout=\"horizontal\"` puts the picture or logo in a column on the left, for a long list; below\n768 px it stands as the vertical card.\n\nA card is either a link or carries actions, never both. Without actions and with `href` the\nwhole card is clickable and the title is its one tab stop; with actions only the title and the\nactions are. The card knows no domain: \"toegang\" or \"eigenaar\" are the host's words.\n\n`iconActions` stand beside the title as icon buttons, also on a card that is a link: an action\non the item itself, such as marking it. One with `pressed` is a switch; the card keeps nothing\nand the host sets the new `pressed` after the event.\n\n`layout=\"horizontal\"` wants a column of at least `--w-card-wide`; `lintje-card-list` keeps to it.\n\nEvents: `lintje-navigate` `{ href }` (a plain click on the title, the card or an action with an\n`href` in this tab), `lintje-card-action` `{ id, value }` (an action without `href`) and\n`{ id, value, pressed }` (an icon action, with a switch's value asked for).",
17203
+ "description": "`<lintje-card>` — one item of a collection: a product, a dataset, a recording, an app.\n\nSquare and flat; in a grid it is drawn by `lintje-card-list`. A card is either a link or carries\nactions, never both: with an `href` and no actions the whole card is clickable. Icon actions\nstand beside the title, also on a card that is a link; one with `pressed` is a switch, and the\nhost sets the new `pressed` after the event. The card knows no domain: \"toegang\" or \"eigenaar\"\nare the host's words.\n\nEvents: `lintje-navigate` `{ href }` (a plain click on the title, the card or an action with an\n`href`), `lintje-card-action` `{ id, value, pressed? }` (an action without `href`; `pressed`\nfrom an icon action that is a switch).",
16956
17204
  "superclass": {
16957
17205
  "name": "LintjeElement"
16958
17206
  },
@@ -16982,7 +17230,7 @@
16982
17230
  "text": "'vertical' | 'horizontal'"
16983
17231
  },
16984
17232
  "default": "'vertical'",
16985
- "description": "`horizontal`: the picture in a column on the left, for a long list.",
17233
+ "description": "`horizontal`: the picture or logo in a column on the left, for a long list; below 768 px the\nvertical card. It wants a column of at least `--w-card-wide`, as `lintje-card-list` keeps.",
16986
17234
  "attribute": "layout",
16987
17235
  "reflects": true
16988
17236
  },
@@ -17035,7 +17283,7 @@
17035
17283
  "text": "'vertical' | 'horizontal'"
17036
17284
  },
17037
17285
  "default": "'vertical'",
17038
- "description": "`horizontal`: the picture in a column on the left, for a long list."
17286
+ "description": "`horizontal`: the picture or logo in a column on the left, for a long list; below 768 px the\nvertical card. It wants a column of at least `--w-card-wide`, as `lintje-card-list` keeps."
17039
17287
  },
17040
17288
  {
17041
17289
  "name": "heading-level",
@@ -17102,7 +17350,7 @@
17102
17350
  "name": "LintjeDataTable",
17103
17351
  "tagName": "lintje-data-table",
17104
17352
  "customElement": true,
17105
- "description": "`<lintje-data-table>` — the data table, inside a tile. Below 768 px it switches to a\ntwo-column representation. Missing values are a muted dash, never 0 (rule 15).\n\nThe table never filters, saves or confirms: it asks and the host answers in `data`. Its\nextensions live in `editing.ts`, `actions.ts` and `filters.ts`. `bare` draws the table alone,\nfor a component that already stands in a tile; `plain` draws it on an application page,\nwithout a tile but with its states.\n\nEvents: `lintje-sort-change` `{key, direction} | null`, `lintje-row-click` `{id, label, href?}`,\n`lintje-row-open` `{id, label, href?}`,\n`lintje-checked-change` (the keys). Each shows the change at once and expects the host to\nconfirm it in the next `data`. With the extensions: `lintje-cell-edit` `{id, column, value}`,\n`lintje-row-action` `{id, action}`, `lintje-bulk-action` `{ids, action}`,\n`lintje-filter-change` `{column, value}`, `lintje-columns-change` `{order, hidden}`.",
17353
+ "description": "`<lintje-data-table>` — the data table, inside a tile; below 768 px a two-column list.\n\nA missing value is a muted dash, never 0. The table never filters, saves or confirms: it shows a\nchange at once, and the host confirms it in the next `data`. Open rows and collapsed groups are\nthe table's own: it sends nothing for them.\n\nEvents: `lintje-sort-change` `{ key, direction } | null`, `lintje-row-click`\n`{ id, label, href? }`, `lintje-row-open` `{ id, label, href? }`, `lintje-checked-change`\n`string[]`, `lintje-cell-edit` `{ id, column, value }`, `lintje-row-action` `{ id, action }`,\n`lintje-bulk-action` `{ ids, action }`, `lintje-filter-change` `{ column, value }`,\n`lintje-columns-change` `{ order, hidden }`.",
17106
17354
  "superclass": {
17107
17355
  "name": "LintjeContentTileElement"
17108
17356
  },
@@ -17145,6 +17393,7 @@
17145
17393
  "text": "boolean"
17146
17394
  },
17147
17395
  "default": "false",
17396
+ "description": "The table alone, for a component that already stands in a tile.",
17148
17397
  "attribute": "bare"
17149
17398
  },
17150
17399
  {
@@ -17154,7 +17403,7 @@
17154
17403
  "text": "boolean"
17155
17404
  },
17156
17405
  "default": "false",
17157
- "description": "On an application page: no tile, so no title or tile buttons; the page's heading names it.",
17406
+ "description": "On an application page: no tile, so no title or tile buttons, but with its states; the page's\nheading names it.",
17158
17407
  "attribute": "plain",
17159
17408
  "reflects": true
17160
17409
  }
@@ -17182,7 +17431,8 @@
17182
17431
  "type": {
17183
17432
  "text": "boolean"
17184
17433
  },
17185
- "default": "false"
17434
+ "default": "false",
17435
+ "description": "The table alone, for a component that already stands in a tile."
17186
17436
  },
17187
17437
  {
17188
17438
  "name": "plain",
@@ -17191,7 +17441,7 @@
17191
17441
  "text": "boolean"
17192
17442
  },
17193
17443
  "default": "false",
17194
- "description": "On an application page: no tile, so no title or tile buttons; the page's heading names it."
17444
+ "description": "On an application page: no tile, so no title or tile buttons, but with its states; the page's\nheading names it."
17195
17445
  }
17196
17446
  ],
17197
17447
  "events": [
@@ -17273,7 +17523,7 @@
17273
17523
  "name": "LintjeDescriptionList",
17274
17524
  "tagName": "lintje-description-list",
17275
17525
  "customElement": true,
17276
- "description": "`<lintje-description-list>` — label-value pairs for a detail or a review screen, a real `<dl>`.\n\nA missing value (`null`, `undefined` or `''`) is a muted dash, never 0 (rule 15). A plain click\non a link is cancelled and sent as `lintje-navigate`; a modified click is the browser's.\n\n`layout=\"grid\"` sets the pairs as cells side by side, for a summary of what is about to happen\n(\"Deze opname\"): a cell can take two columns, carry an icon and a tone, show its value as tags,\nand take richer content through a slot named by the item (`slot`). Below 30rem of its own width\nit has two columns.\n\nEvents: `lintje-navigate` `{ href }`.",
17526
+ "description": "`<lintje-description-list>` — label-value pairs for a detail or a review screen, a real `<dl>`.\n\nA missing value (`null`, `undefined` or `''`) is a muted dash, never 0. A plain click on a link\nis cancelled and sent as `lintje-navigate`.\n\nEvents: `lintje-navigate` `{ href }`.",
17277
17527
  "superclass": {
17278
17528
  "name": "LintjeGridItemElement"
17279
17529
  },
@@ -17317,7 +17567,7 @@
17317
17567
  "text": "'row' | 'column' | 'grid'"
17318
17568
  },
17319
17569
  "default": "'row'",
17320
- "description": "`column` keeps the label above the value at every width; `row` only below 768 px; `grid`: cells.",
17570
+ "description": "`column` keeps the label above the value at every width; `row` only below 768 px. `grid` sets\nthe pairs as cells side by side, for a summary of what is about to happen (\"Deze opname\"): a\ncell can take two columns, an icon and a tone, show its value as tags, and take richer content\nthrough a slot named by the item (`slot`).",
17321
17571
  "attribute": "layout",
17322
17572
  "reflects": true
17323
17573
  },
@@ -17367,7 +17617,7 @@
17367
17617
  "text": "'row' | 'column' | 'grid'"
17368
17618
  },
17369
17619
  "default": "'row'",
17370
- "description": "`column` keeps the label above the value at every width; `row` only below 768 px; `grid`: cells."
17620
+ "description": "`column` keeps the label above the value at every width; `row` only below 768 px. `grid` sets\nthe pairs as cells side by side, for a summary of what is about to happen (\"Deze opname\"): a\ncell can take two columns, an icon and a tone, show its value as tags, and take richer content\nthrough a slot named by the item (`slot`)."
17371
17621
  },
17372
17622
  {
17373
17623
  "name": "columns",
@@ -17423,7 +17673,7 @@
17423
17673
  "name": "LintjeList",
17424
17674
  "tagName": "lintje-list",
17425
17675
  "customElement": true,
17426
- "description": "`<lintje-list>` — rows for what needs no columns: title, a muted line, a fact or actions. It is\nalso the work list: what someone made or had made, in progress or done, with the kind as an\nicon, the state as a word, the progress as a bar, and rows grouped under a moment (\"Vandaag\").\nA row's title is one line, cut with an ellipsis; it wraps where no pointer shows its tooltip:\nbelow 768 px, without hover, and under the keyboard's focus. A run's moment is a heading at\n`heading-level`.\n\nThe whole row is clickable but the title is the one tab stop; a row with `clickable: false` opens\nnothing, and its title is plain text or, with an `href`, only a link. It does not navigate: a plain\nclick is cancelled and sent as `lintje-row-click`; a modifier click on a title link is the\nbrowser's. A menu's `lintje-action` is stopped and sent again with its row. When the focused\ncontrol leaves with an update (a row removed, an action replaced), the focus goes to the same\nrow's other control, else the next row, the previous one, or the list itself. A rename that ends\ngives the focus to its row's first control, found by its id or, saved under a new one, its place.\n\nA row with `rename` turns its title into a field in place, with its save and cancel: renaming\nneeds no dialog. The host keeps the state, as it does for every row.\n\nEvents: `lintje-row-click` `{ id, label, href? }`, `lintje-row-action` `{ id, label, value }`\n(every chosen menu row, a link row included, and the row's own `action`), `lintje-navigate` `{ href }` (from a link row in a\nmenu, after its `lintje-row-action`), `lintje-row-rename` `{ id, value }` and\n`lintje-row-rename-cancel` `{ id }` (Enter and Escape too).",
17676
+ "description": "`<lintje-list>` — rows for what needs no columns: title, a muted line, a fact or actions.\n\nIt is also the work list: what someone made or had made, with its kind, state and progress, in\nruns under a moment (\"Vandaag\"). It does not navigate: a plain click on a row is cancelled and\nsent as `lintje-row-click`, and a link row in a menu also sends `lintje-navigate` after its\n`lintje-row-action`. A row with `rename` turns its title into a field in place; the host keeps\nthat state, as for every row.\n\nEvents: `lintje-row-click` `{ id, label, href? }`, `lintje-row-action` `{ id, label, value }` (a\nchosen menu row or the row's own action), `lintje-row-rename` `{ id, value }`,\n`lintje-row-rename-cancel` `{ id }`.",
17427
17677
  "superclass": {
17428
17678
  "name": "LintjeElement"
17429
17679
  },
@@ -17579,7 +17829,7 @@
17579
17829
  "name": "LintjePagination",
17580
17830
  "tagName": "lintje-pagination",
17581
17831
  "customElement": true,
17582
- "description": "`<lintje-pagination>` — the \"21–40 van 131 documenten\" count on the left, \"Vorige\", page\nnumbers and \"Volgende\" in the middle and, with `page-sizes`, the choice how many stand on a page\non the right. Where the three do not fit on one line the count and the choice go below.\n\nIt does not write the URL. With `href-template` every page is a link and a plain click is\nhanded to the host as `lintje-navigate`; without one they are buttons. A choice shows at once\nand the host confirms it through `page` and `page-size`. Pages count from 1.\n\nEvents: `lintje-page-change` `{ page }`; `lintje-page-size-change` `{ pageSize, page }`, where\n`page` is the one that keeps the first row in view; with `href-template` also\n`lintje-navigate` `{ href }`.",
17832
+ "description": "`<lintje-pagination>` — the \"21–40 van 131 documenten\" count, \"Vorige\", the page numbers and\n\"Volgende\" and, with `page-sizes`, the choice how many stand on a page.\n\nIt does not write the URL: a choice shows at once, and the host confirms it through `page` and\n`page-size`. With `href-template` every page is a link; without one they are buttons. Pages\ncount from 1.\n\nEvents: `lintje-page-change` `{ page }`, `lintje-page-size-change` `{ pageSize, page }` (`page`\nkeeps the first row in view), `lintje-navigate` `{ href }` (with `href-template`).",
17583
17833
  "superclass": {
17584
17834
  "name": "LintjeElement"
17585
17835
  },
@@ -17622,6 +17872,15 @@
17622
17872
  "description": "Rows over all pages, for the count.",
17623
17873
  "attribute": "total"
17624
17874
  },
17875
+ {
17876
+ "kind": "field",
17877
+ "name": "filteredFrom",
17878
+ "type": {
17879
+ "text": "number"
17880
+ },
17881
+ "description": "The rows before a filter narrowed them to `total`; the count then says it was filtered.",
17882
+ "attribute": "filtered-from"
17883
+ },
17625
17884
  {
17626
17885
  "kind": "field",
17627
17886
  "name": "pageSize",
@@ -17708,6 +17967,14 @@
17708
17967
  },
17709
17968
  "description": "Rows over all pages, for the count."
17710
17969
  },
17970
+ {
17971
+ "name": "filtered-from",
17972
+ "fieldName": "filteredFrom",
17973
+ "type": {
17974
+ "text": "number"
17975
+ },
17976
+ "description": "The rows before a filter narrowed them to `total`; the count then says it was filtered."
17977
+ },
17711
17978
  {
17712
17979
  "name": "page-size",
17713
17980
  "fieldName": "pageSize",
@@ -17798,7 +18065,7 @@
17798
18065
  "name": "LintjeSortableList",
17799
18066
  "tagName": "lintje-sortable-list",
17800
18067
  "customElement": true,
17801
- "description": "`<lintje-sortable-list>` — rows reordered by dragging a grip or with the keyboard.\n\nOnly the grip starts a drag, so on a phone the list still scrolls under a finger on the row. A\ntap on a grip picks its row up as the keyboard does, and a tap on a grip puts it down there.\nIt reorders its own copy of `items` until the host sends new ones and tells an order once, when\na row is put down at a new place. Every step is read out by a `role=\"status\"`.\n\nEvents: `lintje-change` (ids, not composed); `lintje-values-change` `{ [name]: ids }` with a\n`name`; `lintje-checked-change` (ids) with `checkable`.",
18068
+ "description": "`<lintje-sortable-list>` — rows reordered by dragging a grip or with the keyboard.\n\nOnly the grip starts a drag, so on a phone the list still scrolls under a finger. It reorders\nits own copy of `items` until the host sends new ones, and tells an order once, when a row is\nput down at a new place.\n\nEvents: `lintje-change` `string[]` (the ids in order), `lintje-values-change`\n`{ [name]: value }` (with a `name`), `lintje-checked-change` `string[]` (with `checkable`).",
17802
18069
  "superclass": {
17803
18070
  "name": "LintjeElement"
17804
18071
  },
@@ -17931,7 +18198,7 @@
17931
18198
  "name": "LintjeTreeView",
17932
18199
  "tagName": "lintje-tree-view",
17933
18200
  "customElement": true,
17934
- "description": "`<lintje-tree-view>` — a hierarchy that folds open and shut, one tab stop with roving focus.\n\n`expanded` is the host's: the element folds its own copy and reports each fold, so a host that\nloads children on demand answers with `loading` and then `children`. It fetches nothing.\n\nEvents: `lintje-node-toggle` `{ id, open }`; `lintje-change` (id, not composed);\n`lintje-values-change` `{ [name]: id }` with a `name`.",
18201
+ "description": "`<lintje-tree-view>` — a hierarchy that folds open and shut, one tab stop with roving focus.\n\nIt fetches nothing: it folds its own copy of `expanded` and reports each fold, so a host that\nloads children on demand answers with `loading` and then `children`.\n\nEvents: `lintje-node-toggle` `{ id, open }`, `lintje-change` `string` (the chosen node's id),\n`lintje-values-change` `{ [name]: value }` (with a `name`).",
17935
18202
  "superclass": {
17936
18203
  "name": "LintjeElement"
17937
18204
  },
@@ -18070,7 +18337,7 @@
18070
18337
  "name": "LintjeIcon",
18071
18338
  "tagName": "lintje-icon",
18072
18339
  "customElement": true,
18073
- "description": "`<lintje-icon>` — one icon, named by its file in `dist-icons/` (without `.svg`).\n\nFor plain HTML pages; inside a component use `renderIcon()` (`../render.ts`), which this\nelement also draws through. Resolution: `src`, the register, loaded icons, then nothing.\nEvents: none.",
18340
+ "description": "`<lintje-icon>` — one icon, named by its file in `dist-icons/` (without `.svg`).\n\nFor plain HTML pages; inside a component use `renderIcon()`, which this element also draws\nthrough. It takes `src`, else the register, else a loaded file; without any it draws nothing.",
18074
18341
  "superclass": {
18075
18342
  "name": "LintjeElement"
18076
18343
  },
@@ -18208,7 +18475,7 @@
18208
18475
  "name": "LintjeBadge",
18209
18476
  "tagName": "lintje-badge",
18210
18477
  "customElement": true,
18211
- "description": "`<lintje-badge>` — a status as a word; two words at most (rule 13). `variant=\"count\"` is the\nquiet counter in a tab or button, `variant=\"unread\"` the round counter of the menu.\n\nA root that draws a badge without the element calls `renderBadge()` and adopts `badgeStyles`,\nas `renderIcon()` / `iconStyles` do.",
18478
+ "description": "`<lintje-badge>` — a status as a word, two words at most; the word carries the meaning, also\nbeside an `icon`.\n\nA root that draws a badge without the element calls `renderBadge()` and adopts `badgeStyles`,\nas `renderIcon()` / `iconStyles` do.",
18212
18479
  "superclass": {
18213
18480
  "name": "LintjeElement"
18214
18481
  },
@@ -18228,7 +18495,7 @@
18228
18495
  "kind": "field",
18229
18496
  "name": "tone",
18230
18497
  "type": {
18231
- "text": "BadgeTone"
18498
+ "text": "Tone"
18232
18499
  },
18233
18500
  "default": "'neutral'",
18234
18501
  "attribute": "tone",
@@ -18241,6 +18508,7 @@
18241
18508
  "text": "'label' | 'count' | 'unread'"
18242
18509
  },
18243
18510
  "default": "'label'",
18511
+ "description": "`count`: the quiet counter in a tab or button; `unread`: the round counter of the menu.",
18244
18512
  "attribute": "variant",
18245
18513
  "reflects": true
18246
18514
  },
@@ -18251,6 +18519,15 @@
18251
18519
  "text": "string"
18252
18520
  },
18253
18521
  "attribute": "label"
18522
+ },
18523
+ {
18524
+ "kind": "field",
18525
+ "name": "icon",
18526
+ "type": {
18527
+ "text": "string"
18528
+ },
18529
+ "description": "An icon file name before the word.",
18530
+ "attribute": "icon"
18254
18531
  }
18255
18532
  ],
18256
18533
  "methods": [],
@@ -18266,7 +18543,7 @@
18266
18543
  "name": "tone",
18267
18544
  "fieldName": "tone",
18268
18545
  "type": {
18269
- "text": "BadgeTone"
18546
+ "text": "Tone"
18270
18547
  },
18271
18548
  "default": "'neutral'"
18272
18549
  },
@@ -18276,7 +18553,8 @@
18276
18553
  "type": {
18277
18554
  "text": "'label' | 'count' | 'unread'"
18278
18555
  },
18279
- "default": "'label'"
18556
+ "default": "'label'",
18557
+ "description": "`count`: the quiet counter in a tab or button; `unread`: the round counter of the menu."
18280
18558
  },
18281
18559
  {
18282
18560
  "name": "label",
@@ -18284,6 +18562,14 @@
18284
18562
  "type": {
18285
18563
  "text": "string"
18286
18564
  }
18565
+ },
18566
+ {
18567
+ "name": "icon",
18568
+ "fieldName": "icon",
18569
+ "type": {
18570
+ "text": "string"
18571
+ },
18572
+ "description": "An icon file name before the word."
18287
18573
  }
18288
18574
  ],
18289
18575
  "events": [],
@@ -18314,7 +18600,7 @@
18314
18600
  "name": "LintjeButton",
18315
18601
  "tagName": "lintje-button",
18316
18602
  "customElement": true,
18317
- "description": "`<lintje-button>` — a button or, with `href`, a link with the same look.\n\n`disabled` and `busy` render `aria-disabled=\"true\"`, never the native `disabled`: the button\nstays in the tab order. A capturing `click` listener on the host swallows the activation, so\nno host listener and no form sees it. `busy` keeps the variant's colours and the exact width.\nA disabled or busy link renders no `href` and keeps `role=\"link\"` and `tabindex=\"0\"`.\n`type=\"submit\"|\"reset\"` acts on the nearest `<form>` itself: the inner `<button>` has no form\nowner in a shadow root. ARIA on the host never reaches the inner control, so what a host needs\nthere (`expanded`, `pressed`, `haspopup`, `keyshortcuts`, `accessible-name`, `description`, `invalid`) is a\nproperty; focusing the host focuses the inner control.",
18603
+ "description": "`<lintje-button>` — a button or, with `href`, a link with the same look.\n\n`disabled` and `busy` keep it in the tab order but swallow the press: no listener on the host\nand no form sees it. ARIA on the host never reaches the inner control, so what a host needs\nthere is a property; focusing the host focuses the inner control.",
18318
18604
  "superclass": {
18319
18605
  "name": "LintjeElement"
18320
18606
  },
@@ -18384,6 +18670,7 @@
18384
18670
  "text": "boolean"
18385
18671
  },
18386
18672
  "default": "false",
18673
+ "description": "At work: `aria-disabled`, with the variant's colours and the exact width kept.",
18387
18674
  "attribute": "busy",
18388
18675
  "reflects": true
18389
18676
  },
@@ -18394,6 +18681,7 @@
18394
18681
  "text": "'button' | 'submit' | 'reset'"
18395
18682
  },
18396
18683
  "default": "'button'",
18684
+ "description": "`submit` and `reset` act on the nearest `<form>` themselves: the inner `<button>` has no form\nowner in a shadow root.",
18397
18685
  "attribute": "type"
18398
18686
  },
18399
18687
  {
@@ -18402,7 +18690,7 @@
18402
18690
  "type": {
18403
18691
  "text": "string"
18404
18692
  },
18405
- "description": "Makes the button an `<a>` with the same look; `type` is then ignored.",
18693
+ "description": "Makes the button an `<a>` with the same look; `type` is then ignored. Disabled or busy, the\nlink has no `href` but stays focusable, with `role=\"link\"`.",
18406
18694
  "attribute": "href"
18407
18695
  },
18408
18696
  {
@@ -18568,7 +18856,8 @@
18568
18856
  "type": {
18569
18857
  "text": "boolean"
18570
18858
  },
18571
- "default": "false"
18859
+ "default": "false",
18860
+ "description": "At work: `aria-disabled`, with the variant's colours and the exact width kept."
18572
18861
  },
18573
18862
  {
18574
18863
  "name": "type",
@@ -18576,7 +18865,8 @@
18576
18865
  "type": {
18577
18866
  "text": "'button' | 'submit' | 'reset'"
18578
18867
  },
18579
- "default": "'button'"
18868
+ "default": "'button'",
18869
+ "description": "`submit` and `reset` act on the nearest `<form>` themselves: the inner `<button>` has no form\nowner in a shadow root."
18580
18870
  },
18581
18871
  {
18582
18872
  "name": "href",
@@ -18584,7 +18874,7 @@
18584
18874
  "type": {
18585
18875
  "text": "string"
18586
18876
  },
18587
- "description": "Makes the button an `<a>` with the same look; `type` is then ignored."
18877
+ "description": "Makes the button an `<a>` with the same look; `type` is then ignored. Disabled or busy, the\nlink has no `href` but stays focusable, with `role=\"link\"`."
18588
18878
  },
18589
18879
  {
18590
18880
  "name": "target",
@@ -18711,7 +19001,7 @@
18711
19001
  "name": "LintjeGridItem",
18712
19002
  "tagName": "lintje-grid-item",
18713
19003
  "customElement": true,
18714
- "description": "`<lintje-grid-item>` — a grid cell for non-`lintje-` content. Events: none.",
19004
+ "description": "`<lintje-grid-item>` — a grid cell for non-`lintje-` content.",
18715
19005
  "superclass": {
18716
19006
  "name": "LintjeGridItemElement"
18717
19007
  },
@@ -18787,7 +19077,7 @@
18787
19077
  "name": "LintjeGrid",
18788
19078
  "tagName": "lintje-grid",
18789
19079
  "customElement": true,
18790
- "description": "`<lintje-grid>` — the 12-column grid. Its items are its own children; a tile carries `span`\nitself and needs no wrapper.\nEvents: none.",
19080
+ "description": "`<lintje-grid>` — the 12-column grid.\n\nIts items are its own children; a tile carries `span` itself and needs no wrapper.",
18791
19081
  "superclass": {
18792
19082
  "name": "LintjeElement"
18793
19083
  },
@@ -18879,7 +19169,7 @@
18879
19169
  "name": "LintjeIconButton",
18880
19170
  "tagName": "lintje-icon-button",
18881
19171
  "customElement": true,
18882
- "description": "`<lintje-icon-button>` — a square button with one icon, or its Dutch label as text when the\nicon has no file. `disabled` renders `aria-disabled=\"true\"` and a capturing `click` listener\nswallows the activation, so the button stays focusable but no host listener sees it.\n`live` is for what listens or speaks now (dictating, reading aloud): the primary fill and\nmoving bars beside the icon; the host still sets `pressed` and the label that stops it.",
19172
+ "description": "`<lintje-icon-button>` — a square button with one icon, or its Dutch label as text when the\nicon has no file.\n\n`disabled` keeps it focusable but swallows the press: no listener on the host sees it.",
18883
19173
  "superclass": {
18884
19174
  "name": "LintjeElement"
18885
19175
  },
@@ -18985,7 +19275,7 @@
18985
19275
  "text": "boolean"
18986
19276
  },
18987
19277
  "default": "false",
18988
- "description": "It listens or speaks now: the primary fill, with moving bars beside the icon.",
19278
+ "description": "It listens or speaks now (dictating, reading aloud): the primary fill, with moving bars beside\nthe icon. The host still sets `pressed` and the label that stops it.",
18989
19279
  "attribute": "live",
18990
19280
  "reflects": true
18991
19281
  }
@@ -19077,7 +19367,7 @@
19077
19367
  "text": "boolean"
19078
19368
  },
19079
19369
  "default": "false",
19080
- "description": "It listens or speaks now: the primary fill, with moving bars beside the icon."
19370
+ "description": "It listens or speaks now (dictating, reading aloud): the primary fill, with moving bars beside\nthe icon. The host still sets `pressed` and the label that stops it."
19081
19371
  }
19082
19372
  ],
19083
19373
  "events": [],
@@ -19104,7 +19394,7 @@
19104
19394
  "name": "LintjePopover",
19105
19395
  "tagName": "lintje-popover",
19106
19396
  "customElement": true,
19107
- "description": "`<lintje-popover>` — the floating panel: a surface fixed to the viewport under its anchor\n(`.anchor`, or the previous sibling). Content and padding come through the slot.\n\nThe owner holds `open`: the popover only asks to be closed. Events: `lintje-close`\n`{ reason: 'escape' | 'outside' }`; a component drawing a popover in its own root stops it.",
19397
+ "description": "`<lintje-popover>` — the floating panel: a surface fixed to the viewport under its anchor.\n\nContent and padding come through the slot. The host holds `open`: the popover only asks to be\nclosed. A component that draws a popover in its own root stops its `lintje-close`.\n\nEvents: `lintje-close` `{ reason: 'escape' | 'outside' }`.",
19108
19398
  "superclass": {
19109
19399
  "name": "LintjeElement"
19110
19400
  },
@@ -19260,7 +19550,7 @@
19260
19550
  "name": "LintjeProgressBar",
19261
19551
  "tagName": "lintje-progress-bar",
19262
19552
  "customElement": true,
19263
- "description": "`<lintje-progress-bar>` — how far a task is. Without a `value` the duration is unknown and a\nblock slides along the track. The default slot takes one action right of the label line.\nDone, error and paused are said in the value text and marked by a glyph before the label.",
19553
+ "description": "`<lintje-progress-bar>` — how far a task is; without a `value` a block slides along the track.\n\nThe default slot takes one action right of the label line. Done, error and paused are said in\nthe value text and marked by a glyph.",
19264
19554
  "superclass": {
19265
19555
  "name": "LintjeElement"
19266
19556
  },
@@ -19316,12 +19606,12 @@
19316
19606
  },
19317
19607
  {
19318
19608
  "kind": "field",
19319
- "name": "tone",
19609
+ "name": "state",
19320
19610
  "type": {
19321
- "text": "'run' | 'done' | 'error' | 'paused'"
19611
+ "text": "Extract<WorkState, 'busy' | 'done' | 'error' | 'paused'>"
19322
19612
  },
19323
- "default": "'run'",
19324
- "attribute": "tone",
19613
+ "default": "'busy'",
19614
+ "attribute": "state",
19325
19615
  "reflects": true
19326
19616
  }
19327
19617
  ],
@@ -19369,12 +19659,12 @@
19369
19659
  "description": "The figure on the right: \"62% · nog ongeveer 3 min\"."
19370
19660
  },
19371
19661
  {
19372
- "name": "tone",
19373
- "fieldName": "tone",
19662
+ "name": "state",
19663
+ "fieldName": "state",
19374
19664
  "type": {
19375
- "text": "'run' | 'done' | 'error' | 'paused'"
19665
+ "text": "Extract<WorkState, 'busy' | 'done' | 'error' | 'paused'>"
19376
19666
  },
19377
- "default": "'run'"
19667
+ "default": "'busy'"
19378
19668
  }
19379
19669
  ],
19380
19670
  "events": [],
@@ -19405,7 +19695,7 @@
19405
19695
  "name": "LintjeSkeleton",
19406
19696
  "tagName": "lintje-skeleton",
19407
19697
  "customElement": true,
19408
- "description": "`<lintje-skeleton>` — the shimmer that holds a box while its content loads. Events: none.",
19698
+ "description": "`<lintje-skeleton>` — the shimmer that holds a box while its content loads.",
19409
19699
  "superclass": {
19410
19700
  "name": "LintjeElement"
19411
19701
  },
@@ -19492,7 +19782,7 @@
19492
19782
  "name": "LintjeSpinner",
19493
19783
  "tagName": "lintje-spinner",
19494
19784
  "customElement": true,
19495
- "description": "`<lintje-spinner>` — the loading ring for content whose shape is not known; for a known shape\nuse `<lintje-skeleton>`. The label is what a screen reader hears (`role=\"status\"`).\nEvents: none.",
19785
+ "description": "`<lintje-spinner>` — the loading ring for content whose shape is not known; for a known shape\nuse `<lintje-skeleton>`.",
19496
19786
  "superclass": {
19497
19787
  "name": "LintjeElement"
19498
19788
  },
@@ -19616,7 +19906,7 @@
19616
19906
  "name": "LintjeStatusDot",
19617
19907
  "tagName": "lintje-status-dot",
19618
19908
  "customElement": true,
19619
- "description": "`<lintje-status-dot>` — a status with its word; colour is never the only carrier (rule 13).\nEvents: none.",
19909
+ "description": "`<lintje-status-dot>` — a status as a dot with its word; colour is never the only carrier.",
19620
19910
  "superclass": {
19621
19911
  "name": "LintjeElement"
19622
19912
  },
@@ -19636,7 +19926,7 @@
19636
19926
  "kind": "field",
19637
19927
  "name": "tone",
19638
19928
  "type": {
19639
- "text": "'complete' | 'delayed' | 'outage' | 'no-data'"
19929
+ "text": "Tone | StatusTone"
19640
19930
  },
19641
19931
  "default": "'complete'",
19642
19932
  "attribute": "tone",
@@ -19674,7 +19964,7 @@
19674
19964
  "name": "tone",
19675
19965
  "fieldName": "tone",
19676
19966
  "type": {
19677
- "text": "'complete' | 'delayed' | 'outage' | 'no-data'"
19967
+ "text": "Tone | StatusTone"
19678
19968
  },
19679
19969
  "default": "'complete'"
19680
19970
  },
@@ -19719,7 +20009,7 @@
19719
20009
  "name": "LintjeTile",
19720
20010
  "tagName": "lintje-tile",
19721
20011
  "customElement": true,
19722
- "description": "`<lintje-tile>` — the frame around a chart, map or table. Top to bottom: header, notice, intro,\nlegend, content, legend (`legend-below`), footnote. `slot=\"aside\"` puts a key figure beside the\ncontent, above it below 768 px. Hover actions show on focus too, always on touch screens.\n\nEvents: `lintje-tile-expand` and `lintje-tile-download`; the host acts on them.",
20012
+ "description": "`<lintje-tile>` — the frame around a chart, map or table.\n\nTop to bottom: header, notice, intro, legend, content, legend (`legend-below`), footnote.\n`slot=\"aside\"` puts a key figure beside the content, above it below 768 px. Hover actions show\non focus too, and always on touch screens. The tile expands and downloads nothing itself: the\nhost answers its events.\n\nEvents: `lintje-tile-expand`, `lintje-tile-download`.",
19723
20013
  "superclass": {
19724
20014
  "name": "LintjeGridItemElement"
19725
20015
  },
@@ -19821,7 +20111,7 @@
19821
20111
  "kind": "field",
19822
20112
  "name": "state",
19823
20113
  "type": {
19824
- "text": "'ready' | 'loading' | 'empty' | 'error'"
20114
+ "text": "ContentStateKind"
19825
20115
  },
19826
20116
  "default": "'ready'",
19827
20117
  "description": "`loading`, `empty` and `error` stand in for the content; the tile keeps its size.",
@@ -19873,6 +20163,17 @@
19873
20163
  "default": "false",
19874
20164
  "description": "The content runs to the tile's edges and indents what it draws by the tile's padding: rows\nwhose lines reach the frame, as a work list's.",
19875
20165
  "attribute": "flush"
20166
+ },
20167
+ {
20168
+ "kind": "field",
20169
+ "name": "breakable",
20170
+ "type": {
20171
+ "text": "boolean"
20172
+ },
20173
+ "default": "false",
20174
+ "description": "On paper the tile may break between two sheets, as a long table does; otherwise it moves to\nthe next sheet whole where it fits.",
20175
+ "attribute": "breakable",
20176
+ "reflects": true
19876
20177
  }
19877
20178
  ],
19878
20179
  "methods": [],
@@ -19957,7 +20258,7 @@
19957
20258
  "name": "state",
19958
20259
  "fieldName": "state",
19959
20260
  "type": {
19960
- "text": "'ready' | 'loading' | 'empty' | 'error'"
20261
+ "text": "ContentStateKind"
19961
20262
  },
19962
20263
  "default": "'ready'",
19963
20264
  "description": "`loading`, `empty` and `error` stand in for the content; the tile keeps its size."
@@ -20001,6 +20302,15 @@
20001
20302
  },
20002
20303
  "default": "false",
20003
20304
  "description": "The content runs to the tile's edges and indents what it draws by the tile's padding: rows\nwhose lines reach the frame, as a work list's."
20305
+ },
20306
+ {
20307
+ "name": "breakable",
20308
+ "fieldName": "breakable",
20309
+ "type": {
20310
+ "text": "boolean"
20311
+ },
20312
+ "default": "false",
20313
+ "description": "On paper the tile may break between two sheets, as a long table does; otherwise it moves to\nthe next sheet whole where it fits."
20004
20314
  }
20005
20315
  ],
20006
20316
  "events": [
@@ -20062,7 +20372,7 @@
20062
20372
  "name": "LintjeTooltip",
20063
20373
  "tagName": "lintje-tooltip",
20064
20374
  "customElement": true,
20065
- "description": "`<lintje-tooltip>` — one short sentence about the element it wraps. Shows 300 ms after the\npointer rests, at once on keyboard focus; the pointer can move onto it, and Escape anywhere\nhides it. Never the only place for something\nthe reader must know. The text is the wrapped element's description; `no-describe` leaves\nthat out when it is already its name.",
20375
+ "description": "`<lintje-tooltip>` — one short sentence about the element it wraps.\n\nIt shows 300 ms after the pointer rests and at once on keyboard focus; Escape anywhere hides it.\nNever the only place for something the reader must know. The text becomes the wrapped element's\ndescription.",
20066
20376
  "superclass": {
20067
20377
  "name": "LintjeElement"
20068
20378
  },
@@ -20094,7 +20404,7 @@
20094
20404
  "text": "boolean"
20095
20405
  },
20096
20406
  "default": "false",
20097
- "description": "The text is already the element's accessible name.",
20407
+ "description": "The text is already the element's accessible name: it is not given as its description too.",
20098
20408
  "attribute": "no-describe"
20099
20409
  },
20100
20410
  {
@@ -20132,7 +20442,7 @@
20132
20442
  "text": "boolean"
20133
20443
  },
20134
20444
  "default": "false",
20135
- "description": "The text is already the element's accessible name."
20445
+ "description": "The text is already the element's accessible name: it is not given as its description too."
20136
20446
  },
20137
20447
  {
20138
20448
  "name": "placement",