@nldd/design-system 0.8.82 → 0.8.84

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 (487) hide show
  1. package/custom-elements.json +3849 -542
  2. package/dist/components/actions/button/button.d.ts +9 -2
  3. package/dist/components/actions/button/button.d.ts.map +1 -1
  4. package/dist/components/actions/button/button.js +15 -2
  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 +2 -2
  10. package/dist/components/actions/icon-button/icon-button.js +2 -2
  11. package/dist/components/actions/menu/menu.d.ts +3 -1
  12. package/dist/components/actions/menu/menu.d.ts.map +1 -1
  13. package/dist/components/actions/menu/menu.js +22 -11
  14. package/dist/components/actions/menu/menu.js.map +1 -1
  15. package/dist/components/actions/toolbar/toolbar.styles.js +2 -2
  16. package/dist/components/components.js +2911 -1157
  17. package/dist/components/content/avatar/avatar.d.ts +6 -0
  18. package/dist/components/content/avatar/avatar.d.ts.map +1 -1
  19. package/dist/components/content/avatar/avatar.js +9 -0
  20. package/dist/components/content/avatar/avatar.js.map +1 -1
  21. package/dist/components/content/avatar/avatar.styles.d.ts.map +1 -1
  22. package/dist/components/content/avatar/avatar.styles.js +5 -1
  23. package/dist/components/content/avatar/avatar.styles.js.map +1 -1
  24. package/dist/components/content/avatar/avatar.template.d.ts.map +1 -1
  25. package/dist/components/content/avatar/avatar.template.js +2 -0
  26. package/dist/components/content/avatar/avatar.template.js.map +1 -1
  27. package/dist/components/content/avatar-group/avatar-group.styles.d.ts.map +1 -1
  28. package/dist/components/content/avatar-group/avatar-group.styles.js +6 -16
  29. package/dist/components/content/avatar-group/avatar-group.styles.js.map +1 -1
  30. package/dist/components/content/blockquote/blockquote.d.ts +3 -4
  31. package/dist/components/content/blockquote/blockquote.d.ts.map +1 -1
  32. package/dist/components/content/blockquote/blockquote.js +3 -4
  33. package/dist/components/content/blockquote/blockquote.js.map +1 -1
  34. package/dist/components/content/icon/icon-aliases.d.ts.map +1 -1
  35. package/dist/components/content/icon/icon-aliases.js +80 -6
  36. package/dist/components/content/icon/icon-aliases.js.map +1 -1
  37. package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
  38. package/dist/components/content/icon/icon-gallery-status.js +57 -94
  39. package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
  40. package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
  41. package/dist/components/content/icon/icon-registry.js +36 -4
  42. package/dist/components/content/icon/icon-registry.js.map +1 -1
  43. package/dist/components/content/icon/icon.d.ts +8 -2
  44. package/dist/components/content/icon/icon.d.ts.map +1 -1
  45. package/dist/components/content/icon/icon.js +17 -2
  46. package/dist/components/content/icon/icon.js.map +1 -1
  47. package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
  48. package/dist/components/content/icon/icon.styles.js +8 -0
  49. package/dist/components/content/icon/icon.styles.js.map +1 -1
  50. package/dist/components/content/image/image.d.ts +1 -1
  51. package/dist/components/content/image/image.js +1 -1
  52. package/dist/components/content/image/image.styles.d.ts.map +1 -1
  53. package/dist/components/content/image/image.styles.js +11 -0
  54. package/dist/components/content/image/image.styles.js.map +1 -1
  55. package/dist/components/content/keyboard-shortcut/keyboard-shortcut.d.ts +30 -30
  56. package/dist/components/content/keyboard-shortcut/keyboard-shortcut.js +30 -30
  57. package/dist/components/content/rich-text/rich-text.d.ts +20 -20
  58. package/dist/components/content/rich-text/rich-text.js +20 -20
  59. package/dist/components/content/text/text.d.ts +50 -0
  60. package/dist/components/content/text/text.d.ts.map +1 -0
  61. package/dist/components/content/text/text.js +81 -0
  62. package/dist/components/content/text/text.js.map +1 -0
  63. package/dist/components/content/text/text.styles.d.ts +2 -0
  64. package/dist/components/content/text/text.styles.d.ts.map +1 -0
  65. package/dist/components/content/text/text.styles.js +116 -0
  66. package/dist/components/content/text/text.styles.js.map +1 -0
  67. package/dist/components/content/text/text.template.d.ts +3 -0
  68. package/dist/components/content/text/text.template.d.ts.map +1 -0
  69. package/dist/components/content/text/text.template.js +7 -0
  70. package/dist/components/content/text/text.template.js.map +1 -0
  71. package/dist/components/content/title/title.d.ts +4 -4
  72. package/dist/components/content/title/title.js +4 -4
  73. package/dist/components/content/title/title.styles.d.ts.map +1 -1
  74. package/dist/components/content/title/title.styles.js +9 -13
  75. package/dist/components/content/title/title.styles.js.map +1 -1
  76. package/dist/components/content/tooltip/tooltip.d.ts +1 -1
  77. package/dist/components/content/tooltip/tooltip.js +1 -1
  78. package/dist/components/{decorate-BKn10QQi.js → decorate-lwt_OrAG.js} +1 -1
  79. package/dist/components/{dist-TpIL8G4G.js → dist-762GHPyH.js} +3 -3
  80. package/dist/components/{dist-OBifyiJS.js → dist-BB7TxeMK.js} +2 -2
  81. package/dist/components/{dist-CJR_Rwhh.js → dist-BJI4-6iQ.js} +1 -1
  82. package/dist/components/{dist-C400RcFU.js → dist-B_3OW7pC.js} +1 -1
  83. package/dist/components/{dist-afrAoubg.js → dist-C09E9-dJ.js} +34 -34
  84. package/dist/components/{dist-Ccw7ZfsU.js → dist-C6gnorjP.js} +4 -3
  85. package/dist/components/{dist-bO14jlsr.js → dist-CRsR6ckU.js} +1 -1
  86. package/dist/components/{dist-C0PiB1dr.js → dist-CjaG8dOI.js} +2 -2
  87. package/dist/components/{dist-CCg5Mso_.js → dist-DZoFKUO-.js} +1 -1
  88. package/dist/components/{dist-Bq4xc7Bm.js → dist-DaavuU6W.js} +14 -3
  89. package/dist/components/{dist-BYVOPNHp.js → dist-la_b3ZSq.js} +1 -1
  90. package/dist/components/forms/form/form.d.ts +76 -22
  91. package/dist/components/forms/form/form.d.ts.map +1 -1
  92. package/dist/components/forms/form/form.js +127 -22
  93. package/dist/components/forms/form/form.js.map +1 -1
  94. package/dist/components/forms/form-actions/form-actions.d.ts +14 -15
  95. package/dist/components/forms/form-actions/form-actions.d.ts.map +1 -1
  96. package/dist/components/forms/form-actions/form-actions.js +14 -15
  97. package/dist/components/forms/form-actions/form-actions.js.map +1 -1
  98. package/dist/components/forms/form-field/form-field.d.ts +42 -39
  99. package/dist/components/forms/form-field/form-field.d.ts.map +1 -1
  100. package/dist/components/forms/form-field/form-field.js +79 -111
  101. package/dist/components/forms/form-field/form-field.js.map +1 -1
  102. package/dist/components/forms/form-field/form-field.styles.d.ts +0 -1
  103. package/dist/components/forms/form-field/form-field.styles.d.ts.map +1 -1
  104. package/dist/components/forms/form-field/form-field.styles.js +7 -73
  105. package/dist/components/forms/form-field/form-field.styles.js.map +1 -1
  106. package/dist/components/forms/form-field/form-field.template.d.ts +0 -2
  107. package/dist/components/forms/form-field/form-field.template.d.ts.map +1 -1
  108. package/dist/components/forms/form-field/form-field.template.js +0 -15
  109. package/dist/components/forms/form-field/form-field.template.js.map +1 -1
  110. package/dist/components/forms/form-section/form-section.d.ts +26 -28
  111. package/dist/components/forms/form-section/form-section.d.ts.map +1 -1
  112. package/dist/components/forms/form-section/form-section.js +27 -29
  113. package/dist/components/forms/form-section/form-section.js.map +1 -1
  114. package/dist/components/forms/validation-list/validation-list.d.ts +193 -0
  115. package/dist/components/forms/validation-list/validation-list.d.ts.map +1 -0
  116. package/dist/components/forms/validation-list/validation-list.js +358 -0
  117. package/dist/components/forms/validation-list/validation-list.js.map +1 -0
  118. package/dist/components/forms/validation-list/validation-list.styles.d.ts +3 -0
  119. package/dist/components/forms/validation-list/validation-list.styles.d.ts.map +1 -0
  120. package/dist/components/forms/validation-list/validation-list.styles.js +58 -0
  121. package/dist/components/forms/validation-list/validation-list.styles.js.map +1 -0
  122. package/dist/components/forms/validation-list/validation-list.template.d.ts +5 -0
  123. package/dist/components/forms/validation-list/validation-list.template.d.ts.map +1 -0
  124. package/dist/components/forms/validation-list/validation-list.template.js +16 -0
  125. package/dist/components/forms/validation-list/validation-list.template.js.map +1 -0
  126. package/dist/components/{icon-CIpJq_cf.js → icon-VTLbdcvZ.js} +104 -11
  127. package/dist/components/{icon-button-BAkUJTn6.js → icon-button-Sne5TwRG.js} +6 -6
  128. package/dist/components/index.d.ts +3 -1
  129. package/dist/components/index.d.ts.map +1 -1
  130. package/dist/components/index.js +3 -1
  131. package/dist/components/index.js.map +1 -1
  132. package/dist/components/inputs/checkbox/checkbox.d.ts +20 -1
  133. package/dist/components/inputs/checkbox/checkbox.d.ts.map +1 -1
  134. package/dist/components/inputs/checkbox/checkbox.js +32 -2
  135. package/dist/components/inputs/checkbox/checkbox.js.map +1 -1
  136. package/dist/components/inputs/checkbox/checkbox.template.d.ts.map +1 -1
  137. package/dist/components/inputs/checkbox/checkbox.template.js +2 -0
  138. package/dist/components/inputs/checkbox/checkbox.template.js.map +1 -1
  139. package/dist/components/inputs/checkbox-field/checkbox-field.d.ts +16 -1
  140. package/dist/components/inputs/checkbox-field/checkbox-field.d.ts.map +1 -1
  141. package/dist/components/inputs/checkbox-field/checkbox-field.js +27 -2
  142. package/dist/components/inputs/checkbox-field/checkbox-field.js.map +1 -1
  143. package/dist/components/inputs/checkbox-field/checkbox-field.template.d.ts.map +1 -1
  144. package/dist/components/inputs/checkbox-field/checkbox-field.template.js +2 -0
  145. package/dist/components/inputs/checkbox-field/checkbox-field.template.js.map +1 -1
  146. package/dist/components/inputs/code-editor/code-editor.d.ts +14 -1
  147. package/dist/components/inputs/code-editor/code-editor.d.ts.map +1 -1
  148. package/dist/components/inputs/code-editor/code-editor.js +21 -2
  149. package/dist/components/inputs/code-editor/code-editor.js.map +1 -1
  150. package/dist/components/inputs/combo-box/combo-box.d.ts +15 -2
  151. package/dist/components/inputs/combo-box/combo-box.d.ts.map +1 -1
  152. package/dist/components/inputs/combo-box/combo-box.js +54 -5
  153. package/dist/components/inputs/combo-box/combo-box.js.map +1 -1
  154. package/dist/components/inputs/combo-box/combo-box.styles.d.ts.map +1 -1
  155. package/dist/components/inputs/combo-box/combo-box.styles.js +14 -0
  156. package/dist/components/inputs/combo-box/combo-box.styles.js.map +1 -1
  157. package/dist/components/inputs/combo-box/combo-box.template.d.ts.map +1 -1
  158. package/dist/components/inputs/combo-box/combo-box.template.js +27 -20
  159. package/dist/components/inputs/combo-box/combo-box.template.js.map +1 -1
  160. package/dist/components/inputs/date-field/date-field.d.ts +29 -31
  161. package/dist/components/inputs/date-field/date-field.d.ts.map +1 -1
  162. package/dist/components/inputs/date-field/date-field.js +40 -37
  163. package/dist/components/inputs/date-field/date-field.js.map +1 -1
  164. package/dist/components/inputs/date-field/date-field.styles.d.ts.map +1 -1
  165. package/dist/components/inputs/date-field/date-field.styles.js +11 -0
  166. package/dist/components/inputs/date-field/date-field.styles.js.map +1 -1
  167. package/dist/components/inputs/date-field/date-field.template.d.ts.map +1 -1
  168. package/dist/components/inputs/date-field/date-field.template.js +7 -2
  169. package/dist/components/inputs/date-field/date-field.template.js.map +1 -1
  170. package/dist/components/inputs/date-picker/date-picker.d.ts +34 -21
  171. package/dist/components/inputs/date-picker/date-picker.d.ts.map +1 -1
  172. package/dist/components/inputs/date-picker/date-picker.js +42 -22
  173. package/dist/components/inputs/date-picker/date-picker.js.map +1 -1
  174. package/dist/components/inputs/dropdown/dropdown.d.ts +23 -2
  175. package/dist/components/inputs/dropdown/dropdown.d.ts.map +1 -1
  176. package/dist/components/inputs/dropdown/dropdown.js +36 -3
  177. package/dist/components/inputs/dropdown/dropdown.js.map +1 -1
  178. package/dist/components/inputs/file-field/file-field.d.ts +4 -3
  179. package/dist/components/inputs/file-field/file-field.d.ts.map +1 -1
  180. package/dist/components/inputs/file-field/file-field.js +8 -7
  181. package/dist/components/inputs/file-field/file-field.js.map +1 -1
  182. package/dist/components/inputs/file-field/file-field.template.d.ts.map +1 -1
  183. package/dist/components/inputs/file-field/file-field.template.js +0 -1
  184. package/dist/components/inputs/file-field/file-field.template.js.map +1 -1
  185. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.d.ts +15 -4
  186. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.d.ts.map +1 -1
  187. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.js +20 -8
  188. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.js.map +1 -1
  189. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.d.ts.map +1 -1
  190. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.js +4 -1
  191. package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.js.map +1 -1
  192. package/dist/components/inputs/number-field/number-field.d.ts +12 -1
  193. package/dist/components/inputs/number-field/number-field.d.ts.map +1 -1
  194. package/dist/components/inputs/number-field/number-field.js +18 -3
  195. package/dist/components/inputs/number-field/number-field.js.map +1 -1
  196. package/dist/components/inputs/number-field/number-field.styles.d.ts.map +1 -1
  197. package/dist/components/inputs/number-field/number-field.styles.js +8 -16
  198. package/dist/components/inputs/number-field/number-field.styles.js.map +1 -1
  199. package/dist/components/inputs/password-field/password-field.d.ts +10 -3
  200. package/dist/components/inputs/password-field/password-field.d.ts.map +1 -1
  201. package/dist/components/inputs/password-field/password-field.js +18 -8
  202. package/dist/components/inputs/password-field/password-field.js.map +1 -1
  203. package/dist/components/inputs/password-field/password-field.template.d.ts.map +1 -1
  204. package/dist/components/inputs/password-field/password-field.template.js +3 -1
  205. package/dist/components/inputs/password-field/password-field.template.js.map +1 -1
  206. package/dist/components/inputs/radio-button/radio-button.d.ts +18 -1
  207. package/dist/components/inputs/radio-button/radio-button.d.ts.map +1 -1
  208. package/dist/components/inputs/radio-button/radio-button.js +27 -2
  209. package/dist/components/inputs/radio-button/radio-button.js.map +1 -1
  210. package/dist/components/inputs/radio-button/radio-button.template.d.ts.map +1 -1
  211. package/dist/components/inputs/radio-button/radio-button.template.js +1 -0
  212. package/dist/components/inputs/radio-button/radio-button.template.js.map +1 -1
  213. package/dist/components/inputs/radio-button-field/radio-button-field.d.ts +14 -1
  214. package/dist/components/inputs/radio-button-field/radio-button-field.d.ts.map +1 -1
  215. package/dist/components/inputs/radio-button-field/radio-button-field.js +22 -2
  216. package/dist/components/inputs/radio-button-field/radio-button-field.js.map +1 -1
  217. package/dist/components/inputs/radio-button-field/radio-button-field.template.d.ts.map +1 -1
  218. package/dist/components/inputs/radio-button-field/radio-button-field.template.js +1 -0
  219. package/dist/components/inputs/radio-button-field/radio-button-field.template.js.map +1 -1
  220. package/dist/components/inputs/radio-button-group/radio-button-group.d.ts +11 -0
  221. package/dist/components/inputs/radio-button-group/radio-button-group.d.ts.map +1 -1
  222. package/dist/components/inputs/radio-button-group/radio-button-group.js +21 -0
  223. package/dist/components/inputs/radio-button-group/radio-button-group.js.map +1 -1
  224. package/dist/components/inputs/search-field/search-field.d.ts +23 -1
  225. package/dist/components/inputs/search-field/search-field.d.ts.map +1 -1
  226. package/dist/components/inputs/search-field/search-field.js +37 -3
  227. package/dist/components/inputs/search-field/search-field.js.map +1 -1
  228. package/dist/components/inputs/search-field/search-field.template.d.ts.map +1 -1
  229. package/dist/components/inputs/search-field/search-field.template.js +4 -0
  230. package/dist/components/inputs/search-field/search-field.template.js.map +1 -1
  231. package/dist/components/inputs/segmented-control/segmented-control.d.ts +28 -0
  232. package/dist/components/inputs/segmented-control/segmented-control.d.ts.map +1 -1
  233. package/dist/components/inputs/segmented-control/segmented-control.js +52 -2
  234. package/dist/components/inputs/segmented-control/segmented-control.js.map +1 -1
  235. package/dist/components/inputs/segmented-control/segmented-control.template.d.ts.map +1 -1
  236. package/dist/components/inputs/segmented-control/segmented-control.template.js +1 -0
  237. package/dist/components/inputs/segmented-control/segmented-control.template.js.map +1 -1
  238. package/dist/components/inputs/stepper/stepper.d.ts +14 -1
  239. package/dist/components/inputs/stepper/stepper.d.ts.map +1 -1
  240. package/dist/components/inputs/stepper/stepper.js +21 -2
  241. package/dist/components/inputs/stepper/stepper.js.map +1 -1
  242. package/dist/components/inputs/switch/switch.d.ts +20 -1
  243. package/dist/components/inputs/switch/switch.d.ts.map +1 -1
  244. package/dist/components/inputs/switch/switch.js +31 -2
  245. package/dist/components/inputs/switch/switch.js.map +1 -1
  246. package/dist/components/inputs/switch/switch.template.d.ts.map +1 -1
  247. package/dist/components/inputs/switch/switch.template.js +2 -0
  248. package/dist/components/inputs/switch/switch.template.js.map +1 -1
  249. package/dist/components/inputs/switch-field/switch-field.d.ts +18 -1
  250. package/dist/components/inputs/switch-field/switch-field.d.ts.map +1 -1
  251. package/dist/components/inputs/switch-field/switch-field.js +25 -1
  252. package/dist/components/inputs/switch-field/switch-field.js.map +1 -1
  253. package/dist/components/inputs/switch-field/switch-field.template.d.ts.map +1 -1
  254. package/dist/components/inputs/switch-field/switch-field.template.js +2 -0
  255. package/dist/components/inputs/switch-field/switch-field.template.js.map +1 -1
  256. package/dist/components/inputs/text-editor/text-editor.d.ts +14 -1
  257. package/dist/components/inputs/text-editor/text-editor.d.ts.map +1 -1
  258. package/dist/components/inputs/text-editor/text-editor.js +21 -2
  259. package/dist/components/inputs/text-editor/text-editor.js.map +1 -1
  260. package/dist/components/inputs/text-field/text-field.d.ts +31 -3
  261. package/dist/components/inputs/text-field/text-field.d.ts.map +1 -1
  262. package/dist/components/inputs/text-field/text-field.js +65 -7
  263. package/dist/components/inputs/text-field/text-field.js.map +1 -1
  264. package/dist/components/inputs/text-field/text-field.template.d.ts.map +1 -1
  265. package/dist/components/inputs/text-field/text-field.template.js +5 -1
  266. package/dist/components/inputs/text-field/text-field.template.js.map +1 -1
  267. package/dist/components/inputs/time-field/time-field.d.ts +33 -35
  268. package/dist/components/inputs/time-field/time-field.d.ts.map +1 -1
  269. package/dist/components/inputs/time-field/time-field.js +43 -40
  270. package/dist/components/inputs/time-field/time-field.js.map +1 -1
  271. package/dist/components/inputs/time-field/time-field.styles.d.ts.map +1 -1
  272. package/dist/components/inputs/time-field/time-field.styles.js +12 -0
  273. package/dist/components/inputs/time-field/time-field.styles.js.map +1 -1
  274. package/dist/components/inputs/time-field/time-field.template.d.ts.map +1 -1
  275. package/dist/components/inputs/time-field/time-field.template.js +7 -2
  276. package/dist/components/inputs/time-field/time-field.template.js.map +1 -1
  277. package/dist/components/inputs/time-picker/time-picker.d.ts +34 -19
  278. package/dist/components/inputs/time-picker/time-picker.d.ts.map +1 -1
  279. package/dist/components/inputs/time-picker/time-picker.js +42 -22
  280. package/dist/components/inputs/time-picker/time-picker.js.map +1 -1
  281. package/dist/components/inputs/toggle-button/toggle-button.d.ts +22 -1
  282. package/dist/components/inputs/toggle-button/toggle-button.d.ts.map +1 -1
  283. package/dist/components/inputs/toggle-button/toggle-button.js +35 -2
  284. package/dist/components/inputs/toggle-button/toggle-button.js.map +1 -1
  285. package/dist/components/inputs/toggle-button/toggle-button.template.d.ts.map +1 -1
  286. package/dist/components/inputs/toggle-button/toggle-button.template.js +3 -0
  287. package/dist/components/inputs/toggle-button/toggle-button.template.js.map +1 -1
  288. package/dist/components/inputs/toggle-button-group/toggle-button-group.d.ts +27 -0
  289. package/dist/components/inputs/toggle-button-group/toggle-button-group.d.ts.map +1 -1
  290. package/dist/components/inputs/toggle-button-group/toggle-button-group.js +46 -0
  291. package/dist/components/inputs/toggle-button-group/toggle-button-group.js.map +1 -1
  292. package/dist/components/inputs/token-field/token-field.d.ts +7 -1
  293. package/dist/components/inputs/token-field/token-field.d.ts.map +1 -1
  294. package/dist/components/inputs/token-field/token-field.js +14 -1
  295. package/dist/components/inputs/token-field/token-field.js.map +1 -1
  296. package/dist/components/layout/app-view/app-view.d.ts.map +1 -1
  297. package/dist/components/layout/app-view/app-view.js +12 -0
  298. package/dist/components/layout/app-view/app-view.js.map +1 -1
  299. package/dist/components/layout/box/box.d.ts +4 -4
  300. package/dist/components/layout/box/box.d.ts.map +1 -1
  301. package/dist/components/layout/box/box.js +4 -4
  302. package/dist/components/layout/box/box.js.map +1 -1
  303. package/dist/components/layout/box/box.styles.d.ts.map +1 -1
  304. package/dist/components/layout/box/box.styles.js +4 -6
  305. package/dist/components/layout/box/box.styles.js.map +1 -1
  306. package/dist/components/layout/card/card.d.ts +18 -19
  307. package/dist/components/layout/card/card.d.ts.map +1 -1
  308. package/dist/components/layout/card/card.js +18 -19
  309. package/dist/components/layout/card/card.js.map +1 -1
  310. package/dist/components/layout/card/card.styles.d.ts.map +1 -1
  311. package/dist/components/layout/card/card.styles.js +1 -0
  312. package/dist/components/layout/card/card.styles.js.map +1 -1
  313. package/dist/components/layout/collection/collection.d.ts.map +1 -1
  314. package/dist/components/layout/collection/collection.js +6 -2
  315. package/dist/components/layout/collection/collection.js.map +1 -1
  316. package/dist/components/layout/divider/divider.d.ts +1 -1
  317. package/dist/components/layout/divider/divider.js +1 -1
  318. package/dist/components/layout/popover/popover.d.ts +1 -1
  319. package/dist/components/layout/popover/popover.d.ts.map +1 -1
  320. package/dist/components/layout/popover/popover.js +15 -2
  321. package/dist/components/layout/popover/popover.js.map +1 -1
  322. package/dist/components/layout/sheet/sheet.d.ts +1 -1
  323. package/dist/components/layout/sheet/sheet.js +2 -2
  324. package/dist/components/layout/sheet/sheet.js.map +1 -1
  325. package/dist/components/layout/sheet/sheet.styles.d.ts.map +1 -1
  326. package/dist/components/layout/sheet/sheet.styles.js +15 -3
  327. package/dist/components/layout/sheet/sheet.styles.js.map +1 -1
  328. package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.d.ts +8 -0
  329. package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.d.ts.map +1 -1
  330. package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.js +29 -11
  331. package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.js.map +1 -1
  332. package/dist/components/layout/window/window.d.ts +20 -21
  333. package/dist/components/layout/window/window.d.ts.map +1 -1
  334. package/dist/components/layout/window/window.js +21 -22
  335. package/dist/components/layout/window/window.js.map +1 -1
  336. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.d.ts +41 -12
  337. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.d.ts.map +1 -1
  338. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.js +47 -17
  339. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.js.map +1 -1
  340. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.styles.d.ts.map +1 -1
  341. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.styles.js +42 -13
  342. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.styles.js.map +1 -1
  343. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.template.d.ts.map +1 -1
  344. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.template.js +12 -4
  345. package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.template.js.map +1 -1
  346. package/dist/components/lists-and-tables/list/list.d.ts +168 -61
  347. package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
  348. package/dist/components/lists-and-tables/list/list.i18n.d.ts +0 -1
  349. package/dist/components/lists-and-tables/list/list.i18n.d.ts.map +1 -1
  350. package/dist/components/lists-and-tables/list/list.i18n.js +0 -1
  351. package/dist/components/lists-and-tables/list/list.i18n.js.map +1 -1
  352. package/dist/components/lists-and-tables/list/list.js +361 -122
  353. package/dist/components/lists-and-tables/list/list.js.map +1 -1
  354. package/dist/components/lists-and-tables/list/list.styles.d.ts.map +1 -1
  355. package/dist/components/lists-and-tables/list/list.styles.js +5 -0
  356. package/dist/components/lists-and-tables/list/list.styles.js.map +1 -1
  357. package/dist/components/lists-and-tables/list/list.template.d.ts +1 -3
  358. package/dist/components/lists-and-tables/list/list.template.d.ts.map +1 -1
  359. package/dist/components/lists-and-tables/list/list.template.js +2 -7
  360. package/dist/components/lists-and-tables/list/list.template.js.map +1 -1
  361. package/dist/components/lists-and-tables/list-item/list-item.d.ts +134 -23
  362. package/dist/components/lists-and-tables/list-item/list-item.d.ts.map +1 -1
  363. package/dist/components/lists-and-tables/list-item/list-item.js +354 -61
  364. package/dist/components/lists-and-tables/list-item/list-item.js.map +1 -1
  365. package/dist/components/lists-and-tables/list-item/list-item.styles.d.ts.map +1 -1
  366. package/dist/components/lists-and-tables/list-item/list-item.styles.js +116 -34
  367. package/dist/components/lists-and-tables/list-item/list-item.styles.js.map +1 -1
  368. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts +1 -1
  369. package/dist/components/lists-and-tables/list-item/list-item.template.d.ts.map +1 -1
  370. package/dist/components/lists-and-tables/list-item/list-item.template.js +5 -2
  371. package/dist/components/lists-and-tables/list-item/list-item.template.js.map +1 -1
  372. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.d.ts +116 -0
  373. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.d.ts.map +1 -0
  374. package/dist/components/lists-and-tables/{list-item-action/list-item-action.js → list-item-segment/list-item-segment.js} +85 -56
  375. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.js.map +1 -0
  376. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.d.ts +2 -0
  377. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.d.ts.map +1 -0
  378. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.js +179 -0
  379. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.js.map +1 -0
  380. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.d.ts +3 -0
  381. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.d.ts.map +1 -0
  382. package/dist/components/lists-and-tables/{list-item-action/list-item-action.template.js → list-item-segment/list-item-segment.template.js} +5 -4
  383. package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.js.map +1 -0
  384. package/dist/components/lists-and-tables/table/table.d.ts +12 -9
  385. package/dist/components/lists-and-tables/table/table.d.ts.map +1 -1
  386. package/dist/components/lists-and-tables/table/table.i18n.d.ts +0 -1
  387. package/dist/components/lists-and-tables/table/table.i18n.d.ts.map +1 -1
  388. package/dist/components/lists-and-tables/table/table.i18n.js +0 -1
  389. package/dist/components/lists-and-tables/table/table.i18n.js.map +1 -1
  390. package/dist/components/lists-and-tables/table/table.js +26 -16
  391. package/dist/components/lists-and-tables/table/table.js.map +1 -1
  392. package/dist/components/lists-and-tables/table/table.styles.d.ts.map +1 -1
  393. package/dist/components/lists-and-tables/table/table.styles.js +5 -0
  394. package/dist/components/lists-and-tables/table/table.styles.js.map +1 -1
  395. package/dist/components/lists-and-tables/table/table.template.d.ts +1 -1
  396. package/dist/components/lists-and-tables/table/table.template.d.ts.map +1 -1
  397. package/dist/components/lists-and-tables/table/table.template.js +5 -9
  398. package/dist/components/lists-and-tables/table/table.template.js.map +1 -1
  399. package/dist/components/navigation/link/link.d.ts +30 -24
  400. package/dist/components/navigation/link/link.d.ts.map +1 -1
  401. package/dist/components/navigation/link/link.js +33 -24
  402. package/dist/components/navigation/link/link.js.map +1 -1
  403. package/dist/components/navigation/link/link.template.js +1 -1
  404. package/dist/components/navigation/link/link.template.js.map +1 -1
  405. package/dist/components/navigation/menu-bar/menu-bar.d.ts +7 -7
  406. package/dist/components/navigation/menu-bar/menu-bar.js +7 -7
  407. package/dist/components/navigation/menu-bar-item/menu-bar-item.d.ts +23 -23
  408. package/dist/components/navigation/menu-bar-item/menu-bar-item.js +23 -23
  409. package/dist/components/navigation/pagination/pagination.d.ts +4 -4
  410. package/dist/components/navigation/pagination/pagination.js +4 -4
  411. package/dist/components/navigation/skip-link/skip-link.d.ts +7 -7
  412. package/dist/components/navigation/skip-link/skip-link.js +7 -7
  413. package/dist/components/navigation/tab-bar/tab-bar.d.ts +5 -3
  414. package/dist/components/navigation/tab-bar/tab-bar.d.ts.map +1 -1
  415. package/dist/components/navigation/tab-bar/tab-bar.js +18 -13
  416. package/dist/components/navigation/tab-bar/tab-bar.js.map +1 -1
  417. package/dist/components/navigation/tab-bar/tab-bar.styles.js +8 -8
  418. package/dist/components/navigation/tab-bar/tab-bar.template.js +5 -5
  419. package/dist/components/navigation/tab-bar/tab-bar.template.js.map +1 -1
  420. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.d.ts +15 -15
  421. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.js +15 -15
  422. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.d.ts.map +1 -1
  423. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js +14 -2
  424. package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js.map +1 -1
  425. package/dist/components/navigation/top-title-bar/top-title-bar.d.ts +2 -2
  426. package/dist/components/navigation/top-title-bar/top-title-bar.js +2 -2
  427. package/dist/components/navigation/top-title-bar/top-title-bar.styles.js +2 -2
  428. package/dist/components/status-and-feedback/badge/badge.d.ts +8 -2
  429. package/dist/components/status-and-feedback/badge/badge.d.ts.map +1 -1
  430. package/dist/components/status-and-feedback/badge/badge.js +17 -1
  431. package/dist/components/status-and-feedback/badge/badge.js.map +1 -1
  432. package/dist/components/status-and-feedback/badge/badge.styles.d.ts.map +1 -1
  433. package/dist/components/status-and-feedback/badge/badge.styles.js +41 -10
  434. package/dist/components/status-and-feedback/badge/badge.styles.js.map +1 -1
  435. package/dist/components/status-and-feedback/badge/badge.template.js +1 -1
  436. package/dist/components/status-and-feedback/badge/badge.template.js.map +1 -1
  437. package/dist/components/status-and-feedback/banner/banner.styles.js +2 -2
  438. package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.d.ts +37 -36
  439. package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.d.ts.map +1 -1
  440. package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.js +37 -36
  441. package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.js.map +1 -1
  442. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts +1 -1
  443. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js +2 -2
  444. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js.map +1 -1
  445. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.d.ts.map +1 -1
  446. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js +7 -0
  447. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js.map +1 -1
  448. package/dist/components/status-and-feedback/notification/notification-region.js +1 -1
  449. package/dist/components/status-and-feedback/status-bar/status-bar.d.ts +29 -28
  450. package/dist/components/status-and-feedback/status-bar/status-bar.d.ts.map +1 -1
  451. package/dist/components/status-and-feedback/status-bar/status-bar.js +29 -28
  452. package/dist/components/status-and-feedback/status-bar/status-bar.js.map +1 -1
  453. package/dist/components/status-and-feedback/step-indicator/step-indicator.styles.js +1 -1
  454. package/dist/components/{visibility-mixin-GxbwkBb1.js → visibility-mixin-vbfhyo7f.js} +1 -1
  455. package/dist/components/{with-translations-DzAdFTK8.js → with-translations-CqUV9S5g.js} +1 -1
  456. package/dist/css/form-section.css +28 -46
  457. package/dist/css/form.css +7 -13
  458. package/dist/css/rich-text.css +5 -5
  459. package/dist/css/variables.css +133 -8
  460. package/dist/nldd.min.js +1382 -875
  461. package/dist/types/vue.d.ts +530 -336
  462. package/dist/utilities/codemirror/codemirror-element.d.ts.map +1 -1
  463. package/dist/utilities/codemirror/codemirror-element.js +5 -0
  464. package/dist/utilities/codemirror/codemirror-element.js.map +1 -1
  465. package/dist/utilities/described-by-mixin.d.ts +49 -0
  466. package/dist/utilities/described-by-mixin.d.ts.map +1 -0
  467. package/dist/utilities/described-by-mixin.js +109 -0
  468. package/dist/utilities/described-by-mixin.js.map +1 -0
  469. package/dist/utilities/form-associated-mixin.d.ts +5 -0
  470. package/dist/utilities/form-associated-mixin.d.ts.map +1 -1
  471. package/dist/utilities/form-associated-mixin.js +69 -0
  472. package/dist/utilities/form-associated-mixin.js.map +1 -1
  473. package/dist/utilities/scroll-mode-controller.d.ts +9 -1
  474. package/dist/utilities/scroll-mode-controller.d.ts.map +1 -1
  475. package/dist/utilities/scroll-mode-controller.js +10 -2
  476. package/dist/utilities/scroll-mode-controller.js.map +1 -1
  477. package/package.json +21 -9
  478. package/dist/components/lists-and-tables/list-item-action/list-item-action.d.ts +0 -108
  479. package/dist/components/lists-and-tables/list-item-action/list-item-action.d.ts.map +0 -1
  480. package/dist/components/lists-and-tables/list-item-action/list-item-action.js.map +0 -1
  481. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.d.ts +0 -2
  482. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.d.ts.map +0 -1
  483. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.js +0 -145
  484. package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.js.map +0 -1
  485. package/dist/components/lists-and-tables/list-item-action/list-item-action.template.d.ts +0 -3
  486. package/dist/components/lists-and-tables/list-item-action/list-item-action.template.d.ts.map +0 -1
  487. package/dist/components/lists-and-tables/list-item-action/list-item-action.template.js.map +0 -1
