@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
@@ -1031,9 +1031,9 @@
1031
1031
  "kind": "field",
1032
1032
  "name": "tooltipTiming",
1033
1033
  "type": {
1034
- "text": "'default' | 'instant' | 'never'"
1034
+ "text": "'delay' | 'instant' | 'never'"
1035
1035
  },
1036
- "default": "'default'",
1036
+ "default": "'delay'",
1037
1037
  "description": "Forwarded to the inner nldd-tooltip's `timing`. Use `'never'` to\nsuppress the visual tooltip; aria-label still describes the button.",
1038
1038
  "attribute": "tooltip-timing",
1039
1039
  "reflects": true
@@ -1249,10 +1249,10 @@
1249
1249
  {
1250
1250
  "name": "tooltip-timing",
1251
1251
  "type": {
1252
- "text": "'default' | 'instant' | 'never'"
1252
+ "text": "'delay' | 'instant' | 'never'"
1253
1253
  },
1254
- "default": "'default'",
1255
- "description": "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).",
1254
+ "default": "'delay'",
1255
+ "description": "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).",
1256
1256
  "fieldName": "tooltipTiming"
1257
1257
  },
1258
1258
  {
@@ -2970,7 +2970,7 @@
2970
2970
  "type": {
2971
2971
  "text": "AvatarSize"
2972
2972
  },
2973
- "default": "''",
2973
+ "default": "'full'",
2974
2974
  "attribute": "size",
2975
2975
  "reflects": true
2976
2976
  },
@@ -2980,7 +2980,7 @@
2980
2980
  "type": {
2981
2981
  "text": "AvatarColor"
2982
2982
  },
2983
- "default": "'default'",
2983
+ "default": "'neutral'",
2984
2984
  "attribute": "color",
2985
2985
  "reflects": true
2986
2986
  },
@@ -3063,9 +3063,9 @@
3063
3063
  "kind": "field",
3064
3064
  "name": "tooltipTiming",
3065
3065
  "type": {
3066
- "text": "'default' | 'instant' | 'never'"
3066
+ "text": "'delay' | 'instant' | 'never'"
3067
3067
  },
3068
- "default": "'default'",
3068
+ "default": "'delay'",
3069
3069
  "description": "Forwarded to the inner nldd-tooltip's `timing`, like nldd-icon-button.\nOn by default: initials without a name are a riddle. An\navatar that sits beside that name is `decorative` and shows none.",
3070
3070
  "attribute": "tooltip-timing",
3071
3071
  "reflects": true
@@ -3177,18 +3177,18 @@
3177
3177
  "type": {
3178
3178
  "text": "AvatarSize"
3179
3179
  },
3180
- "default": "''",
3180
+ "default": "'full'",
3181
3181
  "fieldName": "size",
3182
- "description": "`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"
3182
+ "description": "`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"
3183
3183
  },
3184
3184
  {
3185
3185
  "name": "color",
3186
3186
  "type": {
3187
3187
  "text": "AvatarColor"
3188
3188
  },
3189
- "default": "'default'",
3189
+ "default": "'neutral'",
3190
3190
  "fieldName": "color",
3191
- "description": "`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`"
3191
+ "description": "`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)"
3192
3192
  },
3193
3193
  {
3194
3194
  "name": "icon-aligned",
@@ -3265,10 +3265,10 @@
3265
3265
  {
3266
3266
  "name": "tooltip-timing",
3267
3267
  "type": {
3268
- "text": "'default' | 'instant' | 'never'"
3268
+ "text": "'delay' | 'instant' | 'never'"
3269
3269
  },
3270
- "default": "'default'",
3271
- "description": "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",
3270
+ "default": "'delay'",
3271
+ "description": "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",
3272
3272
  "fieldName": "tooltipTiming"
3273
3273
  },
3274
3274
  {
@@ -3638,7 +3638,7 @@
3638
3638
  "type": {
3639
3639
  "text": "IconSize"
3640
3640
  },
3641
- "default": "''",
3641
+ "default": "'full'",
3642
3642
  "attribute": "size",
3643
3643
  "reflects": true
3644
3644
  },
@@ -3689,9 +3689,9 @@
3689
3689
  "type": {
3690
3690
  "text": "IconSize"
3691
3691
  },
3692
- "description": "`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`.",
3692
+ "description": "`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).",
3693
3693
  "name": "size",
3694
- "default": "''",
3694
+ "default": "'full'",
3695
3695
  "fieldName": "size"
3696
3696
  },
3697
3697
  {
@@ -4645,9 +4645,9 @@
4645
4645
  "kind": "field",
4646
4646
  "name": "color",
4647
4647
  "type": {
4648
- "text": "'' | 'inherit'"
4648
+ "text": "'content' | 'inherit'"
4649
4649
  },
4650
- "default": "''",
4650
+ "default": "'content'",
4651
4651
  "attribute": "color",
4652
4652
  "reflects": true
4653
4653
  },
@@ -4692,11 +4692,11 @@
4692
4692
  {
4693
4693
  "name": "color",
4694
4694
  "type": {
4695
- "text": "'' | 'inherit'"
4695
+ "text": "'content' | 'inherit'"
4696
4696
  },
4697
- "default": "''",
4697
+ "default": "'content'",
4698
4698
  "fieldName": "color",
4699
- "description": "'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."
4699
+ "description": "'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."
4700
4700
  },
4701
4701
  {
4702
4702
  "name": "translations",
@@ -4941,7 +4941,7 @@
4941
4941
  "type": {
4942
4942
  "text": "Color"
4943
4943
  },
4944
- "default": "'default'",
4944
+ "default": "'content'",
4945
4945
  "attribute": "color",
4946
4946
  "reflects": true
4947
4947
  },
@@ -4989,9 +4989,9 @@
4989
4989
  "type": {
4990
4990
  "text": "Color"
4991
4991
  },
4992
- "default": "'default'",
4992
+ "default": "'content'",
4993
4993
  "fieldName": "color",
4994
- "description": "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."
4994
+ "description": "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."
4995
4995
  },
4996
4996
  {
4997
4997
  "name": "horizontal-alignment",
@@ -5061,7 +5061,7 @@
5061
5061
  "type": {
5062
5062
  "text": "TitleColor"
5063
5063
  },
5064
- "default": "''",
5064
+ "default": "'content'",
5065
5065
  "attribute": "color",
5066
5066
  "reflects": true
5067
5067
  }
@@ -5081,9 +5081,9 @@
5081
5081
  "type": {
5082
5082
  "text": "TitleColor"
5083
5083
  },
5084
- "default": "''",
5084
+ "default": "'content'",
5085
5085
  "fieldName": "color",
5086
- "description": "'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."
5086
+ "description": "'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."
5087
5087
  }
5088
5088
  ],
5089
5089
  "superclass": {
@@ -5383,7 +5383,7 @@
5383
5383
  "type": {
5384
5384
  "text": "Timing"
5385
5385
  },
5386
- "default": "'default'",
5386
+ "default": "'delay'",
5387
5387
  "attribute": "timing",
5388
5388
  "reflects": true
5389
5389
  }
@@ -5421,9 +5421,9 @@
5421
5421
  "type": {
5422
5422
  "text": "Timing"
5423
5423
  },
5424
- "default": "'default'",
5424
+ "default": "'delay'",
5425
5425
  "fieldName": "timing",
5426
- "description": "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."
5426
+ "description": "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."
5427
5427
  }
5428
5428
  ],
5429
5429
  "superclass": {
@@ -16420,30 +16420,6 @@
16420
16420
  ],
16421
16421
  "description": "The sentinels a set of groups wants, in clean offsets (start before the first\nchar, end after the last), filtered by the guard. Positions may repeat when two\ngroups touch (end of one, start of the next)."
16422
16422
  },
16423
- {
16424
- "kind": "function",
16425
- "name": "buildDesiredDoc",
16426
- "return": {
16427
- "type": {
16428
- "text": "string"
16429
- }
16430
- },
16431
- "parameters": [
16432
- {
16433
- "name": "cleanText",
16434
- "type": {
16435
- "text": "string"
16436
- }
16437
- },
16438
- {
16439
- "name": "desired",
16440
- "type": {
16441
- "text": "DesiredSentinel[]"
16442
- }
16443
- }
16444
- ],
16445
- "description": "Build the desired doc text: `cleanText` with a sentinel inserted at each desired\nposition (multiplicity honoured for touching groups)."
16446
- },
16447
16423
  {
16448
16424
  "kind": "function",
16449
16425
  "name": "reconcileSentinels",
@@ -16473,7 +16449,7 @@
16473
16449
  }
16474
16450
  }
16475
16451
  ],
16476
- "description": "Minimal changes (in current-doc coords) to turn `doc` into a document that holds\nexactly the sentinels the groups want — touching only sentinel characters, never\nthe real text. `doc` and the target share the same clean text, so a two-pointer\nwalk yields sentinel-only inserts/deletes."
16452
+ "description": "Minimal changes (in current-doc coords) to turn `doc` into a document that holds\nexactly the sentinels the groups want — touching only sentinel characters, never\nthe real text. One walk over `doc`, comparing the sentinel run at each clean\nposition with the number wanted there. Building the target document first would\ncost a second copy of the text on every edit."
16477
16453
  },
16478
16454
  {
16479
16455
  "kind": "function",
@@ -16571,14 +16547,6 @@
16571
16547
  "module": "src/components/inputs/text-editor/text-editor.annotation-sentinels.ts"
16572
16548
  }
16573
16549
  },
16574
- {
16575
- "kind": "js",
16576
- "name": "buildDesiredDoc",
16577
- "declaration": {
16578
- "name": "buildDesiredDoc",
16579
- "module": "src/components/inputs/text-editor/text-editor.annotation-sentinels.ts"
16580
- }
16581
- },
16582
16550
  {
16583
16551
  "kind": "js",
16584
16552
  "name": "reconcileSentinels",
@@ -16740,7 +16708,7 @@
16740
16708
  "type": {
16741
16709
  "text": "TextEditorActiveFormats"
16742
16710
  },
16743
- "default": "{ bold: false, italic: false, inlineCode: false, codeBlock: false, strikethrough: false, link: false, bulletList: false, orderedList: false, quote: false, heading: 0, }"
16711
+ "default": "{ bold: false, italic: false, inlineCode: false, codeBlock: false, strikethrough: false, link: false, bulletList: false, orderedList: false, taskList: false, quote: false, heading: 0, }"
16744
16712
  },
