@nldd/design-system 0.8.85 → 0.8.87

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 (229) hide show
  1. package/custom-elements.json +1011 -355
  2. package/dist/components/actions/icon-button/icon-button.d.ts +2 -2
  3. package/dist/components/actions/icon-button/icon-button.d.ts.map +1 -1
  4. package/dist/components/actions/icon-button/icon-button.js +3 -3
  5. package/dist/components/actions/icon-button/icon-button.js.map +1 -1
  6. package/dist/components/components.js +1546 -371
  7. package/dist/components/content/avatar/avatar.d.ts +6 -6
  8. package/dist/components/content/avatar/avatar.d.ts.map +1 -1
  9. package/dist/components/content/avatar/avatar.js +9 -9
  10. package/dist/components/content/avatar/avatar.js.map +1 -1
  11. package/dist/components/content/icon/icon-aliases.d.ts.map +1 -1
  12. package/dist/components/content/icon/icon-aliases.js +4 -0
  13. package/dist/components/content/icon/icon-aliases.js.map +1 -1
  14. package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
  15. package/dist/components/content/icon/icon-gallery-status.js +3 -26
  16. package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
  17. package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
  18. package/dist/components/content/icon/icon-registry.js +2 -0
  19. package/dist/components/content/icon/icon-registry.js.map +1 -1
  20. package/dist/components/content/icon/icon.d.ts +2 -2
  21. package/dist/components/content/icon/icon.d.ts.map +1 -1
  22. package/dist/components/content/icon/icon.js +3 -3
  23. package/dist/components/content/icon/icon.js.map +1 -1
  24. package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
  25. package/dist/components/content/icon/icon.styles.js +8 -2
  26. package/dist/components/content/icon/icon.styles.js.map +1 -1
  27. package/dist/components/content/rich-text/rich-text.d.ts +7 -6
  28. package/dist/components/content/rich-text/rich-text.d.ts.map +1 -1
  29. package/dist/components/content/rich-text/rich-text.js +8 -7
  30. package/dist/components/content/rich-text/rich-text.js.map +1 -1
  31. package/dist/components/content/text/text.d.ts +2 -2
  32. package/dist/components/content/text/text.js +3 -3
  33. package/dist/components/content/title/title.d.ts +5 -5
  34. package/dist/components/content/title/title.d.ts.map +1 -1
  35. package/dist/components/content/title/title.js +6 -6
  36. package/dist/components/content/title/title.js.map +1 -1
  37. package/dist/components/content/tooltip/tooltip.d.ts +2 -2
  38. package/dist/components/content/tooltip/tooltip.d.ts.map +1 -1
  39. package/dist/components/content/tooltip/tooltip.js +4 -4
  40. package/dist/components/content/tooltip/tooltip.js.map +1 -1
  41. package/dist/components/{dist-C09E9-dJ.js → dist-B_Mnmrj4.js} +1 -1
  42. package/dist/components/{dist-CjaG8dOI.js → dist-ByH8hQze.js} +2 -2
  43. package/dist/components/{dist-BB7TxeMK.js → dist-CRwuSgMM.js} +2 -2
  44. package/dist/components/{dist-la_b3ZSq.js → dist-CSrO_mYe.js} +1 -1
  45. package/dist/components/{dist-762GHPyH.js → dist-CX3DK4i7.js} +3 -3
  46. package/dist/components/{dist-DZoFKUO-.js → dist-CbCO0WCd.js} +1 -1
  47. package/dist/components/{dist-B_3OW7pC.js → dist-CgDuh26K.js} +1 -1
  48. package/dist/components/{dist-DaavuU6W.js → dist-DXZ-cFAl.js} +2 -2
  49. package/dist/components/{dist-CRsR6ckU.js → dist-LX8LuMac.js} +1 -1
  50. package/dist/components/{dist-BJI4-6iQ.js → dist-eVFegyjM.js} +1 -1
  51. package/dist/components/{dist-C6gnorjP.js → dist-fIxe0l7k.js} +9 -1
  52. package/dist/components/{icon-Cd4BloIM.js → icon-C_zwJZ_g.js} +14 -4
  53. package/dist/components/{icon-button-CXN0yaVx.js → icon-button-CEz4MB9H.js} +10 -10
  54. package/dist/components/inputs/code-editor/code-editor.styles.js +2 -2
  55. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.d.ts +3 -5
  56. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.d.ts.map +1 -1
  57. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.js +30 -44
  58. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.js.map +1 -1
  59. package/dist/components/inputs/text-editor/text-editor.annotations.d.ts.map +1 -1
  60. package/dist/components/inputs/text-editor/text-editor.annotations.js +31 -5
  61. package/dist/components/inputs/text-editor/text-editor.annotations.js.map +1 -1
  62. package/dist/components/inputs/text-editor/text-editor.commands.d.ts +14 -2
  63. package/dist/components/inputs/text-editor/text-editor.commands.d.ts.map +1 -1
  64. package/dist/components/inputs/text-editor/text-editor.commands.js +115 -36
  65. package/dist/components/inputs/text-editor/text-editor.commands.js.map +1 -1
  66. package/dist/components/inputs/text-editor/text-editor.cursor.d.ts +7 -0
  67. package/dist/components/inputs/text-editor/text-editor.cursor.d.ts.map +1 -0
  68. package/dist/components/inputs/text-editor/text-editor.cursor.js +207 -0
  69. package/dist/components/inputs/text-editor/text-editor.cursor.js.map +1 -0
  70. package/dist/components/inputs/text-editor/text-editor.d.ts +65 -13
  71. package/dist/components/inputs/text-editor/text-editor.d.ts.map +1 -1
  72. package/dist/components/inputs/text-editor/text-editor.emphasis.d.ts +32 -0
  73. package/dist/components/inputs/text-editor/text-editor.emphasis.d.ts.map +1 -0
  74. package/dist/components/inputs/text-editor/text-editor.emphasis.js +229 -0
  75. package/dist/components/inputs/text-editor/text-editor.emphasis.js.map +1 -0
  76. package/dist/components/inputs/text-editor/text-editor.js +177 -18
  77. package/dist/components/inputs/text-editor/text-editor.js.map +1 -1
  78. package/dist/components/inputs/text-editor/text-editor.links.d.ts +8 -0
  79. package/dist/components/inputs/text-editor/text-editor.links.d.ts.map +1 -1
  80. package/dist/components/inputs/text-editor/text-editor.links.js +30 -4
  81. package/dist/components/inputs/text-editor/text-editor.links.js.map +1 -1
  82. package/dist/components/inputs/text-editor/text-editor.markdown.d.ts.map +1 -1
  83. package/dist/components/inputs/text-editor/text-editor.markdown.js +52 -18
  84. package/dist/components/inputs/text-editor/text-editor.markdown.js.map +1 -1
  85. package/dist/components/inputs/text-editor/text-editor.mentions.d.ts +78 -11
  86. package/dist/components/inputs/text-editor/text-editor.mentions.d.ts.map +1 -1
  87. package/dist/components/inputs/text-editor/text-editor.mentions.js +190 -41
  88. package/dist/components/inputs/text-editor/text-editor.mentions.js.map +1 -1
  89. package/dist/components/inputs/text-editor/text-editor.ordered-list.d.ts +0 -2
  90. package/dist/components/inputs/text-editor/text-editor.ordered-list.d.ts.map +1 -1
  91. package/dist/components/inputs/text-editor/text-editor.ordered-list.js +21 -1
  92. package/dist/components/inputs/text-editor/text-editor.ordered-list.js.map +1 -1
  93. package/dist/components/inputs/text-editor/text-editor.styles.d.ts.map +1 -1
  94. package/dist/components/inputs/text-editor/text-editor.styles.js +11 -10
  95. package/dist/components/inputs/text-editor/text-editor.styles.js.map +1 -1
  96. package/dist/components/inputs/text-editor/text-editor.syntax.d.ts +9 -0
  97. package/dist/components/inputs/text-editor/text-editor.syntax.d.ts.map +1 -0
  98. package/dist/components/inputs/text-editor/text-editor.syntax.js +20 -0
  99. package/dist/components/inputs/text-editor/text-editor.syntax.js.map +1 -0
  100. package/dist/components/layout/collection/collection.d.ts +15 -8
  101. package/dist/components/layout/collection/collection.d.ts.map +1 -1
  102. package/dist/components/layout/collection/collection.js +38 -13
  103. package/dist/components/layout/collection/collection.js.map +1 -1
  104. package/dist/components/layout/collection/collection.styles.d.ts.map +1 -1
  105. package/dist/components/layout/collection/collection.styles.js +36 -23
  106. package/dist/components/layout/collection/collection.styles.js.map +1 -1
  107. package/dist/components/layout/container/container.d.ts +11 -3
  108. package/dist/components/layout/container/container.d.ts.map +1 -1
  109. package/dist/components/layout/container/container.js +30 -17
  110. package/dist/components/layout/container/container.js.map +1 -1
  111. package/dist/components/layout/container/container.styles.d.ts.map +1 -1
  112. package/dist/components/layout/container/container.styles.js +19 -21
  113. package/dist/components/layout/container/container.styles.js.map +1 -1
  114. package/dist/components/layout/page/page.d.ts +23 -2
  115. package/dist/components/layout/page/page.d.ts.map +1 -1
  116. package/dist/components/layout/page/page.js +56 -2
  117. package/dist/components/layout/page/page.js.map +1 -1
  118. package/dist/components/layout/page/page.styles.d.ts.map +1 -1
  119. package/dist/components/layout/page/page.styles.js +33 -8
  120. package/dist/components/layout/page/page.styles.js.map +1 -1
  121. package/dist/components/layout/page-sections/page-section-controls.d.ts +0 -70
  122. package/dist/components/layout/page-sections/page-section-controls.d.ts.map +1 -1
  123. package/dist/components/layout/page-sections/page-section-controls.js +0 -3
  124. package/dist/components/layout/page-sections/page-section-controls.js.map +1 -1
  125. package/dist/components/layout/page-sections/sidebar-section/sidebar-section.styles.d.ts.map +1 -1
  126. package/dist/components/layout/page-sections/sidebar-section/sidebar-section.styles.js +7 -5
  127. package/dist/components/layout/page-sections/sidebar-section/sidebar-section.styles.js.map +1 -1
  128. package/dist/components/layout/sheet/sheet.d.ts +3 -7
  129. package/dist/components/layout/sheet/sheet.d.ts.map +1 -1
  130. package/dist/components/layout/sheet/sheet.js +4 -18
  131. package/dist/components/layout/sheet/sheet.js.map +1 -1
  132. package/dist/components/layout/sheet/sheet.styles.d.ts.map +1 -1
  133. package/dist/components/layout/sheet/sheet.styles.js +2 -6
  134. package/dist/components/layout/sheet/sheet.styles.js.map +1 -1
  135. package/dist/components/layout/sheet/sheet.template.js +2 -2
  136. package/dist/components/layout/sheet/sheet.template.js.map +1 -1
  137. package/dist/components/layout/split-views/bar-split-view/bar-split-view.d.ts +1 -1
  138. package/dist/components/layout/split-views/bar-split-view/bar-split-view.d.ts.map +1 -1
  139. package/dist/components/layout/split-views/bar-split-view/bar-split-view.js +13 -13
  140. package/dist/components/layout/split-views/bar-split-view/bar-split-view.js.map +1 -1
  141. package/dist/components/layout/split-views/bar-split-view/bar-split-view.styles.js +1 -1
  142. package/dist/components/layout/window/window.d.ts +2 -4
  143. package/dist/components/layout/window/window.d.ts.map +1 -1
  144. package/dist/components/layout/window/window.js +4 -14
  145. package/dist/components/layout/window/window.js.map +1 -1
  146. package/dist/components/layout/window/window.template.d.ts.map +1 -1
  147. package/dist/components/layout/window/window.template.js +2 -2
  148. package/dist/components/layout/window/window.template.js.map +1 -1
  149. package/dist/components/lists-and-tables/cells/icon-cell/icon-cell.d.ts +2 -2
  150. package/dist/components/lists-and-tables/cells/icon-cell/icon-cell.js +3 -3
  151. package/dist/components/lists-and-tables/cells/text-cell/text-cell.d.ts +2 -2
  152. package/dist/components/lists-and-tables/cells/text-cell/text-cell.js +3 -3
  153. package/dist/components/lists-and-tables/cells/title-cell/title-cell.d.ts +2 -2
  154. package/dist/components/lists-and-tables/cells/title-cell/title-cell.js +3 -3
  155. package/dist/components/lists-and-tables/list/list.d.ts +17 -5
  156. package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
  157. package/dist/components/lists-and-tables/list/list.js +62 -8
  158. package/dist/components/lists-and-tables/list/list.js.map +1 -1
  159. package/dist/components/lists-and-tables/list/list.styles.d.ts.map +1 -1
  160. package/dist/components/lists-and-tables/list/list.styles.js +8 -1
  161. package/dist/components/lists-and-tables/list/list.styles.js.map +1 -1
  162. package/dist/components/lists-and-tables/list/list.template.d.ts +4 -1
  163. package/dist/components/lists-and-tables/list/list.template.d.ts.map +1 -1
  164. package/dist/components/lists-and-tables/list/list.template.js +31 -12
  165. package/dist/components/lists-and-tables/list/list.template.js.map +1 -1
  166. package/dist/components/lists-and-tables/list-item/list-item.d.ts +8 -3
  167. package/dist/components/lists-and-tables/list-item/list-item.d.ts.map +1 -1
  168. package/dist/components/lists-and-tables/list-item/list-item.js +35 -9
  169. package/dist/components/lists-and-tables/list-item/list-item.js.map +1 -1
  170. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts +1 -1
  171. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts.map +1 -1
  172. package/dist/components/lists-and-tables/list-item/list-item.template.js +18 -1
  173. package/dist/components/lists-and-tables/list-item/list-item.template.js.map +1 -1
  174. package/dist/components/navigation/document-tab-bar/document-tab-bar.template.js +1 -1
  175. package/dist/components/navigation/document-tab-bar/document-tab-bar.template.js.map +1 -1
  176. package/dist/components/navigation/link/link.d.ts +2 -2
  177. package/dist/components/navigation/link/link.d.ts.map +1 -1
  178. package/dist/components/navigation/link/link.js +3 -2
  179. package/dist/components/navigation/link/link.js.map +1 -1
  180. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.d.ts.map +1 -1
  181. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js +50 -12
  182. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js.map +1 -1
  183. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.d.ts +3 -3
  184. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.d.ts.map +1 -1
  185. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.js +4 -4
  186. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.js.map +1 -1
  187. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.d.ts +8 -0
  188. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.d.ts.map +1 -1
  189. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.js +14 -0
  190. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.js.map +1 -1
  191. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.d.ts.map +1 -1
  192. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.js +22 -1
  193. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.js.map +1 -1
  194. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.d.ts.map +1 -1
  195. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.js +6 -2
  196. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.js.map +1 -1
  197. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts +3 -1
  198. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts.map +1 -1
  199. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js +5 -0
  200. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js.map +1 -1
  201. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js +3 -3
  202. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.d.ts.map +1 -1
  203. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.js +1 -0
  204. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.js.map +1 -1
  205. package/dist/components/status-and-feedback/progress-circle/progress-circle.styles.d.ts.map +1 -1
  206. package/dist/components/status-and-feedback/progress-circle/progress-circle.styles.js +15 -0
  207. package/dist/components/status-and-feedback/progress-circle/progress-circle.styles.js.map +1 -1
  208. package/dist/components/status-and-feedback/progress-circle/progress-circle.template.d.ts.map +1 -1
  209. package/dist/components/status-and-feedback/progress-circle/progress-circle.template.js +4 -3
  210. package/dist/components/status-and-feedback/progress-circle/progress-circle.template.js.map +1 -1
  211. package/dist/components/visibility-mixin-BU1vIMW7.js +161 -0
  212. package/dist/favicon.svg +10 -0
  213. package/dist/nldd.min.js +834 -676
  214. package/dist/touch-icon.png +0 -0
  215. package/dist/types/vue.d.ts +55 -33
  216. package/dist/utilities/spacing-scale.d.ts +26 -0
  217. package/dist/utilities/spacing-scale.d.ts.map +1 -0
  218. package/dist/utilities/spacing-scale.js +54 -0
  219. package/dist/utilities/spacing-scale.js.map +1 -0
  220. package/dist/utilities/visibility-mixin.d.ts +11 -8
  221. package/dist/utilities/visibility-mixin.d.ts.map +1 -1
  222. package/dist/utilities/visibility-mixin.js +58 -45
  223. package/dist/utilities/visibility-mixin.js.map +1 -1
  224. package/dist/utilities/visibility-mixin.styles.d.ts +14 -0
  225. package/dist/utilities/visibility-mixin.styles.d.ts.map +1 -0
  226. package/dist/utilities/visibility-mixin.styles.js +52 -0
  227. package/dist/utilities/visibility-mixin.styles.js.map +1 -0
  228. package/package.json +5 -2
  229. package/dist/components/visibility-mixin-vbfhyo7f.js +0 -104
