@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.
- package/custom-elements.json +3849 -542
- package/dist/components/actions/button/button.d.ts +9 -2
- package/dist/components/actions/button/button.d.ts.map +1 -1
- package/dist/components/actions/button/button.js +15 -2
- package/dist/components/actions/button/button.js.map +1 -1
- package/dist/components/actions/button/button.template.d.ts.map +1 -1
- package/dist/components/actions/button/button.template.js +2 -0
- package/dist/components/actions/button/button.template.js.map +1 -1
- package/dist/components/actions/icon-button/icon-button.d.ts +2 -2
- package/dist/components/actions/icon-button/icon-button.js +2 -2
- package/dist/components/actions/menu/menu.d.ts +3 -1
- package/dist/components/actions/menu/menu.d.ts.map +1 -1
- package/dist/components/actions/menu/menu.js +22 -11
- package/dist/components/actions/menu/menu.js.map +1 -1
- package/dist/components/actions/toolbar/toolbar.styles.js +2 -2
- package/dist/components/components.js +2911 -1157
- package/dist/components/content/avatar/avatar.d.ts +6 -0
- package/dist/components/content/avatar/avatar.d.ts.map +1 -1
- package/dist/components/content/avatar/avatar.js +9 -0
- package/dist/components/content/avatar/avatar.js.map +1 -1
- package/dist/components/content/avatar/avatar.styles.d.ts.map +1 -1
- package/dist/components/content/avatar/avatar.styles.js +5 -1
- package/dist/components/content/avatar/avatar.styles.js.map +1 -1
- package/dist/components/content/avatar/avatar.template.d.ts.map +1 -1
- package/dist/components/content/avatar/avatar.template.js +2 -0
- package/dist/components/content/avatar/avatar.template.js.map +1 -1
- package/dist/components/content/avatar-group/avatar-group.styles.d.ts.map +1 -1
- package/dist/components/content/avatar-group/avatar-group.styles.js +6 -16
- package/dist/components/content/avatar-group/avatar-group.styles.js.map +1 -1
- package/dist/components/content/blockquote/blockquote.d.ts +3 -4
- package/dist/components/content/blockquote/blockquote.d.ts.map +1 -1
- package/dist/components/content/blockquote/blockquote.js +3 -4
- package/dist/components/content/blockquote/blockquote.js.map +1 -1
- package/dist/components/content/icon/icon-aliases.d.ts.map +1 -1
- package/dist/components/content/icon/icon-aliases.js +80 -6
- package/dist/components/content/icon/icon-aliases.js.map +1 -1
- package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
- package/dist/components/content/icon/icon-gallery-status.js +57 -94
- package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
- package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
- package/dist/components/content/icon/icon-registry.js +36 -4
- package/dist/components/content/icon/icon-registry.js.map +1 -1
- package/dist/components/content/icon/icon.d.ts +8 -2
- package/dist/components/content/icon/icon.d.ts.map +1 -1
- package/dist/components/content/icon/icon.js +17 -2
- package/dist/components/content/icon/icon.js.map +1 -1
- package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
- package/dist/components/content/icon/icon.styles.js +8 -0
- package/dist/components/content/icon/icon.styles.js.map +1 -1
- package/dist/components/content/image/image.d.ts +1 -1
- package/dist/components/content/image/image.js +1 -1
- package/dist/components/content/image/image.styles.d.ts.map +1 -1
- package/dist/components/content/image/image.styles.js +11 -0
- package/dist/components/content/image/image.styles.js.map +1 -1
- package/dist/components/content/keyboard-shortcut/keyboard-shortcut.d.ts +30 -30
- package/dist/components/content/keyboard-shortcut/keyboard-shortcut.js +30 -30
- package/dist/components/content/rich-text/rich-text.d.ts +20 -20
- package/dist/components/content/rich-text/rich-text.js +20 -20
- package/dist/components/content/text/text.d.ts +50 -0
- package/dist/components/content/text/text.d.ts.map +1 -0
- package/dist/components/content/text/text.js +81 -0
- package/dist/components/content/text/text.js.map +1 -0
- package/dist/components/content/text/text.styles.d.ts +2 -0
- package/dist/components/content/text/text.styles.d.ts.map +1 -0
- package/dist/components/content/text/text.styles.js +116 -0
- package/dist/components/content/text/text.styles.js.map +1 -0
- package/dist/components/content/text/text.template.d.ts +3 -0
- package/dist/components/content/text/text.template.d.ts.map +1 -0
- package/dist/components/content/text/text.template.js +7 -0
- package/dist/components/content/text/text.template.js.map +1 -0
- package/dist/components/content/title/title.d.ts +4 -4
- package/dist/components/content/title/title.js +4 -4
- package/dist/components/content/title/title.styles.d.ts.map +1 -1
- package/dist/components/content/title/title.styles.js +9 -13
- package/dist/components/content/title/title.styles.js.map +1 -1
- package/dist/components/content/tooltip/tooltip.d.ts +1 -1
- package/dist/components/content/tooltip/tooltip.js +1 -1
- package/dist/components/{decorate-BKn10QQi.js → decorate-lwt_OrAG.js} +1 -1
- package/dist/components/{dist-TpIL8G4G.js → dist-762GHPyH.js} +3 -3
- package/dist/components/{dist-OBifyiJS.js → dist-BB7TxeMK.js} +2 -2
- package/dist/components/{dist-CJR_Rwhh.js → dist-BJI4-6iQ.js} +1 -1
- package/dist/components/{dist-C400RcFU.js → dist-B_3OW7pC.js} +1 -1
- package/dist/components/{dist-afrAoubg.js → dist-C09E9-dJ.js} +34 -34
- package/dist/components/{dist-Ccw7ZfsU.js → dist-C6gnorjP.js} +4 -3
- package/dist/components/{dist-bO14jlsr.js → dist-CRsR6ckU.js} +1 -1
- package/dist/components/{dist-C0PiB1dr.js → dist-CjaG8dOI.js} +2 -2
- package/dist/components/{dist-CCg5Mso_.js → dist-DZoFKUO-.js} +1 -1
- package/dist/components/{dist-Bq4xc7Bm.js → dist-DaavuU6W.js} +14 -3
- package/dist/components/{dist-BYVOPNHp.js → dist-la_b3ZSq.js} +1 -1
- package/dist/components/forms/form/form.d.ts +76 -22
- package/dist/components/forms/form/form.d.ts.map +1 -1
- package/dist/components/forms/form/form.js +127 -22
- package/dist/components/forms/form/form.js.map +1 -1
- package/dist/components/forms/form-actions/form-actions.d.ts +14 -15
- package/dist/components/forms/form-actions/form-actions.d.ts.map +1 -1
- package/dist/components/forms/form-actions/form-actions.js +14 -15
- package/dist/components/forms/form-actions/form-actions.js.map +1 -1
- package/dist/components/forms/form-field/form-field.d.ts +42 -39
- package/dist/components/forms/form-field/form-field.d.ts.map +1 -1
- package/dist/components/forms/form-field/form-field.js +79 -111
- package/dist/components/forms/form-field/form-field.js.map +1 -1
- package/dist/components/forms/form-field/form-field.styles.d.ts +0 -1
- package/dist/components/forms/form-field/form-field.styles.d.ts.map +1 -1
- package/dist/components/forms/form-field/form-field.styles.js +7 -73
- package/dist/components/forms/form-field/form-field.styles.js.map +1 -1
- package/dist/components/forms/form-field/form-field.template.d.ts +0 -2
- package/dist/components/forms/form-field/form-field.template.d.ts.map +1 -1
- package/dist/components/forms/form-field/form-field.template.js +0 -15
- package/dist/components/forms/form-field/form-field.template.js.map +1 -1
- package/dist/components/forms/form-section/form-section.d.ts +26 -28
- package/dist/components/forms/form-section/form-section.d.ts.map +1 -1
- package/dist/components/forms/form-section/form-section.js +27 -29
- package/dist/components/forms/form-section/form-section.js.map +1 -1
- package/dist/components/forms/validation-list/validation-list.d.ts +193 -0
- package/dist/components/forms/validation-list/validation-list.d.ts.map +1 -0
- package/dist/components/forms/validation-list/validation-list.js +358 -0
- package/dist/components/forms/validation-list/validation-list.js.map +1 -0
- package/dist/components/forms/validation-list/validation-list.styles.d.ts +3 -0
- package/dist/components/forms/validation-list/validation-list.styles.d.ts.map +1 -0
- package/dist/components/forms/validation-list/validation-list.styles.js +58 -0
- package/dist/components/forms/validation-list/validation-list.styles.js.map +1 -0
- package/dist/components/forms/validation-list/validation-list.template.d.ts +5 -0
- package/dist/components/forms/validation-list/validation-list.template.d.ts.map +1 -0
- package/dist/components/forms/validation-list/validation-list.template.js +16 -0
- package/dist/components/forms/validation-list/validation-list.template.js.map +1 -0
- package/dist/components/{icon-CIpJq_cf.js → icon-VTLbdcvZ.js} +104 -11
- package/dist/components/{icon-button-BAkUJTn6.js → icon-button-Sne5TwRG.js} +6 -6
- package/dist/components/index.d.ts +3 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/inputs/checkbox/checkbox.d.ts +20 -1
- package/dist/components/inputs/checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/inputs/checkbox/checkbox.js +32 -2
- package/dist/components/inputs/checkbox/checkbox.js.map +1 -1
- package/dist/components/inputs/checkbox/checkbox.template.d.ts.map +1 -1
- package/dist/components/inputs/checkbox/checkbox.template.js +2 -0
- package/dist/components/inputs/checkbox/checkbox.template.js.map +1 -1
- package/dist/components/inputs/checkbox-field/checkbox-field.d.ts +16 -1
- package/dist/components/inputs/checkbox-field/checkbox-field.d.ts.map +1 -1
- package/dist/components/inputs/checkbox-field/checkbox-field.js +27 -2
- package/dist/components/inputs/checkbox-field/checkbox-field.js.map +1 -1
- package/dist/components/inputs/checkbox-field/checkbox-field.template.d.ts.map +1 -1
- package/dist/components/inputs/checkbox-field/checkbox-field.template.js +2 -0
- package/dist/components/inputs/checkbox-field/checkbox-field.template.js.map +1 -1
- package/dist/components/inputs/code-editor/code-editor.d.ts +14 -1
- package/dist/components/inputs/code-editor/code-editor.d.ts.map +1 -1
- package/dist/components/inputs/code-editor/code-editor.js +21 -2
- package/dist/components/inputs/code-editor/code-editor.js.map +1 -1
- package/dist/components/inputs/combo-box/combo-box.d.ts +15 -2
- package/dist/components/inputs/combo-box/combo-box.d.ts.map +1 -1
- package/dist/components/inputs/combo-box/combo-box.js +54 -5
- package/dist/components/inputs/combo-box/combo-box.js.map +1 -1
- package/dist/components/inputs/combo-box/combo-box.styles.d.ts.map +1 -1
- package/dist/components/inputs/combo-box/combo-box.styles.js +14 -0
- package/dist/components/inputs/combo-box/combo-box.styles.js.map +1 -1
- package/dist/components/inputs/combo-box/combo-box.template.d.ts.map +1 -1
- package/dist/components/inputs/combo-box/combo-box.template.js +27 -20
- package/dist/components/inputs/combo-box/combo-box.template.js.map +1 -1
- package/dist/components/inputs/date-field/date-field.d.ts +29 -31
- package/dist/components/inputs/date-field/date-field.d.ts.map +1 -1
- package/dist/components/inputs/date-field/date-field.js +40 -37
- package/dist/components/inputs/date-field/date-field.js.map +1 -1
- package/dist/components/inputs/date-field/date-field.styles.d.ts.map +1 -1
- package/dist/components/inputs/date-field/date-field.styles.js +11 -0
- package/dist/components/inputs/date-field/date-field.styles.js.map +1 -1
- package/dist/components/inputs/date-field/date-field.template.d.ts.map +1 -1
- package/dist/components/inputs/date-field/date-field.template.js +7 -2
- package/dist/components/inputs/date-field/date-field.template.js.map +1 -1
- package/dist/components/inputs/date-picker/date-picker.d.ts +34 -21
- package/dist/components/inputs/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/inputs/date-picker/date-picker.js +42 -22
- package/dist/components/inputs/date-picker/date-picker.js.map +1 -1
- package/dist/components/inputs/dropdown/dropdown.d.ts +23 -2
- package/dist/components/inputs/dropdown/dropdown.d.ts.map +1 -1
- package/dist/components/inputs/dropdown/dropdown.js +36 -3
- package/dist/components/inputs/dropdown/dropdown.js.map +1 -1
- package/dist/components/inputs/file-field/file-field.d.ts +4 -3
- package/dist/components/inputs/file-field/file-field.d.ts.map +1 -1
- package/dist/components/inputs/file-field/file-field.js +8 -7
- package/dist/components/inputs/file-field/file-field.js.map +1 -1
- package/dist/components/inputs/file-field/file-field.template.d.ts.map +1 -1
- package/dist/components/inputs/file-field/file-field.template.js +0 -1
- package/dist/components/inputs/file-field/file-field.template.js.map +1 -1
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.d.ts +15 -4
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.d.ts.map +1 -1
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.js +20 -8
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.js.map +1 -1
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.d.ts.map +1 -1
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.js +4 -1
- package/dist/components/inputs/multi-line-text-field/multi-line-text-field.template.js.map +1 -1
- package/dist/components/inputs/number-field/number-field.d.ts +12 -1
- package/dist/components/inputs/number-field/number-field.d.ts.map +1 -1
- package/dist/components/inputs/number-field/number-field.js +18 -3
- package/dist/components/inputs/number-field/number-field.js.map +1 -1
- package/dist/components/inputs/number-field/number-field.styles.d.ts.map +1 -1
- package/dist/components/inputs/number-field/number-field.styles.js +8 -16
- package/dist/components/inputs/number-field/number-field.styles.js.map +1 -1
- package/dist/components/inputs/password-field/password-field.d.ts +10 -3
- package/dist/components/inputs/password-field/password-field.d.ts.map +1 -1
- package/dist/components/inputs/password-field/password-field.js +18 -8
- package/dist/components/inputs/password-field/password-field.js.map +1 -1
- package/dist/components/inputs/password-field/password-field.template.d.ts.map +1 -1
- package/dist/components/inputs/password-field/password-field.template.js +3 -1
- package/dist/components/inputs/password-field/password-field.template.js.map +1 -1
- package/dist/components/inputs/radio-button/radio-button.d.ts +18 -1
- package/dist/components/inputs/radio-button/radio-button.d.ts.map +1 -1
- package/dist/components/inputs/radio-button/radio-button.js +27 -2
- package/dist/components/inputs/radio-button/radio-button.js.map +1 -1
- package/dist/components/inputs/radio-button/radio-button.template.d.ts.map +1 -1
- package/dist/components/inputs/radio-button/radio-button.template.js +1 -0
- package/dist/components/inputs/radio-button/radio-button.template.js.map +1 -1
- package/dist/components/inputs/radio-button-field/radio-button-field.d.ts +14 -1
- package/dist/components/inputs/radio-button-field/radio-button-field.d.ts.map +1 -1
- package/dist/components/inputs/radio-button-field/radio-button-field.js +22 -2
- package/dist/components/inputs/radio-button-field/radio-button-field.js.map +1 -1
- package/dist/components/inputs/radio-button-field/radio-button-field.template.d.ts.map +1 -1
- package/dist/components/inputs/radio-button-field/radio-button-field.template.js +1 -0
- package/dist/components/inputs/radio-button-field/radio-button-field.template.js.map +1 -1
- package/dist/components/inputs/radio-button-group/radio-button-group.d.ts +11 -0
- package/dist/components/inputs/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/dist/components/inputs/radio-button-group/radio-button-group.js +21 -0
- package/dist/components/inputs/radio-button-group/radio-button-group.js.map +1 -1
- package/dist/components/inputs/search-field/search-field.d.ts +23 -1
- package/dist/components/inputs/search-field/search-field.d.ts.map +1 -1
- package/dist/components/inputs/search-field/search-field.js +37 -3
- package/dist/components/inputs/search-field/search-field.js.map +1 -1
- package/dist/components/inputs/search-field/search-field.template.d.ts.map +1 -1
- package/dist/components/inputs/search-field/search-field.template.js +4 -0
- package/dist/components/inputs/search-field/search-field.template.js.map +1 -1
- package/dist/components/inputs/segmented-control/segmented-control.d.ts +28 -0
- package/dist/components/inputs/segmented-control/segmented-control.d.ts.map +1 -1
- package/dist/components/inputs/segmented-control/segmented-control.js +52 -2
- package/dist/components/inputs/segmented-control/segmented-control.js.map +1 -1
- package/dist/components/inputs/segmented-control/segmented-control.template.d.ts.map +1 -1
- package/dist/components/inputs/segmented-control/segmented-control.template.js +1 -0
- package/dist/components/inputs/segmented-control/segmented-control.template.js.map +1 -1
- package/dist/components/inputs/stepper/stepper.d.ts +14 -1
- package/dist/components/inputs/stepper/stepper.d.ts.map +1 -1
- package/dist/components/inputs/stepper/stepper.js +21 -2
- package/dist/components/inputs/stepper/stepper.js.map +1 -1
- package/dist/components/inputs/switch/switch.d.ts +20 -1
- package/dist/components/inputs/switch/switch.d.ts.map +1 -1
- package/dist/components/inputs/switch/switch.js +31 -2
- package/dist/components/inputs/switch/switch.js.map +1 -1
- package/dist/components/inputs/switch/switch.template.d.ts.map +1 -1
- package/dist/components/inputs/switch/switch.template.js +2 -0
- package/dist/components/inputs/switch/switch.template.js.map +1 -1
- package/dist/components/inputs/switch-field/switch-field.d.ts +18 -1
- package/dist/components/inputs/switch-field/switch-field.d.ts.map +1 -1
- package/dist/components/inputs/switch-field/switch-field.js +25 -1
- package/dist/components/inputs/switch-field/switch-field.js.map +1 -1
- package/dist/components/inputs/switch-field/switch-field.template.d.ts.map +1 -1
- package/dist/components/inputs/switch-field/switch-field.template.js +2 -0
- package/dist/components/inputs/switch-field/switch-field.template.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.d.ts +14 -1
- package/dist/components/inputs/text-editor/text-editor.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.js +21 -2
- package/dist/components/inputs/text-editor/text-editor.js.map +1 -1
- package/dist/components/inputs/text-field/text-field.d.ts +31 -3
- package/dist/components/inputs/text-field/text-field.d.ts.map +1 -1
- package/dist/components/inputs/text-field/text-field.js +65 -7
- package/dist/components/inputs/text-field/text-field.js.map +1 -1
- package/dist/components/inputs/text-field/text-field.template.d.ts.map +1 -1
- package/dist/components/inputs/text-field/text-field.template.js +5 -1
- package/dist/components/inputs/text-field/text-field.template.js.map +1 -1
- package/dist/components/inputs/time-field/time-field.d.ts +33 -35
- package/dist/components/inputs/time-field/time-field.d.ts.map +1 -1
- package/dist/components/inputs/time-field/time-field.js +43 -40
- package/dist/components/inputs/time-field/time-field.js.map +1 -1
- package/dist/components/inputs/time-field/time-field.styles.d.ts.map +1 -1
- package/dist/components/inputs/time-field/time-field.styles.js +12 -0
- package/dist/components/inputs/time-field/time-field.styles.js.map +1 -1
- package/dist/components/inputs/time-field/time-field.template.d.ts.map +1 -1
- package/dist/components/inputs/time-field/time-field.template.js +7 -2
- package/dist/components/inputs/time-field/time-field.template.js.map +1 -1
- package/dist/components/inputs/time-picker/time-picker.d.ts +34 -19
- package/dist/components/inputs/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/inputs/time-picker/time-picker.js +42 -22
- package/dist/components/inputs/time-picker/time-picker.js.map +1 -1
- package/dist/components/inputs/toggle-button/toggle-button.d.ts +22 -1
- package/dist/components/inputs/toggle-button/toggle-button.d.ts.map +1 -1
- package/dist/components/inputs/toggle-button/toggle-button.js +35 -2
- package/dist/components/inputs/toggle-button/toggle-button.js.map +1 -1
- package/dist/components/inputs/toggle-button/toggle-button.template.d.ts.map +1 -1
- package/dist/components/inputs/toggle-button/toggle-button.template.js +3 -0
- package/dist/components/inputs/toggle-button/toggle-button.template.js.map +1 -1
- package/dist/components/inputs/toggle-button-group/toggle-button-group.d.ts +27 -0
- package/dist/components/inputs/toggle-button-group/toggle-button-group.d.ts.map +1 -1
- package/dist/components/inputs/toggle-button-group/toggle-button-group.js +46 -0
- package/dist/components/inputs/toggle-button-group/toggle-button-group.js.map +1 -1
- package/dist/components/inputs/token-field/token-field.d.ts +7 -1
- package/dist/components/inputs/token-field/token-field.d.ts.map +1 -1
- package/dist/components/inputs/token-field/token-field.js +14 -1
- package/dist/components/inputs/token-field/token-field.js.map +1 -1
- package/dist/components/layout/app-view/app-view.d.ts.map +1 -1
- package/dist/components/layout/app-view/app-view.js +12 -0
- package/dist/components/layout/app-view/app-view.js.map +1 -1
- package/dist/components/layout/box/box.d.ts +4 -4
- package/dist/components/layout/box/box.d.ts.map +1 -1
- package/dist/components/layout/box/box.js +4 -4
- package/dist/components/layout/box/box.js.map +1 -1
- package/dist/components/layout/box/box.styles.d.ts.map +1 -1
- package/dist/components/layout/box/box.styles.js +4 -6
- package/dist/components/layout/box/box.styles.js.map +1 -1
- package/dist/components/layout/card/card.d.ts +18 -19
- package/dist/components/layout/card/card.d.ts.map +1 -1
- package/dist/components/layout/card/card.js +18 -19
- package/dist/components/layout/card/card.js.map +1 -1
- package/dist/components/layout/card/card.styles.d.ts.map +1 -1
- package/dist/components/layout/card/card.styles.js +1 -0
- package/dist/components/layout/card/card.styles.js.map +1 -1
- package/dist/components/layout/collection/collection.d.ts.map +1 -1
- package/dist/components/layout/collection/collection.js +6 -2
- package/dist/components/layout/collection/collection.js.map +1 -1
- package/dist/components/layout/divider/divider.d.ts +1 -1
- package/dist/components/layout/divider/divider.js +1 -1
- package/dist/components/layout/popover/popover.d.ts +1 -1
- package/dist/components/layout/popover/popover.d.ts.map +1 -1
- package/dist/components/layout/popover/popover.js +15 -2
- package/dist/components/layout/popover/popover.js.map +1 -1
- package/dist/components/layout/sheet/sheet.d.ts +1 -1
- package/dist/components/layout/sheet/sheet.js +2 -2
- package/dist/components/layout/sheet/sheet.js.map +1 -1
- package/dist/components/layout/sheet/sheet.styles.d.ts.map +1 -1
- package/dist/components/layout/sheet/sheet.styles.js +15 -3
- package/dist/components/layout/sheet/sheet.styles.js.map +1 -1
- package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.d.ts +8 -0
- package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.d.ts.map +1 -1
- package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.js +29 -11
- package/dist/components/layout/split-views/navigation-split-view/navigation-split-view.js.map +1 -1
- package/dist/components/layout/window/window.d.ts +20 -21
- package/dist/components/layout/window/window.d.ts.map +1 -1
- package/dist/components/layout/window/window.js +21 -22
- package/dist/components/layout/window/window.js.map +1 -1
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.d.ts +41 -12
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.d.ts.map +1 -1
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.js +47 -17
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.js.map +1 -1
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.styles.d.ts.map +1 -1
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.styles.js +42 -13
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.styles.js.map +1 -1
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.template.d.ts.map +1 -1
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.template.js +12 -4
- package/dist/components/lists-and-tables/cells/timeline-track-cell/timeline-track-cell.template.js.map +1 -1
- package/dist/components/lists-and-tables/list/list.d.ts +168 -61
- package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list/list.i18n.d.ts +0 -1
- package/dist/components/lists-and-tables/list/list.i18n.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list/list.i18n.js +0 -1
- package/dist/components/lists-and-tables/list/list.i18n.js.map +1 -1
- package/dist/components/lists-and-tables/list/list.js +361 -122
- package/dist/components/lists-and-tables/list/list.js.map +1 -1
- package/dist/components/lists-and-tables/list/list.styles.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list/list.styles.js +5 -0
- package/dist/components/lists-and-tables/list/list.styles.js.map +1 -1
- package/dist/components/lists-and-tables/list/list.template.d.ts +1 -3
- package/dist/components/lists-and-tables/list/list.template.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list/list.template.js +2 -7
- package/dist/components/lists-and-tables/list/list.template.js.map +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.d.ts +134 -23
- package/dist/components/lists-and-tables/list-item/list-item.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.js +354 -61
- package/dist/components/lists-and-tables/list-item/list-item.js.map +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.styles.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.styles.js +116 -34
- package/dist/components/lists-and-tables/list-item/list-item.styles.js.map +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.template.d.ts +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.template.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list-item/list-item.template.js +5 -2
- package/dist/components/lists-and-tables/list-item/list-item.template.js.map +1 -1
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.d.ts +116 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.d.ts.map +1 -0
- package/dist/components/lists-and-tables/{list-item-action/list-item-action.js → list-item-segment/list-item-segment.js} +85 -56
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.js.map +1 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.d.ts +2 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.d.ts.map +1 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.js +179 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.styles.js.map +1 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.d.ts +3 -0
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.d.ts.map +1 -0
- package/dist/components/lists-and-tables/{list-item-action/list-item-action.template.js → list-item-segment/list-item-segment.template.js} +5 -4
- package/dist/components/lists-and-tables/list-item-segment/list-item-segment.template.js.map +1 -0
- package/dist/components/lists-and-tables/table/table.d.ts +12 -9
- package/dist/components/lists-and-tables/table/table.d.ts.map +1 -1
- package/dist/components/lists-and-tables/table/table.i18n.d.ts +0 -1
- package/dist/components/lists-and-tables/table/table.i18n.d.ts.map +1 -1
- package/dist/components/lists-and-tables/table/table.i18n.js +0 -1
- package/dist/components/lists-and-tables/table/table.i18n.js.map +1 -1
- package/dist/components/lists-and-tables/table/table.js +26 -16
- package/dist/components/lists-and-tables/table/table.js.map +1 -1
- package/dist/components/lists-and-tables/table/table.styles.d.ts.map +1 -1
- package/dist/components/lists-and-tables/table/table.styles.js +5 -0
- package/dist/components/lists-and-tables/table/table.styles.js.map +1 -1
- package/dist/components/lists-and-tables/table/table.template.d.ts +1 -1
- package/dist/components/lists-and-tables/table/table.template.d.ts.map +1 -1
- package/dist/components/lists-and-tables/table/table.template.js +5 -9
- package/dist/components/lists-and-tables/table/table.template.js.map +1 -1
- package/dist/components/navigation/link/link.d.ts +30 -24
- package/dist/components/navigation/link/link.d.ts.map +1 -1
- package/dist/components/navigation/link/link.js +33 -24
- package/dist/components/navigation/link/link.js.map +1 -1
- package/dist/components/navigation/link/link.template.js +1 -1
- package/dist/components/navigation/link/link.template.js.map +1 -1
- package/dist/components/navigation/menu-bar/menu-bar.d.ts +7 -7
- package/dist/components/navigation/menu-bar/menu-bar.js +7 -7
- package/dist/components/navigation/menu-bar-item/menu-bar-item.d.ts +23 -23
- package/dist/components/navigation/menu-bar-item/menu-bar-item.js +23 -23
- package/dist/components/navigation/pagination/pagination.d.ts +4 -4
- package/dist/components/navigation/pagination/pagination.js +4 -4
- package/dist/components/navigation/skip-link/skip-link.d.ts +7 -7
- package/dist/components/navigation/skip-link/skip-link.js +7 -7
- package/dist/components/navigation/tab-bar/tab-bar.d.ts +5 -3
- package/dist/components/navigation/tab-bar/tab-bar.d.ts.map +1 -1
- package/dist/components/navigation/tab-bar/tab-bar.js +18 -13
- package/dist/components/navigation/tab-bar/tab-bar.js.map +1 -1
- package/dist/components/navigation/tab-bar/tab-bar.styles.js +8 -8
- package/dist/components/navigation/tab-bar/tab-bar.template.js +5 -5
- package/dist/components/navigation/tab-bar/tab-bar.template.js.map +1 -1
- package/dist/components/navigation/top-navigation-bar/top-navigation-bar.d.ts +15 -15
- package/dist/components/navigation/top-navigation-bar/top-navigation-bar.js +15 -15
- package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.d.ts.map +1 -1
- package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js +14 -2
- package/dist/components/navigation/top-navigation-bar/top-navigation-bar.styles.js.map +1 -1
- package/dist/components/navigation/top-title-bar/top-title-bar.d.ts +2 -2
- package/dist/components/navigation/top-title-bar/top-title-bar.js +2 -2
- package/dist/components/navigation/top-title-bar/top-title-bar.styles.js +2 -2
- package/dist/components/status-and-feedback/badge/badge.d.ts +8 -2
- package/dist/components/status-and-feedback/badge/badge.d.ts.map +1 -1
- package/dist/components/status-and-feedback/badge/badge.js +17 -1
- package/dist/components/status-and-feedback/badge/badge.js.map +1 -1
- package/dist/components/status-and-feedback/badge/badge.styles.d.ts.map +1 -1
- package/dist/components/status-and-feedback/badge/badge.styles.js +41 -10
- package/dist/components/status-and-feedback/badge/badge.styles.js.map +1 -1
- package/dist/components/status-and-feedback/badge/badge.template.js +1 -1
- package/dist/components/status-and-feedback/badge/badge.template.js.map +1 -1
- package/dist/components/status-and-feedback/banner/banner.styles.js +2 -2
- package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.d.ts +37 -36
- package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.d.ts.map +1 -1
- package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.js +37 -36
- package/dist/components/status-and-feedback/just-in-time-education/just-in-time-education.js.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js +2 -2
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.d.ts.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js +7 -0
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.styles.js.map +1 -1
- package/dist/components/status-and-feedback/notification/notification-region.js +1 -1
- package/dist/components/status-and-feedback/status-bar/status-bar.d.ts +29 -28
- package/dist/components/status-and-feedback/status-bar/status-bar.d.ts.map +1 -1
- package/dist/components/status-and-feedback/status-bar/status-bar.js +29 -28
- package/dist/components/status-and-feedback/status-bar/status-bar.js.map +1 -1
- package/dist/components/status-and-feedback/step-indicator/step-indicator.styles.js +1 -1
- package/dist/components/{visibility-mixin-GxbwkBb1.js → visibility-mixin-vbfhyo7f.js} +1 -1
- package/dist/components/{with-translations-DzAdFTK8.js → with-translations-CqUV9S5g.js} +1 -1
- package/dist/css/form-section.css +28 -46
- package/dist/css/form.css +7 -13
- package/dist/css/rich-text.css +5 -5
- package/dist/css/variables.css +133 -8
- package/dist/nldd.min.js +1382 -875
- package/dist/types/vue.d.ts +530 -336
- package/dist/utilities/codemirror/codemirror-element.d.ts.map +1 -1
- package/dist/utilities/codemirror/codemirror-element.js +5 -0
- package/dist/utilities/codemirror/codemirror-element.js.map +1 -1
- package/dist/utilities/described-by-mixin.d.ts +49 -0
- package/dist/utilities/described-by-mixin.d.ts.map +1 -0
- package/dist/utilities/described-by-mixin.js +109 -0
- package/dist/utilities/described-by-mixin.js.map +1 -0
- package/dist/utilities/form-associated-mixin.d.ts +5 -0
- package/dist/utilities/form-associated-mixin.d.ts.map +1 -1
- package/dist/utilities/form-associated-mixin.js +69 -0
- package/dist/utilities/form-associated-mixin.js.map +1 -1
- package/dist/utilities/scroll-mode-controller.d.ts +9 -1
- package/dist/utilities/scroll-mode-controller.d.ts.map +1 -1
- package/dist/utilities/scroll-mode-controller.js +10 -2
- package/dist/utilities/scroll-mode-controller.js.map +1 -1
- package/package.json +21 -9
- package/dist/components/lists-and-tables/list-item-action/list-item-action.d.ts +0 -108
- package/dist/components/lists-and-tables/list-item-action/list-item-action.d.ts.map +0 -1
- package/dist/components/lists-and-tables/list-item-action/list-item-action.js.map +0 -1
- package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.d.ts +0 -2
- package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.d.ts.map +0 -1
- package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.js +0 -145
- package/dist/components/lists-and-tables/list-item-action/list-item-action.styles.js.map +0 -1
- package/dist/components/lists-and-tables/list-item-action/list-item-action.template.d.ts +0 -3
- package/dist/components/lists-and-tables/list-item-action/list-item-action.template.d.ts.map +0 -1
- 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
|
|
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
|
|
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-
|
|
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-
|
|
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}
|
|
89
|
-
* @attr {boolean}
|
|
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}
|
|
92
|
-
* @attr {
|
|
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
|
|
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
|
|
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:
|
|
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('
|
|
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
|
|
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('
|
|
218
|
-
this.
|
|
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
|
|
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-
|
|
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
|
|
242
|
-
* so the row drops its own there and the
|
|
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
|
|
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-
|
|
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-
|
|
256
|
-
this.classList.toggle('has-leading-
|
|
257
|
-
this.classList.toggle('has-trailing-
|
|
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
|
-
|
|
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
|
|
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-
|
|
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-
|
|
346
|
-
.forEach(
|
|
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-
|
|
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
|
|
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,
|
|
366
|
-
*
|
|
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
|
-
//
|
|
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
|
|
394
|
-
this._ownDescendants('nldd-list-item-
|
|
395
|
-
.forEach(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
594
|
-
* that holds a checkbox and a chevron
|
|
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
|
|
607
|
-
&& el.tagName.toLowerCase() === 'nldd-list-item-action');
|
|
817
|
+
const ownSegments = this._ownSegments();
|
|
608
818
|
if (!this._arrowNavigation) {
|
|
609
819
|
this.removeAttribute('tabindex');
|
|
610
|
-
|
|
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
|
-
|
|
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
|
|
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-
|
|
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
|
|
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:
|
|
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);
|