16745
16713
  {
16746
16714
  "kind": "function",
@@ -16770,7 +16738,7 @@
16770
16738
  }
16771
16739
  }
16772
16740
  ],
16773
- "description": "Wrap (or, if already wrapped, unwrap) each selection range with `marker`."
16741
+ "description": "Wrap each selection range with `marker`, or unwrap it when it is already\nwrapped. A caret at the very end of the wrapped text steps out of the run\ninstead: bold, type, bold ends with the caret after the bold, ready for the\nnext word, not with the bold undone."
16774
16742
  },
16775
16743
  {
16776
16744
  "kind": "function",
@@ -16837,6 +16805,24 @@
16837
16805
  }
16838
16806
  ]
16839
16807
  },
16808
+ {
16809
+ "kind": "function",
16810
+ "name": "toggleTaskList",
16811
+ "return": {
16812
+ "type": {
16813
+ "text": "void"
16814
+ }
16815
+ },
16816
+ "parameters": [
16817
+ {
16818
+ "name": "view",
16819
+ "type": {
16820
+ "text": "EditorView"
16821
+ }
16822
+ }
16823
+ ],
16824
+ "description": "Turn the selected lines into GFM task items (`- [ ] `), or back into plain\nbullets when they all are tasks already. A bullet or numbered item keeps its\nindent and becomes a task; toggling off leaves a bullet rather than bare text,\nso the list survives and only the box goes. Checking a box is not this\ncommand's job."
16825
+ },
16840
16826
  {
16841
16827
  "kind": "function",
16842
16828
  "name": "setList",
@@ -16855,7 +16841,7 @@
16855
16841
  {
16856
16842
  "name": "type",
16857
16843
  "type": {
16858
- "text": "'none' | 'bullet' | 'ordered'"
16844
+ "text": "ListType"
16859
16845
  }
16860
16846
  }
16861
16847
  ],
@@ -17066,6 +17052,14 @@
17066
17052
  "module": "src/components/inputs/text-editor/text-editor.commands.ts"
17067
17053
  }
17068
17054
  },
17055
+ {
17056
+ "kind": "js",
17057
+ "name": "toggleTaskList",
17058
+ "declaration": {
17059
+ "name": "toggleTaskList",
17060
+ "module": "src/components/inputs/text-editor/text-editor.commands.ts"
17061
+ }
17062
+ },
17069
17063
  {
17070
17064
  "kind": "js",
17071
17065
  "name": "setList",
@@ -17148,6 +17142,68 @@
17148
17142
  }
17149
17143
  ]
17150
17144
  },
17145
+ {
17146
+ "kind": "javascript-module",
17147
+ "path": "src/components/inputs/text-editor/text-editor.cursor.ts",
17148
+ "declarations": [
17149
+ {
17150
+ "kind": "function",
17151
+ "name": "drawnAssoc",
17152
+ "return": {
17153
+ "type": {
17154
+ "text": "-1 | 1"
17155
+ }
17156
+ },
17157
+ "parameters": [
17158
+ {
17159
+ "name": "view",
17160
+ "type": {
17161
+ "text": "EditorView"
17162
+ }
17163
+ },
17164
+ {
17165
+ "name": "head",
17166
+ "type": {
17167
+ "text": "number"
17168
+ }
17169
+ },
17170
+ {
17171
+ "name": "assoc",
17172
+ "type": {
17173
+ "text": "number"
17174
+ }
17175
+ }
17176
+ ],
17177
+ "description": "The side the caret is drawn on at `head`: 1 unless the two sides are\ngenuinely apart and a hint, or else the arrival direction, says \"before\"."
17178
+ },
17179
+ {
17180
+ "kind": "variable",
17181
+ "name": "stableCursor",
17182
+ "type": {
17183
+ "text": "Extension"
17184
+ },
17185
+ "default": "[cursorLayer, pointerTracker, stepOverKeymap, typePastBadge, theme]"
17186
+ }
17187
+ ],
17188
+ "exports": [
17189
+ {
17190
+ "kind": "js",
17191
+ "name": "drawnAssoc",
17192
+ "declaration": {
17193
+ "name": "drawnAssoc",
17194
+ "module": "src/components/inputs/text-editor/text-editor.cursor.ts"
17195
+ }
17196
+ },
17197
+ {
17198
+ "kind": "js",
17199
+ "name": "stableCursor",
17200
+ "declaration": {
17201
+ "name": "stableCursor",
17202
+ "module": "src/components/inputs/text-editor/text-editor.cursor.ts"
17203
+ }
17204
+ }
17205
+ ]
17206
+ },
17151
17207
  {
17152
17208
  "kind": "javascript-module",
17153
17209
  "path": "src/components/inputs/text-editor/text-editor.drag.ts",
@@ -17185,6 +17241,131 @@
17185
17241
  }
17186
17242
  ]
17187
17243
  },
17244
+ {
17245
+ "kind": "javascript-module",
17246
+ "path": "src/components/inputs/text-editor/text-editor.emphasis.ts",
17247
+ "declarations": [
17248
+ {
17249
+ "kind": "variable",
17250
+ "name": "EMPHASIS_MARKERS",
17251
+ "type": {
17252
+ "text": "ReadonlyMap<string, string>"
17253
+ },
17254
+ "default": "new Map([ ['StrongEmphasis', '**'], ['Emphasis', '*'], ['Strikethrough', '~~'], ])",
17255
+ "description": "The emphasis nodes that live by the flanking rules, with the marker the\neditor writes for them. Inline code is not among them: a code span keeps its\nwhitespace and never fails to close."
17256
+ },
17257
+ {
17258
+ "kind": "variable",
17259
+ "name": "holdEmphasis",
17260
+ "description": "Starts a hold on markers just written around an empty selection: `****`\nparses as nothing, so there is no node to remember, but what is typed\nbetween them is meant to be bold."
17261
+ },
17262
+ {
17263
+ "kind": "variable",
17264
+ "name": "heldEmphasisField",
17265
+ "description": "The emphasis the caret is in: the tree's own while it parses, and the held\none, mapped along through edits, once it does not. Null outside any."
17266
+ },
17267
+ {
17268
+ "kind": "function",
17269
+ "name": "repairChangesFor",
17270
+ "return": {
17271
+ "type": {
17272
+ "text": "ChangeSpec[]"
17273
+ }
17274
+ },
17275
+ "parameters": [
17276
+ {
17277
+ "name": "state",
17278
+ "type": {
17279
+ "text": "EditorState"
17280
+ }
17281
+ },
17282
+ {
17283
+ "name": "held",
17284
+ "type": {
17285
+ "text": "HeldEmphasis"
17286
+ }
17287
+ }
17288
+ ],
17289
+ "description": "The changes that move edge whitespace out of `held`, for a command that\nsteps out of the run itself. Empty when there is nothing to move."
17290
+ },
17291
+ {
17292
+ "kind": "function",
17293
+ "name": "repairHeldEmphasis",
17294
+ "return": {
17295
+ "type": {
17296
+ "text": "void"
17297
+ }
17298
+ },
17299
+ "parameters": [
17300
+ {
17301
+ "name": "view",
17302
+ "type": {
17303
+ "text": "EditorView"
17304
+ }
17305
+ }
17306
+ ],
17307
+ "description": "Ends a hold at once, for a blur. The display must be right while the editor\nis unfocused, and the value it commits must be markdown that renders the way\nit looked."
17308
+ },
17309
+ {
17310
+ "kind": "variable",
17311
+ "name": "heldEmphasis",
17312
+ "type": {
17313
+ "text": "Extension"
17314
+ },
17315
+ "default": "[heldEmphasisField, repairOnRelease]"
17316
+ }
17317
+ ],
17318
+ "exports": [
17319
+ {
17320
+ "kind": "js",
17321
+ "name": "EMPHASIS_MARKERS",
17322
+ "declaration": {
17323
+ "name": "EMPHASIS_MARKERS",
17324
+ "module": "src/components/inputs/text-editor/text-editor.emphasis.ts"
17325
+ }
17326
+ },
17327
+ {
17328
+ "kind": "js",
17329
+ "name": "holdEmphasis",
17330
+ "declaration": {
17331
+ "name": "holdEmphasis",
17332
+ "module": "src/components/inputs/text-editor/text-editor.emphasis.ts"
17333
+ }
17334
+ },
17335
+ {
17336
+ "kind": "js",
17337
+ "name": "heldEmphasisField",
17338
+ "declaration": {
17339
+ "name": "heldEmphasisField",
17340
+ "module": "src/components/inputs/text-editor/text-editor.emphasis.ts"
17341
+ }
17342
+ },
17343
+ {
17344
+ "kind": "js",
17345
+ "name": "repairChangesFor",
17346
+ "declaration": {
17347
+ "name": "repairChangesFor",
17348
+ "module": "src/components/inputs/text-editor/text-editor.emphasis.ts"
17349
+ }
17350
+ },
17351
+ {
17352
+ "kind": "js",
17353
+ "name": "repairHeldEmphasis",
17354
+ "declaration": {
17355
+ "name": "repairHeldEmphasis",
17356
+ "module": "src/components/inputs/text-editor/text-editor.emphasis.ts"
17357
+ }
17358
+ },
17359
+ {
17360
+ "kind": "js",
17361
+ "name": "heldEmphasis",
17362
+ "declaration": {
17363
+ "name": "heldEmphasis",
17364
+ "module": "src/components/inputs/text-editor/text-editor.emphasis.ts"
17365
+ }
17366
+ }
17367
+ ]
17368
+ },
17188
17369
  {
17189
17370
  "kind": "javascript-module",
17190
17371
  "path": "src/components/inputs/text-editor/text-editor.links.ts",
@@ -17242,6 +17423,54 @@
17242
17423
  }
17243
17424
  ],
17244
17425
  "description": "Adds an \"open link\" badge after every real link in the viewport. `label` builds\nthe badge's accessible label from the destination, so the host can localize it."