@@ -13,10 +13,62 @@ import { template } from './list-item.template.js';
13
13
  import { isPointerMode } from '../../../utilities/input-modality.js';
14
14
  import { withTranslations } from '../../../utilities/with-translations.js';
15
15
  import { nlddListItemTranslations } from './list-item.i18n.js';
16
+ /** Anything in a row's light DOM that is a tab stop of its own. `[tabindex]`
17
+ * counts because an authored one makes any element focusable; the value itself
18
+ * is read per element, and put back when the row becomes the current one. */
19
+ const OWN_TAB_STOP = 'a[href], button, input, select, textarea, [contenteditable]:not([contenteditable="false"]), [tabindex]';
20
+ /** Keyed on the element, so a row that is re-rendered around the same control
21
+ * still knows what the consumer authored. */
22
+ const authoredTabState = new WeakMap();
23
+ function authoredStateOf(el) {
24
+ let authored = authoredTabState.get(el);
25
+ if (!authored) {
26
+ authored = { noTab: 'noTab' in el ? el.noTab : undefined, tabindex: el.getAttribute('tabindex') };
27
+ authoredTabState.set(el, authored);
28
+ }
29
+ return authored;
30
+ }
31
+ function applyAuthoredTabState(el, authored) {
32
+ if (authored.noTab !== undefined) {
33
+ el.noTab = authored.noTab;
34
+ return;
35
+ }
36
+ if (authored.tabindex === null)
37
+ el.removeAttribute('tabindex');
38
+ else
39
+ el.setAttribute('tabindex', authored.tabindex);
40
+ }
41
+ /**
42
+ * Puts one control in or out of the tab order on behalf of the row it sits in.
43
+ *
44
+ * A design-system control keeps its tab stop inside its own shadow root, where
45
+ * a tabindex on the host cannot reach it, so it carries `no-tab` for exactly
46
+ * this. Everything else is native and takes the tabindex directly. A consumer
47
+ * who set either themselves keeps it: their `no-tab` or `tabindex="-1"` is a
48
+ * decision, not a leftover.
49
+ */
50
+ function setTabbable(el, tabbable) {
51
+ const authored = authoredStateOf(el);
52
+ if (authored.noTab !== undefined) {
53
+ el.noTab = authored.noTab || !tabbable;
54
+ return;
55
+ }
56
+ if (tabbable)
57
+ applyAuthoredTabState(el, authored);
58
+ else
59
+ el.setAttribute('tabindex', '-1');
60
+ }
61
+ function releaseTabbable(el) {
62
+ const authored = authoredTabState.get(el);
63
+ if (!authored)
64
+ return;
65
+ applyAuthoredTabState(el, authored);
66
+ authoredTabState.delete(el);
67
+ }
16
68
  /**
17
69
  * A row within an `nldd-list`. Renders as a link when `href` is set, as a
18
70
  * checkbox when `checkbox` is set, as a button when `button` is set, or as a
19
- * plain container otherwise. All cells and action segmented actions share one flat
71
+ * plain container otherwise. All cells and segments share one flat
20
72
  * slot, in source order.
21
73
  *
22
74
  * ## Geometry
@@ -30,7 +82,7 @@ import { nlddListItemTranslations } from './list-item.i18n.js';
30
82
  * itself outward (`is-interactive` host class → negative inline margin)
31
83
  * and pads the row block back by the same amount, so content stays on the
32
84
  * grid. A row-wide action owns that padding itself, making the whole
33
- * widened box one hit area; slotted segmented actions stay in the grid, so their
85
+ * widened box one hit area; slotted segments stay in the grid, so their
34
86
  * footprint is position-independent and tree columns line up at any depth.
35
87
  *
36
88
  * ## Divider
@@ -39,7 +91,7 @@ import { nlddListItemTranslations } from './list-item.i18n.js';
39
91
  * an avatar, a checkbox, or the spacers a tree indents with. Rows of different
40
92
  * shapes then still line their dividers up with each other, and a tree's
41
93
  * dividers step inward with its indentation. Text inside an
42
- * `nldd-list-item-action` counts as the row's content, and the marker is that
94
+ * `nldd-list-item-segment` counts as the row's content, and the marker is that
43
95
  * text cell rather than the action: the action carries its own inline padding,
44
96
  * so its edge sits before the words. A row with no text or title cell keeps the
45
97
  * full content width. Mark a cell with `divider-start` and/or `divider-end` to
@@ -51,7 +103,7 @@ import { nlddListItemTranslations } from './list-item.i18n.js';
51
103
  *
52
104
  * ## Disclosure
53
105
  * A branch row can disclose its children in two ways: a dedicated
54
- * `nldd-list-item-action[disclosure]` segment (only the chevron is clickable),
106
+ * `nldd-list-item-segment[disclosure]` segment (only the chevron is clickable),
55
107
  * or the row itself as the control (`button` + `expanded`, the whole row
56
108
  * toggles). In the second case, mark the chevron's `nldd-icon-cell` with
57
109
  * `disclosure` and the row turns it with `expanded` — the same affordance,
@@ -84,17 +136,19 @@ import { nlddListItemTranslations } from './list-item.i18n.js';
84
136
  * @element nldd-list-item
85
137
  *
86
138
  * @attr {'sm'|'md'} size - Row size (default: 'md'). Pushed onto the cells whose `size` means the same scale (nldd-text-cell, nldd-drag-handle-cell), so it is written once per row instead of once per cell. A size set on the cell itself wins. Cells where `size` means something else — pixels on nldd-icon-cell / nldd-spacer-cell, a heading scale on nldd-title-cell — are left alone.
87
- * @attr {boolean} selected - 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`.
88
- * @attr {boolean} button - Renders the item as a `<button>`; ignored when `href` is set (a link wins)
89
- * @attr {boolean} checkbox - Makes the whole row a `role="checkbox"` control; ignored when `href` is set
139
+ * @attr {boolean} selected - 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`.
140
+ * @attr {boolean} current - 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.
141
+ * @attr {boolean} button - Renders the item as a `<button>`. Last of the three: `href` and `checkbox` both win over it.
142
+ * @attr {boolean} checkbox - Makes the whole row a `role="checkbox"` control. Wins over `button`, loses to `href`.
90
143
  * @attr {boolean} checked - Checked state of a `checkbox` row; the item toggles it on activation
91
- * @attr {boolean} expanded - 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.
92
- * @attr {string} href - Renders the item as an `<a>` with this URL. Takes precedence over `button`; without either the item is a plain container with no action.
144
+ * @attr {boolean} disabled - 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.
145
+ * @attr {boolean} expanded - 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.
146
+ * @attr {string} href - 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.
93
147
  * @attr {string} target - Link target forwarded to the `<a>` (e.g. '_blank'); only applies with `href`. With '_blank' a visually hidden "opens in new tab" announcement is added for assistive technology.
94
148
  * @attr {string} rel - Link rel forwarded to the `<a>` (e.g. 'noopener noreferrer'); only applies with `href`
95
149
  * @attr {boolean} reorderable - Set by the parent `nldd-list` when its own `reorderable` is on (with `type="list"`); consumers do not set this. Serves as a CSS hook for drag handle visibility.
96
150
  *
97
- * @slot - Cells and segmented actions, in source order
151
+ * @slot - Cells and segments, in source order
98
152
  * @slot children - Child rows of a branch in an `nldd-list type="tree"`. Rendered as a `role="group"` below the row, hidden while `expanded` is false. The nesting IS the hierarchy, so aria-level / -posinset / -setsize are derived, not authored. The group has no styling of its own: repeat a spacer-cell per level to indent, or show depth some other way.
99
153
  *
100
154
  * @fires change - On a `checkbox` row after it toggles; detail: { checked: boolean }
@@ -104,20 +158,39 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
104
158
  super(...arguments);
105
159
  this.size = 'md';
106
160
  this.selected = false;
161
+ /**
162
+ * The row you are on, as opposed to the rows you picked (`selected`).
163
+ *
164
+ * Kept apart because the two say different things and a list can show both:
165
+ * a checkbox list where three rows are ticked and one is open. At rest they
166
+ * paint the same, so a menu reads the same as it always did; the difference
167
+ * shows when focus is in the row.
168
+ */
169
+ this.current = false;
107
170
  /** When set, renders the item as a button; ignored when href is set. */
