@kouji-ui/core 0.1.1 → 0.1.2
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/fesm2022/kouji-ui-core.mjs +26789 -0
- package/fesm2022/kouji-ui-core.mjs.map +1 -0
- package/package.json +5 -6
- package/types/kouji-ui-core.d.ts +13545 -0
- package/.turbo/turbo-build.log +0 -30
- package/CHANGELOG.md +0 -190
- package/ng-package.json +0 -11
- package/src/a11y/.gitkeep +0 -0
- package/src/a11y/aria-describedby.spec.ts +0 -55
- package/src/a11y/aria-describedby.ts +0 -37
- package/src/a11y/aria-labelledby.spec.ts +0 -55
- package/src/a11y/aria-labelledby.ts +0 -38
- package/src/a11y/focus-trap.spec.ts +0 -86
- package/src/a11y/focus-trap.ts +0 -72
- package/src/a11y/index.ts +0 -10
- package/src/a11y/live-region.spec.ts +0 -58
- package/src/a11y/live-region.ts +0 -50
- package/src/a11y/roving-tabindex.spec.ts +0 -201
- package/src/a11y/roving-tabindex.ts +0 -153
- package/src/a11y/visually-hidden.spec.ts +0 -34
- package/src/a11y/visually-hidden.ts +0 -26
- package/src/accordion/accordion.context.ts +0 -44
- package/src/accordion/accordion.spec.ts +0 -242
- package/src/accordion/accordion.ts +0 -401
- package/src/accordion/index.ts +0 -8
- package/src/alert/alert.context.ts +0 -28
- package/src/alert/alert.spec.ts +0 -217
- package/src/alert/alert.ts +0 -417
- package/src/alert/config.ts +0 -46
- package/src/alert/index.ts +0 -19
- package/src/avatar/avatar-group.context.ts +0 -45
- package/src/avatar/avatar-group.spec.ts +0 -358
- package/src/avatar/avatar-group.ts +0 -259
- package/src/avatar/avatar.spec.ts +0 -18
- package/src/avatar/avatar.ts +0 -39
- package/src/avatar/index.ts +0 -11
- package/src/badge/badge.spec.ts +0 -28
- package/src/badge/badge.ts +0 -35
- package/src/badge/index.ts +0 -1
- package/src/breadcrumb/breadcrumb-current.ts +0 -38
- package/src/breadcrumb/breadcrumb-ellipsis.ts +0 -71
- package/src/breadcrumb/breadcrumb-item.ts +0 -41
- package/src/breadcrumb/breadcrumb-link.ts +0 -44
- package/src/breadcrumb/breadcrumb-list.ts +0 -42
- package/src/breadcrumb/breadcrumb-separator.ts +0 -45
- package/src/breadcrumb/breadcrumb.context.ts +0 -45
- package/src/breadcrumb/breadcrumb.spec.ts +0 -354
- package/src/breadcrumb/breadcrumb.ts +0 -239
- package/src/breadcrumb/config.ts +0 -84
- package/src/breadcrumb/index.ts +0 -18
- package/src/button/_examples/button.example.ts +0 -71
- package/src/button/_examples/button.finance.example.ts +0 -83
- package/src/button/_examples/button.retro.example.ts +0 -91
- package/src/button/_examples/button.sizes.example.ts +0 -60
- package/src/button/_examples/index.ts +0 -6
- package/src/button/button.spec.ts +0 -163
- package/src/button/button.ts +0 -142
- package/src/button/config.spec.ts +0 -33
- package/src/button/config.ts +0 -45
- package/src/button/index.ts +0 -2
- package/src/button-group/button-group.context.ts +0 -28
- package/src/button-group/button-group.spec.ts +0 -99
- package/src/button-group/button-group.ts +0 -99
- package/src/button-group/index.ts +0 -2
- package/src/calendar/calendar-day.ts +0 -102
- package/src/calendar/calendar-grid.ts +0 -90
- package/src/calendar/calendar-header.ts +0 -65
- package/src/calendar/calendar.context.ts +0 -53
- package/src/calendar/calendar.spec.ts +0 -225
- package/src/calendar/calendar.ts +0 -233
- package/src/calendar/date-utils.ts +0 -225
- package/src/calendar/index.ts +0 -28
- package/src/carousel/carousel.context.ts +0 -81
- package/src/carousel/carousel.spec.ts +0 -337
- package/src/carousel/carousel.ts +0 -919
- package/src/carousel/index.ts +0 -22
- package/src/cascade-select/cascade-select-option.ts +0 -205
- package/src/cascade-select/cascade-select-panel.ts +0 -106
- package/src/cascade-select/cascade-select-root.ts +0 -265
- package/src/cascade-select/cascade-select-sub-panel.ts +0 -168
- package/src/cascade-select/cascade-select-trigger.ts +0 -44
- package/src/cascade-select/cascade-select.context.ts +0 -71
- package/src/cascade-select/cascade-select.spec.ts +0 -241
- package/src/cascade-select/cascade-select.ts +0 -5
- package/src/cascade-select/index.ts +0 -11
- package/src/chart/chart.spec.ts +0 -27
- package/src/chart/chart.ts +0 -52
- package/src/chart/index.ts +0 -1
- package/src/chat/chat-avatar.ts +0 -31
- package/src/chat/chat-bubble.ts +0 -49
- package/src/chat/chat-footer.ts +0 -67
- package/src/chat/chat-header.ts +0 -41
- package/src/chat/chat-log.ts +0 -43
- package/src/chat/chat.context.ts +0 -64
- package/src/chat/chat.spec.ts +0 -341
- package/src/chat/chat.ts +0 -191
- package/src/chat/config.ts +0 -53
- package/src/chat/index.ts +0 -21
- package/src/checkbox/checkbox.spec.ts +0 -35
- package/src/checkbox/checkbox.ts +0 -89
- package/src/checkbox/index.ts +0 -1
- package/src/color-picker/color-picker.context.ts +0 -74
- package/src/color-picker/color-picker.spec.ts +0 -241
- package/src/color-picker/color-picker.ts +0 -698
- package/src/color-picker/color-picker.utils.ts +0 -140
- package/src/color-picker/index.ts +0 -28
- package/src/combobox/combobox-input.ts +0 -143
- package/src/combobox/combobox-listbox.ts +0 -49
- package/src/combobox/combobox-option.ts +0 -43
- package/src/combobox/combobox-root.ts +0 -281
- package/src/combobox/combobox.spec.ts +0 -75
- package/src/combobox/combobox.ts +0 -4
- package/src/combobox/index.ts +0 -4
- package/src/command-palette/command-empty.ts +0 -36
- package/src/command-palette/command-group.ts +0 -21
- package/src/command-palette/command-input.ts +0 -70
- package/src/command-palette/command-item.ts +0 -60
- package/src/command-palette/command-list.ts +0 -25
- package/src/command-palette/command-palette-dialog.ts +0 -74
- package/src/command-palette/command-palette-trigger.ts +0 -64
- package/src/command-palette/command-palette.filters.ts +0 -53
- package/src/command-palette/command-palette.spec.ts +0 -349
- package/src/command-palette/command-palette.ts +0 -204
- package/src/command-palette/command-separator.ts +0 -18
- package/src/command-palette/index.ts +0 -15
- package/src/confirm-popup/confirm-popup-action.ts +0 -39
- package/src/confirm-popup/confirm-popup-cancel.ts +0 -38
- package/src/confirm-popup/confirm-popup-content.ts +0 -113
- package/src/confirm-popup/confirm-popup-message.ts +0 -36
- package/src/confirm-popup/confirm-popup-trigger.ts +0 -31
- package/src/confirm-popup/confirm-popup.context.ts +0 -41
- package/src/confirm-popup/confirm-popup.spec.ts +0 -337
- package/src/confirm-popup/confirm-popup.ts +0 -109
- package/src/confirm-popup/index.ts +0 -12
- package/src/date-picker/date-picker-calendar.ts +0 -65
- package/src/date-picker/date-picker-trigger.ts +0 -215
- package/src/date-picker/date-picker.context.ts +0 -50
- package/src/date-picker/date-picker.spec.ts +0 -117
- package/src/date-picker/date-picker.ts +0 -127
- package/src/date-picker/index.ts +0 -7
- package/src/dialog/_examples/dialog.confirm.example.ts +0 -145
- package/src/dialog/_examples/dialog.example.ts +0 -106
- package/src/dialog/_examples/dialog.finance.example.ts +0 -121
- package/src/dialog/_examples/dialog.retro.example.ts +0 -126
- package/src/dialog/_examples/index.ts +0 -6
- package/src/dialog/dialog.ref.ts +0 -42
- package/src/dialog/dialog.service.ts +0 -66
- package/src/dialog/dialog.spec.ts +0 -37
- package/src/dialog/dialog.ts +0 -26
- package/src/dialog/index.ts +0 -3
- package/src/divider/divider.spec.ts +0 -223
- package/src/divider/divider.ts +0 -137
- package/src/divider/index.ts +0 -5
- package/src/drawer/drawer.ref.ts +0 -63
- package/src/drawer/drawer.service.ts +0 -106
- package/src/drawer/drawer.spec.ts +0 -117
- package/src/drawer/drawer.ts +0 -122
- package/src/drawer/index.ts +0 -10
- package/src/dropdown-menu/dropdown-menu-content.ts +0 -258
- package/src/dropdown-menu/dropdown-menu-group.ts +0 -31
- package/src/dropdown-menu/dropdown-menu-item.ts +0 -51
- package/src/dropdown-menu/dropdown-menu-label.ts +0 -41
- package/src/dropdown-menu/dropdown-menu-separator.ts +0 -27
- package/src/dropdown-menu/dropdown-menu-trigger.ts +0 -140
- package/src/dropdown-menu/dropdown-menu.spec.ts +0 -265
- package/src/dropdown-menu/dropdown-menu.ts +0 -60
- package/src/dropdown-menu/index.ts +0 -15
- package/src/example-components.ts +0 -42
- package/src/field/field-error.ts +0 -49
- package/src/field/field-group.ts +0 -39
- package/src/field/field-help.ts +0 -47
- package/src/field/field-label.ts +0 -30
- package/src/field/field.context.ts +0 -28
- package/src/field/field.spec.ts +0 -179
- package/src/field/field.ts +0 -121
- package/src/field/index.ts +0 -6
- package/src/file-upload/file-upload.context.ts +0 -89
- package/src/file-upload/file-upload.spec.ts +0 -290
- package/src/file-upload/file-upload.ts +0 -639
- package/src/file-upload/file-upload.types.ts +0 -59
- package/src/file-upload/index.ts +0 -23
- package/src/form/form-error-summary.ts +0 -87
- package/src/form/form-field.context.ts +0 -3
- package/src/form/form-field.spec.ts +0 -25
- package/src/form/form-field.ts +0 -52
- package/src/form/form.context.ts +0 -53
- package/src/form/form.spec.ts +0 -162
- package/src/form/form.ts +0 -326
- package/src/form/index.ts +0 -11
- package/src/icon/E2E.md +0 -14
- package/src/icon/icon.directive.spec.ts +0 -198
- package/src/icon/icon.directive.ts +0 -113
- package/src/icon/icon.mode.spec.ts +0 -29
- package/src/icon/icon.mode.ts +0 -23
- package/src/icon/icon.providers.spec.ts +0 -63
- package/src/icon/icon.providers.ts +0 -47
- package/src/icon/icon.resolver.spec.ts +0 -96
- package/src/icon/icon.resolver.ts +0 -49
- package/src/icon/icon.tokens.ts +0 -88
- package/src/icon/icon.types.ts +0 -48
- package/src/icon/index.ts +0 -21
- package/src/input/index.ts +0 -1
- package/src/input/input.spec.ts +0 -43
- package/src/input/input.ts +0 -89
- package/src/input-group/index.ts +0 -3
- package/src/input-group/input-group-addon.ts +0 -92
- package/src/input-group/input-group.context.ts +0 -27
- package/src/input-group/input-group.spec.ts +0 -186
- package/src/input-group/input-group.ts +0 -136
- package/src/input-mask/index.ts +0 -11
- package/src/input-mask/input-mask.compile.ts +0 -69
- package/src/input-mask/input-mask.engine.ts +0 -376
- package/src/input-mask/input-mask.presets.ts +0 -24
- package/src/input-mask/input-mask.spec.ts +0 -304
- package/src/input-mask/input-mask.tokens.ts +0 -49
- package/src/input-mask/input-mask.ts +0 -280
- package/src/input-otp/index.ts +0 -2
- package/src/input-otp/input-otp.context.ts +0 -41
- package/src/input-otp/input-otp.spec.ts +0 -308
- package/src/input-otp/input-otp.ts +0 -470
- package/src/kbd/index.ts +0 -1
- package/src/kbd/kbd.spec.ts +0 -127
- package/src/kbd/kbd.ts +0 -132
- package/src/link/config.ts +0 -44
- package/src/link/index.ts +0 -2
- package/src/link/link.spec.ts +0 -246
- package/src/link/link.ts +0 -226
- package/src/list/index.ts +0 -11
- package/src/list/list.spec.ts +0 -237
- package/src/list/list.ts +0 -277
- package/src/menubar/index.ts +0 -7
- package/src/menubar/menubar-item.ts +0 -204
- package/src/menubar/menubar.context.ts +0 -43
- package/src/menubar/menubar.spec.ts +0 -433
- package/src/menubar/menubar.ts +0 -309
- package/src/number-input/index.ts +0 -4
- package/src/number-input/number-input-group.ts +0 -64
- package/src/number-input/number-input.context.ts +0 -31
- package/src/number-input/number-input.format.ts +0 -148
- package/src/number-input/number-input.spec.ts +0 -170
- package/src/number-input/number-input.ts +0 -457
- package/src/number-input/number-stepper.ts +0 -193
- package/src/overlay-badge/index.ts +0 -7
- package/src/overlay-badge/overlay-badge-content.ts +0 -73
- package/src/overlay-badge/overlay-badge.context.ts +0 -37
- package/src/overlay-badge/overlay-badge.spec.ts +0 -220
- package/src/overlay-badge/overlay-badge.ts +0 -128
- package/src/pagination/config.ts +0 -82
- package/src/pagination/index.ts +0 -19
- package/src/pagination/page-tokens.ts +0 -78
- package/src/pagination/pagination-ellipsis.ts +0 -69
- package/src/pagination/pagination-first.ts +0 -84
- package/src/pagination/pagination-info.ts +0 -70
- package/src/pagination/pagination-item.ts +0 -81
- package/src/pagination/pagination-last.ts +0 -85
- package/src/pagination/pagination-next.ts +0 -86
- package/src/pagination/pagination-previous.ts +0 -90
- package/src/pagination/pagination.context.ts +0 -52
- package/src/pagination/pagination.spec.ts +0 -388
- package/src/pagination/pagination.ts +0 -288
- package/src/password-input/index.ts +0 -15
- package/src/password-input/password-input.context.ts +0 -65
- package/src/password-input/password-input.scorer.ts +0 -34
- package/src/password-input/password-input.spec.ts +0 -274
- package/src/password-input/password-input.ts +0 -488
- package/src/popover/_examples/index.ts +0 -5
- package/src/popover/_examples/popover.example.ts +0 -92
- package/src/popover/_examples/popover.finance.example.ts +0 -106
- package/src/popover/_examples/popover.retro.example.ts +0 -103
- package/src/popover/index.ts +0 -5
- package/src/popover/popover-arrow.ts +0 -30
- package/src/popover/popover-close.ts +0 -36
- package/src/popover/popover-content.ts +0 -41
- package/src/popover/popover-title.ts +0 -39
- package/src/popover/popover-trigger.ts +0 -40
- package/src/popover/popover.spec.ts +0 -59
- package/src/popover/popover.ts +0 -5
- package/src/presets/bind-presets.spec.ts +0 -50
- package/src/presets/bind-presets.ts +0 -43
- package/src/presets/index.ts +0 -3
- package/src/presets/size.spec.ts +0 -67
- package/src/presets/size.ts +0 -59
- package/src/presets/variant.spec.ts +0 -72
- package/src/presets/variant.ts +0 -62
- package/src/primitives/.gitkeep +0 -0
- package/src/primitives/directionality/directionality.spec.ts +0 -112
- package/src/primitives/directionality/directionality.ts +0 -89
- package/src/primitives/directionality/index.ts +0 -1
- package/src/primitives/forms/form-control.spec.ts +0 -67
- package/src/primitives/forms/form-control.ts +0 -94
- package/src/primitives/forms/index.ts +0 -1
- package/src/primitives/index.ts +0 -6
- package/src/primitives/interaction/disabled.spec.ts +0 -47
- package/src/primitives/interaction/disabled.ts +0 -31
- package/src/primitives/interaction/focus-ring.spec.ts +0 -62
- package/src/primitives/interaction/focus-ring.ts +0 -59
- package/src/primitives/interaction/index.ts +0 -2
- package/src/primitives/list/filterable-list.spec.ts +0 -114
- package/src/primitives/list/filterable-list.ts +0 -126
- package/src/primitives/list/group.spec.ts +0 -99
- package/src/primitives/list/group.ts +0 -139
- package/src/primitives/list/index.ts +0 -8
- package/src/primitives/list/inject-helpers.ts +0 -8
- package/src/primitives/list/item.spec.ts +0 -173
- package/src/primitives/list/item.ts +0 -222
- package/src/primitives/list/navigator.spec.ts +0 -286
- package/src/primitives/list/navigator.ts +0 -238
- package/src/primitives/list/selection.spec.ts +0 -214
- package/src/primitives/list/selection.ts +0 -339
- package/src/primitives/list/tokens.ts +0 -106
- package/src/primitives/list/type-ahead.spec.ts +0 -58
- package/src/primitives/list/type-ahead.ts +0 -46
- package/src/primitives/overlay/backdrop.spec.ts +0 -54
- package/src/primitives/overlay/backdrop.ts +0 -31
- package/src/primitives/overlay/builder.spec.ts +0 -38
- package/src/primitives/overlay/builder.ts +0 -151
- package/src/primitives/overlay/container.ts +0 -42
- package/src/primitives/overlay/context.ts +0 -14
- package/src/primitives/overlay/controller.spec.ts +0 -86
- package/src/primitives/overlay/controller.ts +0 -190
- package/src/primitives/overlay/id.spec.ts +0 -24
- package/src/primitives/overlay/id.ts +0 -17
- package/src/primitives/overlay/index.ts +0 -18
- package/src/primitives/overlay/overlay.css +0 -42
- package/src/primitives/overlay/panel.spec.ts +0 -52
- package/src/primitives/overlay/panel.ts +0 -102
- package/src/primitives/overlay/stack.spec.ts +0 -55
- package/src/primitives/overlay/stack.ts +0 -113
- package/src/primitives/overlay/strategies/backdrop/blurred.spec.ts +0 -11
- package/src/primitives/overlay/strategies/backdrop/blurred.ts +0 -5
- package/src/primitives/overlay/strategies/backdrop/none.spec.ts +0 -10
- package/src/primitives/overlay/strategies/backdrop/none.ts +0 -9
- package/src/primitives/overlay/strategies/backdrop/solid.spec.ts +0 -18
- package/src/primitives/overlay/strategies/backdrop/solid.ts +0 -23
- package/src/primitives/overlay/strategies/focus-trap/inert-based.spec.ts +0 -28
- package/src/primitives/overlay/strategies/focus-trap/inert-based.ts +0 -38
- package/src/primitives/overlay/strategies/focus-trap/no-trap.spec.ts +0 -9
- package/src/primitives/overlay/strategies/focus-trap/no-trap.ts +0 -8
- package/src/primitives/overlay/strategies/focus-trap/tab-cycle.spec.ts +0 -49
- package/src/primitives/overlay/strategies/focus-trap/tab-cycle.ts +0 -85
- package/src/primitives/overlay/strategies/index.ts +0 -34
- package/src/primitives/overlay/strategies/live-announcer/_announce.ts +0 -35
- package/src/primitives/overlay/strategies/live-announcer/assertive.spec.ts +0 -21
- package/src/primitives/overlay/strategies/live-announcer/assertive.ts +0 -11
- package/src/primitives/overlay/strategies/live-announcer/polite.spec.ts +0 -21
- package/src/primitives/overlay/strategies/live-announcer/polite.ts +0 -11
- package/src/primitives/overlay/strategies/live-announcer/silent.spec.ts +0 -12
- package/src/primitives/overlay/strategies/live-announcer/silent.ts +0 -5
- package/src/primitives/overlay/strategies/mount/body-portal.spec.ts +0 -40
- package/src/primitives/overlay/strategies/mount/body-portal.ts +0 -91
- package/src/primitives/overlay/strategies/mount/in-container.spec.ts +0 -43
- package/src/primitives/overlay/strategies/mount/in-container.ts +0 -39
- package/src/primitives/overlay/strategies/mount/in-place.spec.ts +0 -40
- package/src/primitives/overlay/strategies/mount/in-place.ts +0 -20
- package/src/primitives/overlay/strategies/position/anchored-to.spec.ts +0 -56
- package/src/primitives/overlay/strategies/position/anchored-to.ts +0 -248
- package/src/primitives/overlay/strategies/position/corner.spec.ts +0 -36
- package/src/primitives/overlay/strategies/position/corner.ts +0 -33
- package/src/primitives/overlay/strategies/position/edge-sheet.spec.ts +0 -32
- package/src/primitives/overlay/strategies/position/edge-sheet.ts +0 -36
- package/src/primitives/overlay/strategies/position/in-place-sibling.spec.ts +0 -25
- package/src/primitives/overlay/strategies/position/in-place-sibling.ts +0 -13
- package/src/primitives/overlay/strategies/position/point-at.spec.ts +0 -40
- package/src/primitives/overlay/strategies/position/point-at.ts +0 -34
- package/src/primitives/overlay/strategies/position/viewport-centered.spec.ts +0 -31
- package/src/primitives/overlay/strategies/position/viewport-centered.ts +0 -31
- package/src/primitives/overlay/strategies/scroll-lock/css-clip.spec.ts +0 -15
- package/src/primitives/overlay/strategies/scroll-lock/css-clip.ts +0 -39
- package/src/primitives/overlay/strategies/scroll-lock/html-overflow.spec.ts +0 -21
- package/src/primitives/overlay/strategies/scroll-lock/html-overflow.ts +0 -44
- package/src/primitives/overlay/strategies/scroll-lock/none.spec.ts +0 -9
- package/src/primitives/overlay/strategies/scroll-lock/none.ts +0 -5
- package/src/primitives/overlay/strategies/trigger-event/on-click.spec.ts +0 -32
- package/src/primitives/overlay/strategies/trigger-event/on-click.ts +0 -28
- package/src/primitives/overlay/strategies/trigger-event/on-context-menu.spec.ts +0 -45
- package/src/primitives/overlay/strategies/trigger-event/on-context-menu.ts +0 -70
- package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.spec.ts +0 -35
- package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.ts +0 -34
- package/src/primitives/overlay/strategies/trigger-event/on-focus.spec.ts +0 -64
- package/src/primitives/overlay/strategies/trigger-event/on-focus.ts +0 -37
- package/src/primitives/overlay/strategies/trigger-event/on-hotkey.spec.ts +0 -37
- package/src/primitives/overlay/strategies/trigger-event/on-hotkey.ts +0 -59
- package/src/primitives/overlay/strategies/trigger-event/on-hover.spec.ts +0 -34
- package/src/primitives/overlay/strategies/trigger-event/on-hover.ts +0 -86
- package/src/primitives/overlay/strategies/trigger-event/programmatic.spec.ts +0 -16
- package/src/primitives/overlay/strategies/trigger-event/programmatic.ts +0 -12
- package/src/primitives/overlay/tokens.ts +0 -54
- package/src/primitives/overlay/trigger.spec.ts +0 -103
- package/src/primitives/overlay/trigger.ts +0 -75
- package/src/primitives/overlay/types.ts +0 -24
- package/src/primitives/overlay/wrapper.ts +0 -50
- package/src/primitives/signals/deep-signal.ts +0 -109
- package/src/primitives/signals/index.ts +0 -1
- package/src/progress-bar/config.ts +0 -48
- package/src/progress-bar/index.ts +0 -12
- package/src/progress-bar/progress-bar-fill.ts +0 -37
- package/src/progress-bar/progress-bar.context.ts +0 -34
- package/src/progress-bar/progress-bar.spec.ts +0 -423
- package/src/progress-bar/progress-bar.ts +0 -217
- package/src/public-api.ts +0 -84
- package/src/radio/index.ts +0 -2
- package/src/radio/radio.context.ts +0 -3
- package/src/radio/radio.spec.ts +0 -36
- package/src/radio/radio.ts +0 -66
- package/src/select/index.ts +0 -4
- package/src/select/select-content.ts +0 -69
- package/src/select/select-option.ts +0 -35
- package/src/select/select-root.ts +0 -129
- package/src/select/select-trigger.ts +0 -93
- package/src/select/select.spec.ts +0 -138
- package/src/select/select.ts +0 -4
- package/src/skeleton/index.ts +0 -5
- package/src/skeleton/skeleton.spec.ts +0 -115
- package/src/skeleton/skeleton.ts +0 -56
- package/src/slider/index.ts +0 -10
- package/src/slider/slider-range.ts +0 -49
- package/src/slider/slider-thumb.ts +0 -335
- package/src/slider/slider-track.ts +0 -70
- package/src/slider/slider.context.ts +0 -79
- package/src/slider/slider.geometry.ts +0 -73
- package/src/slider/slider.spec.ts +0 -216
- package/src/slider/slider.ts +0 -443
- package/src/speed-dial/index.ts +0 -10
- package/src/speed-dial/speed-dial-action.ts +0 -40
- package/src/speed-dial/speed-dial-actions.ts +0 -31
- package/src/speed-dial/speed-dial-trigger.ts +0 -55
- package/src/speed-dial/speed-dial.context.ts +0 -36
- package/src/speed-dial/speed-dial.spec.ts +0 -143
- package/src/speed-dial/speed-dial.ts +0 -127
- package/src/spinner/config.ts +0 -48
- package/src/spinner/index.ts +0 -8
- package/src/spinner/spinner.spec.ts +0 -262
- package/src/spinner/spinner.ts +0 -129
- package/src/stepper/index.ts +0 -15
- package/src/stepper/stepper.context.ts +0 -63
- package/src/stepper/stepper.spec.ts +0 -403
- package/src/stepper/stepper.ts +0 -544
- package/src/styles/docs-themes.css +0 -82
- package/src/styles.css +0 -17
- package/src/table/column-helpers.spec.ts +0 -74
- package/src/table/column-helpers.ts +0 -68
- package/src/table/filter-fns.ts +0 -230
- package/src/table/filter-models.spec.ts +0 -240
- package/src/table/filter-models.ts +0 -124
- package/src/table/filter-params.ts +0 -90
- package/src/table/grid-api-impl.ts +0 -321
- package/src/table/grid-api.spec.ts +0 -178
- package/src/table/grid-api.ts +0 -285
- package/src/table/index.ts +0 -73
- package/src/table/table-cell.spec.ts +0 -43
- package/src/table/table-cell.ts +0 -38
- package/src/table/table-filter-outlet.ts +0 -120
- package/src/table/table-header.spec.ts +0 -54
- package/src/table/table-header.ts +0 -63
- package/src/table/table-keyboard.spec.ts +0 -68
- package/src/table/table-keyboard.ts +0 -107
- package/src/table/table-resource.spec.ts +0 -37
- package/src/table/table-resource.ts +0 -36
- package/src/table/table-row.spec.ts +0 -54
- package/src/table/table-row.ts +0 -31
- package/src/table/table-storage.spec.ts +0 -67
- package/src/table/table-storage.ts +0 -76
- package/src/table/table.spec.ts +0 -172
- package/src/table/table.ts +0 -281
- package/src/table/table.types.ts +0 -83
- package/src/tabs/index.ts +0 -7
- package/src/tabs/tabs.context.ts +0 -32
- package/src/tabs/tabs.spec.ts +0 -352
- package/src/tabs/tabs.ts +0 -364
- package/src/tag/config.ts +0 -53
- package/src/tag/index.ts +0 -7
- package/src/tag/tag-list.ts +0 -76
- package/src/tag/tag-remove.ts +0 -61
- package/src/tag/tag.context.ts +0 -36
- package/src/tag/tag.spec.ts +0 -240
- package/src/tag/tag.ts +0 -203
- package/src/test-setup.ts +0 -5
- package/src/textarea/config.ts +0 -42
- package/src/textarea/index.ts +0 -8
- package/src/textarea/textarea.spec.ts +0 -176
- package/src/textarea/textarea.ts +0 -235
- package/src/time-picker/index.ts +0 -15
- package/src/time-picker/time-picker-meridiem.ts +0 -123
- package/src/time-picker/time-picker-segment.ts +0 -318
- package/src/time-picker/time-picker.context.ts +0 -38
- package/src/time-picker/time-picker.format.ts +0 -181
- package/src/time-picker/time-picker.spec.ts +0 -189
- package/src/time-picker/time-picker.ts +0 -274
- package/src/toast/_examples/index.ts +0 -5
- package/src/toast/_examples/toast.example.ts +0 -282
- package/src/toast/_examples/toast.finance.example.ts +0 -180
- package/src/toast/_examples/toast.retro.example.ts +0 -161
- package/src/toast/index.ts +0 -28
- package/src/toast/toast.ref.ts +0 -26
- package/src/toast/toast.service.ts +0 -339
- package/src/toast/toast.spec.ts +0 -247
- package/src/toast/toast.strategy.ts +0 -112
- package/src/toast/toast.ts +0 -463
- package/src/toast/toast.types.ts +0 -5
- package/src/toggle/index.ts +0 -1
- package/src/toggle/toggle.spec.ts +0 -24
- package/src/toggle/toggle.ts +0 -48
- package/src/tooltip/_examples/index.ts +0 -6
- package/src/tooltip/_examples/tooltip.example.ts +0 -82
- package/src/tooltip/_examples/tooltip.finance.example.ts +0 -97
- package/src/tooltip/_examples/tooltip.placements.example.ts +0 -83
- package/src/tooltip/_examples/tooltip.retro.example.ts +0 -107
- package/src/tooltip/index.ts +0 -4
- package/src/tooltip/tooltip-arrow.ts +0 -31
- package/src/tooltip/tooltip-content.ts +0 -38
- package/src/tooltip/tooltip-group.ts +0 -32
- package/src/tooltip/tooltip-trigger.ts +0 -47
- package/src/tooltip/tooltip.spec.ts +0 -40
- package/src/tooltip/tooltip.ts +0 -5
- package/src/tree-select/index.ts +0 -12
- package/src/tree-select/tree-select-content.ts +0 -199
- package/src/tree-select/tree-select-node.ts +0 -132
- package/src/tree-select/tree-select-root.ts +0 -272
- package/src/tree-select/tree-select-trigger.ts +0 -90
- package/src/tree-select/tree-select.context.ts +0 -63
- package/src/tree-select/tree-select.spec.ts +0 -433
- package/src/tree-select/tree-select.ts +0 -2
- package/src/typography/blockquote.ts +0 -57
- package/src/typography/code.ts +0 -53
- package/src/typography/index.ts +0 -22
- package/src/typography/lead.ts +0 -49
- package/src/typography/muted.ts +0 -29
- package/src/typography/truncate.ts +0 -99
- package/src/typography/typography.spec.ts +0 -203
- package/tsconfig.lib.json +0 -21
- package/tsconfig.lib.prod.json +0 -17
- package/tsconfig.spec.json +0 -18
- package/vite.config.ts +0 -27
- /package/{src/icon → icon}/icon.css +0 -0
- /package/{src/typography → typography}/prose.css +0 -0
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AfterContentInit,
|
|
3
|
-
Directive,
|
|
4
|
-
ElementRef,
|
|
5
|
-
booleanAttribute,
|
|
6
|
-
computed,
|
|
7
|
-
forwardRef,
|
|
8
|
-
inject,
|
|
9
|
-
input,
|
|
10
|
-
output,
|
|
11
|
-
signal,
|
|
12
|
-
} from '@angular/core';
|
|
13
|
-
import { KjListNavigator } from './navigator';
|
|
14
|
-
import { KjSelectionModel } from './selection';
|
|
15
|
-
import { KJ_LIST_FOCUS_MODE, KJ_LIST_NAVIGATOR_CONFIG } from './tokens';
|
|
16
|
-
|
|
17
|
-
let _id = 0;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Behavior primitive for any item rendered inside a listbox / menu / tree.
|
|
21
|
-
* Composes `KjDisabled`; mints a stable id; exposes value/label/haystacks;
|
|
22
|
-
* binds `aria-disabled`, `aria-selected` (via injected `KjSelectionModel`),
|
|
23
|
-
* `aria-posinset`/`aria-setsize` (stamped by `KjFilterableList`), and
|
|
24
|
-
* `aria-keyshortcuts`. Activation (click / Enter / Space) fires an
|
|
25
|
-
* `activate` output the consumer subscribes to. Role is set by the
|
|
26
|
-
* consumer's outer directive — varies per cluster.
|
|
27
|
-
*
|
|
28
|
-
* @doc-category Core/Primitives
|
|
29
|
-
*/
|
|
30
|
-
@Directive({
|
|
31
|
-
selector: '[kjListItem]',
|
|
32
|
-
exportAs: 'kjListItem',
|
|
33
|
-
standalone: true,
|
|
34
|
-
host: {
|
|
35
|
-
'[hidden]': '!visible()',
|
|
36
|
-
'[attr.tabindex]': 'tabIndex()',
|
|
37
|
-
'[attr.aria-disabled]': 'disabled() ? "true" : null',
|
|
38
|
-
'[attr.data-disabled]': 'disabled() ? "" : null',
|
|
39
|
-
'[attr.aria-selected]': 'ariaSelected()',
|
|
40
|
-
'[attr.aria-checked]': 'ariaChecked()',
|
|
41
|
-
'[attr.aria-posinset]': 'posInSet()',
|
|
42
|
-
'[attr.aria-setsize]': 'setSize()',
|
|
43
|
-
'[attr.aria-keyshortcuts]': 'kjShortcut() || null',
|
|
44
|
-
'(click)': '_activate($event)',
|
|
45
|
-
'(keydown.enter)': '$event.preventDefault(); _activate($event)',
|
|
46
|
-
'(keydown.space)': '$event.preventDefault(); _activate($event)',
|
|
47
|
-
},
|
|
48
|
-
})
|
|
49
|
-
export class KjListItem<T = unknown> implements AfterContentInit {
|
|
50
|
-
/** Typed value emitted on activation. `undefined` when unset. */
|
|
51
|
-
readonly kjItemValue = input<T | undefined>(undefined);
|
|
52
|
-
/** Display label. Falls back to element text content when empty. */
|
|
53
|
-
readonly kjItemLabel = input<string>('');
|
|
54
|
-
/** Extra search terms merged into `haystacks` for type-ahead / filter matching. */
|
|
55
|
-
readonly kjItemKeywords = input<readonly string[]>([]);
|
|
56
|
-
/** ARIA keyboard shortcut string bound to `aria-keyshortcuts`. Omit to suppress the attribute. */
|
|
57
|
-
readonly kjShortcut = input<string | null>(null);
|
|
58
|
-
/**
|
|
59
|
-
* Disabled flag. Declared as a top-level input (rather than as a
|
|
60
|
-
* `hostDirective` forward) so consumers that compose `KjListItem`
|
|
61
|
-
* inside their own `hostDirectives` (`KjOption`, `KjTreeSelectNode`,
|
|
62
|
-
* …) can re-forward it without falling foul of NG0311. The composed
|
|
63
|
-
* `KjDisabled` instance follows this signal via an effect below.
|
|
64
|
-
*/
|
|
65
|
-
readonly kjDisabled = input<boolean, unknown>(false, { transform: booleanAttribute });
|
|
66
|
-
|
|
67
|
-
/** Fires when the item is activated (click / Enter / Space) and not disabled. Emits `value()`. */
|
|
68
|
-
readonly activate = output<T | undefined>();
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Stable id used by `aria-activedescendant`. Resolved at construction.
|
|
72
|
-
* Priority: existing host `id` attribute (static markup) → generated
|
|
73
|
-
* `kj-list-item-N`. To pin an id, write `<el id="my-id" kjListItem>`.
|
|
74
|
-
*/
|
|
75
|
-
readonly id: string;
|
|
76
|
-
|
|
77
|
-
private readonly el = inject(ElementRef<HTMLElement>);
|
|
78
|
-
readonly disabled = this.kjDisabled;
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Nearest ancestor `KjListItem` resolved via the element injector
|
|
82
|
-
* (`skipSelf`, `optional`). Surfaces the DOM-nested parent → child
|
|
83
|
-
* relationship to the selection model, which auto-derives a tree
|
|
84
|
-
* shape from these pointers when the consumer does not supply one
|
|
85
|
-
* via `cfg.treeShape`. Flat consumers (e.g. data-driven tree-select)
|
|
86
|
-
* pass an explicit shape and this pointer is ignored.
|
|
87
|
-
*/
|
|
88
|
-
readonly parent = inject<KjListItem<unknown> | null>(KjListItem, {
|
|
89
|
-
skipSelf: true,
|
|
90
|
-
optional: true,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// Optional — only present when this item lives inside a
|
|
94
|
-
// `[kjListNavigator]` (the common case). Read by `tabIndex()` so the
|
|
95
|
-
// item can reactively re-bind its host `tabindex` as activeId moves.
|
|
96
|
-
// forwardRef avoids the navigator <-> item circular reference issue.
|
|
97
|
-
private readonly navigator = inject<KjListNavigator | null>(
|
|
98
|
-
forwardRef(() => KjListNavigator),
|
|
99
|
-
{ optional: true },
|
|
100
|
-
);
|
|
101
|
-
// Focus mode signal provided by the navigator. Optional: when no
|
|
102
|
-
// navigator hosts this item, fall back to activedescendant behavior
|
|
103
|
-
// (always `-1`) — matches the legacy tabindex output.
|
|
104
|
-
private readonly focusMode = inject(KJ_LIST_FOCUS_MODE, { optional: true });
|
|
105
|
-
|
|
106
|
-
constructor() {
|
|
107
|
-
const host = this.el.nativeElement;
|
|
108
|
-
this.id = host.id || `kj-list-item-${++_id}`;
|
|
109
|
-
host.id = this.id;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** @internal Native host element. Used by `KjListNavigator` to call `.focus()` in roving mode. */
|
|
113
|
-
_host(): HTMLElement {
|
|
114
|
-
return this.el.nativeElement;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Reactive `tabindex` for the host element:
|
|
119
|
-
* - No navigator / `'activedescendant'`: always `-1` — the navigator
|
|
120
|
-
* host owns the Tab stop and signals activation via
|
|
121
|
-
* `aria-activedescendant`.
|
|
122
|
-
* - `'roving'`: `0` for the currently active (focused) item and `-1`
|
|
123
|
-
* for the rest. Disabled items are never active because
|
|
124
|
-
* `KjListNavigator.navigable` filters them out, so they naturally
|
|
125
|
-
* read `-1` here.
|
|
126
|
-
*/
|
|
127
|
-
readonly tabIndex = computed<string>(() => {
|
|
128
|
-
const mode = this.focusMode?.();
|
|
129
|
-
if (mode !== 'roving') return '-1';
|
|
130
|
-
if (this.disabled()) return '-1';
|
|
131
|
-
return this.navigator?.activeId() === this.id ? '0' : '-1';
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
private readonly _elText = signal('');
|
|
135
|
-
readonly value = computed<T | undefined>(() => this.kjItemValue());
|
|
136
|
-
readonly label = computed(() => (this.kjItemLabel() || this._elText()).trim());
|
|
137
|
-
readonly haystacks = computed<readonly string[]>(() => [this.label(), ...this.kjItemKeywords()]);
|
|
138
|
-
|
|
139
|
-
private readonly _visible = signal(true);
|
|
140
|
-
readonly visible = this._visible.asReadonly();
|
|
141
|
-
setVisible(v: boolean): void { this._visible.set(v); }
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Position in the visible (filter-aware) set, bound to `aria-posinset`.
|
|
145
|
-
* Writable for internal use by `KjFilterableList` only; consumers
|
|
146
|
-
* should treat it as read-only.
|
|
147
|
-
*/
|
|
148
|
-
readonly posInSet = signal<number | null>(null);
|
|
149
|
-
/**
|
|
150
|
-
* Total size of the visible (filter-aware) set, bound to `aria-setsize`.
|
|
151
|
-
* Writable for internal use by `KjFilterableList` only; consumers
|
|
152
|
-
* should treat it as read-only.
|
|
153
|
-
*/
|
|
154
|
-
readonly setSize = signal<number | null>(null);
|
|
155
|
-
|
|
156
|
-
private readonly selection = inject(KjSelectionModel, { optional: true }) as KjSelectionModel<T> | null;
|
|
157
|
-
private readonly cfg = inject(KJ_LIST_NAVIGATOR_CONFIG, { optional: true });
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* `aria-selected` driven by the injected selection model. `null` when
|
|
161
|
-
* no model is provided, the value is undefined, or the mode is
|
|
162
|
-
* `'cascade'` (which uses `aria-checked` instead, per WAI-ARIA tree).
|
|
163
|
-
*/
|
|
164
|
-
readonly ariaSelected = computed<'true' | 'false' | null>(() => {
|
|
165
|
-
if (!this.selection) return null;
|
|
166
|
-
if (this.selection.mode() === 'cascade') return null;
|
|
167
|
-
const v = this.value();
|
|
168
|
-
if (v === undefined) return null;
|
|
169
|
-
return this.selection.isSelected(v) ? 'true' : 'false';
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* `aria-checked` driven by `KjSelectionModel.cascadeState()` when the
|
|
174
|
-
* mode is `'cascade'`. Returns `'true'` / `'false'` / `'mixed'` per
|
|
175
|
-
* the WAI-ARIA tree checkbox tri-state pattern. `null` (attribute
|
|
176
|
-
* omitted) in any other mode.
|
|
177
|
-
*/
|
|
178
|
-
readonly ariaChecked = computed<'true' | 'false' | 'mixed' | null>(() => {
|
|
179
|
-
if (!this.selection || this.selection.mode() !== 'cascade') return null;
|
|
180
|
-
const v = this.value();
|
|
181
|
-
if (v === undefined) return null;
|
|
182
|
-
return this.selection.cascadeState(v);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
ngAfterContentInit(): void {
|
|
186
|
-
this._elText.set(this.el.nativeElement.textContent ?? '');
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
_activate(event?: Event): void {
|
|
190
|
-
if (this.disabled()) return;
|
|
191
|
-
const v = this.value();
|
|
192
|
-
// Branch gate owned by the selection model: in `'single'` mode
|
|
193
|
-
// with a tree shape (consumer-supplied or auto-derived from
|
|
194
|
-
// KjListItem parent DI), non-leaf targets must not commit a value
|
|
195
|
-
// — they exist purely as disclosure controls (e.g. cascade-select
|
|
196
|
-
// branch options that only toggle their own sub-panel). Runs
|
|
197
|
-
// before `stopPropagation` so a blocked click can still reach the
|
|
198
|
-
// consumer's own host listener.
|
|
199
|
-
if (v !== undefined && this.selection && !this.selection.canActivate(v)) return;
|
|
200
|
-
// Stop bubbling so a click on a nested `kjListItem` doesn't also
|
|
201
|
-
// activate the ancestor item (matters for tree-style consumers
|
|
202
|
-
// where leaf nodes are rendered inside their parent branch's host
|
|
203
|
-
// element — without this, the leaf activation would be followed
|
|
204
|
-
// by the branch's `_activate` overriding the selection).
|
|
205
|
-
event?.stopPropagation();
|
|
206
|
-
// Selection toggle + consumer hook live here — not in the option
|
|
207
|
-
// wrapper — because every list-style cluster that wires a
|
|
208
|
-
// `KjSelectionModel` repeats the same two steps after activation:
|
|
209
|
-
// (1) toggle the value, (2) run consumer-specific side-effects
|
|
210
|
-
// (close the overlay, set an input query, emit a commit event).
|
|
211
|
-
// Centralizing both removes the per-option `activate.subscribe(...)`
|
|
212
|
-
// boilerplate. `afterSelect` is invoked even when the toggle was a
|
|
213
|
-
// no-op (e.g. leaf-mode branch click) so consumers can decide what
|
|
214
|
-
// counts as "select" — they receive `closeRequested` to gate on.
|
|
215
|
-
let closeRequested = false;
|
|
216
|
-
if (this.selection && v !== undefined) {
|
|
217
|
-
({ closeRequested } = this.selection.toggle(v));
|
|
218
|
-
}
|
|
219
|
-
this.cfg?.afterSelect?.(v, closeRequested);
|
|
220
|
-
this.activate.emit(v);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
// packages/core/src/primitives/list/navigator.spec.ts
|
|
2
|
-
import { Component, Directive, contentChildren, forwardRef, signal } from '@angular/core';
|
|
3
|
-
import { By } from '@angular/platform-browser';
|
|
4
|
-
import { render, type RenderResult } from '@testing-library/angular';
|
|
5
|
-
import { describe, it, expect } from 'vitest';
|
|
6
|
-
import { KjListNavigator } from './navigator';
|
|
7
|
-
import { KjListItem } from './item';
|
|
8
|
-
import { KjTypeAhead } from './type-ahead';
|
|
9
|
-
import { KJ_LIST_NAVIGATOR_CONFIG } from './tokens';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Minimal test root that registers child KjListItems into
|
|
13
|
-
* KJ_LIST_NAVIGATOR_CONFIG via contentChildren — same pattern as
|
|
14
|
-
* KjSelect / KjCombobox. Used by the focus-mode tests below.
|
|
15
|
-
*/
|
|
16
|
-
@Directive({
|
|
17
|
-
selector: '[kjTestListRoot]',
|
|
18
|
-
standalone: true,
|
|
19
|
-
providers: [
|
|
20
|
-
{ provide: KJ_LIST_NAVIGATOR_CONFIG, useExisting: forwardRef(() => TestListRoot) },
|
|
21
|
-
],
|
|
22
|
-
})
|
|
23
|
-
class TestListRoot {
|
|
24
|
-
readonly items = contentChildren(KjListItem, { descendants: true });
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Shape that mirrors the parts of KjListItem the navigator reads. */
|
|
28
|
-
function fakeItem(id: string, label: string, disabled = false) {
|
|
29
|
-
let activated = 0;
|
|
30
|
-
return {
|
|
31
|
-
id,
|
|
32
|
-
label: () => label,
|
|
33
|
-
disabled: () => disabled,
|
|
34
|
-
_activate: () => { activated++; },
|
|
35
|
-
get activated() { return activated; },
|
|
36
|
-
} as unknown as KjListItem<unknown> & { activated: number; _activate: () => void };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function setup(items: ReturnType<typeof fakeItem>[], opts: { wrap?: boolean; orientation?: 'vertical' | 'horizontal' | 'both' } = {}) {
|
|
40
|
-
const orientationAttr = opts.orientation ? ` [kjOrientation]="'${opts.orientation}'"` : '';
|
|
41
|
-
const wrapAttr = opts.wrap === false ? ` [kjWrap]="false"` : '';
|
|
42
|
-
return render(
|
|
43
|
-
`<div kjListNavigator${orientationAttr}${wrapAttr}></div>`,
|
|
44
|
-
{
|
|
45
|
-
imports: [KjListNavigator],
|
|
46
|
-
providers: [
|
|
47
|
-
KjTypeAhead,
|
|
48
|
-
{
|
|
49
|
-
provide: KJ_LIST_NAVIGATOR_CONFIG,
|
|
50
|
-
useValue: { items: signal(items) },
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
},
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Dispatch a keydown and flush change detection so host bindings reach the DOM. */
|
|
58
|
-
function press(host: HTMLElement, fixture: RenderResult<unknown>['fixture'], key: string): KeyboardEvent {
|
|
59
|
-
const e = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true });
|
|
60
|
-
host.dispatchEvent(e);
|
|
61
|
-
fixture.detectChanges();
|
|
62
|
-
return e;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
describe('KjListNavigator', () => {
|
|
66
|
-
it('starts with no active item', async () => {
|
|
67
|
-
const { container } = await setup([fakeItem('1', 'A'), fakeItem('2', 'B')]);
|
|
68
|
-
const host = container.querySelector('[kjListNavigator]')!;
|
|
69
|
-
expect(host.hasAttribute('aria-activedescendant')).toBe(false);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('ArrowDown moves to next item, wraps past last when kjWrap=true', async () => {
|
|
73
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
|
|
74
|
-
const { container, fixture } = await setup(items);
|
|
75
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
76
|
-
press(host, fixture, 'ArrowDown');
|
|
77
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('1');
|
|
78
|
-
press(host, fixture, 'ArrowDown');
|
|
79
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('2');
|
|
80
|
-
press(host, fixture, 'ArrowDown');
|
|
81
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('1');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('ArrowUp wraps to last item from first', async () => {
|
|
85
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
|
|
86
|
-
const { container, fixture } = await setup(items);
|
|
87
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
88
|
-
press(host, fixture, 'ArrowUp');
|
|
89
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('2');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('skips disabled items during navigation', async () => {
|
|
93
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B', true), fakeItem('3', 'C')];
|
|
94
|
-
const { container, fixture } = await setup(items);
|
|
95
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
96
|
-
press(host, fixture, 'ArrowDown');
|
|
97
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('1');
|
|
98
|
-
press(host, fixture, 'ArrowDown');
|
|
99
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('3');
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('Home moves to first, End moves to last', async () => {
|
|
103
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B'), fakeItem('3', 'C')];
|
|
104
|
-
const { container, fixture } = await setup(items);
|
|
105
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
106
|
-
press(host, fixture, 'End');
|
|
107
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('3');
|
|
108
|
-
press(host, fixture, 'Home');
|
|
109
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('1');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('Enter calls _activate on the current item and preventDefaults', async () => {
|
|
113
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
|
|
114
|
-
const { container, fixture } = await setup(items);
|
|
115
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
116
|
-
press(host, fixture, 'ArrowDown');
|
|
117
|
-
const e = press(host, fixture, 'Enter');
|
|
118
|
-
expect((items[0] as { activated: number }).activated).toBe(1);
|
|
119
|
-
expect(e.defaultPrevented).toBe(true);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('Enter does NOT preventDefault when there is no active item', async () => {
|
|
123
|
-
const items = [fakeItem('1', 'A')];
|
|
124
|
-
const { container, fixture } = await setup(items);
|
|
125
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
126
|
-
const e = press(host, fixture, 'Enter');
|
|
127
|
-
expect(e.defaultPrevented).toBe(false);
|
|
128
|
-
expect((items[0] as { activated: number }).activated).toBe(0);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('Space activates current item', async () => {
|
|
132
|
-
const items = [fakeItem('1', 'A')];
|
|
133
|
-
const { container, fixture } = await setup(items);
|
|
134
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
135
|
-
press(host, fixture, 'ArrowDown');
|
|
136
|
-
press(host, fixture, ' ');
|
|
137
|
-
expect((items[0] as { activated: number }).activated).toBe(1);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('PageDown moves by kjPageSize (default 10)', async () => {
|
|
141
|
-
const items = Array.from({ length: 15 }, (_, i) => fakeItem(String(i + 1), 'Item ' + (i + 1)));
|
|
142
|
-
const { container, fixture } = await setup(items);
|
|
143
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
144
|
-
press(host, fixture, 'ArrowDown');
|
|
145
|
-
press(host, fixture, 'PageDown');
|
|
146
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('11');
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('delegates single-char keys to KjTypeAhead and activates the match', async () => {
|
|
150
|
-
const items = [fakeItem('1', 'Apple'), fakeItem('2', 'Banana')];
|
|
151
|
-
const { container, fixture } = await setup(items);
|
|
152
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
153
|
-
press(host, fixture, 'b');
|
|
154
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('2');
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('kjOrientation="horizontal" responds to ArrowLeft/Right not Up/Down', async () => {
|
|
158
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
|
|
159
|
-
const { container, fixture } = await setup(items, { orientation: 'horizontal' });
|
|
160
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
161
|
-
press(host, fixture, 'ArrowDown');
|
|
162
|
-
expect(host.hasAttribute('aria-activedescendant')).toBe(false);
|
|
163
|
-
press(host, fixture, 'ArrowRight');
|
|
164
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('1');
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('kjWrap=false clamps at last item instead of wrapping', async () => {
|
|
168
|
-
const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
|
|
169
|
-
const { container, fixture } = await setup(items, { wrap: false });
|
|
170
|
-
const host = container.querySelector('[kjListNavigator]') as HTMLElement;
|
|
171
|
-
press(host, fixture, 'End');
|
|
172
|
-
press(host, fixture, 'ArrowDown');
|
|
173
|
-
expect(host.getAttribute('aria-activedescendant')).toBe('2');
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
describe('KjListNavigator focus modes', () => {
|
|
178
|
-
it('default activedescendant: all KjListItem tabindex=-1', async () => {
|
|
179
|
-
@Component({
|
|
180
|
-
standalone: true,
|
|
181
|
-
imports: [KjListNavigator, KjListItem, TestListRoot],
|
|
182
|
-
template: `
|
|
183
|
-
<div kjTestListRoot kjListNavigator>
|
|
184
|
-
<div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
|
|
185
|
-
<div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
|
|
186
|
-
</div>
|
|
187
|
-
`,
|
|
188
|
-
})
|
|
189
|
-
class Host {}
|
|
190
|
-
const { container } = await render(Host);
|
|
191
|
-
const els = container.querySelectorAll('[kjListItem]');
|
|
192
|
-
els.forEach(el => expect(el.getAttribute('tabindex')).toBe('-1'));
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it('roving mode: first item is tabindex=0 on first render, others -1', async () => {
|
|
196
|
-
@Component({
|
|
197
|
-
standalone: true,
|
|
198
|
-
imports: [KjListNavigator, KjListItem, TestListRoot],
|
|
199
|
-
template: `
|
|
200
|
-
<div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'">
|
|
201
|
-
<div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
|
|
202
|
-
<div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
|
|
203
|
-
<div role="option" aria-selected="false" kjListItem id="c" [kjItemValue]="'c'">C</div>
|
|
204
|
-
</div>
|
|
205
|
-
`,
|
|
206
|
-
})
|
|
207
|
-
class Host {}
|
|
208
|
-
const { container, fixture } = await render(Host);
|
|
209
|
-
fixture.detectChanges();
|
|
210
|
-
const a = container.querySelector('#a')!;
|
|
211
|
-
const b = container.querySelector('#b')!;
|
|
212
|
-
const c = container.querySelector('#c')!;
|
|
213
|
-
expect(a.getAttribute('tabindex')).toBe('0');
|
|
214
|
-
expect(b.getAttribute('tabindex')).toBe('-1');
|
|
215
|
-
expect(c.getAttribute('tabindex')).toBe('-1');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('roving mode: moveBy(1) flips the tabbable item to the next', async () => {
|
|
219
|
-
@Component({
|
|
220
|
-
standalone: true,
|
|
221
|
-
imports: [KjListNavigator, KjListItem, TestListRoot],
|
|
222
|
-
template: `
|
|
223
|
-
<div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'" #nav="kjListNavigator">
|
|
224
|
-
<div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
|
|
225
|
-
<div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
|
|
226
|
-
</div>
|
|
227
|
-
`,
|
|
228
|
-
})
|
|
229
|
-
class Host {}
|
|
230
|
-
const { container, fixture } = await render(Host);
|
|
231
|
-
fixture.detectChanges();
|
|
232
|
-
const nav = fixture.debugElement.query(By.directive(KjListNavigator)).injector.get(KjListNavigator);
|
|
233
|
-
nav.moveBy(1);
|
|
234
|
-
fixture.detectChanges();
|
|
235
|
-
const a = container.querySelector('#a')!;
|
|
236
|
-
const b = container.querySelector('#b')!;
|
|
237
|
-
expect(a.getAttribute('tabindex')).toBe('-1');
|
|
238
|
-
expect(b.getAttribute('tabindex')).toBe('0');
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it('roving mode: disabled items get -1 even when first; first navigable seeded', async () => {
|
|
242
|
-
@Component({
|
|
243
|
-
standalone: true,
|
|
244
|
-
imports: [KjListNavigator, KjListItem, TestListRoot],
|
|
245
|
-
template: `
|
|
246
|
-
<div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'">
|
|
247
|
-
<div role="option" aria-selected="false" kjListItem id="a" [kjDisabled]="true" [kjItemValue]="'a'">A</div>
|
|
248
|
-
<div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
|
|
249
|
-
<div role="option" aria-selected="false" kjListItem id="c" [kjItemValue]="'c'">C</div>
|
|
250
|
-
</div>
|
|
251
|
-
`,
|
|
252
|
-
})
|
|
253
|
-
class Host {}
|
|
254
|
-
const { container, fixture } = await render(Host);
|
|
255
|
-
fixture.detectChanges();
|
|
256
|
-
const a = container.querySelector('#a')!;
|
|
257
|
-
const b = container.querySelector('#b')!;
|
|
258
|
-
const c = container.querySelector('#c')!;
|
|
259
|
-
// Disabled first item: tabindex=-1, first navigable (b) gets 0.
|
|
260
|
-
expect(a.getAttribute('tabindex')).toBe('-1');
|
|
261
|
-
expect(b.getAttribute('tabindex')).toBe('0');
|
|
262
|
-
expect(c.getAttribute('tabindex')).toBe('-1');
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
it('roving mode: setActive(id) moves focus to that item\'s host element', async () => {
|
|
266
|
-
@Component({
|
|
267
|
-
standalone: true,
|
|
268
|
-
imports: [KjListNavigator, KjListItem, TestListRoot],
|
|
269
|
-
template: `
|
|
270
|
-
<div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'">
|
|
271
|
-
<div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
|
|
272
|
-
<div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
|
|
273
|
-
</div>
|
|
274
|
-
`,
|
|
275
|
-
})
|
|
276
|
-
class Host {}
|
|
277
|
-
const { container, fixture } = await render(Host);
|
|
278
|
-
fixture.detectChanges();
|
|
279
|
-
const nav = fixture.debugElement.query(By.directive(KjListNavigator)).injector.get(KjListNavigator);
|
|
280
|
-
const b = container.querySelector('#b') as HTMLElement;
|
|
281
|
-
nav.setActive('b');
|
|
282
|
-
fixture.detectChanges();
|
|
283
|
-
expect(document.activeElement).toBe(b);
|
|
284
|
-
expect(b.getAttribute('tabindex')).toBe('0');
|
|
285
|
-
});
|
|
286
|
-
});
|