17426
+ },
17427
+ {
17428
+ "kind": "function",
17429
+ "name": "linkEndsAt",
17430
+ "return": {
17431
+ "type": {
17432
+ "text": "boolean"
17433
+ }
17434
+ },
17435
+ "parameters": [
17436
+ {
17437
+ "name": "state",
17438
+ "type": {
17439
+ "text": "EditorState"
17440
+ }
17441
+ },
17442
+ {
17443
+ "name": "pos",
17444
+ "type": {
17445
+ "text": "number"
17446
+ }
17447
+ }
17448
+ ],
17449
+ "description": "Whether a link with a badge ends at `pos`: a `[text](url)` link or a bare\nURL, with a destination the badge accepts. The same tests as `buildBadges`,\nso a mention (a link too, but without a badge) is not one."
17450
+ },
17451
+ {
17452
+ "kind": "function",
17453
+ "name": "bareUrlEndsAt",
17454
+ "return": {
17455
+ "type": {
17456
+ "text": "boolean"
17457
+ }
17458
+ },
17459
+ "parameters": [
17460
+ {
17461
+ "name": "state",
17462
+ "type": {
17463
+ "text": "EditorState"
17464
+ }
17465
+ },
17466
+ {
17467
+ "name": "pos",
17468
+ "type": {
17469
+ "text": "number"
17470
+ }
17471
+ }
17472
+ ],
17473
+ "description": "Whether a bare URL with a badge ends at `pos`: the link that text typed at\nits end extends, unlike a `[text](url)` link, which ends at its `)`."
17245
17474
  }
17246
17475
  ],
17247
17476
  "exports": [
@@ -17268,6 +17497,22 @@
17268
17497
  "name": "linkOpenBadge",
17269
17498
  "module": "src/components/inputs/text-editor/text-editor.links.ts"
17270
17499
  }
17500
+ },
17501
+ {
17502
+ "kind": "js",
17503
+ "name": "linkEndsAt",
17504
+ "declaration": {
17505
+ "name": "linkEndsAt",
17506
+ "module": "src/components/inputs/text-editor/text-editor.links.ts"
17507
+ }
17508
+ },
17509
+ {
17510
+ "kind": "js",
17511
+ "name": "bareUrlEndsAt",
17512
+ "declaration": {
17513
+ "name": "bareUrlEndsAt",
17514
+ "module": "src/components/inputs/text-editor/text-editor.links.ts"
17515
+ }
17271
17516
  }
17272
17517
  ]
17273
17518
  },
@@ -17281,7 +17526,7 @@
17281
17526
  "type": {
17282
17527
  "text": "Extension"
17283
17528
  },
17284
- "default": "[ markdown({ extensions: GFM }), markDecorationPlugin, hangingIndentField, // Prec.highest keeps the mention chip the innermost decoration, so it nests inside // a heading/bold run and inherits its font (scaling with it) instead of sitting at // the base size as an outer sibling. Prec.highest(mentionChipField), mentionAtomicRanges, ]",
17529
+ "default": "[ markdown({ extensions: GFM }), markDecorationPlugin, heldEmphasis, hangingIndentField, // Prec.highest keeps the mention chip the innermost decoration, so it nests inside // a heading/bold run and inherits its font (scaling with it) instead of sitting at // the base size as an outer sibling. Prec.highest(mentionChipField), mentionAtomicRanges, ]",
17285
17530
  "description": "Markdown language (with GFM) plus the hybrid inline-styling decorations."
17286
17531
  },
17287
17532
  {
@@ -17396,6 +17641,36 @@
17396
17641
  "kind": "javascript-module",
17397
17642
  "path": "src/components/inputs/text-editor/text-editor.mentions.ts",
17398
17643
  "declarations": [
17644
+ {
17645
+ "kind": "function",
17646
+ "name": "typeaheadQueryAt",
17647
+ "return": {
17648
+ "type": {
17649
+ "text": "{ from: number; to: number; query: string; trigger: string } | null"
17650
+ }
17651
+ },
17652
+ "parameters": [
17653
+ {
17654
+ "name": "state",
17655
+ "type": {
17656
+ "text": "EditorState"
17657
+ }
17658
+ },
17659
+ {
17660
+ "name": "pos",
17661
+ "type": {
17662
+ "text": "number"
17663
+ }
17664
+ },
17665
+ {
17666
+ "name": "triggers",
17667
+ "type": {
17668
+ "text": "readonly string[]"
17669
+ }
17670
+ }
17671
+ ],
17672
+ "description": "The typeahead query at `pos` for one of `triggers`, or null when the text\nbefore the caret is not one. `from` is the trigger, `query` the typed text\nwithout it. Both the completion source and the reopen-on-delete path go\nthrough this, so they cannot disagree about what counts as a query."
17673
+ },
17399
17674
  {
17400
17675
  "kind": "variable",
17401
17676
  "name": "MENTION_HREF_PREFIX",
@@ -17417,12 +17692,30 @@
17417
17692
  {
17418
17693
  "name": "candidate",
17419
17694
  "type": {
17420
- "text": "MentionCandidate"
17695
+ "text": "TypeaheadCandidate"
17421
17696
  }
17422
17697
  }
17423
17698
  ],
17424
17699
  "description": "The markdown-compatible token stored for a mention (degrades to a plain link).\nThe label's link-text delimiters are backslash-escaped and the id is\npercent-encoded, so a crafted candidate (e.g. a display name sourced from user\ndata) can't break out of `[label](user:id)` into arbitrary markdown — a stray\n`]` or `)` would otherwise start a second, attacker-shaped link. The render\nlayer reverses both via `unescapeMentionLabel` / `decodeMentionId`."
17425
17700
  },
17701
+ {
17702
+ "kind": "function",
17703
+ "name": "mentionInsert",
17704
+ "return": {
17705
+ "type": {
17706
+ "text": "string"
17707
+ }
17708
+ },
17709
+ "parameters": [
17710
+ {
17711
+ "name": "candidate",
17712
+ "type": {
17713
+ "text": "TypeaheadCandidate"
17714
+ }
17715
+ }
17716
+ ],
17717
+ "description": "What the built-in mention writes: the token and a space to go on typing."
17718
+ },
17426
17719
  {
17427
17720
  "kind": "function",
17428
17721
  "name": "unescapeMentionLabel",
@@ -17461,7 +17754,7 @@
17461
17754
  },
17462
17755
  {
17463
17756
  "kind": "function",
17464
- "name": "mentions",
17757
+ "name": "typeaheads",
17465
17758
  "return": {
17466
17759
  "type": {
17467
17760
  "text": "Extension"
@@ -17469,21 +17762,30 @@
17469
17762
  },
17470
17763
  "parameters": [
17471
17764
  {
17472
- "name": "getSource",
17765
+ "name": "getTypeaheads",
17473
17766
  "type": {
17474
- "text": "() => MentionSource | undefined"
17767
+ "text": "() => readonly Typeahead[]"
17475
17768
  }
17476
17769
  },
17477
17770
  {
17478
- "name": "onInsert",
17771
+ "name": "onChoose",
17479
17772
  "type": {
17480
- "text": "(detail: MentionInsertedDetail) => void"
17773
+ "text": "(choice: TypeaheadChoice) => void"
17481
17774
  }
17482
17775
  }
17483
- ]
17776
+ ],
17777
+ "description": "The typeaheads. `getTypeaheads` is read on every keystroke, so the editor can\nhand over its current lists; choosing a candidate writes what the list's\n`insert` says and calls `onChoose`. Without lists it is inert."
17484
17778
  }
17485
17779
  ],
17486
17780
  "exports": [
17781
+ {
17782
+ "kind": "js",
17783
+ "name": "typeaheadQueryAt",
17784
+ "declaration": {
17785
+ "name": "typeaheadQueryAt",
17786
+ "module": "src/components/inputs/text-editor/text-editor.mentions.ts"
17787
+ }
17788
+ },
17487
17789
  {
17488
17790
  "kind": "js",
17489
17791
  "name": "MENTION_HREF_PREFIX",
@@ -17500,6 +17802,14 @@
17500
17802
  "module": "src/components/inputs/text-editor/text-editor.mentions.ts"
17501
17803
  }
17502
17804
  },
17805
+ {
17806
+ "kind": "js",
17807
+ "name": "mentionInsert",
17808
+ "declaration": {
17809
+ "name": "mentionInsert",
17810
+ "module": "src/components/inputs/text-editor/text-editor.mentions.ts"
17811
+ }
17812
+ },
17503
17813
  {
17504
17814
  "kind": "js",
17505
17815
  "name": "unescapeMentionLabel",
@@ -17518,9 +17828,9 @@
17518
17828
  },
17519
17829
  {
17520
17830
  "kind": "js",
17521
- "name": "mentions",
17831
+ "name": "typeaheads",
17522
17832
  "declaration": {
17523
- "name": "mentions",
17833
+ "name": "typeaheads",
17524
17834
  "module": "src/components/inputs/text-editor/text-editor.mentions.ts"
17525
17835
  }
17526
17836
  }
@@ -17550,8 +17860,7 @@
17550
17860
  },
17551
17861
  {
17552
17862
  "kind": "variable",
17553
- "name": "orderedListRenumber",
17554
- "description": "Renumbers ordered lists in the same transaction as the edit that disturbed them,\nso it's one atomic (single-undo) step and the caret/selection maps through it."
17863
+ "name": "orderedListRenumber"
17555
17864
  }
17556
17865
  ],
17557
17866
  "exports": [
@@ -17573,13 +17882,109 @@
17573
17882
  }
17574
17883
  ]
17575
17884
  },