108
171
  this.button = false;
109
172
  /** When set, the whole row is the checkbox control. Ignored when href is set. */
110
173
  this.checkbox = false;
111
174
  /** Checked state of a `checkbox` row. Toggled by the item on activation. */
112
175
  this.checked = false;
176
+ /**
177
+ * Switches off the row's own control.
178
+ *
179
+ * Only the row's own: a row built out of segments has no control here, and
180
+ * each segment carries its own `disabled`. A link cannot be disabled the way
181
+ * a button can, so there it is `aria-disabled` plus a blocked click, the
182
+ * same trade `nldd-button` makes.
183
+ */
184
+ this.disabled = false;
113
185
  /** Set by the parent nldd-list when reorderable is enabled. Used as a CSS hook for drag handle visibility. */
114
186
  this.reorderable = false;
115
187
  this._showChildren = false;
116
188
  this._parentType = 'list';
117
- /** Set by the parent nldd-list when `arrow-navigation` (roving tabindex) is on.
189
+ /** Set by the parent nldd-list when it runs the roving tabindex (everywhere
190
+ * except a listbox and a reorderable list).
118
191
  * Switches the inner action from a normal tab stop to a roving one. */
119
192
  this._arrowNavigation = false;
120
- /** Set by the parent nldd-list: when arrow-navigation is on, exactly one item
193
+ /** Set by the parent nldd-list: while the roving runs, exactly one item
121
194
  * is the roving entry point (tabindex 0); the rest are tabindex -1. */
