@nldd/design-system 0.8.82 → 0.8.83

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 (146) hide show
  1. package/custom-elements.json +436 -68
  2. package/dist/components/actions/button/button.d.ts +5 -0
  3. package/dist/components/actions/button/button.d.ts.map +1 -1
  4. package/dist/components/actions/button/button.js +8 -0
  5. package/dist/components/actions/button/button.js.map +1 -1
  6. package/dist/components/actions/button/button.template.d.ts.map +1 -1
  7. package/dist/components/actions/button/button.template.js +2 -0
  8. package/dist/components/actions/button/button.template.js.map +1 -1
  9. package/dist/components/actions/icon-button/icon-button.d.ts +1 -1
  10. package/dist/components/actions/icon-button/icon-button.js +1 -1
  11. package/dist/components/components.js +894 -226
  12. package/dist/components/content/avatar/avatar.styles.d.ts.map +1 -1
  13. package/dist/components/content/avatar/avatar.styles.js +5 -1
  14. package/dist/components/content/avatar/avatar.styles.js.map +1 -1
  15. package/dist/components/content/icon/icon-aliases.d.ts.map +1 -1
  16. package/dist/components/content/icon/icon-aliases.js +78 -6
  17. package/dist/components/content/icon/icon-aliases.js.map +1 -1
  18. package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
  19. package/dist/components/content/icon/icon-gallery-status.js +55 -94
  20. package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
  21. package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
  22. package/dist/components/content/icon/icon-registry.js +34 -4
  23. package/dist/components/content/icon/icon-registry.js.map +1 -1
  24. package/dist/components/content/icon/icon.d.ts +8 -2
  25. package/dist/components/content/icon/icon.d.ts.map +1 -1
  26. package/dist/components/content/icon/icon.js +17 -2
  27. package/dist/components/content/icon/icon.js.map +1 -1
  28. package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
  29. package/dist/components/content/icon/icon.styles.js +8 -0
  30. package/dist/components/content/icon/icon.styles.js.map +1 -1
  31. package/dist/components/content/text/text.d.ts +50 -0
  32. package/dist/components/content/text/text.d.ts.map +1 -0
  33. package/dist/components/content/text/text.js +81 -0
  34. package/dist/components/content/text/text.js.map +1 -0
  35. package/dist/components/content/text/text.styles.d.ts +2 -0
  36. package/dist/components/content/text/text.styles.d.ts.map +1 -0
  37. package/dist/components/content/text/text.styles.js +116 -0
  38. package/dist/components/content/text/text.styles.js.map +1 -0
  39. package/dist/components/content/text/text.template.d.ts +3 -0
  40. package/dist/components/content/text/text.template.d.ts.map +1 -0
  41. package/dist/components/content/text/text.template.js +7 -0
  42. package/dist/components/content/text/text.template.js.map +1 -0
  43. package/dist/components/content/title/title.styles.d.ts.map +1 -1
  44. package/dist/components/content/title/title.styles.js +9 -13
  45. package/dist/components/content/title/title.styles.js.map +1 -1
  46. package/dist/components/{icon-CIpJq_cf.js → icon-C1Kikpol.js} +100 -10
  47. package/dist/components/{icon-button-BAkUJTn6.js → icon-button-BYy6hnAY.js} +2 -2
  48. package/dist/components/index.d.ts +2 -1
  49. package/dist/components/index.d.ts.map +1 -1
  50. package/dist/components/index.js +2 -1
  51. package/dist/components/index.js.map +1 -1
  52. package/dist/components/inputs/combo-box/combo-box.d.ts +2 -0
  53. package/dist/components/inputs/combo-box/combo-box.d.ts.map +1 -1
  54. package/dist/components/inputs/combo-box/combo-box.js +22 -0
  55. package/dist/components/inputs/combo-box/combo-box.js.map +1 -1
  56. package/dist/components/inputs/combo-box/combo-box.styles.d.ts.map +1 -1
  57. package/dist/components/inputs/combo-box/combo-box.styles.js +5 -0
  58. package/dist/components/inputs/combo-box/combo-box.styles.js.map +1 -1
  59. package/dist/components/inputs/combo-box/combo-box.template.d.ts.map +1 -1
  60. package/dist/components/inputs/combo-box/combo-box.template.js +23 -20
  61. package/dist/components/inputs/combo-box/combo-box.template.js.map +1 -1
  62. package/dist/components/inputs/date-field/date-field.template.d.ts.map +1 -1
  63. package/dist/components/inputs/date-field/date-field.template.js +7 -1
  64. package/dist/components/inputs/date-field/date-field.template.js.map +1 -1
  65. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.d.ts +8 -1
  66. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.d.ts.map +1 -1
  67. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.js +8 -0
  68. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.js.map +1 -1
  69. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.d.ts.map +1 -1
  70. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.js +2 -0
  71. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.js.map +1 -1
  72. package/dist/components/inputs/text-field/text-field.d.ts +21 -0
  73. package/dist/components/inputs/text-field/text-field.d.ts.map +1 -1
  74. package/dist/components/inputs/text-field/text-field.js +48 -0
  75. package/dist/components/inputs/text-field/text-field.js.map +1 -1
  76. package/dist/components/inputs/text-field/text-field.template.d.ts.map +1 -1
  77. package/dist/components/inputs/text-field/text-field.template.js +2 -0
  78. package/dist/components/inputs/text-field/text-field.template.js.map +1 -1
  79. package/dist/components/inputs/time-field/time-field.template.d.ts.map +1 -1
  80. package/dist/components/inputs/time-field/time-field.template.js +7 -1
  81. package/dist/components/inputs/time-field/time-field.template.js.map +1 -1
  82. package/dist/components/layout/box/box.d.ts +3 -3
  83. package/dist/components/layout/box/box.d.ts.map +1 -1
  84. package/dist/components/layout/box/box.js +3 -3
  85. package/dist/components/layout/box/box.js.map +1 -1
  86. package/dist/components/layout/box/box.styles.d.ts.map +1 -1
  87. package/dist/components/layout/box/box.styles.js +3 -6
  88. package/dist/components/layout/box/box.styles.js.map +1 -1
  89. package/dist/components/layout/sheet/sheet.styles.d.ts.map +1 -1
  90. package/dist/components/layout/sheet/sheet.styles.js +10 -3
  91. package/dist/components/layout/sheet/sheet.styles.js.map +1 -1
  92. package/dist/components/lists-and-tables/list/list.d.ts +60 -45
  93. package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
  94. package/dist/components/lists-and-tables/list/list.js +94 -80
  95. package/dist/components/lists-and-tables/list/list.js.map +1 -1
  96. package/dist/components/lists-and-tables/list-item/list-item.d.ts +94 -21
  97. package/dist/components/lists-and-tables/list-item/list-item.d.ts.map +1 -1
  98. package/dist/components/lists-and-tables/list-item/list-item.js +275 -48
  99. package/dist/components/lists-and-tables/list-item/list-item.js.map +1 -1
  100. package/dist/components/lists-and-tables/list-item/list-item.styles.d.ts.map +1 -1
  101. package/dist/components/lists-and-tables/list-item/list-item.styles.js +116 -34
  102. package/dist/components/lists-and-tables/list-item/list-item.styles.js.map +1 -1
  103. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts +1 -1
  104. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts.map +1 -1
  105. package/dist/components/lists-and-tables/list-item/list-item.template.js +5 -2
  106. package/dist/components/lists-and-tables/list-item/list-item.template.js.map +1 -1
  107. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.d.ts +116 -0
  108. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.d.ts.map +1 -0
  109. package/dist/components/lists-and-tables/{list-item-action/list-item-action.js → list-item-segment/list-item-segment.js} +77 -52
  110. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.js.map +1 -0
  111. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.d.ts +2 -0
  112. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.d.ts.map +1 -0
  113. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.js +179 -0
  114. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.js.map +1 -0
  115. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.d.ts +3 -0
  116. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.d.ts.map +1 -0
  117. package/dist/components/lists-and-tables/{list-item-action/list-item-action.template.js → list-item-segment/list-item-segment.template.js} +5 -4
  118. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.js.map +1 -0
  119. package/dist/components/status-and-feedback/badge/badge.d.ts +8 -2
  120. package/dist/components/status-and-feedback/badge/badge.d.ts.map +1 -1
  121. package/dist/components/status-and-feedback/badge/badge.js +17 -1
  122. package/dist/components/status-and-feedback/badge/badge.js.map +1 -1
  123. package/dist/components/status-and-feedback/badge/badge.styles.d.ts.map +1 -1
  124. package/dist/components/status-and-feedback/badge/badge.styles.js +35 -6
  125. package/dist/components/status-and-feedback/badge/badge.styles.js.map +1 -1
  126. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.d.ts.map +1 -1
  127. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js +7 -0
  128. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js.map +1 -1
  129. package/dist/css/variables.css +25 -1
  130. package/dist/nldd.min.js +1002 -593
  131. package/dist/types/vue.d.ts +93 -47
  132. package/dist/utilities/scroll-mode-controller.d.ts +9 -1
  133. package/dist/utilities/scroll-mode-controller.d.ts.map +1 -1
  134. package/dist/utilities/scroll-mode-controller.js +10 -2
  135. package/dist/utilities/scroll-mode-controller.js.map +1 -1
  136. package/package.json +8 -4
  137. package/dist/components/lists-and-tables/list-item-action/list-item-action.d.ts +0 -108
  138. package/dist/components/lists-and-tables/list-item-action/list-item-action.d.ts.map +0 -1
  139. package/dist/components/lists-and-tables/list-item-action/list-item-action.js.map +0 -1
  140. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.d.ts +0 -2
  141. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.d.ts.map +0 -1
  142. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.js +0 -145
  143. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.js.map +0 -1
  144. package/dist/components/lists-and-tables/list-item-action/list-item-action.template.d.ts +0 -3
  145. package/dist/components/lists-and-tables/list-item-action/list-item-action.template.d.ts.map +0 -1
  146. package/dist/components/lists-and-tables/list-item-action/list-item-action.template.js.map +0 -1