17885
+ {
17886
+ "kind": "javascript-module",
17887
+ "path": "src/components/inputs/text-editor/text-editor.syntax.ts",
17888
+ "declarations": [
17889
+ {
17890
+ "kind": "function",
17891
+ "name": "enclosingNode",
17892
+ "return": {
17893
+ "type": {
17894
+ "text": "SyntaxNode | null"
17895
+ }
17896
+ },
17897
+ "parameters": [
17898
+ {
17899
+ "name": "state",
17900
+ "type": {
17901
+ "text": "EditorState"
17902
+ }
17903
+ },
17904
+ {
17905
+ "name": "pos",
17906
+ "type": {
17907
+ "text": "number"
17908
+ }
17909
+ },
17910
+ {
17911
+ "name": "side",
17912
+ "type": {
17913
+ "text": "-1 | 0 | 1"
17914
+ }
17915
+ },
17916
+ {
17917
+ "name": "match",
17918
+ "type": {
17919
+ "text": "(node: SyntaxNode) => boolean"
17920
+ }
17921
+ }
17922
+ ],
17923
+ "description": "The innermost node at `pos` that `match` accepts, looking outward from there.\n`side` decides which node a position between two of them belongs to: -1 the\none that ends there, 1 the one that starts there. Null when none matches."
17924
+ },
17925
+ {
17926
+ "kind": "function",
17927
+ "name": "enclosingNamed",
17928
+ "return": {
17929
+ "type": {
17930
+ "text": "SyntaxNode | null"
17931
+ }
17932
+ },
17933
+ "parameters": [
17934
+ {
17935
+ "name": "state",
17936
+ "type": {
17937
+ "text": "EditorState"
17938
+ }
17939
+ },
17940
+ {
17941
+ "name": "pos",
17942
+ "type": {
17943
+ "text": "number"
17944
+ }
17945
+ },
17946
+ {
17947
+ "name": "side",
17948
+ "type": {
17949
+ "text": "-1 | 0 | 1"
17950
+ }
17951
+ },
17952
+ {
17953
+ "name": "names",
17954
+ "type": {
17955
+ "text": "string | ReadonlySet<string>"
17956
+ }
17957
+ }
17958
+ ],
17959
+ "description": "`enclosingNode` for the common case: a node that goes by one of these names."
17960
+ }
17961
+ ],
17962
+ "exports": [
17963
+ {
17964
+ "kind": "js",
17965
+ "name": "enclosingNode",
17966
+ "declaration": {
17967
+ "name": "enclosingNode",
17968
+ "module": "src/components/inputs/text-editor/text-editor.syntax.ts"
17969
+ }
17970
+ },
17971
+ {
17972
+ "kind": "js",
17973
+ "name": "enclosingNamed",
17974
+ "declaration": {
17975
+ "name": "enclosingNamed",
17976
+ "module": "src/components/inputs/text-editor/text-editor.syntax.ts"
17977
+ }
17978
+ }
17979
+ ]
17980
+ },
17576
17981
  {
17577
17982
  "kind": "javascript-module",
17578
17983
  "path": "src/components/inputs/text-editor/text-editor.ts",
17579
17984
  "declarations": [
17580
17985
  {
17581
17986
  "kind": "class",
17582
- "description": "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.",
17987
+ "description": "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.",
17583
17988
  "name": "NLDDTextEditor",
17584
17989
  "members": [
17585
17990
  {
@@ -17725,6 +18130,15 @@
17725
18130
  },
17726
18131
  "description": "Consumer-supplied"
17727
18132
  },
18133
+ {
18134
+ "kind": "field",
18135
+ "name": "typeaheads",
18136
+ "type": {
18137
+ "text": "Typeahead[]"
18138
+ },
18139
+ "default": "[]",
18140
+ "description": "Your own typeahead lists next to the"
18141
+ },
17728
18142
  {
17729
18143
  "kind": "field",
17730
18144
  "name": "annotatable",
@@ -17846,6 +18260,16 @@
17846
18260
  }
17847
18261
  }
17848
18262
  },
18263
+ {
18264
+ "kind": "method",
18265
+ "name": "toggleTaskList",
18266
+ "return": {
18267
+ "type": {
18268
+ "text": "void"
18269
+ }
18270
+ },
18271
+ "description": "Turn the selected lines into GFM task items (`- [ ] `), or back into\nbullets when they all are tasks. Checking a box is not a command."
18272
+ },
17849
18273
  {
17850
18274
  "kind": "method",
17851
18275
  "name": "setList",
@@ -17858,11 +18282,11 @@
17858
18282
  {
17859
18283
  "name": "type",
17860
18284
  "type": {
17861
- "text": "'none' | 'bullet' | 'ordered'"
18285
+ "text": "ListType"
17862
18286
  }
17863
18287
  }
17864
18288
  ],
17865
- "description": "Set the list type, replacing any existing list ('none' strips it) — for an\nexclusive list picker."
18289
+ "description": "Set the list type, replacing any existing list ('none' strips it) — for an\nexclusive list picker. A task keeps its checkbox only within its own type:\nswitching to bullet or ordered takes the box along with the marker."
17866
18290
  },
17867
18291
  {
17868
18292
  "kind": "method",
@@ -17977,6 +18401,54 @@
17977
18401
  },
17978
18402
  "description": "Paste clipboard text at the caret, replacing any selection. Sentinels that\nrode in from another editor are stripped. When the text matches a cut made in\nthis editor, its annotations travel with it (a move); otherwise it's plain\ntext. No-op when the clipboard is empty or unreadable."
17979
18403
  },
18404
+ {
18405
+ "kind": "method",
18406
+ "name": "insertAtCursor",
18407
+ "return": {
18408
+ "type": {
18409
+ "text": "void"
18410
+ }
18411
+ },
18412
+ "parameters": [
18413
+ {
18414
+ "name": "text",
18415
+ "type": {
18416
+ "text": "string"
18417
+ }
18418
+ }
18419
+ ],
18420
+ "description": "Puts `text` at the caret, in place of the selection when there is one, and\nleaves the caret after it, with focus on the editor. Plain text: markdown\nin it stays as written and is styled like anything typed. Does nothing on\na read-only editor."
18421
+ },
18422
+ {
18423
+ "kind": "method",
18424
+ "name": "replaceRange",
18425
+ "return": {
18426
+ "type": {
18427
+ "text": "void"
18428
+ }
18429
+ },
18430
+ "parameters": [
18431
+ {
18432
+ "name": "from",
18433
+ "type": {
18434
+ "text": "number"
18435
+ }
18436
+ },
18437
+ {
18438
+ "name": "to",
18439
+ "type": {
18440
+ "text": "number"
18441
+ }
18442
+ },
18443
+ {
18444
+ "name": "text",
18445
+ "type": {
18446
+ "text": "string"
18447
+ }
18448
+ }
18449
+ ],
18450
+ "description": "Replaces the text between two offsets with `text`, and leaves the caret\nafter it. The offsets are CLEAN, the same coordinates `getSelection()` and\nthe annotations speak, so a consumer can act on what it read there. Both\nare clamped into the text, and `to` below `from` counts as an insert at\n`from`. Does nothing on a read-only editor."
18451
+ },
17980
18452
  {
17981
18453
  "kind": "method",
17982
18454
  "name": "runCommand",
@@ -18000,7 +18472,7 @@
18000
18472
  }
18001
18473
  }
18002
18474
  ],
18003
- "description": "Escape hatch: run a command by name (bold, italic, inlineCode,\nstrikethrough, bulletList, quote, heading [payload: level], link\n[payload: href], copy, cut, paste)."
18475
+ "description": "Escape hatch: run a command by name, so a toolbar can carry the name in its\nmarkup instead of a method reference. Every method above is reachable.\n\nToggles (no payload): `bold`, `italic`, `inlineCode`, `strikethrough`,\n`bulletList`, `taskList`, `quote`, `codeBlock`, `heading` (payload: the\nlevel, default 1), `link` (payload: the href).\nSetters: `setHeading` (payload: the level, 0 for a paragraph), `setList`\n(payload: 'none' | 'bullet' | 'ordered' | 'task').\nThe rest: `indent`, `outdent`, `undo`, `redo`, `copy`, `cut`, `paste`.\n\nAn unknown name warns rather than doing nothing quietly: a typo in a\ntoolbar is otherwise invisible."
18004
18476
  },
18005
18477
  {
18006
18478
  "kind": "method",
@@ -18236,7 +18708,11 @@
18236
18708
  },
18237
18709
  {
18238
18710
  "name": "nldd-text-editor-mention",
18239
- "description": "When an @-mention is inserted (detail: MentionInsertedDetail with id, label, from, to)"
18711
+ "description": "When an @-mention is inserted (detail: MentionInsertedDetail with id, text, from, to; clean offsets, like getSelection())"
18712
+ },
18713
+ {
18714
+ "name": "nldd-text-editor-typeahead",
18715
+ "description": "When a candidate from one of the `typeaheads` is chosen (detail: TypeaheadChosenDetail with trigger, candidate, from, to; clean offsets)"
18240
18716
  },
18241
18717
  {
18242
18718
  "name": "nldd-text-editor-annotation-click",
@@ -18407,6 +18883,14 @@
18407
18883
  "module": "./text-editor.commands.js"
18408
18884
  }
18409
18885
  },
18886
+ {
18887
+ "kind": "js",
18888
+ "name": "ListType",
18889
+ "declaration": {
18890
+ "name": "ListType",
18891
+ "module": "./text-editor.commands.js"
18892
+ }
18893
+ },
18410
18894
  {
18411
18895
  "kind": "js",
18412
18896
  "name": "TextEditorState",
@@ -18447,6 +18931,38 @@
18447
18931
  "module": "./text-editor.mentions.js"
18448
18932
  }
18449
18933
  },