122
195
  this._rovingActive = false;
123
196
  /** Set by the parent nldd-list in `type="listbox"`: marks this option as
@@ -129,14 +202,26 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
129
202
  this._isBoxed = false;
130
203
  this._hasCheckedSegment = false;
131
204
  this._lightDomObserver = null;
205
+ /** The controls in this row the roving takes in and out of the tab order.
206
+ * Rebuilt when the row's light DOM changes, so a keypress does not walk
207
+ * every cell of every row again. */
208
+ this._rovingControlsCache = null;
132
209
  /** Watches the row and its divider-marker cells for size changes; marker
133
210
  * insets are measured, so any reflow can move them. */
134
211
  this._dividerMarkerObserver = null;
135
212
  this._observedMarkerTargets = [];
136
213
  this._warnedDegenerateDivider = false;
214
+ this._warnedChildrenOutsideTree = false;
137
215
  /** Remembers the size a cell was authored with, so a later push can restore it. */
138
216
  this._ownCellSize = new WeakMap();
139
217
  this._handleClick = (e) => {
218
+ // A disabled <button> never gets here, but a link does: there is no such
219
+ // thing as a disabled <a>, so the row stops the navigation itself.
220
+ if (this.disabled) {
221
+ e.preventDefault();
222
+ e.stopPropagation();
223
+ return;
224
+ }
140
225
  // Safari and Firefox on Mac don't focus buttons on click. Force focus
141
226
  // so :has(.list-item__action:focus) and :focus-within CSS work reliably.
142
227
  this._action?.focus();
@@ -160,7 +245,24 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
160
245
  this._handleFocusOut = () => {
161
246
  this._action?.classList.remove('is-pointer-focus');
162
247
  };
248
+ /**
249
+ * See the same handler in nldd-list-item-segment: Safari hands focus to the
250
+ * body while the mouse is down, which drops a row out of its lit state until
251
+ * you let go. Left alone on a reorderable row and on a row whose press came
252
+ * from a nested one, where the default is doing real work (dragging).
253
+ */
254
+ this._onMouseDown = (e) => {
255
+ if (e.button > 0 || this.reorderable)
256
+ return;
257
+ if (this._isFromNestedRow(e))
258
+ return;
259
+ if (!this._action)
260
+ return;
261
+ e.preventDefault();
262
+ };
163
263
  this._onPointerDown = (e) => {
264
+ if (this.disabled)
265
+ return;
164
266
  // Primary button / touch / pen only (mouse right-click has button > 0).
165
267
  if (e.button > 0)
166
268
  return;
@@ -170,8 +272,17 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
170
272
  if (this._isFromNestedRow(e))
171
273
  return;
172
274
  this._action?.classList.add('is-pressed');
275
+ window.addEventListener('pointerup', this._clearPressed);
276
+ window.addEventListener('pointercancel', this._clearPressed);
277
+ // Safari does not focus a <button> on click, so a row whose paint follows
278
+ // the focus in it would stay unlit there while the other browsers light
279
+ // up. Focusing on the press makes the three agree; the ring stays hidden
280
+ // because is-pointer-focus already marks a pointer focus.
281
+ this._action?.focus({ preventScroll: true });
173
282
  };
174
283
  this._clearPressed = () => {
284
+ window.removeEventListener('pointerup', this._clearPressed);
285
+ window.removeEventListener('pointercancel', this._clearPressed);
175
286
  this._action?.classList.remove('is-pressed');
176
287
  };
177
288
  }