@@ -281,6 +281,17 @@
281
281
  "attribute": "max-width",
282
282
  "reflects": true
283
283
  },
284
+ {
285
+ "kind": "field",
286
+ "name": "noTab",
287
+ "type": {
288
+ "text": "boolean"
289
+ },
290
+ "default": "false",
291
+ "description": "Take the button out of the tab order (`tabindex=\"-1\"`) — for a control owned\nby a roving container (an `nldd-list` sets it on the rows that are not the\ncurrent one) that manages focus itself. Still mouse- and script-focusable.",
292
+ "attribute": "no-tab",
293
+ "reflects": true
294
+ },
284
295
  {
285
296
  "kind": "field",
286
297
  "name": "expandable",
@@ -552,6 +563,15 @@
552
563
  "description": "Caps the width at this CSS length (e.g. '320px'). Combines with `width=\"full\"`: the button follows its container up to the cap. A label that doesn't fit is truncated with an ellipsis — a cap only means something if the content respects it.",
553
564
  "fieldName": "maxWidth"
554
565
  },
566
+ {
567
+ "name": "no-tab",
568
+ "type": {
569
+ "text": "boolean"
570
+ },
571
+ "default": "false",
572
+ "description": "Takes the button out of the tab order (tabindex=\"-1\"), for a control owned by a roving container (e.g. a button in a row of an nldd-list, where the arrow keys move between rows) that manages focus itself. Still mouse- and script-focusable.",
573
+ "fieldName": "noTab"
574
+ },
555
575
  {
556
576
  "name": "expandable",
557
577
  "type": {
@@ -1139,7 +1159,7 @@
1139
1159
  "text": "boolean"
1140
1160
  },
1141
1161
  "default": "false",
1142
- "description": "Takes the button out of the tab order (tabindex=\"-1\"), for a control owned by a roving container (e.g. an nldd-token in nldd-token-field) that manages focus itself. Still mouse- and script-focusable.",
1162
+ "description": "Takes the button out of the tab order (tabindex=\"-1\"), for a control owned by a roving container (an nldd-token in nldd-token-field, a button in a row of an nldd-list) that manages focus itself. Still mouse- and script-focusable.",
1143
1163
  "fieldName": "noTab"
1144
1164
  },
1145
1165
  {
@@ -3549,7 +3569,7 @@
3549
3569
  },
3550
3570
  {
3551
3571
  "kind": "class",
3552
- "description": "A customizable icon component that renders SVG icons from a predefined library. Icons are decorative by default: the host gets `aria-hidden=\"true\"` automatically. If you want the icon to be announced by assistive tech, set `aria-hidden=\"false\"` on the consumer side together with an `aria-label`. Sizing: the icon fills whatever sizes it — an `nldd-icon-cell`, a button, a menu item. `size=\"full\"` names that default explicitly. `size=\"inherit\"` makes it follow the surrounding text (1em), for an icon set inline in a sentence. Any spacer-aligned number (16–96) pins a fixed dimension. Reach for `inherit` rather than a global `nldd-icon { width: 1em }` rule in the consumer: such a rule wins over the component's own :host styling and so also shrinks the icons that a cell or button was already sizing correctly. Color: by default the icon inherits its parent's `color`. Set `color` to one of the functional semantics (`primary-content`, `secondary-content`, `accent`, `critical`, `warning`, `success`) or a rijkskleur (`lintblauw`, `paars`, `groen`, …). For arbitrary one-off colors, set `style=\"color: …\"` on the hostthe inherited `color` still drives the SVG fill/stroke.",
3572
+ "description": "A customizable icon component that renders SVG icons from a predefined library. Icons are decorative by default: the host gets `aria-hidden=\"true\"` automatically. If you want the icon to be announced by assistive tech, set `aria-hidden=\"false\"` on the consumer side together with an `aria-label`. Sizing: the icon fills whatever sizes it — an `nldd-icon-cell`, a button, a menu item. `size=\"full\"` names that default explicitly. `size=\"inherit\"` makes it follow the surrounding text (1em), for an icon set inline in a sentence. Any spacer-aligned number (16–96) pins a fixed dimension. Reach for `inherit` rather than a global `nldd-icon { width: 1em }` rule in the consumer: such a rule wins over the component's own :host styling and so also shrinks the icons that a cell or button was already sizing correctly. Color: by default the icon inherits its parent's `color`. Set `color` to one of the functional semantics (`primary-content`, `secondary-content`, `accent`, `critical`, `warning`, `success`) or a rijkskleur (`lintblauw`, `paars`, `groen`, …). For a color the design system cannot know the jacket of a cable, a color someone picked set `custom-color` to any CSS color.",
3553
3573
  "name": "NLDDIcon",
3554
3574
  "members": [
3555
3575
  {
@@ -3580,6 +3600,17 @@
3580
3600
  "default": "''",
3581
3601
  "attribute": "color",
3582
3602
  "reflects": true
3603
+ },
3604
+ {
3605
+ "kind": "field",
3606
+ "name": "customColor",
3607
+ "type": {
3608
+ "text": "string"
3609
+ },
3610
+ "default": "''",
3611
+ "description": "Handed to the styles as a custom property rather than read from the\nattribute in CSS: `attr()` with a type is not available everywhere yet,\nand this keeps one code path.",
3612
+ "attribute": "custom-color",
3613
+ "reflects": true
3583
3614
  }
3584
3615
  ],
3585
3616
  "attributes": [
@@ -3609,6 +3640,15 @@
3609
3640
  "name": "color",
3610
3641
  "default": "''",
3611
3642
  "fieldName": "color"
3643
+ },
3644
+ {
3645
+ "type": {
3646
+ "text": "string"
3647
+ },
3648
+ "description": "A color of its own, as any CSS color value ('#a90061', 'oklch(0.6 0.2 20)', 'var(--brand-cable-blue)'). For a color the design system cannot know. It wins over `color`.",
3649
+ "name": "custom-color",
3650
+ "default": "''",
3651
+ "fieldName": "customColor"
3612
3652
  }
3613
3653
  ],
3614
3654
  "superclass": {
@@ -4785,6 +4825,146 @@
4785
4825
  }
4786
4826
  ]
4787
4827
  },