18934
+ {
18935
+ "kind": "js",
18936
+ "name": "Typeahead",
18937
+ "declaration": {
18938
+ "name": "Typeahead",
18939
+ "module": "./text-editor.mentions.js"
18940
+ }
18941
+ },
18942
+ {
18943
+ "kind": "js",
18944
+ "name": "TypeaheadCandidate",
18945
+ "declaration": {
18946
+ "name": "TypeaheadCandidate",
18947
+ "module": "./text-editor.mentions.js"
18948
+ }
18949
+ },
18950
+ {
18951
+ "kind": "js",
18952
+ "name": "TypeaheadSource",
18953
+ "declaration": {
18954
+ "name": "TypeaheadSource",
18955
+ "module": "./text-editor.mentions.js"
18956
+ }
18957
+ },
18958
+ {
18959
+ "kind": "js",
18960
+ "name": "TypeaheadChosenDetail",
18961
+ "declaration": {
18962
+ "name": "TypeaheadChosenDetail",
18963
+ "module": "./text-editor.mentions.js"
18964
+ }
18965
+ },
18450
18966
  {
18451
18967
  "kind": "js",
18452
18968
  "name": "Annotation",
@@ -21866,7 +22382,7 @@
21866
22382
  "declarations": [
21867
22383
  {
21868
22384
  "kind": "class",
21869
- "description": "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.",
22385
+ "description": "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.",
21870
22386
  "name": "NLDDCollection",
21871
22387
  "members": [
21872
22388
  {
@@ -21921,12 +22437,39 @@
21921
22437
  "kind": "field",
21922
22438
  "name": "gap",
21923
22439
  "type": {
21924
- "text": "string | undefined"
22440
+ "text": "SpacingSize | undefined"
21925
22441
  },
21926
- "description": "Custom gap between items (any CSS length, e.g. '8px'). Overrides the\nresponsive default at every breakpoint. Unset keeps the default.",
22442
+ "description": "A step of the spacing scale, overriding the responsive default at every\nbreakpoint. Unset keeps the default.",
21927
22443
  "attribute": "gap",
21928
22444
  "reflects": true
21929
22445
  },
22446
+ {
22447
+ "kind": "field",
22448
+ "name": "smGap",
22449
+ "type": {
22450
+ "text": "SpacingSize | undefined"
22451
+ },
22452
+ "attribute": "sm-gap",
22453
+ "reflects": true
22454
+ },
22455
+ {
22456
+ "kind": "field",
22457
+ "name": "mdGap",
22458
+ "type": {
22459
+ "text": "SpacingSize | undefined"
22460
+ },
22461
+ "attribute": "md-gap",
22462
+ "reflects": true
22463
+ },
22464
+ {
22465
+ "kind": "field",
22466
+ "name": "lgGap",
22467
+ "type": {
22468
+ "text": "SpacingSize | undefined"
22469
+ },
22470
+ "attribute": "lg-gap",
22471
+ "reflects": true
22472
+ },
21930
22473
  {
21931
22474
  "kind": "field",
21932
22475
  "name": "translations",
@@ -21951,7 +22494,7 @@
21951
22494
  },
21952
22495
  "default": "'grid'",
21953
22496
  "fieldName": "layout",
21954
- "description": "Layout mode: 'grid' | 'stack' | 'horizontal-scroll' (default: 'grid')"
22497
+ "description": "Layout mode: 'grid' | 'stack' | 'lanes' | 'horizontal-scroll' (default: 'grid')"
21955
22498
  },
21956
22499
  {
21957
22500
  "name": "show-load-more",
@@ -21986,16 +22529,40 @@
21986
22529
  "text": "string | undefined"
21987
22530
  },
21988
22531
  "fieldName": "itemWidth",
21989
- "description": "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."
22532
+ "description": "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."
21990
22533
  },
21991
22534
  {
21992
22535
  "name": "gap",
21993
22536
  "type": {
21994
- "text": "string | undefined"
22537
+ "text": "SpacingSize | undefined"
21995
22538
  },
21996
- "description": "Custom gap between items (any CSS length, e.g. '8px'). Overrides the responsive default at every breakpoint; unset keeps the default.",
22539
+ "description": "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.",
21997
22540
  "fieldName": "gap"
21998
22541
  },
22542
+ {
22543
+ "name": "sm-gap",
22544
+ "type": {
22545
+ "text": "SpacingSize | undefined"
22546
+ },
22547
+ "fieldName": "smGap",
22548
+ "description": "Gap at sm, overriding `gap` there"
22549
+ },
22550
+ {
22551
+ "name": "md-gap",
22552
+ "type": {
22553
+ "text": "SpacingSize | undefined"
22554
+ },
22555
+ "fieldName": "mdGap",
22556
+ "description": "Gap at md, overriding `gap` there"
22557
+ },
22558
+ {
22559
+ "name": "lg-gap",
22560
+ "type": {
22561
+ "text": "SpacingSize | undefined"
22562
+ },
22563
+ "fieldName": "lgGap",
22564
+ "description": "Gap at lg, overriding `gap` there"
22565
+ },
21999
22566
  {
22000
22567
  "name": "translations",
22001
22568
  "type": {
@@ -22049,7 +22616,7 @@
22049
22616
  "declarations": [
22050
22617
  {
22051
22618
  "kind": "class",
22052
- "description": "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`.",
22619
+ "description": "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.",
22053
22620
  "name": "NLDDContainer",
22054
22621
  "members": [
22055
22622
  {
@@ -25104,7 +25671,7 @@
25104
25671
  "type": {
25105
25672
  "text": "object"
25106
25673
  },
25107
- "default": "{ background: { control: { type: 'select' }, options: ['inherit', 'base', 'tinted'], description: 'Oppervlak: \"inherit\" (transparant) toont het oppervlak van de ouder; \"base\"/\"tinted\" tekenen een oppervlak en cascaden het naar afstammelingen', table: { defaultValue: { summary: 'inherit' } }, }, scheme: { control: { type: 'select' }, options: ['inherit', 'light', 'dark', 'inverted'], description: 'Kleurschema: \"inherit\" erft; \"inverted\" is het tegenovergestelde van het omliggende paginaschema', table: { defaultValue: { summary: 'inherit' } }, }, width: { control: 'text', description: 'Body max-width: \"full\" verwijdert de constraint, of een CSS length (bv. \"480px\") overschrijft de default max-width', table: { defaultValue: { summary: '' } }, }, height: { control: 'text', description: 'Minimale sectiehoogte (CSS length, bv. \"400px\", \"100dvh\") — net als width op de body-max-width, mapt height op min-height van de host', table: { defaultValue: { summary: '' } }, }, 'padding-block': paddingControl('Block (boven+onder) padding-override (token 0–96; \"0\" verwijdert de padding)'), 'padding-top': paddingControl('Override van alleen de bovenpadding'), 'padding-bottom': paddingControl('Override van alleen de onderpadding'), 'sm-padding-block': paddingControl('Block-padding op sm (≤640px)'), 'sm-padding-top': paddingControl('Bovenpadding op sm (≤640px)'), 'sm-padding-bottom': paddingControl('Onderpadding op sm (≤640px)'), 'md-padding-block': paddingControl('Block-padding op md (641–1007px)'), 'md-padding-top': paddingControl('Bovenpadding op md (641–1007px)'), 'md-padding-bottom': paddingControl('Onderpadding op md (641–1007px)'), 'lg-padding-block': paddingControl('Block-padding op lg (≥1008px)'), 'lg-padding-top': paddingControl('Bovenpadding op lg (≥1008px)'), 'lg-padding-bottom': paddingControl('Onderpadding op lg (≥1008px)'), }",
25674
+ "default": "{ background: { control: { type: 'select' }, options: ['inherit', 'base', 'tinted'], description: 'Oppervlak: \"inherit\" (transparant) toont het oppervlak van de ouder; \"base\"/\"tinted\" tekenen een oppervlak en cascaden het naar afstammelingen', table: { defaultValue: { summary: 'inherit' } }, }, scheme: { control: { type: 'select' }, options: ['inherit', 'light', 'dark', 'inverted'], description: 'Kleurschema: \"inherit\" erft; \"inverted\" is het tegenovergestelde van het omliggende paginaschema', table: { defaultValue: { summary: 'inherit' } }, }, width: { control: 'text', description: 'Body max-width: \"full\" verwijdert de constraint, of een CSS length (bv. \"480px\") overschrijft de default max-width', }, height: { control: 'text', description: 'Minimale sectiehoogte (CSS length, bv. \"400px\", \"100dvh\") — net als width op de body-max-width, mapt height op min-height van de host', }, 'padding-block': paddingControl('Block (boven+onder) padding-override (token 0–96; \"0\" verwijdert de padding)'), 'padding-top': paddingControl('Override van alleen de bovenpadding'), 'padding-bottom': paddingControl('Override van alleen de onderpadding'), 'sm-padding-block': paddingControl('Block-padding op sm (≤640px)'), 'sm-padding-top': paddingControl('Bovenpadding op sm (≤640px)'), 'sm-padding-bottom': paddingControl('Onderpadding op sm (≤640px)'), 'md-padding-block': paddingControl('Block-padding op md (641–1007px)'), 'md-padding-top': paddingControl('Bovenpadding op md (641–1007px)'), 'md-padding-bottom': paddingControl('Onderpadding op md (641–1007px)'), 'lg-padding-block': paddingControl('Block-padding op lg (≥1008px)'), 'lg-padding-top': paddingControl('Bovenpadding op lg (≥1008px)'), 'lg-padding-bottom': paddingControl('Onderpadding op lg (≥1008px)'), }",
25108
25675
  "description": "Shared Storybook controls for the PageSectionMixin surface API\n(background, scheme, width, height and the 12 block-padding overrides).\nSpread into a section story's `argTypes` / `args`, and bind onto the host\nelement in `render` with the `pageSectionAttrs` directive."
25109
25676
  },
25110
25677
  {
@@ -26708,7 +27275,7 @@
26708
27275
  "declarations": [
26709
27276
  {
26710
27277
  "kind": "class",
26711
- "description": "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.",
27278
+ "description": "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.",
26712
27279
  "name": "NLDDPage",
26713
27280
  "members": [
26714
27281
  {
@@ -27164,16 +27731,6 @@
27164
27731
  "attribute": "height",
27165
27732
  "reflects": true
27166
27733
  },
27167
- {
27168
- "kind": "field",
27169
- "name": "modeless",
27170
- "type": {
27171
- "text": "boolean"
27172
- },
27173
- "default": "false",
27174
- "attribute": "modeless",
27175
- "reflects": true
27176
- },
27177
27734
  {
27178
27735
  "kind": "field",
27179
27736
  "name": "accessibleLabel",
@@ -27243,15 +27800,6 @@
27243
27800
  "description": "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+.",
27244
27801
  "fieldName": "height"
27245
27802
  },
27246
- {
27247
- "name": "modeless",
27248
- "type": {
27249
- "text": "boolean"
27250
- },
27251
- "default": "false",
27252
- "fieldName": "modeless",
27253
- "description": "Non-modal (no backdrop or focus lock); the sheet is modal by default"
27254
- },
27255
27803
  {
27256
27804
  "name": "accessible-label",
27257
27805
  "type": {
@@ -28128,19 +28676,9 @@
28128
28676
  "declarations": [
28129
28677
  {
28130
28678
  "kind": "class",
28131
- "description": "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.",
28679
+ "description": "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.",
28132
28680
  "name": "NLDDWindow",
28133
28681
  "members": [
28134
- {
28135
- "kind": "field",
28136
- "name": "modeless",
28137
- "type": {
28138
- "text": "boolean"
28139
- },
28140
- "default": "false",
28141
- "attribute": "modeless",
28142
- "reflects": true
28143
- },
28144
28682
  {
28145
28683
  "kind": "field",
28146
28684
  "name": "noLightDismiss",
@@ -28274,15 +28812,6 @@
28274
28812
  }
28275
28813
  ],
28276
28814
  "attributes": [
28277
- {
28278
- "name": "modeless",
28279
- "type": {
28280
- "text": "boolean"
28281
- },
28282
- "default": "false",
28283
- "fieldName": "modeless",
28284
- "description": "Modeless (no backdrop or focus trap); the window is modal by default"
28285
- },
28286
28815
  {
28287
28816
  "name": "no-light-dismiss",
28288
28817
  "type": {
@@ -28922,7 +29451,7 @@
28922
29451
  "type": {
28923
29452
  "text": "Color"
28924
29453
  },
28925
- "default": "'default'",
29454
+ "default": "'content'",
28926
29455
  "attribute": "color",
28927
29456
  "reflects": true
28928
29457
  },
@@ -28987,9 +29516,9 @@
28987
29516
  "type": {
28988
29517
  "text": "Color"
28989
29518
  },
28990
- "default": "'default'",
29519
+ "default": "'content'",
28991
29520
  "fieldName": "color",
28992
- "description": "Color variant of the icon (default: 'default')"
29521
+ "description": "Color variant of the icon (default: 'content')"
28993
29522
  },
28994
29523
  {
28995
29524
  "name": "icon",
@@ -29199,7 +29728,7 @@
29199
29728
  "type": {
29200
29729
  "text": "Color"
29201
29730
  },
29202
- "default": "'default'",
29731
+ "default": "'content'",
29203
29732
  "attribute": "color",
29204
29733
  "reflects": true
29205
29734
  },
@@ -29351,9 +29880,9 @@
29351
29880
  "type": {
29352
29881
  "text": "Color"
29353
29882
  },
29354
- "default": "'default'",
29883
+ "default": "'content'",
29355
29884
  "fieldName": "color",
29356
- "description": "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."
29885
+ "description": "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."
29357
29886
  },
29358
29887
  {
29359
29888
  "name": "width",
@@ -29808,7 +30337,7 @@
29808
30337
  "type": {
29809
30338
  "text": "Color"
29810
30339
  },
29811
- "default": "'default'",
30340
+ "default": "'content'",
29812
30341
  "attribute": "color",
29813
30342
  "reflects": true
29814
30343
  },
@@ -29970,9 +30499,9 @@
29970
30499
  "type": {
29971
30500
  "text": "Color"
29972
30501
  },
29973
- "default": "'default'",
30502
+ "default": "'content'",
29974
30503
  "fieldName": "color",
29975
- "description": "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."
30504
+ "description": "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."
29976
30505
  },
29977
30506
  {
29978
30507
  "name": "width",
@@ -30512,6 +31041,17 @@
30512
31041
  "attribute": "checkbox",
30513
31042
  "reflects": true
30514
31043
  },
31044
+ {
31045
+ "kind": "field",
31046
+ "name": "radio",
31047
+ "type": {
31048
+ "text": "boolean"
31049
+ },
31050
+ "default": "false",
31051
+ "description": "When set, the whole row is one radio of a group. Ignored when href is set.",
31052
+ "attribute": "radio",
31053
+ "reflects": true
31054
+ },
30515
31055
  {
30516
31056
  "kind": "field",
30517
31057
  "name": "checked",
@@ -30519,7 +31059,7 @@
30519
31059
  "text": "boolean"
30520
31060
  },
30521
31061
  "default": "false",
30522
- "description": "Checked state of a `checkbox` row. Toggled by the item on activation.",
31062
+ "description": "Checked state of a `checkbox` or `radio` row. A checkbox row toggles it on\nactivation; a radio row only ever sets it, because picking the option you\nalready have is not a way to unpick it.",
30523
31063
  "attribute": "checked",
30524
31064
  "reflects": true
30525
31065
  },
@@ -30639,7 +31179,7 @@
30639
31179
  "events": [
30640
31180
  {
30641
31181
  "name": "change",
30642
- "description": "On a `checkbox` row after it toggles; detail: { checked: boolean }"
31182
+ "description": "On a `checkbox` row after it toggles, and on a `radio` row when it becomes checked; detail: { checked: boolean }"
30643
31183
  }
30644
31184
  ],
30645
31185
  "attributes": [
@@ -30692,7 +31232,16 @@
30692
31232
  "type": {
30693
31233
  "text": "boolean"
30694
31234
  },
30695
- "description": "Checked state of a `checkbox` row; the item toggles it on activation",
31235
+ "description": "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.",
31236
+ "name": "radio",
31237
+ "default": "false",
31238
+ "fieldName": "radio"
31239
+ },
31240
+ {
31241
+ "type": {
31242
+ "text": "boolean"
31243
+ },
31244
+ "description": "Checked state of a `checkbox` or `radio` row. A checkbox row toggles it on activation, a radio row only ever sets it",
30696
31245
  "name": "checked",
30697
31246
  "default": "false",
30698
31247
  "fieldName": "checked"
@@ -30799,7 +31348,7 @@
30799
31348
  "declarations": [
30800
31349
  {
30801
31350
  "kind": "class",
30802
- "description": "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.",
31351
+ "description": "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.",
30803
31352
  "name": "NLDDList",
30804
31353
  "slots": [
30805
31354
  {
@@ -30816,7 +31365,11 @@
30816
31365
  },
30817
31366
  {
30818
31367
  "name": "empty",
30819
- "description": "Shown when no items are visible (all `[hidden]` or none). Empty by default: what an empty list should say is the app's to write, so put an `nldd-inline-dialog` here. In `type=\"listbox\"` it is suppressed while the search field is empty (no query yet), so the consumer can show just the search field or its own hint outside the list."
31368
+ "description": "Shown when the list has no items at all. Empty by default: what an empty list should say is the app's to write, so put an `nldd-inline-dialog` here. There is nothing to search or filter in a list with no rows, so the search field of a `type=\"listbox\"` and a `[slot=\"toolbar\"]` are hidden along with them, and an unfilled slot takes the whole list off the page. A list that fetches its rows is in this state until they arrive: put an `nldd-inline-dialog variant=\"loading\"` here to hold the place rather than have the controls appear a moment later."
31369
+ },
31370
+ {
31371
+ "name": "no-results",
31372
+ "description": "Shown when the list has items but every one of them is `[hidden]`, which is what consumer-driven filtering leaves behind. A different state from `empty` and a different sentence: here the search field and the `[slot=\"toolbar\"]` stay, because they are the way back to the rows. Falls back to `[slot=\"empty\"]` when not given. In `type=\"listbox\"` it is suppressed while the search field is empty (no query yet), so the consumer can show just the search field or its own hint outside the list."
30820
31373
  }
30821
31374
  ],
30822
31375
  "members": [
@@ -31786,8 +32339,9 @@
31786
32339
  "kind": "field",
31787
32340
  "name": "size",
31788
32341
  "type": {
31789
- "text": "Size | undefined"
32342
+ "text": "Size"
31790
32343
  },
32344
+ "default": "'inherit'",
31791
32345
  "attribute": "size",
31792
32346
  "reflects": true
31793
32347
  },
@@ -31894,10 +32448,11 @@
31894
32448
  {
31895
32449
  "name": "size",
31896
32450
  "type": {
31897
- "text": "Size | undefined"
32451
+ "text": "Size"
31898
32452
  },
32453
+ "default": "'inherit'",
31899
32454
  "fieldName": "size",
31900
- "description": "Text size: 'xs' | 'sm' | 'md' | 'lg' | 'inherit'. Empty = inherit."
32455
+ "description": "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."
31901
32456
  },
31902
32457
  {
31903
32458
  "name": "text",
@@ -33582,8 +34137,8 @@
33582
34137
  "type": {
33583
34138
  "text": "ActivityIndicatorTiming"
33584
34139
  },
33585
- "default": "'default'",
33586
- "description": "'default' waits DELAY_MS before showing; 'instant' shows\nimmediately. The fade-in plays either way.",
34140
+ "default": "'delay'",
34141
+ "description": "'delay' waits DELAY_MS before showing; 'instant' shows\nimmediately. The fade-in plays either way.",
33587
34142
  "attribute": "timing",
33588
34143
  "reflects": true
33589
34144
  },
@@ -33652,8 +34207,8 @@
33652
34207
  "type": {
33653
34208
  "text": "ActivityIndicatorTiming"
33654
34209
  },
33655
- "default": "'default'",
33656
- "description": "'default' waits 1000ms before showing (anti-flash); 'instant' shows immediately (the fade-in still plays). Default 'default'.",
34210
+ "default": "'delay'",
34211
+ "description": "'delay' (the default) waits 1000ms before showing (anti-flash); 'instant' shows immediately (the fade-in still plays).",
33657
34212
  "fieldName": "timing"
33658
34213
  },
33659
34214
  {
@@ -34132,204 +34687,223 @@
34132
34687
  "description": "Renders text as h1–h6; absent renders a p"
34133
34688
  },
34134
34689
  {
34135
- "name": "dismissible",
34136
- "type": {
34137
- "text": "boolean"
34138
- },
34139
- "default": "false",
34140
- "fieldName": "dismissible",
34141
- "description": "Show a close button in the top-right; emits `dismiss` when clicked"
34142
- },
34143
- {
34144
- "name": "translations",
34145
- "type": {
34146
- "text": "Partial<NLDDBannerTranslations>"
34147
- },
34148
- "default": "{}",
34149
- "description": "Override translation keys; unset keys fall back to Dutch",
34150
- "fieldName": "translations"
34151
- }
34152
- ],
34153
- "superclass": {
34154
- "name": "LitElement",
34155
- "package": "lit"
34156
- },
34157
- "tagName": "nldd-banner",
34158
- "customElement": true,
34159
- "slots": [
34160
- {
34161
- "name": "",
34162
- "description": "Optional rich content between text and actions (e.g. nldd-rich-text)"
34163
- },
34164
- {
34165
- "name": "actions",
34166
- "description": "nldd-button elements, wrapped in a horizontal nldd-button-group"
34167
- }
34168
- ]
34169
- }
34170
- ],
34171
- "exports": [
34172
- {
34173
- "kind": "js",
34174
- "name": "NLDDBanner",
34175
- "declaration": {
34176
- "name": "NLDDBanner",
34177
- "module": "src/components/status-and-feedback/banner/banner.ts"
34178
- }
34179
- },
34180
- {
34181
- "kind": "custom-element-definition",
34182
- "name": "nldd-banner",
34183
- "declaration": {
34184
- "name": "NLDDBanner",
34185
- "module": "src/components/status-and-feedback/banner/banner.ts"
34186
- }
34187
- }
34188
- ]
34189
- },
34190
- {
34191
- "kind": "javascript-module",
34192
- "path": "src/components/status-and-feedback/inline-dialog/inline-dialog.ts",
34193
- "declarations": [
34194
- {
34195
- "kind": "class",
34196
- "description": "An inline status component for empty state, confirmations and feedback. Fills the container and has no minimum width.",
34197
- "name": "NLDDInlineDialog",
34198
- "members": [
34199
- {
34200
- "kind": "field",
34201
- "name": "variant",
34202
- "type": {
34203
- "text": "InlineDialogVariant | ''"
34204
- },
34205
- "default": "''",
34206
- "attribute": "variant",
34207
- "reflects": true
34208
- },
34209
- {
34210
- "kind": "field",
34211
- "name": "size",
34212
- "type": {
34213
- "text": "InlineDialogSize"
34214
- },
34215
- "default": "'md'",
34216
- "attribute": "size",
34217
- "reflects": true
34218
- },
34219
- {
34220
- "kind": "field",
34221
- "name": "icon",
34222
- "type": {
34223
- "text": "string"
34224
- },
34225
- "default": "''",
34226
- "attribute": "icon",
34227
- "reflects": true
34228
- },
34229
- {
34230
- "kind": "field",
34231
- "name": "iconColor",
34232
- "type": {
34233
- "text": "InlineDialogIconColor | ''"
34234
- },
34235
- "default": "''",
34236
- "attribute": "icon-color",
34237
- "reflects": true
34238
- },
34239
- {
34240
- "kind": "field",
34241
- "name": "text",
34242
- "type": {
34243
- "text": "string"
34244
- },
34245
- "default": "''",
34246
- "attribute": "text",
34247
- "reflects": true
34248
- },
34249
- {
34250
- "kind": "field",
34251
- "name": "supportingText",
34252
- "type": {
34253
- "text": "string"
34254
- },
34255
- "default": "''",
34256
- "attribute": "supporting-text",
34257
- "reflects": true
34258
- },
34259
- {
34260
- "kind": "field",
34261
- "name": "headingLevel",
34262
- "type": {
34263
- "text": "1 | 2 | 3 | 4 | 5 | 6 | null"
34264
- },
34265
- "default": "null",
34266
- "attribute": "heading-level",
34267
- "reflects": true
34268
- }
34269
- ],
34270
- "attributes": [
34271
- {
34272
- "name": "variant",
34273
- "type": {
34274
- "text": "InlineDialogVariant | ''"
34275
- },
34276
- "default": "''",
34277
- "fieldName": "variant",
34278
- "description": "Semantic variant. 'alert' / 'success' force a matching icon and color; 'loading' shows an nldd-activity-indicator (a role=\"status\" spinner announcing \"Laden\") in place of the icon — for an empty state that is still loading."
34279
- },
34280
- {
34281
- "name": "size",
34282
- "type": {
34283
- "text": "InlineDialogSize"
34284
- },
34285
- "default": "'md'",
34286
- "fieldName": "size",
34287
- "description": "Typography size: 'md' (default) keeps body-md text + body-sm supporting; 'lg' bumps both up a step."
34288
- },
34289
- {
34290
- "name": "icon",
34291
- "type": {
34292
- "text": "string"
34293
- },
34294
- "default": "''",
34295
- "fieldName": "icon",
34296
- "description": "Name of the nldd-icon icon above the text; absent when not set. Ignored when variant is set."
34297
- },
34298
- {
34299
- "name": "icon-color",
34300
- "type": {
34301
- "text": "InlineDialogIconColor | ''"
34302
- },
34303
- "default": "''",
34304
- "fieldName": "iconColor",
34305
- "description": "'secondary' | 'accent' | 'critical' | 'warning' | 'success'. Overrides the default and variant icon color."
34306
- },
34307
- {
34308
- "name": "text",
34309
- "type": {
34310
- "text": "string"
34311
- },
34312
- "default": "''",
34313
- "fieldName": "text",
34314
- "description": "Main text (heading or paragraph, depending on heading-level)"
34315
- },
34316
- {
34317
- "name": "supporting-text",
34690
+ "name": "dismissible",
34691
+ "type": {
34692
+ "text": "boolean"
34693
+ },
34694
+ "default": "false",
34695
+ "fieldName": "dismissible",
34696
+ "description": "Show a close button in the top-right; emits `dismiss` when clicked"
34697
+ },
34698
+ {
34699
+ "name": "translations",
34700
+ "type": {
34701
+ "text": "Partial<NLDDBannerTranslations>"
34702
+ },
34703
+ "default": "{}",
34704
+ "description": "Override translation keys; unset keys fall back to Dutch",
34705
+ "fieldName": "translations"
34706
+ }
34707
+ ],
34708
+ "superclass": {
34709
+ "name": "LitElement",
34710
+ "package": "lit"
34711
+ },
34712
+ "tagName": "nldd-banner",
34713
+ "customElement": true,
34714
+ "slots": [
34715
+ {
34716
+ "name": "",
34717
+ "description": "Optional rich content between text and actions (e.g. nldd-rich-text)"
34718
+ },
34719
+ {
34720
+ "name": "actions",
34721
+ "description": "nldd-button elements, wrapped in a horizontal nldd-button-group"
34722
+ }
34723
+ ]
34724
+ }
34725
+ ],
34726
+ "exports": [
34727
+ {
34728
+ "kind": "js",
34729
+ "name": "NLDDBanner",
34730
+ "declaration": {
34731
+ "name": "NLDDBanner",
34732
+ "module": "src/components/status-and-feedback/banner/banner.ts"
34733
+ }
34734
+ },
34735
+ {
34736
+ "kind": "custom-element-definition",
34737
+ "name": "nldd-banner",
34738
+ "declaration": {
34739
+ "name": "NLDDBanner",
34740
+ "module": "src/components/status-and-feedback/banner/banner.ts"
34741
+ }
34742
+ }
34743
+ ]
34744
+ },
34745
+ {
34746
+ "kind": "javascript-module",
34747
+ "path": "src/components/status-and-feedback/inline-dialog/inline-dialog.ts",
34748
+ "declarations": [
34749
+ {
34750
+ "kind": "class",
34751
+ "description": "An inline status component for empty state, confirmations and feedback. Fills the container and has no minimum width.",
34752
+ "name": "NLDDInlineDialog",
34753
+ "members": [
34754
+ {
34755
+ "kind": "field",
34756
+ "name": "variant",
34757
+ "type": {
34758
+ "text": "InlineDialogVariant | ''"
34759
+ },
34760
+ "default": "''",
34761
+ "attribute": "variant",
34762
+ "reflects": true
34763
+ },
34764
+ {
34765
+ "kind": "field",
34766
+ "name": "size",
34767
+ "type": {
34768
+ "text": "InlineDialogSize"
34769
+ },
34770
+ "default": "'md'",
34771
+ "attribute": "size",
34772
+ "reflects": true
34773
+ },
34774
+ {
34775
+ "kind": "field",
34776
+ "name": "icon",
34777
+ "type": {
34778
+ "text": "string"
34779
+ },
34780
+ "default": "''",
34781
+ "attribute": "icon",
34782
+ "reflects": true
34783
+ },
34784
+ {
34785
+ "kind": "field",
34786
+ "name": "iconColor",
34787
+ "type": {
34788
+ "text": "InlineDialogIconColor | ''"
34789
+ },
34790
+ "default": "''",
34791
+ "attribute": "icon-color",
34792
+ "reflects": true
34793
+ },
34794
+ {
34795
+ "kind": "field",
34796
+ "name": "text",
34797
+ "type": {
34798
+ "text": "string"
34799
+ },
34800
+ "default": "''",
34801
+ "attribute": "text",
34802
+ "reflects": true
34803
+ },
34804
+ {
34805
+ "kind": "field",
34806
+ "name": "supportingText",
34807
+ "type": {
34808
+ "text": "string"
34809
+ },
34810
+ "default": "''",
34811
+ "attribute": "supporting-text",
34812
+ "reflects": true
34813
+ },
34814
+ {
34815
+ "kind": "field",
34816
+ "name": "headingLevel",
34817
+ "type": {
34818
+ "text": "1 | 2 | 3 | 4 | 5 | 6 | null"
34819
+ },
34820
+ "default": "null",
34821
+ "attribute": "heading-level",
34822
+ "reflects": true
34823
+ },
34824
+ {
34825
+ "kind": "field",
34826
+ "name": "horizontalAlignment",
34827
+ "type": {
34828
+ "text": "InlineDialogHorizontalAlignment | ''"
34829
+ },
34830
+ "default": "''",
34831
+ "attribute": "horizontal-alignment",
34832
+ "reflects": true
34833
+ }
34834
+ ],
34835
+ "attributes": [
34836
+ {
34837
+ "name": "variant",
34838
+ "type": {
34839
+ "text": "InlineDialogVariant | ''"
34840
+ },
34841
+ "default": "''",
34842
+ "fieldName": "variant",
34843
+ "description": "Semantic variant. 'alert' / 'success' force a matching icon and color; 'loading' shows an nldd-activity-indicator (a role=\"status\" spinner announcing \"Laden\") in place of the icon — for an empty state that is still loading."
34844
+ },
34845
+ {
34846
+ "name": "size",
34847
+ "type": {
34848
+ "text": "InlineDialogSize"
34849
+ },
34850
+ "default": "'md'",
34851
+ "fieldName": "size",
34852
+ "description": "Typography size: 'md' (default) keeps body-md text + body-sm supporting; 'lg' bumps both up a step."
34853
+ },
34854
+ {
34855
+ "name": "icon",
34856
+ "type": {
34857
+ "text": "string"
34858
+ },
34859
+ "default": "''",
34860
+ "fieldName": "icon",
34861
+ "description": "Name of the nldd-icon icon above the text; absent when not set. Ignored when variant is set."
34862
+ },
34863
+ {
34864
+ "name": "icon-color",
34865
+ "type": {
34866
+ "text": "InlineDialogIconColor | ''"
34867
+ },
34868
+ "default": "''",
34869
+ "fieldName": "iconColor",
34870
+ "description": "'secondary' | 'accent' | 'critical' | 'warning' | 'success'. Overrides the default and variant icon color."
34871
+ },
34872
+ {
34873
+ "name": "text",
34874
+ "type": {
34875
+ "text": "string"
34876
+ },
34877
+ "default": "''",
34878
+ "fieldName": "text",
34879
+ "description": "Main text (heading or paragraph, depending on heading-level)"
34880
+ },
34881
+ {
34882
+ "name": "supporting-text",
34883
+ "type": {
34884
+ "text": "string"
34885
+ },
34886
+ "default": "''",
34887
+ "fieldName": "supportingText",
34888
+ "description": "Supporting text below the heading"
34889
+ },
34890
+ {
34891
+ "name": "heading-level",
34892
+ "type": {
34893
+ "text": "1 | 2 | 3 | 4 | 5 | 6 | null"
34894
+ },
34895
+ "default": "null",
34896
+ "fieldName": "headingLevel",
34897
+ "description": "Renders text as h1–h6; absent renders a p"
34898
+ },
34899
+ {
34900
+ "name": "horizontal-alignment",
34318
34901
  "type": {
34319
- "text": "string"
34902
+ "text": "InlineDialogHorizontalAlignment | ''"
34320
34903
  },
34321
34904
  "default": "''",
34322
- "fieldName": "supportingText",
34323
- "description": "Supporting text below the heading"
34324
- },
34325
- {
34326
- "name": "heading-level",
34327
- "type": {
34328
- "text": "1 | 2 | 3 | 4 | 5 | 6 | null"
34329
- },
34330
- "default": "null",
34331
- "fieldName": "headingLevel",
34332
- "description": "Renders text as h1–h6; absent renders a p"
34905
+ "fieldName": "horizontalAlignment",
34906
+ "description": "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."
34333
34907
  }
34334
34908
  ],
34335
34909
  "superclass": {
@@ -34643,6 +35217,16 @@
34643
35217
  "attribute": "supporting-text",
34644
35218
  "reflects": true
34645
35219
  },
35220
+ {
35221
+ "kind": "field",
35222
+ "name": "horizontalAlignment",
35223
+ "type": {
35224
+ "text": "InlineDialogHorizontalAlignment | ''"
35225
+ },
35226
+ "default": "''",
35227
+ "attribute": "horizontal-alignment",
35228
+ "reflects": true
35229
+ },
34646
35230
  {
34647
35231
  "kind": "field",
34648
35232
  "name": "accessibleLabel",
@@ -34719,6 +35303,15 @@
34719
35303
  "fieldName": "supportingText",
34720
35304
  "description": "Forwarded to nldd-inline-dialog; supporting text"
34721
35305
  },
35306
+ {
35307
+ "name": "horizontal-alignment",
35308
+ "type": {
35309
+ "text": "InlineDialogHorizontalAlignment | ''"
35310
+ },
35311
+ "default": "''",
35312
+ "fieldName": "horizontalAlignment",
35313
+ "description": "Forwarded to nldd-inline-dialog. Unset derives it there: slotted content aligns left, a bare message stays centered."
35314
+ },
34722
35315
  {
34723
35316
  "name": "accessible-label",
34724
35317
  "type": {
@@ -37843,13 +38436,76 @@
37843
38436
  }
37844
38437
  ]
37845
38438
  },
38439
+ {
38440
+ "kind": "javascript-module",
38441
+ "path": "src/utilities/spacing-scale.ts",
38442
+ "declarations": [
38443
+ {
38444
+ "kind": "variable",
38445
+ "name": "SPACING_SCALE",
38446
+ "type": {
38447
+ "text": "[\n\t'0', '2', '4', '6', '8', '10', '12', '16', '20', '24',\n\t'28', '32', '40', '44', '48', '56', '64', '80', '96',\n]"
38448
+ },
38449
+ "default": "[ '0', '2', '4', '6', '8', '10', '12', '16', '20', '24', '28', '32', '40', '44', '48', '56', '64', '80', '96', ]",
38450
+ "description": "Every step there is. `'0'` is a value, not the absence of one."
38451
+ },
38452
+ {
38453
+ "kind": "function",
38454
+ "name": "spacingToValue",
38455
+ "return": {
38456
+ "type": {
38457
+ "text": "string | null"
38458
+ }
38459
+ },
38460
+ "parameters": [
38461
+ {
38462
+ "name": "value",
38463
+ "type": {
38464
+ "text": "string | undefined"
38465
+ }
38466
+ },
38467
+ {
38468
+ "name": "element",
38469
+ "type": {
38470
+ "text": "string"
38471
+ }
38472
+ },
38473
+ {
38474
+ "name": "attribute",
38475
+ "type": {
38476
+ "text": "string"
38477
+ }
38478
+ }
38479
+ ],
38480
+ "description": "A step of the scale as the token it stands for.\n\nReturns null when there is nothing to set, so a caller can remove the\nproperty rather than write an empty one. `element` and `attribute` are only\nthere to name the offender in a dev warning."
38481
+ }
38482
+ ],
38483
+ "exports": [
38484
+ {
38485
+ "kind": "js",
38486
+ "name": "SPACING_SCALE",
38487
+ "declaration": {
38488
+ "name": "SPACING_SCALE",
38489
+ "module": "src/utilities/spacing-scale.ts"
38490
+ }
38491
+ },
38492
+ {
38493
+ "kind": "js",
38494
+ "name": "spacingToValue",
38495
+ "declaration": {
38496
+ "name": "spacingToValue",
38497
+ "module": "src/utilities/spacing-scale.ts"
38498
+ }
38499
+ }
38500
+ ]
38501
+ },
37846
38502
  {
37847
38503
  "kind": "javascript-module",
37848
38504
  "path": "src/utilities/visibility-mixin.ts",
37849
38505
  "declarations": [
37850
38506
  {
37851
38507
  "kind": "mixin",
37852
- "description": "Adds `hide-below` and `hide-above` attributes that toggle visibility based\non the inline-size of an ancestor CSS container.\n\nWithout a `containerName` argument the generated rule is an anonymous\n`@container (…)` query — it matches the nearest ancestor that declares\n`container-type: inline-size`. Pass a name to target a specific container\n(e.g. `'cells-container'` for cells inside `nldd-list`, which sets that\nname inline on its host as a Safari shadow-DOM workaround).\n\nValues are either a named breakpoint — `sm` / `md` / `lg` — or a CSS length\n(e.g. '320px', '20rem'). Named values resolve to the standard breakpoint\nthresholds: `hide-below` uses the breakpoint's lower bound (e.g.\n`hide-below=\"lg\"` hides in sm+md and shows in lg), `hide-above` its upper\nbound; the open edges (below sm, above lg) are no-ops. Container queries can't\nread CSS variables in their conditions, so the query rule is generated at\nruntime and injected as a <style> element in the component's shadow root,\nwrapped in `:host {",
38508
+ "description": "Adds `hide-below` and `hide-above` attributes that toggle visibility based\non the inline-size of an ancestor CSS container.\n\nWithout a `containerName` argument the rule is an anonymous `@container (…)`\nquery — it matches the nearest ancestor that declares\n`container-type: inline-size`. Pass a name to target a specific container\n(e.g. `'cells-container'` for cells inside `nldd-list`, which sets that\nname inline on its host as a Safari shadow-DOM workaround).\n\nValues are either a named breakpoint — `sm` / `md` / `lg` — or a CSS length\n(e.g. '320px', '20rem'). Named values resolve to the standard breakpoint\nthresholds: `hide-below` uses the breakpoint's lower bound (e.g.\n`hide-below=\"lg\"` hides in sm+md and shows in lg), `hide-above` its upper\nbound; the open edges (below sm, above lg) are no-ops.\n\nThe named values are static CSS (see `visibility-mixin.styles.ts`), added\nthrough `finalizeStyles` so that a component's own `static styles` does not\nhave to know about them. A custom length has no static form: the threshold\nis only known at runtime and a container query cannot read one from a CSS\nvariable, so its rule is written at runtime into a constructable stylesheet\nthe shadow root adopts. Neither path is an inline stylesheet, so no consumer\nneeds `'unsafe-inline'` in its `style-src` for either.",
37853
38509
  "name": "VisibilityMixin",
37854
38510
  "members": [
37855
38511
  {
@@ -37872,15 +38528,15 @@
37872
38528
  },
37873
38529
  {
37874
38530
  "kind": "field",
37875
- "name": "_visibilityStyle",
38531
+ "name": "_visibilitySheet",
37876
38532
  "type": {
37877
- "text": "HTMLStyleElement | undefined"
38533
+ "text": "CSSStyleSheet | undefined"
37878
38534
  },
37879
38535
  "privacy": "private"
37880
38536
  },
37881
38537
  {
37882
38538
  "kind": "method",
37883
- "name": "_updateVisibilityStyle",
38539
+ "name": "_updateVisibilityRules",
37884
38540
  "privacy": "private",
37885
38541
  "return": {
37886
38542
  "type": {