@@ -191,12 +302,13 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
191
302
  this.addEventListener('click', this._handleClick);
192
303
  // Press feedback: shown on press, cleared on release or when a touch
193
304
  // turns into a scroll (the browser fires pointercancel for that pointer),
194
- // so `active` never sticks while the user scrolls the list.
305
+ // so `active` never sticks while the user scrolls the list. The release
306
+ // is watched on the window rather than here, because a button let go
307
+ // outside the row fires nowhere near it and the feedback would stay on.
195
308
  this.addEventListener('pointerdown', this._onPointerDown);
196
- this.addEventListener('pointerup', this._clearPressed);
197
- this.addEventListener('pointercancel', this._clearPressed);
309
+ this.addEventListener('mousedown', this._onMouseDown);
198
310
  // Light-DOM state the row derives styling from: a checked checkbox-
199
- // segment (row-wide selected fill), which segmented actions own a row edge, and
311
+ // segment (row-wide selected fill), which segments own a row edge, and
200
312
  // the divider markers. Attribute observation, not events: consumers
201
313
  // also set these programmatically via setAttribute.
202
314
  this._lightDomObserver = new MutationObserver(() => this._onLightDomChange());
@@ -204,7 +316,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
204
316
  subtree: true,
205
317
  childList: true,
206
318
  attributes: true,
