@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
package/src/spinner/spinner.ts
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DestroyRef,
|
|
3
|
-
Directive,
|
|
4
|
-
ElementRef,
|
|
5
|
-
afterNextRender,
|
|
6
|
-
computed,
|
|
7
|
-
inject,
|
|
8
|
-
input,
|
|
9
|
-
signal,
|
|
10
|
-
} from '@angular/core';
|
|
11
|
-
import { KjSize, KjVariant, bindPresets } from '../presets';
|
|
12
|
-
import { KJ_SPINNER_CONFIG, KjSpinnerAnimation } from './config';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Marks an element as a kouji indeterminate spinner. Owns the small
|
|
16
|
-
* accessibility contract (`role="status"`, default `aria-label="Loading"`,
|
|
17
|
-
* `prefers-reduced-motion` reflection) and reflects `data-animation`,
|
|
18
|
-
* `data-variant`, and `data-size` for the theme to render the visual glyph.
|
|
19
|
-
*
|
|
20
|
-
* The host element is consumer-supplied — usually a `<span kjSpinner>`. The
|
|
21
|
-
* directive itself emits no markup; the surrounding wrapper / template is
|
|
22
|
-
* responsible for the visually-hidden label fallback when no consumer label
|
|
23
|
-
* is provided. The directive does set `aria-label` to the default when
|
|
24
|
-
* neither `aria-label` nor `aria-labelledby` is already on the host.
|
|
25
|
-
*
|
|
26
|
-
* **Indeterminate-only.** A determinate "x of y" indicator is a Progress
|
|
27
|
-
* Bar — different role, different ARIA contract; do not bend Spinner to fit.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```html
|
|
31
|
-
* <span kjSpinner></span>
|
|
32
|
-
* <span kjSpinner kjAnimation="dots" kjAriaLabel="Sending"></span>
|
|
33
|
-
* ```
|
|
34
|
-
* @doc-category Core/Feedback
|
|
35
|
-
* @doc
|
|
36
|
-
* @doc-name spinner
|
|
37
|
-
* @doc-description Marks an element as an indeterminate loading indicator with the right accessibility role and label.
|
|
38
|
-
* @doc-is-main
|
|
39
|
-
*/
|
|
40
|
-
@Directive({
|
|
41
|
-
selector: '[kjSpinner]',
|
|
42
|
-
standalone: true,
|
|
43
|
-
exportAs: 'kjSpinner',
|
|
44
|
-
hostDirectives: [
|
|
45
|
-
{ directive: KjVariant, inputs: ['kjVariant'] },
|
|
46
|
-
{ directive: KjSize, inputs: ['kjSize'] },
|
|
47
|
-
],
|
|
48
|
-
providers: [...bindPresets(KJ_SPINNER_CONFIG)],
|
|
49
|
-
host: {
|
|
50
|
-
role: 'status',
|
|
51
|
-
'aria-live': 'polite',
|
|
52
|
-
'aria-atomic': 'true',
|
|
53
|
-
'[attr.data-animation]': 'kjAnimation()',
|
|
54
|
-
'[attr.data-reduced-motion]': 'reducedMotion() ? "true" : null',
|
|
55
|
-
'[attr.aria-label]': 'ariaLabelAttr()',
|
|
56
|
-
},
|
|
57
|
-
})
|
|
58
|
-
export class KjSpinner {
|
|
59
|
-
private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
|
|
60
|
-
private readonly config = inject(KJ_SPINNER_CONFIG);
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Animation shape preset. Reflects `data-animation`. Default `'spin'`.
|
|
64
|
-
* Themes own the keyframes for each value.
|
|
65
|
-
*/
|
|
66
|
-
readonly kjAnimation = input<KjSpinnerAnimation>(
|
|
67
|
-
(this.config.defaults.animation as KjSpinnerAnimation) ?? 'spin',
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Accessible name announced by AT. Bound to `aria-label` when the host has
|
|
72
|
-
* no `aria-label` attribute and no `aria-labelledby` attribute already set
|
|
73
|
-
* (so a consumer-authored `aria-labelledby` wins, and a consumer-authored
|
|
74
|
-
* `aria-label` is not double-bound).
|
|
75
|
-
*/
|
|
76
|
-
readonly kjAriaLabel = input<string>(this.config.defaults.ariaLabel ?? 'Loading');
|
|
77
|
-
|
|
78
|
-
/** True when the host had a consumer-authored `aria-labelledby` at mount. */
|
|
79
|
-
protected readonly hasAriaLabelledBy: boolean;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Captured value of the consumer-authored `aria-label` HTML attribute at
|
|
83
|
-
* mount, or `null` if none was set. We re-emit it through the host
|
|
84
|
-
* binding so Angular doesn't strip the original (a host `[attr.aria-label]`
|
|
85
|
-
* binding always wins over the static attribute, so leaving the binding
|
|
86
|
-
* unconditional but echoing the captured value preserves the consumer
|
|
87
|
-
* intent).
|
|
88
|
-
*/
|
|
89
|
-
protected readonly nativeAriaLabel: string | null;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Reflects the user's `prefers-reduced-motion` preference. The directive
|
|
93
|
-
* does not animate anything itself — it mirrors the boolean as
|
|
94
|
-
* `data-reduced-motion="true"` and themes own the alternate keyframe.
|
|
95
|
-
*/
|
|
96
|
-
protected readonly reducedMotion = signal<boolean>(false);
|
|
97
|
-
|
|
98
|
-
protected readonly ariaLabelAttr = computed(() => {
|
|
99
|
-
if (this.hasAriaLabelledBy) return null;
|
|
100
|
-
if (this.nativeAriaLabel !== null) return this.nativeAriaLabel;
|
|
101
|
-
return this.kjAriaLabel();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
constructor() {
|
|
105
|
-
const destroyRef = inject(DestroyRef);
|
|
106
|
-
|
|
107
|
-
// Read consumer-authored aria attributes synchronously in the
|
|
108
|
-
// constructor — by the time `afterNextRender` runs, Angular's host
|
|
109
|
-
// binding for `[attr.aria-label]` has already overwritten the original
|
|
110
|
-
// attribute with the computed default, which would make the detection
|
|
111
|
-
// see kouji's own value and ignore the consumer's.
|
|
112
|
-
const host = this.el.nativeElement;
|
|
113
|
-
this.hasAriaLabelledBy = host.hasAttribute('aria-labelledby');
|
|
114
|
-
this.nativeAriaLabel = host.getAttribute('aria-label');
|
|
115
|
-
|
|
116
|
-
afterNextRender(() => {
|
|
117
|
-
// SSR-safe: matchMedia is only present in a real browser. The
|
|
118
|
-
// server-rendered HTML carries no `data-reduced-motion`; the post-
|
|
119
|
-
// hydrate read sets it on the client when the preference is active.
|
|
120
|
-
if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
|
|
121
|
-
const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
122
|
-
this.reducedMotion.set(mql.matches);
|
|
123
|
-
const onChange = (e: MediaQueryListEvent) => this.reducedMotion.set(e.matches);
|
|
124
|
-
mql.addEventListener('change', onChange);
|
|
125
|
-
destroyRef.onDestroy(() => mql.removeEventListener('change', onChange));
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
package/src/stepper/index.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
KjStepper,
|
|
3
|
-
KjStep,
|
|
4
|
-
KjStepLabel,
|
|
5
|
-
KjStepContent,
|
|
6
|
-
KjStepperNext,
|
|
7
|
-
KjStepperPrevious,
|
|
8
|
-
KjStepperReset,
|
|
9
|
-
} from './stepper';
|
|
10
|
-
export {
|
|
11
|
-
KJ_STEPPER,
|
|
12
|
-
KJ_STEP,
|
|
13
|
-
type KjStepperContext,
|
|
14
|
-
type KjStepContext,
|
|
15
|
-
} from './stepper.context';
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, Signal } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
/** Per-step context exposed to `KjStepLabel` and `KjStepContent`. */
|
|
4
|
-
export interface KjStepContext {
|
|
5
|
-
/** 0-based index in the parent stepper's step set. */
|
|
6
|
-
readonly index: Signal<number>;
|
|
7
|
-
/** True when this step is the active one. */
|
|
8
|
-
readonly active: Signal<boolean>;
|
|
9
|
-
/** True when this step has been completed (consumer-set via `kjStepCompleted`). */
|
|
10
|
-
readonly completed: Signal<boolean>;
|
|
11
|
-
/** True when this step is in an error state (consumer-set via `kjStepError`). */
|
|
12
|
-
readonly error: Signal<boolean>;
|
|
13
|
-
/** True when this step is optional (does not gate linear advancement). */
|
|
14
|
-
readonly optional: Signal<boolean>;
|
|
15
|
-
/** True when this step is reachable in the current mode. */
|
|
16
|
-
readonly reachable: Signal<boolean>;
|
|
17
|
-
/** True when this step is explicitly disabled by the consumer. */
|
|
18
|
-
readonly disabled: Signal<boolean>;
|
|
19
|
-
/** Optional consumer-supplied semantic key, used by `goToKey()`. */
|
|
20
|
-
readonly key: Signal<string | undefined>;
|
|
21
|
-
/** Stable id for `aria-labelledby` wiring. */
|
|
22
|
-
readonly labelId: Signal<string>;
|
|
23
|
-
/** Stable id for the content region. */
|
|
24
|
-
readonly contentId: Signal<string>;
|
|
25
|
-
/** Activate this step (subject to linear-mode gating). */
|
|
26
|
-
activate(): void;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Stepper-root context exposed to step / label / content / command directives. */
|
|
30
|
-
export interface KjStepperContext {
|
|
31
|
-
/** Active step index (0-based). */
|
|
32
|
-
readonly activeStep: Signal<number>;
|
|
33
|
-
/** Total number of registered steps. */
|
|
34
|
-
readonly totalSteps: Signal<number>;
|
|
35
|
-
/** @internal — read-only view of registered steps in registration order. */
|
|
36
|
-
readonly steps: Signal<readonly KjStepContext[]>;
|
|
37
|
-
/** Linear-mode flag. */
|
|
38
|
-
readonly linear: Signal<boolean>;
|
|
39
|
-
/** Orientation. */
|
|
40
|
-
readonly orientation: Signal<'horizontal' | 'vertical'>;
|
|
41
|
-
/** True when `next()` will succeed. */
|
|
42
|
-
readonly canAdvance: Signal<boolean>;
|
|
43
|
-
/** True when `previous()` will succeed. */
|
|
44
|
-
readonly canRetreat: Signal<boolean>;
|
|
45
|
-
/** Imperative navigation. */
|
|
46
|
-
next(): void;
|
|
47
|
-
previous(): void;
|
|
48
|
-
goTo(index: number): void;
|
|
49
|
-
goToKey(key: string): void;
|
|
50
|
-
reset(): void;
|
|
51
|
-
/** @internal — `KjStep` registers / unregisters here. */
|
|
52
|
-
register(step: KjStepContext): void;
|
|
53
|
-
/** @internal */
|
|
54
|
-
unregister(step: KjStepContext): void;
|
|
55
|
-
/** @internal — `KjStep` reports its reachability under linear gating. */
|
|
56
|
-
isReachable(index: number): boolean;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** Injection token for the root stepper directive. */
|
|
60
|
-
export const KJ_STEPPER = new InjectionToken<KjStepperContext>('KjStepper');
|
|
61
|
-
|
|
62
|
-
/** Injection token for an individual step directive. */
|
|
63
|
-
export const KJ_STEP = new InjectionToken<KjStepContext>('KjStep');
|
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
-
import { fireEvent, render } from '@testing-library/angular';
|
|
3
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
4
|
-
import {
|
|
5
|
-
KjStep,
|
|
6
|
-
KjStepContent,
|
|
7
|
-
KjStepLabel,
|
|
8
|
-
KjStepper,
|
|
9
|
-
KjStepperNext,
|
|
10
|
-
KjStepperPrevious,
|
|
11
|
-
KjStepperReset,
|
|
12
|
-
} from './stepper';
|
|
13
|
-
|
|
14
|
-
expect.extend(toHaveNoViolations);
|
|
15
|
-
|
|
16
|
-
const imports = [
|
|
17
|
-
KjStepper,
|
|
18
|
-
KjStep,
|
|
19
|
-
KjStepLabel,
|
|
20
|
-
KjStepContent,
|
|
21
|
-
KjStepperNext,
|
|
22
|
-
KjStepperPrevious,
|
|
23
|
-
KjStepperReset,
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
const baseTemplate = `
|
|
27
|
-
<ol kjStepper [(kjActiveStep)]="active">
|
|
28
|
-
<li kjStep>
|
|
29
|
-
<button kjStepLabel>Account</button>
|
|
30
|
-
<section kjStepContent>Account body</section>
|
|
31
|
-
</li>
|
|
32
|
-
<li kjStep>
|
|
33
|
-
<button kjStepLabel>Profile</button>
|
|
34
|
-
<section kjStepContent>Profile body</section>
|
|
35
|
-
</li>
|
|
36
|
-
<li kjStep>
|
|
37
|
-
<button kjStepLabel>Confirm</button>
|
|
38
|
-
<section kjStepContent>Confirm body</section>
|
|
39
|
-
</li>
|
|
40
|
-
<li>
|
|
41
|
-
<button kjStepperPrevious>Back</button>
|
|
42
|
-
<button kjStepperNext>Next</button>
|
|
43
|
-
<button kjStepperReset>Reset</button>
|
|
44
|
-
</li>
|
|
45
|
-
</ol>`;
|
|
46
|
-
|
|
47
|
-
@Component({
|
|
48
|
-
standalone: true,
|
|
49
|
-
imports,
|
|
50
|
-
changeDetection: ChangeDetectionStrategy.Eager,
|
|
51
|
-
template: baseTemplate,
|
|
52
|
-
})
|
|
53
|
-
class BasicHostComponent {
|
|
54
|
-
active = 0;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
describe('KjStepper', () => {
|
|
58
|
-
describe('roles + ARIA', () => {
|
|
59
|
-
it('renders the root with native <ol> semantics and data-orientation', async () => {
|
|
60
|
-
const { container } = await render(BasicHostComponent);
|
|
61
|
-
const root = container.querySelector('[kjStepper]')!;
|
|
62
|
-
expect(root.tagName).toBe('OL');
|
|
63
|
-
// We deliberately do not set `aria-orientation` — axe `aria-allowed-attr`
|
|
64
|
-
// rejects it on the implicit `list` role. The keyboard axis is enforced
|
|
65
|
-
// via `KjRovingTabindex`; visual layout reads `data-orientation`.
|
|
66
|
-
expect(root).not.toHaveAttribute('aria-orientation');
|
|
67
|
-
expect(root).toHaveAttribute('data-orientation', 'horizontal');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('marks the active step with aria-current="step" and inactive steps without it', async () => {
|
|
71
|
-
const { container } = await render(BasicHostComponent);
|
|
72
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
73
|
-
expect(steps[0]).toHaveAttribute('aria-current', 'step');
|
|
74
|
-
expect(steps[1]).not.toHaveAttribute('aria-current');
|
|
75
|
-
expect(steps[2]).not.toHaveAttribute('aria-current');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('wires step content as role="region" with aria-labelledby to the label id', async () => {
|
|
79
|
-
const { container } = await render(BasicHostComponent);
|
|
80
|
-
const label = container.querySelectorAll('[kjStepLabel]')[0];
|
|
81
|
-
const content = container.querySelectorAll('[kjStepContent]')[0];
|
|
82
|
-
expect(content).toHaveAttribute('role', 'region');
|
|
83
|
-
expect(label.getAttribute('id')).toBeTruthy();
|
|
84
|
-
expect(content.getAttribute('aria-labelledby')).toBe(label.getAttribute('id'));
|
|
85
|
-
expect(label.getAttribute('aria-controls')).toBe(content.getAttribute('id'));
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('hides inactive content panels via [hidden] and [inert]', async () => {
|
|
89
|
-
const { container } = await render(BasicHostComponent);
|
|
90
|
-
const contents = container.querySelectorAll('[kjStepContent]');
|
|
91
|
-
expect(contents[0]).not.toHaveAttribute('hidden');
|
|
92
|
-
expect(contents[1]).toHaveAttribute('hidden', '');
|
|
93
|
-
expect(contents[1]).toHaveAttribute('inert', '');
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it('passes axe audit', async () => {
|
|
97
|
-
const { container } = await render(BasicHostComponent);
|
|
98
|
-
// Step content elements with `aria-labelledby` may be flagged when their
|
|
99
|
-
// referenced label is hidden; restrict the audit to the always-visible
|
|
100
|
-
// header strip + active panel for a clean signal.
|
|
101
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('active step via index', () => {
|
|
106
|
-
it('writing to kjActiveStep activates the matching step', async () => {
|
|
107
|
-
const fixture = await render(BasicHostComponent);
|
|
108
|
-
fixture.fixture.componentInstance.active = 1;
|
|
109
|
-
fixture.detectChanges();
|
|
110
|
-
const steps = fixture.container.querySelectorAll('[kjStep]');
|
|
111
|
-
expect(steps[0]).not.toHaveAttribute('aria-current');
|
|
112
|
-
expect(steps[1]).toHaveAttribute('aria-current', 'step');
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('out-of-range writes clamp to the valid range', async () => {
|
|
116
|
-
const fixture = await render(BasicHostComponent);
|
|
117
|
-
fixture.fixture.componentInstance.active = 99;
|
|
118
|
-
fixture.detectChanges();
|
|
119
|
-
// The clamping effect re-runs and pulls the model back into range.
|
|
120
|
-
await fixture.fixture.whenStable();
|
|
121
|
-
fixture.detectChanges();
|
|
122
|
-
const steps = fixture.container.querySelectorAll('[kjStep]');
|
|
123
|
-
expect(steps[2]).toHaveAttribute('aria-current', 'step');
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
describe('non-linear jumps', () => {
|
|
128
|
-
it('clicking any step header activates it', async () => {
|
|
129
|
-
const { container } = await render(BasicHostComponent);
|
|
130
|
-
const labels = container.querySelectorAll('[kjStepLabel]');
|
|
131
|
-
fireEvent.click(labels[2]);
|
|
132
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
133
|
-
expect(steps[2]).toHaveAttribute('aria-current', 'step');
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
describe('linear-mode reachability gating', () => {
|
|
138
|
-
@Component({
|
|
139
|
-
standalone: true,
|
|
140
|
-
imports,
|
|
141
|
-
template: `
|
|
142
|
-
<ol kjStepper [kjLinear]="true" [(kjActiveStep)]="active">
|
|
143
|
-
<li kjStep [kjStepCompleted]="step1Done()">
|
|
144
|
-
<button kjStepLabel>Account</button>
|
|
145
|
-
<section kjStepContent>Account</section>
|
|
146
|
-
</li>
|
|
147
|
-
<li kjStep [kjStepCompleted]="step2Done()">
|
|
148
|
-
<button kjStepLabel>Profile</button>
|
|
149
|
-
<section kjStepContent>Profile</section>
|
|
150
|
-
</li>
|
|
151
|
-
<li kjStep>
|
|
152
|
-
<button kjStepLabel>Confirm</button>
|
|
153
|
-
<section kjStepContent>Confirm</section>
|
|
154
|
-
</li>
|
|
155
|
-
<button kjStepperNext>Next</button>
|
|
156
|
-
</ol>
|
|
157
|
-
`,
|
|
158
|
-
})
|
|
159
|
-
class LinearHost {
|
|
160
|
-
active = 0;
|
|
161
|
-
readonly step1Done = signal(false);
|
|
162
|
-
readonly step2Done = signal(false);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
it('un-reached headers are aria-disabled in linear mode', async () => {
|
|
166
|
-
const { container } = await render(LinearHost);
|
|
167
|
-
const labels = container.querySelectorAll('[kjStepLabel]');
|
|
168
|
-
expect(labels[0]).not.toHaveAttribute('aria-disabled');
|
|
169
|
-
expect(labels[1]).toHaveAttribute('aria-disabled', 'true');
|
|
170
|
-
expect(labels[2]).toHaveAttribute('aria-disabled', 'true');
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('clicking an un-reached label is a no-op', async () => {
|
|
174
|
-
const { container } = await render(LinearHost);
|
|
175
|
-
const labels = container.querySelectorAll('[kjStepLabel]');
|
|
176
|
-
fireEvent.click(labels[2]);
|
|
177
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
178
|
-
expect(steps[0]).toHaveAttribute('aria-current', 'step');
|
|
179
|
-
expect(steps[2]).not.toHaveAttribute('aria-current');
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('next() is disabled when the active step is not completed', async () => {
|
|
183
|
-
const { container } = await render(LinearHost);
|
|
184
|
-
const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
|
|
185
|
-
expect(next).toHaveAttribute('disabled', '');
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('next() advances after the active step is marked completed', async () => {
|
|
189
|
-
const fixture = await render(LinearHost);
|
|
190
|
-
fixture.fixture.componentInstance.step1Done.set(true);
|
|
191
|
-
fixture.detectChanges();
|
|
192
|
-
const next = fixture.container.querySelector('[kjStepperNext]') as HTMLButtonElement;
|
|
193
|
-
expect(next).not.toHaveAttribute('disabled');
|
|
194
|
-
fireEvent.click(next);
|
|
195
|
-
fixture.detectChanges();
|
|
196
|
-
const steps = fixture.container.querySelectorAll('[kjStep]');
|
|
197
|
-
expect(steps[1]).toHaveAttribute('aria-current', 'step');
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it('once a step is completed the next header becomes reachable', async () => {
|
|
201
|
-
const fixture = await render(LinearHost);
|
|
202
|
-
fixture.fixture.componentInstance.step1Done.set(true);
|
|
203
|
-
fixture.detectChanges();
|
|
204
|
-
const labels = fixture.container.querySelectorAll('[kjStepLabel]');
|
|
205
|
-
expect(labels[1]).not.toHaveAttribute('aria-disabled');
|
|
206
|
-
// Step 3 still gated because step 2 isn't done yet.
|
|
207
|
-
expect(labels[2]).toHaveAttribute('aria-disabled', 'true');
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
describe('step completion + error reflection', () => {
|
|
212
|
-
@Component({
|
|
213
|
-
standalone: true,
|
|
214
|
-
imports,
|
|
215
|
-
template: `
|
|
216
|
-
<ol kjStepper>
|
|
217
|
-
<li
|
|
218
|
-
kjStep
|
|
219
|
-
[kjStepCompleted]="done()"
|
|
220
|
-
[kjStepError]="failed()"
|
|
221
|
-
[kjStepOptional]="optional()"
|
|
222
|
-
>
|
|
223
|
-
<button kjStepLabel>One</button>
|
|
224
|
-
</li>
|
|
225
|
-
<li kjStep>
|
|
226
|
-
<button kjStepLabel>Two</button>
|
|
227
|
-
</li>
|
|
228
|
-
</ol>
|
|
229
|
-
`,
|
|
230
|
-
})
|
|
231
|
-
class StateHost {
|
|
232
|
-
readonly done = signal(false);
|
|
233
|
-
readonly failed = signal(false);
|
|
234
|
-
readonly optional = signal(false);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
it('reflects completion / error / optional via data-* attrs', async () => {
|
|
238
|
-
const fixture = await render(StateHost);
|
|
239
|
-
const step = fixture.container.querySelectorAll('[kjStep]')[0];
|
|
240
|
-
expect(step).not.toHaveAttribute('data-completed');
|
|
241
|
-
expect(step).not.toHaveAttribute('data-error');
|
|
242
|
-
expect(step).not.toHaveAttribute('data-optional');
|
|
243
|
-
|
|
244
|
-
fixture.fixture.componentInstance.done.set(true);
|
|
245
|
-
fixture.fixture.componentInstance.failed.set(true);
|
|
246
|
-
fixture.fixture.componentInstance.optional.set(true);
|
|
247
|
-
fixture.detectChanges();
|
|
248
|
-
|
|
249
|
-
expect(step).toHaveAttribute('data-completed', 'true');
|
|
250
|
-
expect(step).toHaveAttribute('data-error', 'true');
|
|
251
|
-
expect(step).toHaveAttribute('data-optional', 'true');
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
describe('next/prev/reset commands', () => {
|
|
256
|
-
it('next advances by one in non-linear mode', async () => {
|
|
257
|
-
const { container } = await render(BasicHostComponent);
|
|
258
|
-
const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
|
|
259
|
-
fireEvent.click(next);
|
|
260
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
261
|
-
expect(steps[1]).toHaveAttribute('aria-current', 'step');
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it('previous retreats by one and is disabled at index 0', async () => {
|
|
265
|
-
const { container } = await render(BasicHostComponent);
|
|
266
|
-
const prev = container.querySelector('[kjStepperPrevious]') as HTMLButtonElement;
|
|
267
|
-
expect(prev).toHaveAttribute('disabled', '');
|
|
268
|
-
const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
|
|
269
|
-
fireEvent.click(next);
|
|
270
|
-
fireEvent.click(next);
|
|
271
|
-
expect(prev).not.toHaveAttribute('disabled');
|
|
272
|
-
fireEvent.click(prev);
|
|
273
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
274
|
-
expect(steps[1]).toHaveAttribute('aria-current', 'step');
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it('reset returns to step 0', async () => {
|
|
278
|
-
const { container } = await render(BasicHostComponent);
|
|
279
|
-
const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
|
|
280
|
-
const reset = container.querySelector('[kjStepperReset]') as HTMLButtonElement;
|
|
281
|
-
fireEvent.click(next);
|
|
282
|
-
fireEvent.click(next);
|
|
283
|
-
fireEvent.click(reset);
|
|
284
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
285
|
-
expect(steps[0]).toHaveAttribute('aria-current', 'step');
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it('next at the last step is disabled by default; loops when kjLoop=true', async () => {
|
|
289
|
-
@Component({
|
|
290
|
-
standalone: true,
|
|
291
|
-
imports,
|
|
292
|
-
template: ` <ol kjStepper [kjLoop]="loop">
|
|
293
|
-
<li kjStep><button kjStepLabel>A</button></li>
|
|
294
|
-
<li kjStep><button kjStepLabel>B</button></li>
|
|
295
|
-
<button kjStepperNext>Next</button>
|
|
296
|
-
</ol>`,
|
|
297
|
-
})
|
|
298
|
-
class LoopHost {
|
|
299
|
-
loop = false;
|
|
300
|
-
}
|
|
301
|
-
const fixture = await render(LoopHost);
|
|
302
|
-
const next = fixture.container.querySelector('[kjStepperNext]') as HTMLButtonElement;
|
|
303
|
-
fireEvent.click(next);
|
|
304
|
-
// At last step, no loop → disabled.
|
|
305
|
-
expect(next).toHaveAttribute('disabled', '');
|
|
306
|
-
|
|
307
|
-
fixture.fixture.componentInstance.loop = true;
|
|
308
|
-
fixture.detectChanges();
|
|
309
|
-
expect(next).not.toHaveAttribute('disabled');
|
|
310
|
-
fireEvent.click(next);
|
|
311
|
-
const steps = fixture.container.querySelectorAll('[kjStep]');
|
|
312
|
-
expect(steps[0]).toHaveAttribute('aria-current', 'step');
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
describe('orientation propagation to roving', () => {
|
|
317
|
-
it('vertical orientation reflects on data-orientation', async () => {
|
|
318
|
-
@Component({
|
|
319
|
-
standalone: true,
|
|
320
|
-
imports,
|
|
321
|
-
template: ` <ol kjStepper kjOrientation="vertical">
|
|
322
|
-
<li kjStep><button kjStepLabel>One</button></li>
|
|
323
|
-
<li kjStep><button kjStepLabel>Two</button></li>
|
|
324
|
-
</ol>`,
|
|
325
|
-
})
|
|
326
|
-
class VerticalHost {}
|
|
327
|
-
const { container } = await render(VerticalHost);
|
|
328
|
-
const root = container.querySelector('[kjStepper]')!;
|
|
329
|
-
expect(root).toHaveAttribute('data-orientation', 'vertical');
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
it('arrow keys move focus along the configured axis (horizontal default)', async () => {
|
|
333
|
-
const { container } = await render(BasicHostComponent);
|
|
334
|
-
const root = container.querySelector('[kjStepper]')!;
|
|
335
|
-
const labels = container.querySelectorAll<HTMLButtonElement>('[kjStepLabel]');
|
|
336
|
-
labels[0].focus();
|
|
337
|
-
fireEvent.keyDown(root, { key: 'ArrowRight' });
|
|
338
|
-
// Roving moved tabindex=0 to the next label.
|
|
339
|
-
expect(labels[1]).toHaveAttribute('tabindex', '0');
|
|
340
|
-
expect(labels[0]).toHaveAttribute('tabindex', '-1');
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
it('vertical orientation: ArrowDown moves focus, ArrowRight is ignored', async () => {
|
|
344
|
-
@Component({
|
|
345
|
-
standalone: true,
|
|
346
|
-
imports,
|
|
347
|
-
template: ` <ol kjStepper kjOrientation="vertical">
|
|
348
|
-
<li kjStep><button kjStepLabel>One</button></li>
|
|
349
|
-
<li kjStep><button kjStepLabel>Two</button></li>
|
|
350
|
-
</ol>`,
|
|
351
|
-
})
|
|
352
|
-
class VerticalHost {}
|
|
353
|
-
const { container } = await render(VerticalHost);
|
|
354
|
-
const root = container.querySelector('[kjStepper]')!;
|
|
355
|
-
const labels = container.querySelectorAll<HTMLButtonElement>('[kjStepLabel]');
|
|
356
|
-
labels[0].focus();
|
|
357
|
-
fireEvent.keyDown(root, { key: 'ArrowRight' });
|
|
358
|
-
expect(labels[0]).toHaveAttribute('tabindex', '0');
|
|
359
|
-
expect(labels[1]).toHaveAttribute('tabindex', '-1');
|
|
360
|
-
|
|
361
|
-
fireEvent.keyDown(root, { key: 'ArrowDown' });
|
|
362
|
-
expect(labels[1]).toHaveAttribute('tabindex', '0');
|
|
363
|
-
expect(labels[0]).toHaveAttribute('tabindex', '-1');
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
describe('goToKey lookup', () => {
|
|
368
|
-
it('navigates by kjStepKey', async () => {
|
|
369
|
-
@Component({
|
|
370
|
-
standalone: true,
|
|
371
|
-
imports,
|
|
372
|
-
template: ` <ol kjStepper #s="kjStepper">
|
|
373
|
-
<li kjStep kjStepKey="account"><button kjStepLabel>Account</button></li>
|
|
374
|
-
<li kjStep kjStepKey="profile"><button kjStepLabel>Profile</button></li>
|
|
375
|
-
<li kjStep kjStepKey="confirm"><button kjStepLabel>Confirm</button></li>
|
|
376
|
-
<button (click)="s.goToKey('profile')" id="jump">Jump</button>
|
|
377
|
-
</ol>`,
|
|
378
|
-
})
|
|
379
|
-
class KeyHost {}
|
|
380
|
-
const { container } = await render(KeyHost);
|
|
381
|
-
fireEvent.click(container.querySelector('#jump')!);
|
|
382
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
383
|
-
expect(steps[1]).toHaveAttribute('aria-current', 'step');
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
it('unknown key is a no-op', async () => {
|
|
387
|
-
@Component({
|
|
388
|
-
standalone: true,
|
|
389
|
-
imports,
|
|
390
|
-
template: ` <ol kjStepper #s="kjStepper">
|
|
391
|
-
<li kjStep kjStepKey="a"><button kjStepLabel>A</button></li>
|
|
392
|
-
<li kjStep kjStepKey="b"><button kjStepLabel>B</button></li>
|
|
393
|
-
<button (click)="s.goToKey('nope')" id="jump">Jump</button>
|
|
394
|
-
</ol>`,
|
|
395
|
-
})
|
|
396
|
-
class KeyHost {}
|
|
397
|
-
const { container } = await render(KeyHost);
|
|
398
|
-
fireEvent.click(container.querySelector('#jump')!);
|
|
399
|
-
const steps = container.querySelectorAll('[kjStep]');
|
|
400
|
-
expect(steps[0]).toHaveAttribute('aria-current', 'step');
|
|
401
|
-
});
|
|
402
|
-
});
|
|
403
|
-
});
|