4828
+ {
4829
+ "kind": "javascript-module",
4830
+ "path": "src/components/content/text/text.ts",
4831
+ "declarations": [
4832
+ {
4833
+ "kind": "class",
4834
+ "description": "One run of body text at a size from the type scale. It is what you reach for where an app would otherwise write a bare `<p>` and inherit whatever the page happens to set: a line under a title, a sentence in a panel, a caption. Every combination it offers exists as a token, so it cannot invent typography — it only names what the scale already has. The three axes are the same three the tokens carry: size, weight and line height. Not for headings, which is `nldd-title`, and not for a block of prose with its own rhythm, spacing and media widths, which is `nldd-rich-text`. This is one run of text and nothing around it. Color follows the context channel a list item, menu or table sets on its content, so text inside a row travels with that row as it is hovered or selected. Standalone that channel is unset and the semantic color answers.",
4835
+ "name": "NLDDText",
4836
+ "members": [
4837
+ {
4838
+ "kind": "field",
4839
+ "name": "size",
4840
+ "type": {
4841
+ "text": "Size"
4842
+ },
4843
+ "default": "'md'",
4844
+ "attribute": "size",
4845
+ "reflects": true
4846
+ },
4847
+ {
4848
+ "kind": "field",
4849
+ "name": "weight",
4850
+ "type": {
4851
+ "text": "Weight"
4852
+ },
4853
+ "default": "'regular'",
4854
+ "attribute": "weight",
4855
+ "reflects": true
4856
+ },
4857
+ {
4858
+ "kind": "field",
4859
+ "name": "lineHeight",
4860
+ "type": {
4861
+ "text": "LineHeight"
4862
+ },
4863
+ "default": "'snug'",
4864
+ "attribute": "line-height",
4865
+ "reflects": true
4866
+ },
4867
+ {
4868
+ "kind": "field",
4869
+ "name": "color",
4870
+ "type": {
4871
+ "text": "Color"
4872
+ },
4873
+ "default": "'default'",
4874
+ "attribute": "color",
4875
+ "reflects": true
4876
+ },
4877
+ {
4878
+ "kind": "field",
4879
+ "name": "horizontalAlignment",
4880
+ "type": {
4881
+ "text": "HorizontalAlignment"
4882
+ },
4883
+ "default": "'left'",
4884
+ "attribute": "horizontal-alignment",
4885
+ "reflects": true
4886
+ }
4887
+ ],
4888
+ "attributes": [
4889
+ {
4890
+ "name": "size",
4891
+ "type": {
4892
+ "text": "Size"
4893
+ },
4894
+ "default": "'md'",
4895
+ "fieldName": "size",
4896
+ "description": "Text size on the body scale: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' (default: 'md')"
4897
+ },
4898
+ {
4899
+ "name": "weight",
4900
+ "type": {
4901
+ "text": "Weight"
4902
+ },
4903
+ "default": "'regular'",
4904
+ "fieldName": "weight",
4905
+ "description": "Font weight: 'regular' | 'medium' | 'bold' (default: 'regular'). With 'bold' a slotted `<strong>` no longer stands out: there is nothing bolder in the scale."
4906
+ },
4907
+ {
4908
+ "name": "line-height",
4909
+ "type": {
4910
+ "text": "LineHeight"
4911
+ },
4912
+ "default": "'snug'",
4913
+ "fieldName": "lineHeight",
4914
+ "description": "Line height: 'flat' | 'tight' | 'snug' | 'loose' (default: 'snug')"
4915
+ },
4916
+ {
4917
+ "name": "color",
4918
+ "type": {
4919
+ "text": "Color"
4920
+ },
4921
+ "default": "'default'",
4922
+ "fieldName": "color",
4923
+ "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."
4924
+ },
4925
+ {
4926
+ "name": "horizontal-alignment",
4927
+ "type": {
4928
+ "text": "HorizontalAlignment"
4929
+ },
4930
+ "default": "'left'",
4931
+ "fieldName": "horizontalAlignment",
4932
+ "description": "Alignment of the text within the block: 'left' | 'center' | 'right' (default: 'left'). Aligns the words; `horizontal-alignment` on nldd-container moves the box."
4933
+ }
4934
+ ],
4935
+ "superclass": {
4936
+ "name": "LitElement",
4937
+ "package": "lit"
4938
+ },
4939
+ "tagName": "nldd-text",
4940
+ "customElement": true,
4941
+ "slots": [
4942
+ {
4943
+ "name": "",
4944
+ "description": "The text. Inline elements work as they are: `<strong>` and `<b>` take the bold weight from the scale, `<a>`, `<em>` and components such as `nldd-tag` are left alone."
4945
+ }
4946
+ ]
4947
+ }
4948
+ ],
4949
+ "exports": [
4950
+ {
4951
+ "kind": "js",
4952
+ "name": "NLDDText",
4953
+ "declaration": {
4954
+ "name": "NLDDText",
4955
+ "module": "src/components/content/text/text.ts"
4956
+ }
4957
+ },
4958
+ {
4959
+ "kind": "custom-element-definition",
4960
+ "name": "nldd-text",
4961
+ "declaration": {
4962
+ "name": "NLDDText",
4963
+ "module": "src/components/content/text/text.ts"
4964
+ }
4965
+ }
4966
+ ]
4967
+ },
4788
4968
  {
4789
4969
  "kind": "javascript-module",
4790
4970
  "path": "src/components/content/title/title.ts",
@@ -5773,6 +5953,14 @@
5773
5953
  "module": "./content/tag/tag.js"
5774
5954
  }
5775
5955
  },
5956
+ {
5957
+ "kind": "js",
5958
+ "name": "NLDDText",
5959
+ "declaration": {
5960
+ "name": "NLDDText",
5961
+ "module": "./content/text/text.js"
5962
+ }
5963
+ },
5776
5964
  {
5777
5965
  "kind": "js",
5778
5966
  "name": "NLDDTitle",
@@ -6271,10 +6459,10 @@
6271
6459
  },
6272
6460
  {
6273
6461
  "kind": "js",
6274
- "name": "NLDDListItemAction",
6462
+ "name": "NLDDListItemSegment",
6275
6463
  "declaration": {
6276
- "name": "NLDDListItemAction",
6277
- "module": "./lists-and-tables/list-item-action/list-item-action.js"
6464
+ "name": "NLDDListItemSegment",
6465
+ "module": "./lists-and-tables/list-item-segment/list-item-segment.js"
6278
6466
  }
6279
6467
  },
6280
6468
  {
@@ -7740,6 +7928,16 @@
7740
7928
  "attribute": "disabled",
7741
7929
  "reflects": true
7742
7930
  },
7931
+ {
7932
+ "kind": "field",
7933
+ "name": "readonly",
7934
+ "type": {
7935
+ "text": "boolean"
7936
+ },
7937
+ "default": "false",
7938
+ "attribute": "readonly",
7939
+ "reflects": true
7940
+ },
7743
7941
  {
7744
7942
  "kind": "field",
7745
7943
  "name": "allowCustom",
@@ -8025,6 +8223,15 @@
8025
8223
  "fieldName": "disabled",
8026
8224
  "description": "Disabled state"
8027
8225
  },