207
- attributeFilter: ['checked', 'divider-start', 'divider-end'],
319
+ attributeFilter: ['checked', 'current', 'divider-start', 'divider-end'],
208
320
  });
209
321
  this._onLightDomChange();
210
322
  }
@@ -214,8 +326,8 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
214
326
  this.removeEventListener('focusout', this._handleFocusOut);
215
327
  this.removeEventListener('click', this._handleClick);
216
328
  this.removeEventListener('pointerdown', this._onPointerDown);
217
- this.removeEventListener('pointerup', this._clearPressed);
218
- this.removeEventListener('pointercancel', this._clearPressed);
329
+ this.removeEventListener('mousedown', this._onMouseDown);
330
+ this._clearPressed();
219
331
  this._lightDomObserver?.disconnect();
220
332
  this._lightDomObserver = null;
221
333
  this._dividerMarkerObserver?.disconnect();
@@ -223,47 +335,138 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
223
335
  }
224
336
  _onLightDomChange() {
225
337
  this._updateCheckedSegment();
338
+ this._updateCurrentSegment();
226
339
  this._updateInteractive();
227
340
  this._measureDividerMarkers();
341
+ this._rovingControlsCache = null;
342
+ // A framework can fill a row in a later pass than the one that put the row
343
+ // in the list, so both have to run again: the tab stops inside this row,
344
+ // and the list's choice of which rows the arrows stop at — a row that just
345
+ // gained its only control was not a stop when that choice was made.
346
+ if (this._arrowNavigation) {
347
+ this._syncRovingTabStops();
348
+ this._parentList?._updateRoving();
349
+ }
350
+ }
351
+ get _parentList() {
352
+ return this.closest('nldd-list');
353
+ }
354
+ /**
355
+ * The controls in this row that own a tab stop: a design-system control that
356
+ * carries `no-tab`, or anything natively focusable. Segments are left
357
+ * out — they have their own channel (`_tabbable`) — but a control slotted
358
+ * inside one is not, so it is managed here.
359
+ *
360
+ * Custom elements that have not upgraded yet cannot answer whether they carry
361
+ * `no-tab`, so the cache is dropped and the row re-syncs once they do.
362
+ */
363
+ _rovingControls() {
364
+ if (this._rovingControlsCache)
365
+ return this._rovingControlsCache;
366
+ const pending = new Set();
367
+ const controls = this._ownDescendants('*').filter((el) => {
368
+ const tag = el.tagName.toLowerCase();
369
+ if (tag === 'nldd-list-item-segment')
370
+ return false;
371
+ if (tag.includes('-') && !customElements.get(tag)) {
372
+ pending.add(tag);
373
+ return false;
374
+ }
375
+ return 'noTab' in el || el.matches(OWN_TAB_STOP);
376
+ });
377
+ this._rovingControlsCache = controls;
378
+ pending.forEach((tag) => {
379
+ customElements.whenDefined(tag).then(() => {
380
+ this._rovingControlsCache = null;
381
+ if (this._arrowNavigation)
382
+ this._syncRovingTabStops();
383
+ });
384
+ });
385
+ return controls;
386
+ }
387
+ /**
388
+ * Whether the arrow keys stop at this row.
389
+ *
390
+ * Anything you can operate makes a row a stop: its own link, button or
391
+ * checkbox, a segment, or a control sitting in one of its cells. A
392
+ * row of nothing but text is skipped, because focus that leads nowhere is a
393
+ * dead end for a keyboard.
394
+ *
395
+ * @internal Read by the parent nldd-list.
396
+ */
397
+ get _isRovingStop() {
398
+ // Nothing to land on: a disabled control is not focusable, so a stop there
399
+ // would swallow the arrow key and leave focus where it was.
400
+ if (this.disabled)
401
+ return false;
402
+ if (this.href || this.button || this.checkbox)
403
+ return true;
404
+ if (this._ownDescendants('nldd-list-item-segment:not([disabled])').length > 0)
405
+ return true;
406
+ return this._rovingControls().some((control) => !control.hasAttribute('disabled'));
407
+ }
408
+ /**
409
+ * A segment marked `current` makes the whole row the current one.
410
+ *
411
+ * A row cut into segments has no control of its own, so `aria-current="page"`
412
+ * belongs on the segment that holds the link. Written there, the row would
413
+ * stay unpainted and the consumer had to set `current` twice, once for the
414
+ * semantics and once for the color, with nothing to catch the two drifting
415
+ * apart. The row reads it off its own segments instead — reading, not
416
+ * writing: the attributes stay the consumer's.
417
+ */
418
+ _updateCurrentSegment() {
419
+ this.toggleAttribute('data-current', this._ownDescendants('nldd-list-item-segment[current]').length > 0);
228
420
  }
229
421
  /** A checked checkbox-segment reads as "this row is selected", so the fill
230
422
  * covers the whole row — including a disclosure segment — instead of
231
- * stopping at the segmented action boundary. Scoped to own descendants: a checked
423
+ * stopping at the segment boundary. Scoped to own descendants: a checked
232
424
  * row in a nested branch must not light up its ancestors. */
233
425
  _updateCheckedSegment() {
234
426
  this._hasCheckedSegment =
235
- this._ownDescendants('nldd-list-item-action[checkbox][checked]').length > 0;
427
+ this._ownDescendants('nldd-list-item-segment[checkbox][checked]').length > 0;
236
428
  }