Binary file
@@ -149,7 +149,7 @@ declare module 'vue' {
149
149
  'showText'?: NLDDActivityIndicator['showText'];
150
150
  /** Label text. Falls back to the translated "Laden" when unset. */
151
151
  'text'?: NLDDActivityIndicator['text'];
152
- /** 'default' waits 1000ms before showing (anti-flash); 'instant' shows immediately (the fade-in still plays). Default 'default'. */
152
+ /** 'delay' (the default) waits 1000ms before showing (anti-flash); 'instant' shows immediately (the fade-in still plays). */
153
153
  'timing'?: NLDDActivityIndicator['timing'];
154
154
  /** Mark the loader as finished while keeping the element mounted; clears aria-busy and hides the indicator. */
155
155
  'complete'?: NLDDActivityIndicator['complete'];
@@ -169,9 +169,9 @@ declare module 'vue' {
169
169
  type NLDDAvatarProps = {
170
170
  /** `person` (circle, person icon) or `organization` (rounded, building icon); default `person` */
171
171
  'type'?: NLDDAvatar['type'];
172
- /** `full` (default) scales with the container, like nldd-icon; or a fixed size in px (spacer-aligned: 16, 20, 24, 28, 32, 40, 44, 48, 56, 64, 80, 96). Empty behaves as `full`. The initials and the icon scale along */
172
+ /** `full` (the default) scales with the container, like nldd-icon; or a fixed size in px (spacer-aligned: 16, 20, 24, 28, 32, 40, 44, 48, 56, 64, 80, 96). The initials and the icon scale along */
173
173
  'size'?: NLDDAvatar['size'];
174
- /** `default` (neutral fill) or `inherit` (fill in the content color: the `--context-content-color` channel, or `currentColor` when that is unset; text in the contrast color, so the avatar can replace an icon in a button for instance); default `default` */
174
+ /** `neutral` (the default, a neutral fill) or `inherit` (fill in the content color: the `--context-content-color` channel, or `currentColor` when that is unset; text in the contrast color, so the avatar can replace an icon in a button for instance) */
175
175
  'color'?: NLDDAvatar['color'];
176
176
  /** Shrinks the visible shape to 5/6 of the host, centered, so the avatar aligns optically with an icon on the same grid (an icon glyph has built-in margin) */
177
177
  'icon-aligned'?: NLDDAvatar['iconAligned'];
@@ -193,9 +193,9 @@ declare module 'vue' {
193
193
  'accessibleLabel'?: NLDDAvatar['accessibleLabel'];
194
194
  /** Hides the avatar from assistive software (use when the name already stands beside it as text) */
195
195
  'decorative'?: NLDDAvatar['decorative'];
196
- /** When the name appears as a tooltip on hover or focus: `default` (after 700ms; the default), `instant`, or `never`. An avatar shows no text, so without a tooltip the name is readable by assistive software only. A `decorative` avatar shows none regardless: there the name already stands beside it as text */
196
+ /** When the name appears as a tooltip on hover or focus: `delay` (the default, after 700ms), `instant`, or `never`. An avatar shows no text, so without a tooltip the name is readable by assistive software only. A `decorative` avatar shows none regardless: there the name already stands beside it as text */
197
197
  'tooltip-timing'?: NLDDAvatar['tooltipTiming'];
198
- /** When the name appears as a tooltip on hover or focus: `default` (after 700ms; the default), `instant`, or `never`. An avatar shows no text, so without a tooltip the name is readable by assistive software only. A `decorative` avatar shows none regardless: there the name already stands beside it as text */
198
+ /** When the name appears as a tooltip on hover or focus: `delay` (the default, after 700ms), `instant`, or `never`. An avatar shows no text, so without a tooltip the name is readable by assistive software only. A `decorative` avatar shows none regardless: there the name already stands beside it as text */
199
199
  'tooltipTiming'?: NLDDAvatar['tooltipTiming'];
200
200
  /** Makes the avatar a link to this URL; the shape itself becomes the link, so the hit area and the focus ring follow it */
201
201
  'href'?: NLDDAvatar['href'];
@@ -583,7 +583,7 @@ declare module 'vue' {
583
583
  };
584
584
 
585
585
  type NLDDCollectionProps = {
586
- /** Layout mode: 'grid' | 'stack' | 'horizontal-scroll' (default: 'grid') */
586
+ /** Layout mode: 'grid' | 'stack' | 'lanes' | 'horizontal-scroll' (default: 'grid') */
587
587
  'layout'?: NLDDCollection['layout'];
588
588
  /** Show load-more button in grid/stack (default: false) */
589
589
  'show-load-more'?: NLDDCollection['showLoadMore'];
@@ -597,12 +597,24 @@ declare module 'vue' {
597
597
  'lazy-load'?: NLDDCollection['lazyLoad'];
598
598
  /** Automatically load more items when the button becomes visible */
599
599
  'lazyLoad'?: NLDDCollection['lazyLoad'];
600
- /** Preferred width for each item (e.g. '280px', '20rem'). In grid layout used as the minimum column width (columns will be at least this wide; 1fr if container allows more). In horizontal scroll used as flex-basis. Never forces horizontal overflow — the value is clamped to container width. */
600
+ /** Preferred width for each item (e.g. '280px', '20rem'). In grid and lanes layouts used as the minimum column width (columns will be at least this wide; 1fr if container allows more). In horizontal scroll used as flex-basis. Never forces horizontal overflow — the value is clamped to container width. */
601
601
  'item-width'?: NLDDCollection['itemWidth'];
602
- /** Preferred width for each item (e.g. '280px', '20rem'). In grid layout used as the minimum column width (columns will be at least this wide; 1fr if container allows more). In horizontal scroll used as flex-basis. Never forces horizontal overflow — the value is clamped to container width. */
602
+ /** Preferred width for each item (e.g. '280px', '20rem'). In grid and lanes layouts used as the minimum column width (columns will be at least this wide; 1fr if container allows more). In horizontal scroll used as flex-basis. Never forces horizontal overflow — the value is clamped to container width. */
603
603
  'itemWidth'?: NLDDCollection['itemWidth'];
604
- /** Custom gap between items (any CSS length, e.g. '8px'). Overrides the responsive default at every breakpoint; unset keeps the default. */
604
+ /** Gap between items, as a step of the spacing scale ('0', '2', '4', '6', '8', '10', '12', '16', '20', '24', '28', '32', '40', '44', '48', '56', '64', '80', '96'). Overrides the responsive default at every breakpoint; unset keeps the default. */
605
605
  'gap'?: NLDDCollection['gap'];
606
+ /** Gap at sm, overriding `gap` there */
607
+ 'sm-gap'?: NLDDCollection['smGap'];
608
+ /** Gap at sm, overriding `gap` there */
609
+ 'smGap'?: NLDDCollection['smGap'];
610
+ /** Gap at md, overriding `gap` there */
611
+ 'md-gap'?: NLDDCollection['mdGap'];
612
+ /** Gap at md, overriding `gap` there */
613
+ 'mdGap'?: NLDDCollection['mdGap'];
614
+ /** Gap at lg, overriding `gap` there */
615
+ 'lg-gap'?: NLDDCollection['lgGap'];
616
+ /** Gap at lg, overriding `gap` there */
617
+ 'lgGap'?: NLDDCollection['lgGap'];
606
618
  /** Translation overrides; unset keys fall back to Dutch. Available keys: 'components.collection.previous-action', 'components.collection.next-action', 'components.collection.load-more-action' */
607
619
  'translations'?: NLDDCollection['translations'];
608
620
  /** When the load-more button is clicked */
@@ -1226,7 +1238,7 @@ declare module 'vue' {
1226
1238
  type NLDDIconProps = {
1227
1239
  /** The name of the icon to display */
1228
1240
  'name'?: NLDDIcon['name'];
1229
- /** `full` (default) fills the container; `inherit` follows the surrounding text (1em); or a fixed spacer-aligned size in px (16, 20, 24, 28, 32, 40, 44, 48, 56, 64, 80, 96). Empty behaves as `full`. */
1241
+ /** `full` (the default) fills the container. `inherit` sizes the icon to the surrounding text (1em) and drops it onto that text's own line, for an icon set in a line of running text. Or a fixed spacer-aligned size in px (16, 20, 24, 28, 32, 40, 44, 48, 56, 64, 80, 96). */
1230
1242
  'size'?: NLDDIcon['size'];
1231
1243
  /** Functional (`primary-content`, `secondary-content`, `accent`, `critical`, `warning`, `success`) or rijkskleur (`lintblauw`, `donkerblauw`, `hemelblauw`, `lichtblauw`, `paars`, `violet`, `robijnrood`, `roze`, `rood`, `oranje`, `donkergeel`, `geel`, `donkerbruin`, `bruin`, `donkergroen`, `groen`, `mosgroen`, `mintgroen`). Empty = inherit `color` from parent. */
1232
1244
  'color'?: NLDDIcon['color'];
@@ -1281,9 +1293,9 @@ declare module 'vue' {
1281
1293
  'accessible-label'?: NLDDIconButton['accessibleLabel'];
1282
1294
  /** Accessible label for screen readers. Overrides text as aria-label and title tooltip. Use when the visible text alone lacks context for screen readers (e.g. text "Toon", accessible-label "Toon wachtwoord"). The text is still shown visually in lg size regardless. */
1283
1295
  'accessibleLabel'?: NLDDIconButton['accessibleLabel'];
1284
- /** Forwarded to the inner nldd-tooltip's `timing`: 'default' (700 ms show-delay), 'instant', or 'never' (suppress the visual tooltip; screen readers still get the aria-label). Use 'never' when the surrounding context already explains the button (e.g. spin buttons in nldd-number-field, the chevron in nldd-split-button). */
1296
+ /** Forwarded to the inner nldd-tooltip's `timing`: 'delay' (the default, a 700 ms show-delay), 'instant', or 'never' (suppress the visual tooltip; screen readers still get the aria-label). Use 'never' when the surrounding context already explains the button (e.g. spin buttons in nldd-number-field, the chevron in nldd-split-button). */
1285
1297
  'tooltip-timing'?: NLDDIconButton['tooltipTiming'];
1286
- /** Forwarded to the inner nldd-tooltip's `timing`: 'default' (700 ms show-delay), 'instant', or 'never' (suppress the visual tooltip; screen readers still get the aria-label). Use 'never' when the surrounding context already explains the button (e.g. spin buttons in nldd-number-field, the chevron in nldd-split-button). */
1298
+ /** Forwarded to the inner nldd-tooltip's `timing`: 'delay' (the default, a 700 ms show-delay), 'instant', or 'never' (suppress the visual tooltip; screen readers still get the aria-label). Use 'never' when the surrounding context already explains the button (e.g. spin buttons in nldd-number-field, the chevron in nldd-split-button). */
1287
1299
  'tooltipTiming'?: NLDDIconButton['tooltipTiming'];
1288
1300
  /** When set, renders an <a> element instead of <button> */
1289
1301
  'href'?: NLDDIconButton['href'];
@@ -1308,7 +1320,7 @@ declare module 'vue' {
1308
1320
  'verticalAlignment'?: NLDDIconCell['verticalAlignment'];
1309
1321
  /** Size: '16' | '20' | '24' | '32' (default: '24') */
1310
1322
  'size'?: NLDDIconCell['size'];
1311
- /** Color variant of the icon (default: 'default') */
1323
+ /** Color variant of the icon (default: 'content') */
1312
1324
  'color'?: NLDDIconCell['color'];
1313
1325
  /** Icon name (renders `<nldd-icon>`). Takes precedence over the default slot. */
1314
1326
  'icon'?: NLDDIconCell['icon'];
@@ -1407,6 +1419,10 @@ declare module 'vue' {
1407
1419
  'heading-level'?: NLDDInlineDialog['headingLevel'];
1408
1420
  /** Renders text as h1–h6; absent renders a p */
1409
1421
  'headingLevel'?: NLDDInlineDialog['headingLevel'];
1422
+ /** Overrides the alignment of text, icon and actions. Unset (the default) derives it: content in the default slot means a task, which aligns left; a bare message stays centered. Left alignment also lays the actions out in a row instead of stacked full-width. */
1423
+ 'horizontal-alignment'?: NLDDInlineDialog['horizontalAlignment'];
1424
+ /** Overrides the alignment of text, icon and actions. Unset (the default) derives it: content in the default slot means a task, which aligns left; a bare message stays centered. Left alignment also lays the actions out in a row instead of stacked full-width. */
1425
+ 'horizontalAlignment'?: NLDDInlineDialog['horizontalAlignment'];
1410
1426
  };
1411
1427
 
1412
1428
  type NLDDJustInTimeEducationProps = {
@@ -1469,7 +1485,7 @@ declare module 'vue' {
1469
1485
  'target'?: NLDDLink['target'];
1470
1486
  /** Link rel attribute; defaults to 'noopener noreferrer' with target='_blank' */
1471
1487
  'rel'?: NLDDLink['rel'];
1472
- /** Text size: 'xs' | 'sm' | 'md' | 'lg' | 'inherit'. Empty = inherit. */
1488
+ /** Text size: 'inherit' (the default) follows the surrounding text and lays the link out inline, so it wraps in running prose. 'xs' | 'sm' | 'md' | 'lg' pin a size and switch to inline-flex, which baseline-aligns a start or end icon with an explicit gap. */
1473
1489
  'size'?: NLDDLink['size'];
1474
1490
  /** Link text (alternative to the default slot) */
1475
1491
  'text'?: NLDDLink['text'];
@@ -1529,7 +1545,9 @@ declare module 'vue' {
1529
1545
  'button'?: NLDDListItem['button'];
1530
1546
  /** Makes the whole row a `role="checkbox"` control. Wins over `button`, loses to `href`. */
1531
1547
  'checkbox'?: NLDDListItem['checkbox'];
1532
- /** Checked state of a `checkbox` row; the item toggles it on activation */
1548
+ /** Makes the whole row one radio of a group: the action becomes a `role="radio"` button carrying `aria-checked`, and activation sets `checked` (never clears it) and fires `change`. Put the rows in an `nldd-list type="radiogroup"`, which is what makes them a set. Wins over `button`, loses to `href` and `checkbox`. The arrow keys move focus without checking, where a native radio group and `nldd-radio-button-group` check as they go: a row can carry more than a label, so stepping past one should not commit it. */
1549
+ 'radio'?: NLDDListItem['radio'];
1550
+ /** Checked state of a `checkbox` or `radio` row. A checkbox row toggles it on activation, a radio row only ever sets it */
1533
1551
  'checked'?: NLDDListItem['checked'];
1534
1552
  /** Switches the row's own control off: a `button` or `checkbox` row stops responding and dims, a `href` row gets `aria-disabled` and its click is blocked (a link cannot be disabled natively). A row without a control of its own has nothing to switch off, and segments carry their own `disabled`. The arrow keys skip a disabled row. */
1535
1553
  'disabled'?: NLDDListItem['disabled'];
@@ -1548,7 +1566,7 @@ declare module 'vue' {
1548
1566
  'childRows'?: NLDDListItem['childRows'];
1549
1567
  /** The branch this row hangs under, or undefined for a top-level row. */
1550
1568
  'parentRow'?: NLDDListItem['parentRow'];
1551
- /** On a `checkbox` row after it toggles; detail: { checked: boolean } */
1569
+ /** On a `checkbox` row after it toggles, and on a `radio` row when it becomes checked; detail: { checked: boolean } */
1552
1570
  'onChange'?: (event: CustomEvent) => void;
1553
1571
  };
1554
1572
 
@@ -1733,6 +1751,10 @@ declare module 'vue' {
1733
1751
  'supporting-text'?: NLDDModalDialog['supportingText'];
1734
1752
  /** Forwarded to nldd-inline-dialog; supporting text */
1735
1753
  'supportingText'?: NLDDModalDialog['supportingText'];
1754
+ /** Forwarded to nldd-inline-dialog. Unset derives it there: slotted content aligns left, a bare message stays centered. */
1755
+ 'horizontal-alignment'?: NLDDModalDialog['horizontalAlignment'];
1756
+ /** Forwarded to nldd-inline-dialog. Unset derives it there: slotted content aligns left, a bare message stays centered. */
1757
+ 'horizontalAlignment'?: NLDDModalDialog['horizontalAlignment'];
1736
1758
  /** Accessible name for the dialog (aria-label); falls back to text */
1737
1759
  'accessible-label'?: NLDDModalDialog['accessibleLabel'];
1738
1760
  /** Accessible name for the dialog (aria-label); falls back to text */
@@ -2301,7 +2323,7 @@ declare module 'vue' {
2301
2323
  'centered'?: NLDDRichText['centered'];
2302
2324
  /** Opt-in automatic hyphenation for running text (p, li, dd). Needs a correct `lang` on the page (`lang="nl"` on `<html>`, for instance): without language information the browser does not hyphenate. An `overflow-wrap: break-word` safety net on p/li is always on, independent of this attribute, so long URLs and compounds break neatly instead of overflowing even without a dictionary. */
2303
2325
  'hyphens'?: NLDDRichText['hyphens'];
2304
- /** 'inherit' lets all text follow the color of the surface (for colored areas such as the filled categories). Links stay underlined as an affordance; secondary text (figcaption) gets the same color at a lowered opacity. Known v1 gaps: inline code, mark, tables and hr keep their own surfaces. Empty = the default content colors. */
2326
+ /** 'content' (the default) takes the system's own content colors, each element its own. 'inherit' lets all text follow the color of the surface instead (for colored areas such as the filled categories). Links stay underlined as an affordance; secondary text (figcaption) gets the same color at a lowered opacity. Known v1 gaps: inline code, mark, tables and hr keep their own surfaces. */
2305
2327
  'color'?: NLDDRichText['color'];
2306
2328
  /** Override translation keys; unset keys fall back to Dutch */
2307
2329
  'translations'?: NLDDRichText['translations'];
@@ -2423,8 +2445,6 @@ declare module 'vue' {
2423
2445
  'placement'?: NLDDSheet['placement'];
2424
2446
  /** Custom height for bottom sheets (and for any sheet on sm viewports, where all placements collapse to bottom). Accepts: `'full'` (default — viewport minus top-inset, identical to omitting the attribute), `'fit-content'` (collapse to content size), or any CSS length/percentage (e.g. `'50dvh'`, `'480px'`, `'50%'`). Always clamped to `100dvh - top-inset` so the sheet can't extend past the dismiss-tap area. No effect on side sheets at md+. */
2425
2447
  'height'?: NLDDSheet['height'];
2426
- /** Non-modal (no backdrop or focus lock); the sheet is modal by default */
2427
- 'modeless'?: NLDDSheet['modeless'];
2428
2448
  /** Accessible name for the dialog, forwarded as aria-label (default: 'Venster') */
2429
2449
  'accessible-label'?: NLDDSheet['accessibleLabel'];
2430
2450
  /** Accessible name for the dialog, forwarded as aria-label (default: 'Venster') */
@@ -2860,7 +2880,7 @@ declare module 'vue' {
2860
2880
  'line-height'?: NLDDText['lineHeight'];
2861
2881
  /** Line height: 'flat' | 'tight' | 'snug' | 'loose' (default: 'snug') */
2862
2882
  'lineHeight'?: NLDDText['lineHeight'];
2863
- /** Text color: 'default' | 'secondary' | 'accent' | 'success' | 'warning' | 'critical' | 'inherit' (default: 'default'). 'default' and 'secondary' follow the surrounding content channel; 'inherit' takes the color it inherits, for text on a painted surface. */
2883
+ /** Text color: 'content' (the default) | 'secondary' | 'accent' | 'success' | 'warning' | 'critical' | 'inherit'. 'content' and 'secondary' follow the surrounding content channel; 'inherit' takes the color it inherits, for text on a painted surface. */
2864
2884
  'color'?: NLDDText['color'];
2865
2885
  /** Alignment of the text within the block: 'left' | 'center' | 'right' (default: 'left'). Aligns the words; `horizontal-alignment` on nldd-container moves the box. */
2866
2886
  'horizontal-alignment'?: NLDDText['horizontalAlignment'];
@@ -2871,7 +2891,7 @@ declare module 'vue' {
2871
2891
  type NLDDTextCellProps = {
2872
2892
  /** Cell size: 'sm' | 'md' (default: 'md') */
2873
2893
  'size'?: NLDDTextCell['size'];
2874
- /** Text color variant: 'default' | 'secondary' | 'accent' | 'success' | 'warning' | 'critical' (default: 'default'). All non-default/-secondary variants apply to all three text fields so the cell reads as a coherent state. */
2894
+ /** Text color variant: 'content' (the default) | 'secondary' | 'accent' | 'success' | 'warning' | 'critical'. All variants other than those two apply to all three text fields so the cell reads as a coherent state. */
2875
2895
  'color'?: NLDDTextCell['color'];
2876
2896
  /** 'full' | 'fit-content' | CSS length (e.g. '200px', '20rem'). Default: 'full' */
2877
2897
  'width'?: NLDDTextCell['width'];
@@ -2952,6 +2972,8 @@ declare module 'vue' {
2952
2972
  'invalid'?: NLDDTextEditor['invalid'];
2953
2973
  /** Consumer-supplied */
2954
2974
  'mentionSource'?: NLDDTextEditor['mentionSource'];
2975
+ /** Your own typeahead lists next to the */
2976
+ 'typeaheads'?: NLDDTextEditor['typeaheads'];
2955
2977
  /** Consumer-supplied annotations (W3C-style overlay). Property only (set via JS). Render only when `annotatable` is on. The text stays clean; these render as a light tint and a count badge, anchored by offset and mapped through edits. IMPORTANT: assign a NEW array to apply changes. Lit dirty-checks this property by identity, so mutating the existing array in place (`editor.annotations.push(next)`, `editor.annotations[0].end = 9`, …) does NOT trigger a re-render. Always replace it: `editor.annotations = [...editor.annotations, next]`. */
2956
2978
  'annotations'?: NLDDTextEditor['annotations'];
2957
2979
  /** Set by nldd-form-field. A consumer never writes this. */
@@ -2963,8 +2985,10 @@ declare module 'vue' {
2963
2985
  'onChange'?: (event: CustomEvent) => void;
2964
2986
  /** When the selection or content changes (detail: TextEditorState), for toolbar toggle state */
2965
2987
  'onNlddTextEditorState'?: (event: CustomEvent) => void;
2966
- /** When an @-mention is inserted (detail: MentionInsertedDetail with id, label, from, to) */
2988
+ /** When an @-mention is inserted (detail: MentionInsertedDetail with id, text, from, to; clean offsets, like getSelection()) */
2967
2989
  'onNlddTextEditorMention'?: (event: CustomEvent) => void;
2990
+ /** When a candidate from one of the `typeaheads` is chosen (detail: TypeaheadChosenDetail with trigger, candidate, from, to; clean offsets) */
2991
+ 'onNlddTextEditorTypeahead'?: (event: CustomEvent) => void;
2968
2992
  /** When an annotation's count badge is clicked (detail: { ids: string[], rect: DOMRect }); rect is the badge's viewport box so a consumer can anchor its own note UI to it */
2969
2993
  'onNlddTextEditorAnnotationClick'?: (event: CustomEvent) => void;
2970
2994
  };
@@ -3136,14 +3160,14 @@ declare module 'vue' {
3136
3160
  type NLDDTitleProps = {
3137
3161
  /** Visual size of the title: 1–6 (default: 3) */
3138
3162
  'size'?: NLDDTitle['size'];
3139
- /** 'inherit' lets the title follow the text color of the surface (for colored areas such as the filled categories); overline and subtitle get the same color at a lowered opacity. Empty = the default content colors. */
3163
+ /** 'content' (the default) takes the system's own content colors. 'inherit' lets the title follow the text color of the surface instead (for colored areas such as the filled categories); overline and subtitle get the same color at a lowered opacity. */
3140
3164
  'color'?: NLDDTitle['color'];
3141
3165
  };
3142
3166
 
3143
3167
  type NLDDTitleCellProps = {
3144
3168
  /** Visual size of the title (default: 5) */
3145
3169
  'size'?: NLDDTitleCell['size'];
3146
- /** Text color variant (default: 'default'). `secondary` demotes the title to match the muted overline/supporting-text. `accent`, `success`, `warning` and `critical` tint all three regions so the cell reads as a coherent state. */
3170
+ /** Text color variant (default: 'content'). `secondary` demotes the title to match the muted overline/supporting-text. `accent`, `success`, `warning` and `critical` tint all three regions so the cell reads as a coherent state. */
3147
3171
  'color'?: NLDDTitleCell['color'];
3148
3172
  /** 'full' | 'fit-content' | CSS length (e.g. '200px', '20rem'). Default: 'full' */
3149
3173
  'width'?: NLDDTitleCell['width'];
@@ -3391,7 +3415,7 @@ declare module 'vue' {
3391
3415
  'open'?: NLDDTooltip['open'];
3392
3416
  /** Position: 'top' | 'bottom' | 'left' | 'right' (default: 'bottom'; automatically 'top' on touch devices) */
3393
3417
  'placement'?: NLDDTooltip['placement'];
3394
- /** When the tooltip appears on hover: 'instant' — right away, without a show delay. 'default' — after the standard show delay (700ms). 'never' — the tooltip is never shown; hover and focus events are ignored, aria-describedby is suppressed, and a tooltip that is already visible disappears. The hide delay and the touch suppression stay in force under every value. A focus trigger is always instant. */
3418
+ /** When the tooltip appears on hover: 'instant' — right away, without a show delay. 'delay' (the default) — after the standard show delay (700ms). 'never' — the tooltip is never shown; hover and focus events are ignored, aria-describedby is suppressed, and a tooltip that is already visible disappears. The hide delay and the touch suppression stay in force under every value. A focus trigger is always instant. */
3395
3419
  'timing'?: NLDDTooltip['timing'];
3396
3420
  /** When a user presses Escape while `open=true`. The consumer owns the open lifecycle from there (we cannot clear `open` on our own), so this event is the consumer's chance to set `open` back to `false`. WCAG 1.4.13: a persistent hover or focus overlay has to be dismissible without moving focus. */
3397
3421
  'onNlddTooltipDismiss'?: (event: CustomEvent) => void;
@@ -3548,8 +3572,6 @@ declare module 'vue' {
3548
3572
  };
3549
3573
 
3550
3574
  type NLDDWindowProps = {
3551
- /** Modeless (no backdrop or focus trap); the window is modal by default */
3552
- 'modeless'?: NLDDWindow['modeless'];
3553
3575
  /** A click on the backdrop does not close the window. For windows where dismissing by accident costs work: a wizard, a form with filled-in fields. Escape and the dismiss button keep working. */
3554
3576
  'no-light-dismiss'?: NLDDWindow['noLightDismiss'];
3555
3577
  /** A click on the backdrop does not close the window. For windows where dismissing by accident costs work: a wizard, a form with filled-in fields. Escape and the dismiss button keep working. */
@@ -3622,11 +3644,11 @@ declare module 'vue' {
3622
3644
  'nldd-code-editor': DefineComponent<NLDDCodeEditorProps>;
3623
3645
  /** A read-only block of code/text built on a non-editable CodeMirror 6 view. Visually pairs with nldd-code-editor (same engine, same token palette). Whitespace is preserved; long lines scroll horizontally by default. Set `wrap` to break long lines onto the next visual line. Set `language` to one of the supported grammars (yaml, json, javascript, typescript, css, html, xml, bash, markdown, rust, gherkin, toml, sql, python) to highlight the content. Without `language` the content renders plain. Grammars are loaded lazily on first use, so a page that never sets `language` ships zero grammar code. Token colors are the `--components-code-viewer-token-*` custom properties (shared with the editor via the CodeMirror highlight style). Override them per-instance to swap the theme. */
3624
3646
  'nldd-code-viewer': DefineComponent<NLDDCodeViewerProps>;
3625
- /** A container for displaying collections of items. Supports grid, stack, and horizontal scroll layouts. In grid and stack modes, items are paginated via a load-more button. In horizontal scroll, the prev/next controls and the edge fade appear only when the items overflow the container. With `lazy-load`, the next items are automatically loaded when the load-more button comes into view. */
3647
+ /** A container for displaying collections of items. Supports grid, stack, lanes and horizontal scroll layouts. In grid and stack modes, items are paginated via a load-more button. In horizontal scroll, the prev/next controls and the edge fade appear only when the items overflow the container. With `lazy-load`, the next items are automatically loaded when the load-more button comes into view. */
3626
3648
  'nldd-collection': DefineComponent<NLDDCollectionProps>;
3627
3649
  /** A text input with autocomplete dropdown via nldd-menu. Add a slotted nldd-menu with nldd-menu-item children to provide options. The slotted nldd-menu keeps its default focus behavior (menu container receives focus) so that typing keeps focus on the input. The picker button moves focus to the menu explicitly on activation. Note: Only nldd-menu-item type="button" is supported. Radio and checkbox types are not supported in this context. */
3628
3650
  'nldd-combo-box': DefineComponent<NLDDComboBoxProps>;
3629
- /** A simple layout primitive: pick a layout mode, give it a gap, optionally align contents, and add padding. Padding can be set for all sides, per axis (inline/block), or per individual side. Specificity: per side > per axis > all sides. Responsive padding and gap have sm/md/lg variants. Each variant emits both an @media (viewport) and @container (layout-container) query. When inside a layout-container the @container query wins; otherwise the @media query provides the viewport-based fallback. Layout modes: - `stack` (default): block items, stacked vertically. The "what you expect from DOM flow" mode. - `row`: flex row, no wrapping. Items shrink or overflow. - `wrap`: flex row, items wrap to new lines. - `grid`: CSS grid, auto-fit columns at min 280px wide. - `columns`: CSS multi-column flow, 280px minimum column width, items don't split across column breaks. Alignment maps to the layout's natural axis: - `stack`: vertical = main-axis (justify-content), horizontal = cross-axis (align-items) - `row` / `wrap`: horizontal = main-axis, vertical = cross-axis - `grid`: horizontal = justify-items, vertical = align-items (per cell) - `columns`: alignment props have no effect (CSS multicol doesn't expose alignment) Item order is set per-child via attributes on the slotted children themselves: `<child order="3">` for a fixed position, or `<child sm-order="N">` / `<child md-order="N">` / `<child lg-order="N">` to override per breakpoint (resolved against THIS container's width via @container queries, same scope as the responsive padding/gap). The container observes slot changes and child attribute mutations and bridges these to `--_slot-order` / `--_slot-sm-order` / etc. custom properties on each child's inline style, which the container's CSS then reads via `::slotted(*)` inside @container queries. Cascade: `sm-order` falls back to `order` falls back to `0` at sm (and analogously for md/lg). No-op for `layout="columns"` (CSS multicol has no per-item ordering hook). The `column-count` attribute (1-8) forces an exact column count for `layout="grid"` (overrides auto-fit) and `layout="columns"` (overrides the natural width-driven count). `sm-column-count` / `md-column-count` / `lg-column-count` resolve against this container's OWN width via an `@container (...)` query on the host — not against the viewport. That lets a footer in a narrow sidebar choose its own column count independent of the surrounding page width. `layout="lanes"` packs items into balanced columns using native CSS grid lanes where supported, falling back to CSS multicol (column-order) elsewhere. CSS-only, no JS. Honours `gap` on both axes and `column-count`. */
3651
+ /** A simple layout primitive: pick a layout mode, give it a gap, optionally align contents, and add padding. Padding can be set for all sides, per axis (inline/block), or per individual side. Specificity: per side > per axis > all sides. Responsive padding and gap have sm/md/lg variants. Each variant emits both an @media (viewport) and @container (layout-container) query. When inside a layout-container the @container query wins; otherwise the @media query provides the viewport-based fallback. Layout modes: - `stack` (default): block items, stacked vertically. The "what you expect from DOM flow" mode. - `row`: flex row, no wrapping. Items shrink or overflow. - `wrap`: flex row, items wrap to new lines. - `grid`: CSS grid, auto-fit columns at min 280px wide. - `columns`: CSS multi-column flow, 280px minimum column width, items don't split across column breaks. Alignment maps to the layout's natural axis: - `stack`: vertical = main-axis (justify-content), horizontal = cross-axis (align-items) - `row` / `wrap`: horizontal = main-axis, vertical = cross-axis - `grid`: horizontal = justify-items, vertical = align-items (per cell) - `columns`: alignment props have no effect (CSS multicol doesn't expose alignment) Item order is set per-child via attributes on the slotted children themselves: `<child order="3">` for a fixed position, or `<child sm-order="N">` / `<child md-order="N">` / `<child lg-order="N">` to override per breakpoint (resolved against THIS container's width via @container queries, same scope as the responsive padding/gap). The container observes slot changes and child attribute mutations and bridges these to `--_slot-order` / `--_slot-sm-order` / etc. custom properties on each child's inline style, which the container's CSS then reads via `::slotted(*)` inside @container queries. Cascade: `sm-order` falls back to `order` falls back to `0` at sm (and analogously for md/lg). No-op for `layout="columns"` (CSS multicol has no per-item ordering hook). The `column-count` attribute (1-8) forces an exact column count for `layout="grid"` (overrides auto-fit) and `layout="columns"` (overrides the natural width-driven count). `sm-column-count` / `md-column-count` / `lg-column-count` resolve against this container's OWN width via an `@container (...)` query on the host — not against the viewport. That lets a footer in a narrow sidebar choose its own column count independent of the surrounding page width. `layout="lanes"` packs items into balanced columns using native CSS grid lanes where supported, falling back to CSS multicol (column-order) elsewhere. CSS-only, no JS. Honours `gap` on both axes and `column-count`. Note that nldd-collection's lanes falls back to its own grid rather than to multicol: that component pages, and multicol redistributes the whole set every time load-more adds to it. */
3630
3652
  'nldd-container': DefineComponent<NLDDContainerProps>;
3631
3653
  /** A text field for a date, with an optional calendar in a popover. The value is always ISO (yyyy-mm-dd); on screen it shows the Dutch notation (dd-mm-yyyy). Typing is not masked: input is accepted generously and normalized only when the field is left. Error messages belong to nldd-form-field, not here. This field reflects only `invalid` / `valid`, like nldd-text-field. */
3632
3654
  'nldd-date-field': DefineComponent<NLDDDateFieldProps>;
@@ -3674,7 +3696,7 @@ declare module 'vue' {
3674
3696
  'nldd-keyboard-shortcut': DefineComponent<NLDDKeyboardShortcutProps>;
3675
3697
  /** Hyperlink component with two modes: 1. **Standalone (sized)**: set `size="xs"|"sm"|"md"|"lg"` for menus, action areas or overviews. Fixed text size, `display: inline-flex` with `gap` for icon spacing. 2. **Inline (inherit)**: leave `size` out or set `size="inherit"` explicitly. The link inherits `font-size`, `line-height` and `font-family` from its surroundings. Text wraps naturally across lines (`display: inline`). Icons work here too; the natural whitespace between icon and text provides the spacing. For links in CMS or markdown output, where the `<a>` arrives as HTML, `<nldd-rich-text>` with a raw `<a>` remains the route to take. */
3676
3698
  'nldd-link': DefineComponent<NLDDLinkProps>;
3677
- /** A container for `nldd-list-item` elements. The `type` attribute switches the list's a11y role and behavior: - `list` (default) — `role="list"`, items `role="listitem"`. Reorderable allowed. - `tree` — `role="tree"`, items `role="treeitem"`. Branch rows put their child rows in their own `slot="children"`, which the item renders as a `role="group"`. Level, position and set size are NOT authored: the nesting represents the hierarchy, so assistive technology derives them. A branch row must carry `expanded`; the group is hidden while it is false. Visual indentation is the consumer's — repeat a spacer-cell per level. Comes with its own keyboard, see "Tree" below. - `navigation` — host `role="navigation"`, items with `selected` get `aria-current="page"` on their inner `<a>` or `<button>`. - `form` — rows that are not actions themselves: the controls inside them are. A row of a label and a field, a switch, a menu button, or a value you cannot change at all. Semantically the same as `list` (`role="list"`, `role="listitem"`), and everything visual is unchanged; what falls away is the keyboard of a list you walk through. No arrow navigation, so no promise of it either, and no tab stop on the row: Tab goes straight to the controls, in source order, the way it does in any form. Rows that ARE actions (`href`, `button`, `checkbox`, or a segment) contradict that and warn in development. SwiftUI draws the same line between `List` and `Form`, for the same reason. - `listbox` — an accessible, filterable listbox (combobox pattern). The list renders its OWN search input (`role="combobox"`) pinned above the options; `.list__items` becomes `role="listbox"` and items become `role="option"`. Focus stays in the input, the active option moves via `aria-activedescendant`, and filtering is consumer-managed via the `input` event (toggle `[hidden]` on items). See "Listbox" below. Selection state is consumer-managed: the list never mutates `selected` itself. A list you walk through answers to the arrow keys, and there is no attribute to switch that on. Whether the keys do something is not a property of one list: it is what a reader may assume about all of them, and a per-list setting made that unknowable from the outside. It follows the type, which you can see before you touch a key. - ArrowUp / ArrowDown — move focus between the rows there is something to do with. A row of nothing but text is skipped, because focus that leads nowhere is a dead end. - Home / End — the first / last of those rows. - Tab — the list is ONE tab stop, so Tab moves past it rather than through it. Within the current row Tab walks that row's own controls: a chevron beside a checkbox, a menu button at the end. The same controls in the other rows are held out of the tab order (`tabindex="-1"`, or `no-tab` on a design-system control that keeps its tab stop in its own shadow root), and so are this row's once focus leaves the list, so tabbing back in lands on the row again. - Escape — out of a control the row holds, back onto the row. One level up, where Shift+Tab is one step back. On the row itself the list claims nothing, so Escape carries on to whatever holds the list, and a control showing a menu keeps the first press for closing that menu. While focus sits in a control a row holds, the list stands down: those keys are the control's, and a list that took them anyway would pull focus out of a combo box or a text field mid-word. What the row IS — its own link, button or segments — keeps answering here. Arrows move focus only; selection stays consumer-managed. Three types answer differently, and all three say so on screen before you touch a key: a listbox runs its keyboard from its search field, a reorderable list moves rows with the arrows, and a form has no rows to move between at all. In `type="listbox"` the list owns a native `<input role="combobox">` (mirroring how `nldd-combo-box` wires an input to a slotted listbox). Keyboard, handled on the input so focus never leaves it: - ArrowDown / ArrowUp — move the active option among the VISIBLE (non-`[hidden]`) options (wrap around). - Home / End — first / last visible option. - Enter — activate the active option by triggering its inner action (a link navigates, a button fires the consumer's handler). Selection stays consumer-managed. - Escape — clear the search value (and refire `input`). On every active change the input's `aria-activedescendant` is set to the active option's id and the option is scrolled into view. The active option (`_highlighted` on the item, a highlight) is distinct from `selected`. Filtering is the consumer's job: listen to `input` (`{ detail: { value } }`) and toggle `[hidden]` on items; after the visible set changes the list resets the active option to the first visible one. `reorderable` and the roving arrow keys are ignored in listbox mode (listbox has its own keyboard). A tree adds to that keyboard, and counts the rows of an open branch as part of the order the arrows walk: - ArrowRight — opens a closed branch; on an open one it steps to its first child. - ArrowLeft — closes an open branch; on a leaf it steps out to the parent row. - Enter — follows the row: its own link or button, or on a segmented branch the first action that is not the chevron. A branch with only a chevron folds instead. - Space — open and close, the same as Right and Left. Only while focus sits on the row itself: a row that is its own control, and a segmented action you tabbed into, handle both keys themselves. Opening and closing runs through the row's own disclosure control — the segment marked `disclosure`, or the row itself when it is a button. The list activates that control rather than writing `expanded`, so the state keeps being set in one place: the consumer's handler. A row that is a link is never activated this way, since that would navigate away. The tree is one tab stop. Focus lands on the row itself when the row has no control of its own, because that is where `treeitem` sits and it makes assistive technology announce the row rather than a button inside it. Tab then walks the controls of THAT row (a chevron beside a checkbox, say) and leaves the list after the last one. A deliberate deviation: strictly speaking a row with several controls is a `treegrid`, not a `tree`. We keep the tree semantics — level and set size are what matters here, not rows and columns — and borrow the "Tab within the row" behavior from the grid pattern. Should a tree with real columns come up, that is when `treegrid` earns its own type. On reorder (type="list" + reorderable), the list dispatches `nldd-reorder` with `fromIndex` / `toIndex` and expects the consumer to mutate the DOM (or their data model that renders the DOM). Focus is restored to the moved item's drag handle via a single `requestAnimationFrame` — this assumes the consumer reorders **synchronously** in the event handler. Async renderers (React, Vue, …) that update the DOM on a later tick will miss the focus restore and should manage focus themselves after their render commits. */
3699
+ /** A container for `nldd-list-item` elements. The `type` attribute switches the list's a11y role and behavior: - `list` (default) — `role="list"`, items `role="listitem"`. Reorderable allowed. - `radiogroup` — `role="radiogroup"`, for a set of `nldd-list-item radio` rows: one choice, laid out as rows so each option can carry a count or a second line. The rows step out of the accessibility tree themselves (`role="none"`), so the radios are the group's own children. The arrows move focus here and activation checks, rather than the selection following focus as it does in `nldd-radio-button-group`. - `tree` — `role="tree"`, items `role="treeitem"`. Branch rows put their child rows in their own `slot="children"`, which the item renders as a `role="group"`. Level, position and set size are NOT authored: the nesting represents the hierarchy, so assistive technology derives them. A branch row must carry `expanded`; the group is hidden while it is false. Visual indentation is the consumer's — repeat a spacer-cell per level. Comes with its own keyboard, see "Tree" below. - `navigation` — host `role="navigation"`, items with `selected` get `aria-current="page"` on their inner `<a>` or `<button>`. - `form` — rows that are not actions themselves: the controls inside them are. A row of a label and a field, a switch, a menu button, or a value you cannot change at all. Semantically the same as `list` (`role="list"`, `role="listitem"`), and everything visual is unchanged; what falls away is the keyboard of a list you walk through. No arrow navigation, so no promise of it either, and no tab stop on the row: Tab goes straight to the controls, in source order, the way it does in any form. Rows that ARE actions (`href`, `button`, `checkbox`, or a segment) contradict that and warn in development. SwiftUI draws the same line between `List` and `Form`, for the same reason. - `listbox` — an accessible, filterable listbox (combobox pattern). The list renders its OWN search input (`role="combobox"`) pinned above the options; `.list__items` becomes `role="listbox"` and items become `role="option"`. Focus stays in the input, the active option moves via `aria-activedescendant`, and filtering is consumer-managed via the `input` event (toggle `[hidden]` on items). See "Listbox" below. Selection state is consumer-managed: the list never mutates `selected` itself. A list you walk through answers to the arrow keys, and there is no attribute to switch that on. Whether the keys do something is not a property of one list: it is what a reader may assume about all of them, and a per-list setting made that unknowable from the outside. It follows the type, which you can see before you touch a key. - ArrowUp / ArrowDown — move focus between the rows there is something to do with. A row of nothing but text is skipped, because focus that leads nowhere is a dead end. - Home / End — the first / last of those rows. - Tab — the list is ONE tab stop, so Tab moves past it rather than through it. Within the current row Tab walks that row's own controls: a chevron beside a checkbox, a menu button at the end. The same controls in the other rows are held out of the tab order (`tabindex="-1"`, or `no-tab` on a design-system control that keeps its tab stop in its own shadow root), and so are this row's once focus leaves the list, so tabbing back in lands on the row again. - Escape — out of a control the row holds, back onto the row. One level up, where Shift+Tab is one step back. On the row itself the list claims nothing, so Escape carries on to whatever holds the list, and a control showing a menu keeps the first press for closing that menu. While focus sits in a control a row holds, the list stands down: those keys are the control's, and a list that took them anyway would pull focus out of a combo box or a text field mid-word. What the row IS — its own link, button or segments — keeps answering here. Arrows move focus only; selection stays consumer-managed. Three types answer differently, and all three say so on screen before you touch a key: a listbox runs its keyboard from its search field, a reorderable list moves rows with the arrows, and a form has no rows to move between at all. In `type="listbox"` the list owns a native `<input role="combobox">` (mirroring how `nldd-combo-box` wires an input to a slotted listbox). Keyboard, handled on the input so focus never leaves it: - ArrowDown / ArrowUp — move the active option among the VISIBLE (non-`[hidden]`) options (wrap around). - Home / End — first / last visible option. - Enter — activate the active option by triggering its inner action (a link navigates, a button fires the consumer's handler). Selection stays consumer-managed. - Escape — clear the search value (and refire `input`). On every active change the input's `aria-activedescendant` is set to the active option's id and the option is scrolled into view. The active option (`_highlighted` on the item, a highlight) is distinct from `selected`. Filtering is the consumer's job: listen to `input` (`{ detail: { value } }`) and toggle `[hidden]` on items; after the visible set changes the list resets the active option to the first visible one. `reorderable` and the roving arrow keys are ignored in listbox mode (listbox has its own keyboard). A tree adds to that keyboard, and counts the rows of an open branch as part of the order the arrows walk: - ArrowRight — opens a closed branch; on an open one it steps to its first child. - ArrowLeft — closes an open branch; on a leaf it steps out to the parent row. - Enter — follows the row: its own link or button, or on a segmented branch the first action that is not the chevron. A branch with only a chevron folds instead. - Space — open and close, the same as Right and Left. Only while focus sits on the row itself: a row that is its own control, and a segmented action you tabbed into, handle both keys themselves. Opening and closing runs through the row's own disclosure control — the segment marked `disclosure`, or the row itself when it is a button. The list activates that control rather than writing `expanded`, so the state keeps being set in one place: the consumer's handler. A row that is a link is never activated this way, since that would navigate away. The tree is one tab stop. Focus lands on the row itself when the row has no control of its own, because that is where `treeitem` sits and it makes assistive technology announce the row rather than a button inside it. Tab then walks the controls of THAT row (a chevron beside a checkbox, say) and leaves the list after the last one. A deliberate deviation: strictly speaking a row with several controls is a `treegrid`, not a `tree`. We keep the tree semantics — level and set size are what matters here, not rows and columns — and borrow the "Tab within the row" behavior from the grid pattern. Should a tree with real columns come up, that is when `treegrid` earns its own type. On reorder (type="list" + reorderable), the list dispatches `nldd-reorder` with `fromIndex` / `toIndex` and expects the consumer to mutate the DOM (or their data model that renders the DOM). Focus is restored to the moved item's drag handle via a single `requestAnimationFrame` — this assumes the consumer reorders **synchronously** in the event handler. Async renderers (React, Vue, …) that update the DOM on a later tick will miss the focus restore and should manage focus themselves after their render commits. */
3678
3700
  'nldd-list': DefineComponent<NLDDListProps>;
3679
3701
  /** A row within an `nldd-list`. Renders as a link when `href` is set, as a checkbox when `checkbox` is set, as a button when `button` is set, or as a plain container otherwise. All cells and segments share one flat slot, in source order. Two rules govern every row: 1. State fills always paint the WIDENED row geometry — the row box extended by the indicator inline inset on both sides — whether or not the row is interactive. Paint never differs between a selected plain row and a selected interactive row. 2. The widened strip belongs to the ROW, never to a segment. A row with any action (its own `href`/`button`/`checkbox`, or a slotted segment) pulls itself outward (`is-interactive` host class → negative inline margin) and pads the row block back by the same amount, so content stays on the grid. A row-wide action owns that padding itself, making the whole widened box one hit area; slotted segments stay in the grid, so their footprint is position-independent and tree columns line up at any depth. By default the divider starts at the row's first text or title cell, so the line lands on the words rather than on whatever leads up to them — an icon, an avatar, a checkbox, or the spacers a tree indents with. Rows of different shapes then still line their dividers up with each other, and a tree's dividers step inward with its indentation. Text inside an `nldd-list-item-segment` counts as the row's content, and the marker is that text cell rather than the action: the action carries its own inline padding, so its edge sits before the words. A row with no text or title cell keeps the full content width. Mark a cell with `divider-start` and/or `divider-end` to place it yourself instead — an explicit marker replaces the derived one entirely, so `divider-start` on the leading cell restores the full-width line. Multiple markers resolve as the union: first `divider-start` through last `divider-end`. A start past the last end is an authoring error — the item DEV-warns and falls back to the full content width. A branch row can disclose its children in two ways: a dedicated `nldd-list-item-segment[disclosure]` segment (only the chevron is clickable), or the row itself as the control (`button` + `expanded`, the whole row toggles). In the second case, mark the chevron's `nldd-icon-cell` with `disclosure` and the row turns it with `expanded` — the same affordance, without having to trade a clickable row for a turning chevron. `checkbox` makes the WHOLE row the control: the inner action becomes a `role="checkbox"` button carrying `aria-checked`, it toggles `checked` on activation and fires `change`. Slot a visual `nldd-checkbox` (or any glyph) before the text and mark it `aria-hidden` + non-focusable — the row already conveys role and state, and a second focusable control would double the tab stops. Do NOT nest a real `<input type="checkbox">` in the action: interactive content inside a `<button>` is invalid HTML and AT announces the button, not the checked state. A `<label>` variant is not offered for the same reason it cannot work — label-to-input association walks the DOM tree, and a slotted input is not a descendant of a label in the shadow root. When it renders as a link, `target` and `rel` are forwarded to the inner `<a>` (e.g. `target="_blank" rel="noopener noreferrer"`). With `target="_blank"` the item also injects a visually hidden "opens in new tab" announcement for assistive technology (WCAG 2.1 SC 3.2.2). The item synchronizes its ARIA with its parent `nldd-list`'s `type`: - `list` parent → `role="listitem"` - `navigation` parent → `role="listitem"` + `aria-current="page"` on the inner `<a>` / `<button>` when `selected` - `listbox` parent → `role="option"` + `aria-selected` reflecting `selected`. The list points its search input's `aria-activedescendant` at the active option via `_highlighted` (separate from `selected`). */
3680
3702
  'nldd-list-item': DefineComponent<NLDDListItemProps>;
@@ -3705,7 +3727,7 @@ declare module 'vue' {
3705
3727
  'nldd-one-half-one-half-section': DefineComponent<NLDDOneHalfOneHalfSectionProps>;
3706
3728
  /** A section with a 1/3 sidebar on the left and 2/3 main content on the right. The columns wrap automatically when they become smaller than 280px. Padding and gap adjust via container queries. */
3707
3729
  'nldd-one-third-two-thirds-section': DefineComponent<NLDDOneThirdTwoThirdsSectionProps>;
3708
- /** A page layout with optional sticky header and footer. Without sticky-header, the host is the scroll container and the header is in normal flow. With sticky-header, the header becomes absolute and .page__scroll takes over scrolling. A ResizeObserver on the header sets padding-top on the scroll wrapper (only when not scrolled). In root-scroll mode (--context-scroll-mode: root, derived upstream by nldd-app-view) the page stops owning a scroller: the document scrolls and the sticky header/footer become position:sticky layers offset by --context-layer-top/bottom. The mode is read on connect/resize and reflected to [data-scroll] so the CSS can branch. */
3730
+ /** A page layout with optional sticky header and footer. Without sticky-header, the host is the scroll container and the header is in normal flow. With sticky-header, the header becomes absolute and .page__scroll takes over scrolling. A ResizeObserver on the header sets padding-top on the scroll wrapper (only when not scrolled). In root-scroll mode (--context-scroll-mode: root, derived upstream by nldd-app-view) the page stops owning a scroller: the document scrolls and the sticky header/footer stick against the document, offset by --context-inset-top/bottom. The mode is read on connect/resize and reflected to [data-scroll] so the CSS can branch. The page passes those insets on to its own content, with its sticky header and footer added: anything sticky inside (an nldd-sidebar-section, a sticky table head) reads --context-inset-top / --context-inset-bottom and clears every bar above and below it without being told a number. The heights are measured, because a top title bar shrinks as you scroll past its anchor. While the page owns the scroller, only its own bars count: the chrome above the page sits outside that scroller and does not push sticky content down. */
3709
3731
  'nldd-page': DefineComponent<NLDDPageProps>;
3710
3732
  /** The footer band at the bottom of a page. Hosts three optional rows in a fixed order: breadcrumbs (top), consumer-defined main content (middle), and a legal-bar (bottom). Dividers are drawn automatically between non-empty rows. Establishes its own container query (`page-footer-container`) so the responsive padding and gap react to the footer's own width, not the viewport. The host has `id="page-footer"` so a skip-link can target it directly. Use the sub-components `nldd-page-footer-legal-bar` and `nldd-page-footer-legal-bar-item` for the bottom row. */
3711
3733
  'nldd-page-footer': DefineComponent<NLDDPageFooterProps>;
@@ -3784,7 +3806,7 @@ declare module 'vue' {
3784
3806
  'nldd-text': DefineComponent<NLDDTextProps>;
3785
3807
  /** A cell component for displaying text content in lists with configurable alignment, size and color. This is the most fundamental list cell component. `vertical-alignment="center"` (default) stretches the cell to fill the full row height and centers its content within that space. Use `min-height` to set a minimum centered region. For strict top alignment without a minimum height, use `vertical-alignment="top"`. Each text region (overline, main text, supporting text) accepts either a string attribute or slotted DOM content. The slot is the source of truth: if the consumer provides slotted content, it replaces the attribute-based render for that region. Use slots when you need inline elements like `<nldd-tag>`, `<a>` or `<nldd-icon>` mixed with text. Note that `query` highlighting and `**bold**` parsing only apply to the attribute path — slotted content is rendered as-is. */
3786
3808
  'nldd-text-cell': DefineComponent<NLDDTextCellProps>;
3787
- /** A hybrid markdown editor built on CodeMirror 6 (via NLDDCodeMirrorElement): the document stays plain markdown text, but formatting is shown inline (bold is bold, headings are larger, links are colored) while the syntax markers stay visible, only dimmed — the iA Writer / Kirby approach. No WYSIWYG tree, so the data stays portable. Default `variant="simple"` is bare (no frame, no focus ring) for use inside a composition (e.g. a message field) that owns its chrome and focus; the caret is a prominent accent. `variant="input-field"` adds a framed surface + focus Headless: there is no built-in toolbar. A consumer drives formatting via the command methods (toggleBold/toggleItalic/toggleInlineCode/toggleStrikethrough/ toggleHeading/toggleBulletList/toggleQuote/toggleLink/runCommand to toggle, and setHeading/setList for picker-style "set" semantics), reads the active formats with getState(), listens to the nldd-text-editor-state event to render toggle states, and forwards padding clicks with focusFromPoint(). Cmd/Ctrl+B/I/E/K are bound out of the box. Commands keep focus on the editor. An @-mention typeahead (mentionSource) collapses to an atomic token, and a W3C-style annotation overlay (annotations) marks ranges with a dashed underline, light tint and a count badge without touching the underlying text. */
3809
+ /** A hybrid markdown editor built on CodeMirror 6 (via NLDDCodeMirrorElement): the document stays plain markdown text, but formatting is shown inline (bold is bold, headings are larger, links are colored) while the syntax markers stay visible, only dimmed — the iA Writer / Kirby approach. No WYSIWYG tree, so the data stays portable. Default `variant="simple"` is bare (no frame, no focus ring) for use inside a composition (e.g. a message field) that owns its chrome and focus; the caret is a prominent accent. `variant="input-field"` adds a framed surface + focus Headless: there is no built-in toolbar. A consumer drives formatting via the command methods (toggleBold/toggleItalic/toggleInlineCode/toggleStrikethrough/ toggleHeading/toggleBulletList/toggleTaskList/toggleQuote/toggleLink/runCommand to toggle, and setHeading/setList for picker-style "set" semantics), reads the active formats with getState(), listens to the nldd-text-editor-state event to render toggle states, and forwards padding clicks with focusFromPoint(). Cmd/Ctrl+B/I/E/K are bound out of the box. Commands keep focus on the editor. An inline toggle wraps the selected text (whitespace at its edges stays outside the markers), unwraps a run the caret is in, and with the caret at the very end of a run steps out of it. Bold that a typed space has broken (`**woord **`) keeps its styling while the caret is inside; the space moves outside the markers when the caret leaves. insertAtCursor(text) puts text at the caret and replaceRange(from, to, text) writes at the same clean offsets getSelection() reads. An @-mention typeahead (mentionSource) collapses to an atomic token, further typeahead lists on their own trigger (typeaheads) write what you tell them to, and a W3C-style annotation overlay (annotations) marks ranges with a dashed underline, light tint and a count badge without touching the underlying text. */
3788
3810
  'nldd-text-editor': DefineComponent<NLDDTextEditorProps>;
3789
3811
  'nldd-text-field': DefineComponent<NLDDTextFieldProps>;
3790
3812
  /** A text field for a time. The value is always 24-hour `HH:mm`, which is how Dutch shows it too, so unlike nldd-date-field there is nothing to convert. Typing is not masked: input is accepted generously and normalized only when the field is left. Error messages belong to nldd-form-field, not here. This field reflects only `invalid` / `valid`, like nldd-text-field. What you do in the picker is a preview until you leave it. The field shows the time right away but commits it on close. "Klaar" and Enter keep the choice, and so does a click outside once you have picked something. Cancel and Escape put the old time back. On an empty field the wheels open at `min`, or otherwise at the current time rounded to `step`, which does not fill in the field yet. */
@@ -3819,7 +3841,7 @@ declare module 'vue' {
3819
3841
  'nldd-validation-item': DefineComponent<NLDDValidationItemProps>;
3820
3842
  /** Nederlandse Digitale Dienst Validation List (Lit + TypeScript) Everything a value has to satisfy, in one list. A requirement you can state up front is an item with a rule, and it checks itself while you type. One only a server can decide is an item without a rule, and the app names it in `unmet` on the control. The list has two modes and `judging` is the switch. Before a verdict it shows its hints, which are the requirements of the field. After one it shows everything the value does not satisfy, and the hints are gone. It throws that switch itself the moment its control turns `invalid`, so when the field is judged is the consumer's decision, and the right moment is on submit. Hints are off by default. A phone number does not need its format spelled out before anyone has typed, while the rules for a password do. There are no checkmarks. The control already shows a validation icon of its own, and repeating that per line says the same thing three times. */
3821
3843
  'nldd-validation-list': DefineComponent<NLDDValidationListProps>;
3822
- /** A floating window based on the native <dialog> element. Can be shown modal or modeless. Positionable through CSS values. No header of its own: consumers use nldd-page with a sticky header inside for a title bar. */
3844
+ /** A floating window based on the native <dialog> element, positionable through CSS values. Always modal. No header of its own: consumers use nldd-page with a sticky header inside for a title bar. */
3823
3845
  'nldd-window': DefineComponent<NLDDWindowProps>;
3824
3846
  }
3825
3847
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The spacing scale, for the attributes that take a step of it.
3
+ *
4
+ * Spacing is rhythm: the point of a scale is that the space between things is
5
+ * the same handful of numbers on every page, so a value beside it is not a
6
+ * finer choice but a break in the pattern. These attributes take a step and
7
+ * nothing else, and this is the one place that turns a step into its token.
8
+ *
9
+ * Which also settles what the attribute means. `gap="16"` in a component that
10
+ * expected a CSS length wrote `--_gap: 16`, which is not one: the declaration
11
+ * fell away and the gap became zero with nothing said. Anything this cannot
12
+ * place is refused and named in dev instead, a length included — writing an
13
+ * unplaceable value is that same silent zero.
14
+ */
15
+ /** Every step there is. `'0'` is a value, not the absence of one. */
16
+ export declare const SPACING_SCALE: readonly ["0", "2", "4", "6", "8", "10", "12", "16", "20", "24", "28", "32", "40", "44", "48", "56", "64", "80", "96"];
17
+ export type SpacingSize = (typeof SPACING_SCALE)[number];
18
+ /**
19
+ * A step of the scale as the token it stands for.
20
+ *
21
+ * Returns null when there is nothing to set, so a caller can remove the
22
+ * property rather than write an empty one. `element` and `attribute` are only
23
+ * there to name the offender in a dev warning.
24
+ */
25
+ export declare function spacingToValue(value: string | undefined, element: string, attribute: string): string | null;
26
+ //# sourceMappingURL=spacing-scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spacing-scale.d.ts","sourceRoot":"","sources":["../../src/utilities/spacing-scale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,qEAAqE;AACrE,eAAO,MAAM,aAAa,wHAGhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAgBzD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAiBf"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The spacing scale, for the attributes that take a step of it.
3
+ *
4
+ * Spacing is rhythm: the point of a scale is that the space between things is
5
+ * the same handful of numbers on every page, so a value beside it is not a
6
+ * finer choice but a break in the pattern. These attributes take a step and
7
+ * nothing else, and this is the one place that turns a step into its token.
8
+ *
9
+ * Which also settles what the attribute means. `gap="16"` in a component that
10
+ * expected a CSS length wrote `--_gap: 16`, which is not one: the declaration
11
+ * fell away and the gap became zero with nothing said. Anything this cannot
12
+ * place is refused and named in dev instead, a length included — writing an
13
+ * unplaceable value is that same silent zero.
14
+ */
15
+ /** Every step there is. `'0'` is a value, not the absence of one. */
16
+ export const SPACING_SCALE = [
17
+ '0', '2', '4', '6', '8', '10', '12', '16', '20', '24',
18
+ '28', '32', '40', '44', '48', '56', '64', '80', '96',
19
+ ];
20
+ /** Anything that is not a bare number: a length, a percentage, a calc(). */
21
+ function looksLikeLength(value) {
22
+ return /[a-z%()]/i.test(value.trim());
23
+ }
24
+ const warned = new Set();
25
+ function warnOnce(element, attribute, message) {
26
+ const key = `${element}.${attribute}.${message}`;
27
+ if (warned.has(key))
28
+ return;
29
+ warned.add(key);
30
+ console.warn(`<${element}>: ${message}`);
31
+ }
32
+ /**
33
+ * A step of the scale as the token it stands for.
34
+ *
35
+ * Returns null when there is nothing to set, so a caller can remove the
36
+ * property rather than write an empty one. `element` and `attribute` are only
37
+ * there to name the offender in a dev warning.
38
+ */
39
+ export function spacingToValue(value, element, attribute) {
40
+ if (value === undefined || value === '')
41
+ return null;
42
+ const step = String(value).trim();
43
+ if (SPACING_SCALE.includes(step)) {
44
+ return step === '0' ? '0' : `var(--primitives-space-${step})`;
45
+ }
46
+ if (import.meta.env?.DEV) {
47
+ const why = looksLikeLength(step)
48
+ ? 'is a CSS length, and these attributes take a step of the spacing scale so the rhythm holds across the page'
49
+ : 'is not a step of the spacing scale';
50
+ warnOnce(element, attribute, `${attribute}="${step}" ${why} (${SPACING_SCALE.join(', ')}). Nothing is written, so the default stands.`);
51
+ }
52
+ return null;
53
+ }
54
+ //# sourceMappingURL=spacing-scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spacing-scale.js","sourceRoot":"","sources":["../../src/utilities/spacing-scale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACrD,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC3C,CAAC;AAIX,4EAA4E;AAC5E,SAAS,eAAe,CAAC,KAAa;IACrC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjC,SAAS,QAAQ,CAAC,OAAe,EAAE,SAAiB,EAAE,OAAe;IACpE,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;IACjD,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,MAAM,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC7B,KAAyB,EACzB,OAAe,EACf,SAAiB;IAEjB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAK,aAAmC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B,IAAI,GAAG,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC;YAChC,CAAC,CAAC,4GAA4G;YAC9G,CAAC,CAAC,oCAAoC,CAAC;QACxC,QAAQ,CACP,OAAO,EACP,SAAS,EACT,GAAG,SAAS,KAAK,IAAI,KAAK,GAAG,KAAK,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CACzG,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -4,8 +4,8 @@ type Constructor<T = LitElement> = new (...args: any[]) => T;
4
4
  * Adds `hide-below` and `hide-above` attributes that toggle visibility based
5
5
  * on the inline-size of an ancestor CSS container.
6
6
  *
7
- * Without a `containerName` argument the generated rule is an anonymous
8
- * `@container (…)` query — it matches the nearest ancestor that declares
7
+ * Without a `containerName` argument the rule is an anonymous `@container (…)`
8
+ * query — it matches the nearest ancestor that declares
9
9
  * `container-type: inline-size`. Pass a name to target a specific container
10
10
  * (e.g. `'cells-container'` for cells inside `nldd-list`, which sets that
11
11
  * name inline on its host as a Safari shadow-DOM workaround).
@@ -14,12 +14,15 @@ type Constructor<T = LitElement> = new (...args: any[]) => T;
14
14
  * (e.g. '320px', '20rem'). Named values resolve to the standard breakpoint
15
15
  * thresholds: `hide-below` uses the breakpoint's lower bound (e.g.
16
16
  * `hide-below="lg"` hides in sm+md and shows in lg), `hide-above` its upper
17
- * bound; the open edges (below sm, above lg) are no-ops. Container queries can't
18
- * read CSS variables in their conditions, so the query rule is generated at
19
- * runtime and injected as a <style> element in the component's shadow root,
20
- * wrapped in `:host { @container <name>? (…) { display: none !important; } }`
21
- * (nested form — the flattened `@container { :host { … } }` is unreliable in
22
- * Safari).
17
+ * bound; the open edges (below sm, above lg) are no-ops.
18
+ *
19
+ * The named values are static CSS (see `visibility-mixin.styles.ts`), added
20
+ * through `finalizeStyles` so that a component's own `static styles` does not
21
+ * have to know about them. A custom length has no static form: the threshold
22
+ * is only known at runtime and a container query cannot read one from a CSS
23
+ * variable, so its rule is written at runtime into a constructable stylesheet
24
+ * the shadow root adopts. Neither path is an inline stylesheet, so no consumer
25
+ * needs `'unsafe-inline'` in its `style-src` for either.
23
26
  *
24
27
  * @mixin VisibilityMixin
25
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"visibility-mixin.d.ts","sourceRoot":"","sources":["../../src/utilities/visibility-mixin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAuB,MAAM,KAAK,CAAC;AAGtD,KAAK,WAAW,CAAC,CAAC,GAAG,UAAU,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AA0C7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,eAAe,CAAC,KAAK,SAAS,WAAW,CAAC,UAAU,CAAC,EACpE,IAAI,EAAE,KAAK,EACX,aAAa,CAAC,EAAE,MAAM,GAgDc,KAAK,GACxC,WAAW,CAAC,UAAU,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CACrE"}
1
+ {"version":3,"file":"visibility-mixin.d.ts","sourceRoot":"","sources":["../../src/utilities/visibility-mixin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAoE,MAAM,KAAK,CAAC;AAGnG,KAAK,WAAW,CAAC,CAAC,GAAG,UAAU,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAuC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,eAAe,CAAC,KAAK,SAAS,WAAW,CAAC,UAAU,CAAC,EACpE,IAAI,EAAE,KAAK,EACX,aAAa,CAAC,EAAE,MAAM,GA0Ec,KAAK,GACxC,WAAW,CAAC,UAAU,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CACrE"}