8226
+ {
8227
+ "name": "readonly",
8228
+ "type": {
8229
+ "text": "boolean"
8230
+ },
8231
+ "default": "false",
8232
+ "fieldName": "readonly",
8233
+ "description": "Read-only state: the value stays readable, selectable and in the tab order, but the menu does not open and there is nothing to clear. The input drops its combobox role and the aria that goes with it, so assistive technology is not told about a list it cannot open. Use this where the value belongs to the record rather than to the form, e.g. the product an asset is an instance of."
8234
+ },
8028
8235
  {
8029
8236
  "name": "allow-custom",
8030
8237
  "type": {
@@ -9752,6 +9959,26 @@
9752
9959
  "default": "''",
9753
9960
  "attribute": "autocomplete"
9754
9961
  },
9962
+ {
9963
+ "kind": "field",
9964
+ "name": "keyboard",
9965
+ "type": {
9966
+ "text": "Keyboard | undefined"
9967
+ },
9968
+ "description": "Which on-screen keyboard to raise, forwarded as `inputmode`.",
9969
+ "attribute": "keyboard",
9970
+ "reflects": true
9971
+ },
9972
+ {
9973
+ "kind": "field",
9974
+ "name": "enterKey",
9975
+ "type": {
9976
+ "text": "EnterKey | undefined"
9977
+ },
9978
+ "description": "What the Enter key says, forwarded as `enterkeyhint`.",
9979
+ "attribute": "enter-key",
9980
+ "reflects": true
9981
+ },
9755
9982
  {
9756
9983
  "kind": "field",
9757
9984
  "name": "rows",
@@ -10033,6 +10260,22 @@
10033
10260
  "fieldName": "autocomplete",
10034
10261
  "description": "Autocomplete hint"
10035
10262
  },
10263
+ {
10264
+ "name": "keyboard",
10265
+ "type": {
10266
+ "text": "Keyboard | undefined"
10267
+ },
10268
+ "description": "Which virtual keyboard a phone or tablet raises, forwarded as `inputmode`: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'. It changes nothing about what the field accepts, and nothing at all on a desktop.",
10269
+ "fieldName": "keyboard"
10270
+ },
10271
+ {
10272
+ "name": "enter-key",
10273
+ "type": {
10274
+ "text": "EnterKey | undefined"
10275
+ },
10276
+ "description": "What the Enter key of the virtual keyboard says, forwarded as `enterkeyhint`: 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'. In a field where Enter starts a new line, leave it alone.",
10277
+ "fieldName": "enterKey"
10278
+ },
10036
10279
  {
10037
10280
  "name": "rows",
10038
10281
  "type": {
@@ -10103,6 +10346,22 @@
10103
10346
  }
10104
10347
  ],
10105
10348
  "exports": [
10349
+ {
10350
+ "kind": "js",
10351
+ "name": "Keyboard",
10352
+ "declaration": {
10353
+ "name": "Keyboard",
10354
+ "module": "../text-field/text-field.js"
10355
+ }
10356
+ },
10357
+ {
10358
+ "kind": "js",
10359
+ "name": "EnterKey",
10360
+ "declaration": {
10361
+ "name": "EnterKey",
10362
+ "module": "../text-field/text-field.js"
10363
+ }
10364
+ },
10106
10365
  {
10107
10366
  "kind": "js",
10108
10367
  "name": "NLDDMultiLineTextField",
@@ -15878,6 +16137,23 @@
15878
16137
  "kind": "javascript-module",
15879
16138
  "path": "src/components/inputs/text-field/text-field.ts",
15880
16139
  "declarations": [
16140
+ {
16141
+ "kind": "variable",
16142
+ "name": "KEYBOARDS",
16143
+ "type": {
16144
+ "text": "['none', 'text', 'decimal', 'numeric', 'tel', 'search', 'email', 'url']"
16145
+ },
16146
+ "default": "['none', 'text', 'decimal', 'numeric', 'tel', 'search', 'email', 'url']",
16147
+ "description": "The tokens `inputmode` and `enterkeyhint` accept. Arrays, so one list types\nthe property and answers at runtime: a value outside it is dropped by the\nbrowser without a word, which is a typo you only find on a phone."
16148
+ },
16149
+ {
16150
+ "kind": "variable",
16151
+ "name": "ENTER_KEYS",
16152
+ "type": {
16153
+ "text": "['enter', 'done', 'go', 'next', 'previous', 'search', 'send']"
16154
+ },
16155
+ "default": "['enter', 'done', 'go', 'next', 'previous', 'search', 'send']"
16156
+ },
15881
16157
  {
15882
16158
  "kind": "class",
15883
16159
  "description": "",
@@ -15989,6 +16265,26 @@
15989
16265
  "default": "'text'",
15990
16266
  "attribute": "type"
15991
16267
  },
16268
+ {
16269
+ "kind": "field",
16270
+ "name": "keyboard",
16271
+ "type": {
16272
+ "text": "Keyboard | undefined"
16273
+ },
16274
+ "description": "Which on-screen keyboard to raise, forwarded as `inputmode`.",
16275
+ "attribute": "keyboard",
16276
+ "reflects": true
16277
+ },
16278
+ {
16279
+ "kind": "field",
16280
+ "name": "enterKey",
16281
+ "type": {
16282
+ "text": "EnterKey | undefined"
16283
+ },
16284
+ "description": "What the Enter key says, forwarded as `enterkeyhint`.",
16285
+ "attribute": "enter-key",
16286
+ "reflects": true
16287
+ },
15992
16288
  {
15993
16289
  "kind": "field",
15994
16290
  "name": "name",
@@ -16292,6 +16588,22 @@
16292
16588
  "fieldName": "type",
16293
16589
  "description": "Input type: 'text' | 'email' | 'tel' | 'url'"
16294
16590
  },
16591
+ {
16592
+ "name": "keyboard",
16593
+ "type": {
16594
+ "text": "Keyboard | undefined"
16595
+ },
16596
+ "description": "Which virtual keyboard a phone or tablet raises, forwarded as `inputmode`: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'. It changes nothing about what the field accepts, and nothing at all on a desktop. Reach for it where the value is digits but not a quantity you would step (a house number, a postcode, a rack unit): 'numeric'. The keyboard for 'tel', 'email' and 'url' already follows from `type`.",
16597
+ "fieldName": "keyboard"
16598
+ },
16599
+ {
16600
+ "name": "enter-key",
16601
+ "type": {
16602
+ "text": "EnterKey | undefined"
16603
+ },
16604
+ "description": "What the Enter key of the virtual keyboard says, forwarded as `enterkeyhint`: 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'. It only labels the key; what Enter does is still up to the form, and on a desktop it changes nothing.",
16605
+ "fieldName": "enterKey"
16606
+ },
16295
16607
  {
16296
16608
  "name": "name",
16297
16609
  "type": {
@@ -16380,6 +16692,22 @@
16380
16692
  }
16381
16693
  ],
16382
16694
  "exports": [
16695
+ {
16696
+ "kind": "js",
16697
+ "name": "KEYBOARDS",
16698
+ "declaration": {
16699
+ "name": "KEYBOARDS",
16700
+ "module": "src/components/inputs/text-field/text-field.ts"
16701
+ }
16702
+ },
16703
+ {
16704
+ "kind": "js",
16705
+ "name": "ENTER_KEYS",
16706
+ "declaration": {
16707
+ "name": "ENTER_KEYS",
16708
+ "module": "src/components/inputs/text-field/text-field.ts"
16709
+ }
16710
+ },
16383
16711
  {
16384
16712
  "kind": "js",
16385
16713
  "name": "NLDDTextField",
@@ -18447,24 +18775,24 @@
18447
18775
  "members": [
18448
18776
  {
18449
18777
  "kind": "field",
18450
- "name": "variant",
18778
+ "name": "background",
18451
18779
  "type": {
18452
- "text": "BoxVariant"
18780
+ "text": "BoxBackground"
18453
18781
  },
18454
18782
  "default": "'tinted'",
18455
- "attribute": "variant",
18783
+ "attribute": "background",
18456
18784
  "reflects": true
18457
18785
  }
18458
18786
  ],
18459
18787
  "attributes": [
18460
18788
  {
18461
- "name": "variant",
18789
+ "name": "background",
18462
18790
  "type": {
18463
- "text": "BoxVariant"
18791
+ "text": "BoxBackground"
18464
18792
  },
18465
18793
  "default": "'tinted'",
18466
- "fieldName": "variant",
18467
- "description": "Which surface this box draws. - `tinted` (default): a box on a plain page background. - `base`: a box on an already-tinted parent (the border ring gets +2 palette steps so it still reads against a card-on-card). - `critical`: a region whose actions are destructive or irreversible (a \"danger zone\"), tinted and outlined in critical. It carries no ARIA of its own: unlike nldd-banner this is not an announcement but a permanent part of the page, so the heading and the button labels have to name the danger — colour is a reinforcement, never the only signal (WCAG 1.4.1). The box draws the surface and nothing else: it has no padding of its own, the same way nldd-card has none. Put an nldd-container inside it and let that set the inset, so one component owns spacing wherever it is used."
18794
+ "fieldName": "background",
18795
+ "description": "Which surface this box draws, named as it is on nldd-app-view, nldd-page, nldd-split-view-pane and nldd-card. It starts tinted where a card starts base: a box is there to stand out from the page, a card to sit on it. - `tinted` (default): a box on a plain page background. - `base`: a box on an already-tinted parent (the border ring gets +2 palette steps so it still reads against a card-on-card). - `critical`: a region whose actions are destructive or irreversible (a \"danger zone\"), tinted and outlined in critical. It carries no ARIA of its own: unlike nldd-banner this is not an announcement but a permanent part of the page, so the heading and the button labels have to name the danger — colour is a reinforcement, never the only signal (WCAG 1.4.1). The box draws the surface and nothing else: it has no padding of its own, the same way nldd-card has none. Put an nldd-container inside it and let that set the inset, so one component owns spacing wherever it is used."
18468
18796
  }
18469
18797
  ],
18470
18798
  "superclass": {
@@ -26966,16 +27294,16 @@
26966
27294
  },
26967
27295
  {
26968
27296
  "kind": "javascript-module",
26969
- "path": "src/components/lists-and-tables/list-item-action/list-item-action.ts",
27297
+ "path": "src/components/lists-and-tables/list-item-segment/list-item-segment.ts",
26970
27298
  "declarations": [
26971
27299
  {
26972
27300
  "kind": "class",
26973
- "description": "A segmented action inside an `nldd-list-item`: it groups a run of cells and makes just that run clickable. Use it when a row needs more than one action — a tree row whose chevron expands while the label toggles a checkbox, or a row that navigates with a separate button beside it. Put it in the row where its cells would go: the item has one flat slot, and a segmented action takes the place of the cells it covers. Where the divider starts or stops is marked on the cells themselves (`divider-start` / `divider-end`), not by the slot an action sits in. A row is EITHER row-level interactive (`href` / `button` / `checkbox` on the `nldd-list-item`) OR segmented (one or more of these). Both at once nests a control inside a control, which is invalid HTML; the item DEV-warns. Unlike the row-wide action this does not bleed outward: a segmented action sits between siblings, so an outward inset would overlap them. It owns its inline padding and never drops below the row's control size, so an icon-only one still meets the WCAG 2.5.8 target size — do not add spacer cells inside it for room or hit area, that doubles the space. In a `type=\"listbox\"` list the segmented action renders as a plain container (no control, not focusable) and DEV-warns: an `option` may not contain interactive descendants. The cells render unchanged, so nothing shifts.",
26974
- "name": "NLDDListItemAction",
27301
+ "description": "A segment inside an `nldd-list-item`: it groups a run of cells and makes just that run clickable. Use it when a row needs more than one segment — a tree row whose chevron expands while the label toggles a checkbox, or a row that navigates with a separate button beside it. Put it in the row where its cells would go: the item has one flat slot, and a segment takes the place of the cells it covers. Where the divider starts or stops is marked on the cells themselves (`divider-start` / `divider-end`), not by the slot a segment sits in. A row is EITHER row-level interactive (`href` / `button` / `checkbox` on the `nldd-list-item`) OR segmented (one or more of these). Both at once nests a control inside a control, which is invalid HTML; the item DEV-warns. Unlike the row-wide action this does not bleed outward: a segment sits between siblings, so an outward inset would overlap them. It owns its inline padding and never drops below the row's control size, so an icon-only one still meets the WCAG 2.5.8 target size — do not add spacer cells inside it for room or hit area, that doubles the space. In a `type=\"listbox\"` list the segment renders as a plain container (no control, not focusable) and DEV-warns: an `option` may not contain interactive descendants. The cells render unchanged, so nothing shifts.",
27302
+ "name": "NLDDListItemSegment",
26975
27303
  "slots": [
26976
27304
  {
26977
27305
  "name": "",
26978
- "description": "The cells that belong to this action"
27306
+ "description": "The cells that belong to this segment"
26979
27307
  }
26980
27308
  ],
26981
27309
  "members": [
@@ -27053,7 +27381,7 @@
27053
27381
  "text": "boolean"
27054
27382
  },
27055
27383
  "default": "false",
27056
- "description": "Marks this action as the row's disclosure control: it takes `aria-expanded`\nfrom the parent item's `expanded` instead of its own. Use it on a tree row's\nchevron, so the open/closed state is written once — on the row, where it also\ndrives the children group — rather than kept in step in two places.\n\nA slotted `nldd-icon-cell` turns a quarter with that state, so a chevron\npoints down while the row is open without any consumer CSS.",
27384
+ "description": "Marks this segment as the row's disclosure control: it takes `aria-expanded`\nfrom the parent item's `expanded` instead of its own. Use it on a tree row's\nchevron, so the open/closed state is written once — on the row, where it also\ndrives the children group — rather than kept in step in two places.\n\nA slotted `nldd-icon-cell` turns a quarter with that state, so a chevron\npoints down while the row is open without any consumer CSS.",
27057
27385
  "attribute": "disclosure",
27058
27386
  "reflects": true
27059
27387
  },
@@ -27081,7 +27409,7 @@
27081
27409
  "kind": "field",
27082
27410
  "name": "width",
27083
27411
  "type": {
27084
- "text": "ListItemActionWidth"
27412
+ "text": "ListItemSegmentWidth"
27085
27413
  },
27086
27414
  "default": "'fit-content'",
27087
27415
  "attribute": "width",
@@ -27119,7 +27447,7 @@
27119
27447
  "events": [
27120
27448
  {
27121
27449
  "name": "change",
27122
- "description": "On a `checkbox` action after it toggles; detail: { checked: boolean }"
27450
+ "description": "On a `checkbox` segment after it toggles; detail: { checked: boolean }"
27123
27451
  }
27124
27452
  ],
27125
27453
  "attributes": [
@@ -27127,7 +27455,7 @@
27127
27455
  "type": {
27128
27456
  "text": "boolean"
27129
27457
  },
27130
- "description": "Renders the segmented action as a `<button>`; ignored when `href` is set",
27458
+ "description": "Renders the segment as a `<button>`. Last of the three: `href` and `checkbox` both win over it.",
27131
27459
  "name": "button",
27132
27460
  "default": "false",
27133
27461
  "fieldName": "button"
@@ -27136,7 +27464,7 @@
27136
27464
  "type": {
27137
27465
  "text": "string | undefined"
27138
27466
  },
27139
- "description": "Renders the segmented action as an `<a>` with this URL; wins over `button` and `checkbox`",
27467
+ "description": "Renders the segment as an `<a>` with this URL. Wins over `checkbox` and `button`.",
27140
27468
  "name": "href",
27141
27469
  "fieldName": "href"
27142
27470
  },
@@ -27160,7 +27488,7 @@
27160
27488
  "type": {
27161
27489
  "text": "boolean"
27162
27490
  },
27163
- "description": "Makes the segmented action a `role=\"checkbox\"` control; ignored when `href` is set",
27491
+ "description": "Makes the segment a `role=\"checkbox\"` control. Wins over `button`, loses to `href`.",
27164
27492
  "name": "checkbox",
27165
27493
  "default": "false",
27166
27494
  "fieldName": "checkbox"
@@ -27169,7 +27497,7 @@
27169
27497
  "type": {
27170
27498
  "text": "boolean"
27171
27499
  },
27172
- "description": "Checked state of a `checkbox` action; it toggles on activation",
27500
+ "description": "Checked state of a `checkbox` segment; it toggles on activation",
27173
27501
  "name": "checked",
27174
27502
  "default": "false",
27175
27503
  "fieldName": "checked"
@@ -27178,7 +27506,7 @@
27178
27506
  "type": {
27179
27507
  "text": "boolean | undefined"
27180
27508
  },
27181
- "description": "Disclosure state, reflected as `aria-expanded` on the control. Set it on the segmented action that opens something (e.g. a tree row's chevron). Leave it off entirely when the segmented action discloses nothing — an absent attribute emits no aria-expanded.",
27509
+ "description": "Disclosure state, reflected as `aria-expanded` on the control, and painted: the segment stays lit a step above hover for as long as what it opened is on screen, so a menu reads as hanging off this row rather than floating over the list. Set it on the segment that opens something (a tree row's chevron, a menu). Leave it off entirely when the segment discloses nothing — an absent attribute emits no aria-expanded.",
27182
27510
  "name": "expanded",
27183
27511
  "fieldName": "expanded"
27184
27512
  },
@@ -27186,7 +27514,7 @@
27186
27514
  "type": {
27187
27515
  "text": "boolean"
27188
27516
  },
27189
- "description": "Marks the segmented action as the row's disclosure control: `aria-expanded` comes from the parent item's `expanded`, so the state lives in one place. A slotted `nldd-icon-cell` rotates a quarter turn while the row is open",
27517
+ "description": "Marks the segment as the row's disclosure control: `aria-expanded` comes from the parent item's `expanded`, so the state lives in one place. A slotted `nldd-icon-cell` rotates a quarter turn while the row is open",
27190
27518
  "name": "disclosure",
27191
27519
  "default": "false",
27192
27520
  "fieldName": "disclosure"
@@ -27195,7 +27523,7 @@
27195
27523
  "type": {
27196
27524
  "text": "boolean"
27197
27525
  },
27198
- "description": "Marks the segmented action as the current page (`aria-current=\"page\"`)",
27526
+ "description": "Marks the segment as the current page (`aria-current=\"page\"`). The row it sits in paints itself as the current row from it, so on a segmented row this is the only place it has to be set.",
27199
27527
  "name": "current",
27200
27528
  "default": "false",
27201
27529
  "fieldName": "current"
@@ -27204,16 +27532,16 @@
27204
27532
  "type": {
27205
27533
  "text": "boolean"
27206
27534
  },
27207
- "description": "Disabled state; only applies to button and checkbox segmented actions",
27535
+ "description": "Switches the segment off: a `button` or `checkbox` segment stops responding and dims, a `href` segment gets `aria-disabled` and its click is blocked (a link cannot be disabled natively). The arrow keys skip a row whose only segment is off.",
27208
27536
  "name": "disabled",
27209
27537
  "default": "false",
27210
27538
  "fieldName": "disabled"
27211
27539
  },
27212
27540
  {
27213
27541
  "type": {
27214
- "text": "ListItemActionWidth"
27542
+ "text": "ListItemSegmentWidth"
27215
27543
  },
27216
- "description": "`full` lets the segmented action grow to fill the row (default: 'fit-content')",
27544
+ "description": "`full` lets the segment grow to fill the row (default: 'fit-content')",
27217
27545
  "name": "width",
27218
27546
  "default": "'fit-content'",
27219
27547
  "fieldName": "width"
@@ -27222,7 +27550,7 @@
27222
27550
  "type": {
27223
27551
  "text": "string"
27224
27552
  },
27225
- "description": "Accessible name for the control. Set it when the segmented action holds only an icon, or when the cell text does not describe the action.",
27553
+ "description": "Accessible name for the control. Set it when the segment holds only an icon, or when the cell text does not describe the action.",
27226
27554
  "name": "accessible-label",
27227
27555
  "default": "''",
27228
27556
  "fieldName": "accessibleLabel"
@@ -27232,25 +27560,25 @@
27232
27560
  "name": "LitElement",
27233
27561
  "package": "lit"
27234
27562
  },
27235
- "tagName": "nldd-list-item-action",
27563
+ "tagName": "nldd-list-item-segment",
27236
27564
  "customElement": true
27237
27565
  }
27238
27566
  ],
27239
27567
  "exports": [
27240
27568
  {
27241
27569
  "kind": "js",
27242
- "name": "NLDDListItemAction",
27570
+ "name": "NLDDListItemSegment",
27243
27571
  "declaration": {
27244
- "name": "NLDDListItemAction",
27245
- "module": "src/components/lists-and-tables/list-item-action/list-item-action.ts"
27572
+ "name": "NLDDListItemSegment",
27573
+ "module": "src/components/lists-and-tables/list-item-segment/list-item-segment.ts"
27246
27574
  }
27247
27575
  },
27248
27576
  {
27249
27577
  "kind": "custom-element-definition",
27250
- "name": "nldd-list-item-action",
27578
+ "name": "nldd-list-item-segment",
27251
27579
  "declaration": {
27252
- "name": "NLDDListItemAction",
27253
- "module": "src/components/lists-and-tables/list-item-action/list-item-action.ts"
27580
+ "name": "NLDDListItemSegment",
27581
+ "module": "src/components/lists-and-tables/list-item-segment/list-item-segment.ts"
27254
27582
  }
27255
27583
  }
27256
27584
  ]
@@ -27261,12 +27589,12 @@
27261
27589
  "declarations": [
27262
27590
  {
27263
27591
  "kind": "class",
27264
- "description": "A row within an `nldd-list`. Renders as a link when `href` is set, as a checkbox when `checkbox` is set, as a button when `button` is set, or as a plain container otherwise. All cells and action segmented actions share one flat slot, in source order. Two rules govern every row: 1. State fills always paint the WIDENED row geometry — the row box extended by the indicator inline inset on both sides — whether or not the row is interactive. Paint never differs between a selected plain row and a selected interactive row. 2. The widened strip belongs to the ROW, never to a segment. A row with any action (its own `href`/`button`/`checkbox`, or a slotted segment) pulls itself outward (`is-interactive` host class → negative inline margin) and pads the row block back by the same amount, so content stays on the grid. A row-wide action owns that padding itself, making the whole widened box one hit area; slotted segmented actions stay in the grid, so their footprint is position-independent and tree columns line up at any depth. By default the divider starts at the row's first text or title cell, so the line lands on the words rather than on whatever leads up to them — an icon, an avatar, a checkbox, or the spacers a tree indents with. Rows of different shapes then still line their dividers up with each other, and a tree's dividers step inward with its indentation. Text inside an `nldd-list-item-action` counts as the row's content, and the marker is that text cell rather than the action: the action carries its own inline padding, so its edge sits before the words. A row with no text or title cell keeps the full content width. Mark a cell with `divider-start` and/or `divider-end` to place it yourself instead — an explicit marker replaces the derived one entirely, so `divider-start` on the leading cell restores the full-width line. Multiple markers resolve as the union: first `divider-start` through last `divider-end`. A start past the last end is an authoring error — the item DEV-warns and falls back to the full content width. A branch row can disclose its children in two ways: a dedicated `nldd-list-item-action[disclosure]` segment (only the chevron is clickable), or the row itself as the control (`button` + `expanded`, the whole row toggles). In the second case, mark the chevron's `nldd-icon-cell` with `disclosure` and the row turns it with `expanded` — the same affordance, without having to trade a clickable row for a turning chevron. `checkbox` makes the WHOLE row the control: the inner action becomes a `role=\"checkbox\"` button carrying `aria-checked`, it toggles `checked` on activation and fires `change`. Slot a visual `nldd-checkbox` (or any glyph) before the text and mark it `aria-hidden` + non-focusable — the row already conveys role and state, and a second focusable control would double the tab stops. Do NOT nest a real `<input type=\"checkbox\">` in the action: interactive content inside a `<button>` is invalid HTML and AT announces the button, not the checked state. A `<label>` variant is not offered for the same reason it cannot work — label-to-input association walks the DOM tree, and a slotted input is not a descendant of a label in the shadow root. When it renders as a link, `target` and `rel` are forwarded to the inner `<a>` (e.g. `target=\"_blank\" rel=\"noopener noreferrer\"`). With `target=\"_blank\"` the item also injects a visually hidden \"opens in new tab\" announcement for assistive technology (WCAG 2.1 SC 3.2.2). The item synchronizes its ARIA with its parent `nldd-list`'s `type`: - `list` parent → `role=\"listitem\"` - `navigation` parent → `role=\"listitem\"` + `aria-current=\"page\"` on the inner `<a>` / `<button>` when `selected` - `listbox` parent → `role=\"option\"` + `aria-selected` reflecting `selected`. The list points its search input's `aria-activedescendant` at the active option via `_highlighted` (separate from `selected`).",
27592
+ "description": "A row within an `nldd-list`. Renders as a link when `href` is set, as a checkbox when `checkbox` is set, as a button when `button` is set, or as a plain container otherwise. All cells and segments share one flat slot, in source order. Two rules govern every row: 1. State fills always paint the WIDENED row geometry — the row box extended by the indicator inline inset on both sides — whether or not the row is interactive. Paint never differs between a selected plain row and a selected interactive row. 2. The widened strip belongs to the ROW, never to a segment. A row with any action (its own `href`/`button`/`checkbox`, or a slotted segment) pulls itself outward (`is-interactive` host class → negative inline margin) and pads the row block back by the same amount, so content stays on the grid. A row-wide action owns that padding itself, making the whole widened box one hit area; slotted segments stay in the grid, so their footprint is position-independent and tree columns line up at any depth. By default the divider starts at the row's first text or title cell, so the line lands on the words rather than on whatever leads up to them — an icon, an avatar, a checkbox, or the spacers a tree indents with. Rows of different shapes then still line their dividers up with each other, and a tree's dividers step inward with its indentation. Text inside an `nldd-list-item-segment` counts as the row's content, and the marker is that text cell rather than the action: the action carries its own inline padding, so its edge sits before the words. A row with no text or title cell keeps the full content width. Mark a cell with `divider-start` and/or `divider-end` to place it yourself instead — an explicit marker replaces the derived one entirely, so `divider-start` on the leading cell restores the full-width line. Multiple markers resolve as the union: first `divider-start` through last `divider-end`. A start past the last end is an authoring error — the item DEV-warns and falls back to the full content width. A branch row can disclose its children in two ways: a dedicated `nldd-list-item-segment[disclosure]` segment (only the chevron is clickable), or the row itself as the control (`button` + `expanded`, the whole row toggles). In the second case, mark the chevron's `nldd-icon-cell` with `disclosure` and the row turns it with `expanded` — the same affordance, without having to trade a clickable row for a turning chevron. `checkbox` makes the WHOLE row the control: the inner action becomes a `role=\"checkbox\"` button carrying `aria-checked`, it toggles `checked` on activation and fires `change`. Slot a visual `nldd-checkbox` (or any glyph) before the text and mark it `aria-hidden` + non-focusable — the row already conveys role and state, and a second focusable control would double the tab stops. Do NOT nest a real `<input type=\"checkbox\">` in the action: interactive content inside a `<button>` is invalid HTML and AT announces the button, not the checked state. A `<label>` variant is not offered for the same reason it cannot work — label-to-input association walks the DOM tree, and a slotted input is not a descendant of a label in the shadow root. When it renders as a link, `target` and `rel` are forwarded to the inner `<a>` (e.g. `target=\"_blank\" rel=\"noopener noreferrer\"`). With `target=\"_blank\"` the item also injects a visually hidden \"opens in new tab\" announcement for assistive technology (WCAG 2.1 SC 3.2.2). The item synchronizes its ARIA with its parent `nldd-list`'s `type`: - `list` parent → `role=\"listitem\"` - `navigation` parent → `role=\"listitem\"` + `aria-current=\"page\"` on the inner `<a>` / `<button>` when `selected` - `listbox` parent → `role=\"option\"` + `aria-selected` reflecting `selected`. The list points its search input's `aria-activedescendant` at the active option via `_highlighted` (separate from `selected`).",
27265
27593
  "name": "NLDDListItem",
27266
27594
  "slots": [
27267
27595
  {
27268
27596
  "name": "",
27269
- "description": "Cells and segmented actions, in source order"
27597
+ "description": "Cells and segments, in source order"
27270
27598
  },
27271
27599
  {
27272
27600
  "name": "children",
@@ -27294,6 +27622,17 @@
27294
27622
  "attribute": "selected",
27295
27623
  "reflects": true
27296
27624
  },
27625
+ {
27626
+ "kind": "field",
27627
+ "name": "current",
27628
+ "type": {
27629
+ "text": "boolean"
27630
+ },
27631
+ "default": "false",
27632
+ "description": "The row you are on, as opposed to the rows you picked (`selected`).\n\nKept apart because the two say different things and a list can show both:\na checkbox list where three rows are ticked and one is open. At rest they\npaint the same, so a menu reads the same as it always did; the difference\nshows when focus is in the row.",
27633
+ "attribute": "current",
27634
+ "reflects": true
27635
+ },
27297
27636
  {
27298
27637
  "kind": "field",
27299
27638
  "name": "button",
@@ -27327,6 +27666,17 @@
27327
27666
  "attribute": "checked",
27328
27667
  "reflects": true
27329
27668
  },
27669
+ {
27670
+ "kind": "field",
27671
+ "name": "disabled",
27672
+ "type": {
27673
+ "text": "boolean"
27674
+ },
27675
+ "default": "false",
27676
+ "description": "Switches off the row's own control.\n\nOnly the row's own: a row built out of segments has no control here, and\neach segment carries its own `disabled`. A link cannot be disabled the way\na button can, so there it is `aria-disabled` plus a blocked click, the\nsame trade `nldd-button` makes.",
27677
+ "attribute": "disabled",
27678
+ "reflects": true
27679
+ },
27330
27680
  {
27331
27681
  "kind": "field",
27332
27682
  "name": "expanded",
@@ -27449,7 +27799,7 @@
27449
27799
  "type": {
27450
27800
  "text": "boolean"
27451
27801
  },
27452
- "description": "Marks the item as selected. Selection is consumer-managed; the list never sets it. In a `navigation` parent it puts `aria-current=\"page\"` on the inner action, in a `listbox` parent it drives `aria-selected`.",
27802
+ "description": "Marks the item as selected: it is one of the rows you picked. Selection is consumer-managed; the list never sets it. In a `navigation` parent it puts `aria-current=\"page\"` on the inner action, in a `listbox` parent it drives `aria-selected`.",
27453
27803
  "name": "selected",
27454
27804
  "default": "false",
27455
27805
  "fieldName": "selected"
@@ -27458,7 +27808,16 @@
27458
27808
  "type": {
27459
27809
  "text": "boolean"
27460
27810
  },
27461
- "description": "Renders the item as a `<button>`; ignored when `href` is set (a link wins)",
27811
+ "description": "Marks the item as the one you are on: the page a menu row points at, the record a list has open. Exactly one row in a list carries it, where `selected` may be on many. It paints like `selected` at rest, and takes the highlighted fill while focus is anywhere in the row — including inside a nested `nldd-list-item-segment`, which is what a segmented row needs: the focus never reaches the row's own control, because there is none. In a `navigation` parent it puts `aria-current=\"page\"` on the inner action. On a segmented row set it on the segment that holds the link instead: the row reads `current` off its own segments and paints itself, so it is written once, where `aria-current` belongs.",
27812
+ "name": "current",
27813
+ "default": "false",
27814
+ "fieldName": "current"
27815
+ },
27816
+ {
27817
+ "type": {
27818
+ "text": "boolean"
27819
+ },
27820
+ "description": "Renders the item as a `<button>`. Last of the three: `href` and `checkbox` both win over it.",
27462
27821
  "name": "button",
27463
27822
  "default": "false",
27464
27823
  "fieldName": "button"
@@ -27467,7 +27826,7 @@
27467
27826
  "type": {
27468
27827
  "text": "boolean"
27469
27828
  },
27470
- "description": "Makes the whole row a `role=\"checkbox\"` control; ignored when `href` is set",
27829
+ "description": "Makes the whole row a `role=\"checkbox\"` control. Wins over `button`, loses to `href`.",
27471
27830
  "name": "checkbox",
27472
27831
  "default": "false",
27473
27832
  "fieldName": "checkbox"
@@ -27481,11 +27840,20 @@
27481
27840
  "default": "false",
27482
27841
  "fieldName": "checked"
27483
27842
  },
27843
+ {
27844
+ "type": {
27845
+ "text": "boolean"
27846
+ },
27847
+ "description": "Switches the row's own control off: a `button` or `checkbox` row stops responding and dims, a `href` row gets `aria-disabled` and its click is blocked (a link cannot be disabled natively). A row without a control of its own has nothing to switch off, and segments carry their own `disabled`. The arrow keys skip a disabled row.",
27848
+ "name": "disabled",
27849
+ "default": "false",
27850
+ "fieldName": "disabled"
27851
+ },
27484
27852
  {
27485
27853
  "type": {
27486
27854
  "text": "boolean | undefined"
27487
27855
  },
27488
- "description": "Disclosure state. Drives the `children` group's visibility AND supplies `aria-expanded` — to the row's own control when the row is interactive, or to the segmented action marked `disclosure`. Written once either way; the item DEV-warns when there is nowhere for it to live.",
27856
+ "description": "Disclosure state. Drives the `children` group's visibility AND supplies `aria-expanded` — to the row's own control when the row is interactive, or to the segment marked `disclosure`. Written once either way; the item DEV-warns when there is nowhere for it to live.",
27489
27857
  "name": "expanded",
27490
27858
  "fieldName": "expanded"
27491
27859
  },
@@ -27493,7 +27861,7 @@
27493
27861
  "type": {
27494
27862
  "text": "string | undefined"
27495
27863
  },
27496
- "description": "Renders the item as an `<a>` with this URL. Takes precedence over `button`; without either the item is a plain container with no action.",
27864
+ "description": "Renders the item as an `<a>` with this URL. Wins over `checkbox` and `button`; without any of the three the item is a plain container with no action.",
27497
27865
  "name": "href",
27498
27866
  "fieldName": "href"
27499
27867
  },
@@ -27574,7 +27942,7 @@
27574
27942
  "declarations": [
27575
27943
  {
27576
27944
  "kind": "class",
27577
- "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>`. - `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. 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 `arrow-navigation` are ignored in listbox mode (listbox has its own keyboard). A tree is a composite widget, so it brings its own keyboard — `arrow-navigation` is implied and needn't be set: - ArrowDown / ArrowUp — move between the rows in the order they appear on screen, the rows of an open branch included. - Home / End first / last row. - 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 / 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 segmented action 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.",
27945
+ "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>`. - `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. Every list 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. - 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). Arrows move focus only; selection stays consumer-managed. Two types answer differently, and both say so on screen before you touch a key: a listbox runs its keyboard from its search field, and a reorderable list moves rows with the arrows. 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.",
27578
27946
  "name": "NLDDList",
27579
27947
  "slots": [
27580
27948
  {
@@ -27639,17 +28007,6 @@
27639
28007
  "attribute": "dividers",
27640
28008
  "reflects": true
27641
28009
  },
27642
- {
27643
- "kind": "field",
27644
- "name": "arrowNavigation",
27645
- "type": {
27646
- "text": "boolean"
27647
- },
27648
- "default": "false",
27649
- "description": "Roving-tabindex arrow-key navigation. When set, ArrowUp/ArrowDown move focus\nbetween the (interactive) items, Home/End jump to the first/last, and the\nwhole list becomes a single tab stop — so Tab moves past the rest instead of\nstepping through every item. Arrows move focus only; selection stays\nconsumer-managed.\n\nPragmatic by design: the `list`/`navigation` role is kept (no widget role).\nUse it only on **simple** lists where each item has a single action and no\nextra controls (a control in a `start`/`end` slot would not be reachable as\nits own tab stop). Mutually exclusive with `reorderable` (both use the arrow\nkeys); when both are set, `reorderable` wins and this is ignored.\n\nKnown a11y limitation: because the role stays `list`/`navigation` (not\n`listbox`/`menu`), screen readers do not auto-announce that the arrow keys\nnavigate. As a best-effort signal the host carries\n`aria-keyshortcuts=\"ArrowUp ArrowDown Home End\"` while active, but blind users\nmay still not discover the feature — another reason to keep it to genuinely\nsimple lists.",
27650
- "attribute": "arrow-navigation",
27651
- "reflects": true
27652
- },
27653
28010
  {
27654
28011
  "kind": "field",
27655
28012
  "name": "height",
@@ -27737,7 +28094,7 @@
27737
28094
  "type": {
27738
28095
  "text": "boolean"
27739
28096
  },
27740
- "description": "Enables drag-to-reorder and pushes `reorderable` onto the items. Only valid with `type=\"list\"`; wins over `arrow-navigation` when both are set.",
28097
+ "description": "Enables drag-to-reorder and pushes `reorderable` onto the items. Only valid with `type=\"list\"`; there the arrow keys move rows instead of focus.",
27741
28098
  "name": "reorderable",
27742
28099
  "default": "false",
27743
28100
  "fieldName": "reorderable"
@@ -27751,15 +28108,6 @@
27751
28108
  "default": "'always'",
27752
28109
  "fieldName": "dividers"
27753
28110
  },
27754
- {
27755
- "type": {
27756
- "text": "boolean"
27757
- },
27758
- "description": "Roving-tabindex arrow-key navigation: ArrowUp/ArrowDown move focus between the rows, Home/End jump to first/last, and the list becomes a single tab stop. Implied by `type=\"tree\"` (which adds ArrowLeft/ArrowRight, see above). Ignored when `reorderable` is active on a `type=\"list\"`, and in listbox mode.",
27759
- "name": "arrow-navigation",
27760
- "default": "false",
27761
- "fieldName": "arrowNavigation"
27762
- },
27763
28111
  {
27764
28112
  "type": {
27765
28113
  "text": "string"
@@ -30604,6 +30952,17 @@
30604
30952
  "attribute": "color",
30605
30953
  "reflects": true
30606
30954
  },
30955
+ {
30956
+ "kind": "field",
30957
+ "name": "customColor",
30958
+ "type": {
30959
+ "text": "string"
30960
+ },
30961
+ "default": "''",
30962
+ "description": "Handed to the styles as a custom property rather than read from the\nattribute in CSS: `attr()` with a type is not available everywhere yet,\nand this keeps one code path.",
30963
+ "attribute": "custom-color",
30964
+ "reflects": true
30965
+ },
30607
30966
  {
30608
30967
  "kind": "field",
30609
30968
  "name": "pulse",
@@ -30703,7 +31062,16 @@
30703
31062
  },
30704
31063
  "default": "'critical'",
30705
31064
  "fieldName": "color",
30706
- "description": "Semantic ('critical' | 'accent' | 'neutral' | 'warning' | 'success') or a Rijkshuisstijl color ('lintblauw' | 'hemelblauw' | 'oranje' | …). Default: 'critical'"
31065
+ "description": "Semantic ('critical' | 'accent' | 'neutral' | 'warning' | 'success'), a Rijkshuisstijl color ('lintblauw' | 'hemelblauw' | 'oranje' | …), or 'inherit' to fill in the content color around it: the `--context-content-color` channel a list item, table row or menu sets, falling back to `currentColor`. Default: 'critical'"
31066
+ },
31067
+ {
31068
+ "name": "custom-color",
31069
+ "type": {
31070
+ "text": "string"
31071
+ },
31072
+ "default": "''",
31073
+ "description": "A color of its own, as any CSS color value ('#a90061', 'oklch(0.6 0.2 20)', 'var(--brand-cable-blue)'). For a color the design system cannot know: the jacket of a cable, a color someone picked. It wins over `color`. Whatever it paints, the text and icon on top become white or black, whichever contrasts. The text on it is black or white, picked on the relative luminance of the fill, so it clears 4.5:1 whatever color you hand it.",
31074
+ "fieldName": "customColor"
30707
31075
  },
30708
31076
  {
30709
31077
  "name": "pulse",
@@ -34373,7 +34741,7 @@
34373
34741
  }
34374
34742
  }
34375
34743
  ],
34376
- "description": "Nearest ancestor app-view (light-DOM `closest`; slotted layers stay in the\nconsumer's light tree so this reaches across the slot boundaries), or null\nwhen a layer is used stand-alone (e.g. a bare page in the docs)."
34744
+ "description": "Nearest ancestor app-view (light-DOM `closest`; slotted layers stay in the\nconsumer's light tree so this reaches across the slot boundaries), or null\nwhen a layer is used stand-alone (e.g. a bare page in the docs).\n\nAn overlay ends the search: a sheet or a modal dialog is its own scroll\ncontainer and its own top edge, so a page inside one owns its scroller\nwhatever the app around it does. Without this the app-view would push its\nroot mode straight through the overlay and the page's sticky header would\nstick against the document, over the content of the overlay. The overlays\nreset --context-scroll-mode as well, which is what the stand-alone read\nbelow then finds."
34377
34745
  },
34378
34746
  {
34379
34747
  "kind": "class",