237
429
  /** A row with any action — its own href/button/checkbox or a slotted
238
430
  * segment — carries the widened geometry: negative host margin plus the
239
431
  * compensating row padding (see the geometry rules in the class doc).
240
432
  *
241
- * An action segment at a row edge owns the padding for that side itself,
242
- * so the row drops its own there and the segmented action lands on the row's edge.
433
+ * An segment at a row edge owns the padding for that side itself,
434
+ * so the row drops its own there and the segment lands on the row's edge.
243
435
  * Stamped as classes because the CSS cannot ask: `:has()` is not allowed
244
436
  * inside `:host()`, and the row's own padding is what has to change — a
245
- * `::slotted()` rule could only reach the segmented action. */
437
+ * `::slotted()` rule could only reach the segment. */
246
438
  _updateInteractive() {
247
439
  const interactive = !!this.href || this.button || this.checkbox ||
248
- this._ownDescendants('nldd-list-item-action').length > 0;
440
+ this._ownDescendants('nldd-list-item-segment').length > 0;
249
441
  this.classList.toggle('is-interactive', interactive);
250
442
  // The row's own children, not the branch's child rows: those go to the
251
443
  // `children` slot and render BELOW the row, so on a branch row the last
252
444
  // element child is a nested row rather than the row's trailing segment.
253
445
  const ownChildren = Array.from(this.children)
254
446
  .filter(el => el.getAttribute('slot') !== 'children');
255
- const isSegment = (el) => el?.tagName.toLowerCase() === 'nldd-list-item-action';
256
- this.classList.toggle('has-leading-action', isSegment(ownChildren[0]));
257
- this.classList.toggle('has-trailing-action', isSegment(ownChildren[ownChildren.length - 1]));
447
+ const isSegment = (el) => el?.tagName.toLowerCase() === 'nldd-list-item-segment';
448
+ this.classList.toggle('has-leading-segment', isSegment(ownChildren[0]));
449
+ this.classList.toggle('has-trailing-segment', isSegment(ownChildren[ownChildren.length - 1]));
450
+ }
451
+ willUpdate(changed) {
452
+ super.willUpdate(changed);
453
+ // Before the first render, so the row is painted with the list's variant and
454
+ // type right away. Setting them in `firstUpdated` asks for a second render
455
+ // from inside the first.
456
+ if (this.hasUpdated || this.hasAttribute('data-nldd-clone'))
457
+ return;
458
+ this._syncWithList();
258
459
  }
259
460
  firstUpdated() {
260
461
  // Clones are visual-only copies inside nldd-list's shadow root: their
261
462
  // classes and stamped attributes came along with cloneNode, so no sync.
262
463
  if (this.hasAttribute('data-nldd-clone'))
263
464
  return;
264
- this._syncWithList();
265
465
  this._observeChildrenSlot();
266
- this._updateChildren();
466
+ // Read out of the row's own shadow DOM, so not before the first render,
467
+ // and deferred out of the update cycle: setting the state here would
468
+ // schedule a second update from inside the first.
469
+ queueMicrotask(() => this._updateChildren());
267
470
  this._relayExpanded();
268
471
  // First measurement after the first render: the marker offsets need
269
472
  // laid-out boxes.
@@ -271,12 +474,12 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
271
474
  }
272
475
  /**
273
476
  * The row's own descendants for `selector` — everything down to and inside
274
- * its action segmented actions, but NOT inside a nested row. In a tree the child rows
477
+ * its segments, but NOT inside a nested row. In a tree the child rows
275
478
  * are DOM children of this row, so a plain querySelectorAll would push this
276
479
  * row's state into theirs (a parent's `expanded` turning every nested
277
480
  * chevron, its `size` overwriting theirs). A `:scope >` child selector is
278
481
  * too strict the other way: cells legitimately sit one level deeper, inside
279
- * an nldd-list-item-action.
482
+ * an nldd-list-item-segment.
280
483
  */
281
484
  _ownDescendants(selector) {
282
485
  return Array.from(this.querySelectorAll(selector))
@@ -311,7 +514,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
311
514
  });
312
515
  }
313
516
  updated(changed) {
314
- if (changed.has('selected') || changed.has('button') || changed.has('checkbox') || changed.has('href') || changed.has('_parentType')) {
517
+ if (changed.has('selected') || changed.has('current') || changed.has('button') || changed.has('checkbox') || changed.has('href') || changed.has('_parentType')) {
315
518
  this._updateAriaState();
316
519
  }
317
520
  if (changed.has('button') || changed.has('checkbox') || changed.has('href')) {
@@ -324,6 +527,14 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
324
527
  if (changed.has('_arrowNavigation') || changed.has('_rovingActive')) {
325
528
  this._syncRovingTabStops();
326
529
  }
530
+ // A row that switches off mid-flight stops being a stop, but the tab stop it
531
+ // already holds does not move by itself: a disabled anchor keeps its
532
+ // tabindex, so Tab would land on a row that answers to nothing until some
533
+ // unrelated change happened to re-run the roving.
534
+ if (changed.has('disabled')) {
535
+ this._syncRovingTabStops();
536
+ this._parentList?._updateRoving();
537
+ }
327
538
  this._propagateSize();
328
539
  }
329
540
  /**
@@ -342,8 +553,8 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
342
553
  /** Segments marked `disclosure` announce the row's expanded state, so the
343
554
  * consumer writes it once — here, where it also drives the children group. */
344
555
  _relayExpanded() {
345
- this._ownDescendants('nldd-list-item-action[disclosure]')
346
- .forEach(action => { action._rowExpanded = this._resolvedExpanded; });
556
+ this._ownDescendants('nldd-list-item-segment[disclosure]')
557
+ .forEach(segment => { segment._rowExpanded = this._resolvedExpanded; });
347
558
  }
348
559
  /** `expanded` needs a control to sit on; a plain container has none. */
349
560
  _warnOnStrayExpanded() {
@@ -353,17 +564,17 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
353
564
  return;
354
565
  if (this.href || this.button || this.checkbox)
355
566
  return;
356
- if (this._ownDescendants('nldd-list-item-action[disclosure]').length > 0)
567
+ if (this._ownDescendants('nldd-list-item-segment[disclosure]').length > 0)
357
568
  return;
358
- console.warn('nldd-list-item: `expanded` needs somewhere to live — make the row interactive (href, button or checkbox), or mark the segmented action that does the disclosing with `disclosure`.');
569
+ console.warn('nldd-list-item: `expanded` needs somewhere to live — make the row interactive (href, button or checkbox), or mark the segment that does the disclosing with `disclosure`.');
359
570
  }
360
571
  /** True when the item is an option in a `type="listbox"` parent. */
361
572
  get _isListboxOption() {
362
573
  return this._parentType === 'listbox';
363
574
  }
364
575
  /**
365
- * Reads the initial variant + type from the closest parent nldd-list, once in
366
- * firstUpdated, so the item is styled correctly on first paint. Later changes
576
+ * Reads the initial variant + type from the closest parent nldd-list, before
577
+ * the first render, so the item is styled correctly on first paint. Later changes
367
578
  * are PUSHED by the list: its `updated` / `_updateItems` calls `_applyVariant`
368
579
  * and `_applyParentType` on every item, so the list is the single source of
369
580
  * truth and a runtime variant/type switch (or an item moved to another list)
@@ -388,11 +599,11 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
388
599
  _applyParentType(type) {
389
600
  this._parentType = type;
390
601
  this._relayToChildren(item => item._applyParentType(type));
391
- // Segment actions need the list type too: in a listbox they degrade to a
602
+ // Segments need the list type too: in a listbox they degrade to a
392
603
  // plain container, since an `option` may not hold interactive descendants.
393
- // Own segmented actions only — nested rows get the relay above and push their own.
394
- this._ownDescendants('nldd-list-item-action')
395
- .forEach(action => action._applyParentType?.(type));
604
+ // Own segments only — nested rows get the relay above and push their own.
605
+ this._ownDescendants('nldd-list-item-segment')
606
+ .forEach(segment => segment._applyParentType?.(type));
396
607
  }
397
608
  /** Nested rows sit in this item's `children` slot, not the list's, so a plain
398
609
  * `querySelector` from the list walks past them. */
@@ -423,7 +634,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
423
634
  }
424
635
  // aria-current on the inner action (link/button) — navigation only
425
636
  const action = this._action;
426
- if (this._parentType === 'navigation' && this.selected && action) {
637
+ if (this._parentType === 'navigation' && (this.current || this.selected) && action) {
427
638
  action.setAttribute('aria-current', 'page');
428
639
  }
429
640
  else {
@@ -447,7 +658,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
447
658
  * full-width line back.
448
659
  */
449
660
  _implicitDividerStart() {
450
- // The marker is the CELL, never a segmented action around it: the action
661
+ // The marker is the CELL, never a segment around it: the action
451
662
  // carries its own inline padding, so its edge sits before the text. Own
452
663
  // descendants, so a text inside a segment counts as this row's content
453
664
  // while a nested row's text does not.
@@ -555,12 +766,11 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
555
766
  }
556
767
  if (!import.meta.env?.DEV)
557
768
  return;
558
- if (this._showChildren && this._parentType !== 'tree') {
769
+ // Once per row: slotchange runs this again on every change to the branch.
770
+ if (this._showChildren && this._parentType !== 'tree' && !this._warnedChildrenOutsideTree) {
771
+ this._warnedChildrenOutsideTree = true;
559
772
  console.warn('nldd-list-item: `slot="children"` nests rows, which only carries meaning in an nldd-list with type="tree". Elsewhere the group has no owning tree and assistive technology cannot read the hierarchy.');
560
773
  }
561
- if (this._showChildren && this.expanded === undefined) {
562
- console.warn('nldd-list-item: a row with children needs `expanded` — without it there is no aria-expanded, so the branch reads as a leaf and the group can never be announced as collapsed.');
563
- }
564
774
  }
565
775
  /** Whether the event started in a row nested inside this one. Only the part
566
776
  * of the path BELOW this row counts — everything above it is this row's own
@@ -577,7 +787,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
577
787
  * so consumers can call `listItemEl.focus()` without reaching into shadow DOM.
578
788
  */
579
789
  focus(options) {
580
- // A tree row without a control of its own (only segmented actions, or
790
+ // A tree row without a control of its own (only segments, or
581
791
  // none at all) takes focus on the host: that is where role="treeitem"
582
792
  // sits, so assistive technology announces the row rather than a button
583
793
  // inside it. _syncRovingTabStops gives the host the tabindex for it.
@@ -590,8 +800,9 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
590
800
  /**
591
801
  * The roving tab stop, spread over the row and the controls inside it: the
592
802
  * current row is reachable with Tab, everything else only with the arrow
593
- * keys. Within the current row Tab then walks its segmented actions, so a row
594
- * that holds a checkbox and a chevron stays fully operable.
803
+ * keys. Within the current row Tab then walks its segments and any
804
+ * control in its cells, so a row that holds a checkbox and a chevron, or a
805
+ * menu button at its end, stays fully operable.
595
806
  *
596
807
  * A row that is not the current one carries NO tabindex at all rather than
597
808
  * -1. A shadow host with a tabindex is a focus scope of its own, and Chromium
@@ -603,11 +814,11 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
603
814
  * tab stop is in the DOM before focus is handed over.
604
815
  */
605
816
  _syncRovingTabStops() {
606
- const ownActions = Array.from(this.children).filter((el) => el.getAttribute('slot') !== 'children'
607
- && el.tagName.toLowerCase() === 'nldd-list-item-action');
817
+ const ownSegments = this._ownSegments();
608
818
  if (!this._arrowNavigation) {
609
819
  this.removeAttribute('tabindex');
610
- ownActions.forEach((action) => { action._tabbable = undefined; });
820
+ ownSegments.forEach((segment) => { segment._tabbable = undefined; });
821
+ this._rovingControls().forEach(releaseTabbable);
611
822
  return;
612
823
  }
613
824
  // Only a row without its own control needs the host as focus target; with
@@ -618,14 +829,68 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
618
829
  else {
619
830
  this.setAttribute('tabindex', '0');
620
831
  }
621
- ownActions.forEach((action) => { action._tabbable = this._rovingActive; });
832
+ ownSegments.forEach((segment) => { segment._tabbable = this._rovingActive; });
833
+ this._rovingControls().forEach((control) => { setTabbable(control, this._rovingActive); });
834
+ }
835
+ /**
836
+ * The control of this row an event started in, if it started in one at all.
837
+ *
838
+ * Tells apart what the row IS from what it HOLDS, and it asks that of the
839
+ * light DOM rather than of `_rovingControls`. That set holds what the roving
840
+ * can park, which needs `no-tab` or a native tab stop — and a combo box has
841
+ * neither, so the one control most in need of protection is exactly the one
842
+ * missing from it.
843
+ *
844
+ * So: everything in the path that is a light-DOM descendant of this row,
845
+ * stopping at the row. Nothing means the event came from the row's own
846
+ * action, which lives in its shadow root where `contains` does not reach.
847
+ * A segment on its own is what the row IS; a control slotted into one is not,
848
+ * and shows up in front of it.
849
+ *
850
+ * @internal Read by the parent nldd-list.
851
+ */
852
+ _slottedControlFor(path) {
853
+ const held = [];
854
+ for (const node of path) {
855
+ if (node === this)
856
+ break;
857
+ if (node instanceof Element && this.contains(node))
858
+ held.push(node);
859
+ }
860
+ if (held.length === 0)
861
+ return null;
862
+ if (held.length === 1 && held[0].tagName.toLowerCase() === 'nldd-list-item-segment')
863
+ return null;
864
+ return held[0];
865
+ }
866
+ /**
867
+ * Everything but the row itself out of the tab order.
868
+ *
869
+ * A list is one stop from the outside: Tab into it lands on the row, and the
870
+ * controls inside open up from there. Without this the stops the row handed
871
+ * out stay handed out after you tab away, so tabbing back in drops you into
872
+ * the control you left rather than on the row, and the arrow keys are two
873
+ * moves away instead of none.
874
+ *
875
+ * @internal Called by the parent nldd-list when focus leaves it.
876
+ */
877
+ _parkControls() {
878
+ if (!this._arrowNavigation || !this._rovingActive)
879
+ return;
880
+ this._ownSegments().forEach((segment) => { segment._tabbable = false; });
881
+ this._rovingControls().forEach((control) => { setTabbable(control, false); });
882
+ }
883
+ /** The segments of this row, leaving out those of a nested tree row. */
884
+ _ownSegments() {
885
+ return Array.from(this.children).filter((el) => el.getAttribute('slot') !== 'children'
886
+ && el.tagName.toLowerCase() === 'nldd-list-item-segment');
622
887
  }
623
- /** The control that opens and closes this row: the segmented action marked
888
+ /** The control that opens and closes this row: the segment marked
624
889
  * `disclosure`, or the row itself when it is a button. Never a link — Left
625
890
  * and Right may not navigate away. */
626
891
  get _disclosureControl() {
627
892
  const action = Array.from(this.children).find((el) => el.getAttribute('slot') !== 'children'
628
- && el.tagName.toLowerCase() === 'nldd-list-item-action'
893
+ && el.tagName.toLowerCase() === 'nldd-list-item-segment'
629
894
  && el.hasAttribute('disclosure'));
630
895
  if (action)
631
896
  return action;
@@ -640,7 +905,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
640
905
  const control = this._disclosureControl;
641
906
  if (!control)
642
907
  return false;
643
- // The click lands on a segmented action, and that action pulls focus into
908
+ // The click lands on a segment, and that segment pulls focus into
644
909
  // its own control — with the pointer-focus flag set, since a click is what
645
910
  // it sees. Focus belongs to the row: that is the roving tab stop, and the
646
911
  // keyboard user has to keep seeing where they are.
@@ -650,6 +915,28 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
650
915
  this.focus();
651
916
  return true;
652
917
  }
918
+ /**
919
+ * Activates what this row is FOR, as opposed to what folds it: the first
920
+ * segment that is not the disclosure. A row that is its own control
921
+ * needs none of this, because the key reaches that control by itself.
922
+ * Returns false when there is nothing but a chevron.
923
+ */
924
+ _activatePrimary() {
925
+ const segments = [...this.querySelectorAll(':scope > nldd-list-item-segment')];
926
+ const primary = segments.find((segment) => !segment.hasAttribute('disclosure'));
927
+ if (!primary)
928
+ return false;
929
+ const control = primary.shadowRoot?.querySelector('a, button');
930
+ if (!control)
931
+ return false;
932
+ // Same trade as _activateDisclosure: the click pulls focus into the
933
+ // segment, and the row has to keep it, because the row is the tab stop.
934
+ const hadFocus = this.matches(':focus-within');
935
+ control.click();
936
+ if (hadFocus)
937
+ this.focus();
938
+ return true;
939
+ }
653
940
  /** The branch this row hangs under, or undefined for a top-level row. */
654
941
  get parentRow() {
655
942
  const parent = this.parentElement;
@@ -665,7 +952,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
665
952
  // search input is in the tab order, and active moves via
666
953
  // aria-activedescendant. Roving tabindex (arrow-navigation) supersedes
667
954
  // nothing here: the two modes are mutually exclusive on the parent list.
668
- // Otherwise, roving tabindex: when the list runs arrow-navigation,
955
+ // Otherwise, roving tabindex: while the list runs the roving,
669
956
  // exactly one item is the tab stop (0) and the rest are reachable only
670
957
  // via the arrow keys (-1). Off → undefined leaves the native
671
958
  // button/link as a normal tab stop.
@@ -674,7 +961,7 @@ let NLDDListItem = NLDDListItem_1 = class NLDDListItem extends withTranslations(
674
961
  : this._arrowNavigation
675
962
  ? (this._rovingActive ? '0' : '-1')
676
963
  : undefined;
677
- return template(this.button, this.href, this.target, this.rel, opensInNewTabLabel, actionTabindex, this._highlighted, this.checkbox, this.checked, this._resolvedExpanded, this._showChildren, this._hasCheckedSegment);
964
+ return template(this.button, this.href, this.target, this.rel, opensInNewTabLabel, actionTabindex, this._highlighted, this.checkbox, this.checked, this._resolvedExpanded, this._showChildren, this._hasCheckedSegment, this.disabled);
678
965
  }
679
966
  };
680
967
  NLDDListItem.styles = [listItemStyles];
@@ -690,6 +977,9 @@ __decorate([
690
977
  __decorate([
691
978
  property({ type: Boolean, reflect: true })
692
979
  ], NLDDListItem.prototype, "selected", void 0);
980
+ __decorate([
981
+ property({ type: Boolean, reflect: true })
982
+ ], NLDDListItem.prototype, "current", void 0);
693
983
  __decorate([
694
984
  property({ type: Boolean, reflect: true })
695
985
  ], NLDDListItem.prototype, "button", void 0);
@@ -699,6 +989,9 @@ __decorate([
699
989
  __decorate([
700
990
  property({ type: Boolean, reflect: true })
701
991
  ], NLDDListItem.prototype, "checked", void 0);
992
+ __decorate([
993
+ property({ type: Boolean, reflect: true })
994
+ ], NLDDListItem.prototype, "disabled", void 0);
702
995
  __decorate([
703
996
  property({ type: Boolean, reflect: true })
704
997
  ], NLDDListItem.prototype, "expanded", void 0);