@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/.turbo/turbo-build.log
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @kouji-ui/core@0.1.1 build /home/runner/work/kouji-ui/kouji-ui/packages/core
|
|
3
|
-
> ng-packagr -p ng-package.json -c tsconfig.lib.prod.json
|
|
4
|
-
|
|
5
|
-
Building Angular Package
|
|
6
|
-
|
|
7
|
-
------------------------------------------------------------------------------
|
|
8
|
-
Building entry point '@kouji-ui/core'
|
|
9
|
-
------------------------------------------------------------------------------
|
|
10
|
-
- Compiling with Angular sources in partial compilation mode.
|
|
11
|
-
[32m✔[39m Compiling with Angular sources in partial compilation mode.
|
|
12
|
-
[32m✔[39m Generating FESM and DTS bundles
|
|
13
|
-
- Copying assets
|
|
14
|
-
[32m✔[39m Copying assets
|
|
15
|
-
- Writing package manifest
|
|
16
|
-
WARNING: Found a conflicting export condition for "./package.json". The "default" condition would be overridden by ng-packagr. Please unset it.
|
|
17
|
-
WARNING: Found a conflicting export condition for ".". The "types" condition would be overridden by ng-packagr. Please unset it.
|
|
18
|
-
WARNING: Found a conflicting export condition for ".". The "default" condition would be overridden by ng-packagr. Please unset it.
|
|
19
|
-
[34mℹ[39m Removing scripts section in package.json as it's considered a potential security vulnerability.
|
|
20
|
-
[32m✔[39m Writing package manifest
|
|
21
|
-
[32m✔[39m Built @kouji-ui/core
|
|
22
|
-
|
|
23
|
-
------------------------------------------------------------------------------
|
|
24
|
-
Built Angular Package
|
|
25
|
-
- from: /home/runner/work/kouji-ui/kouji-ui/packages/core
|
|
26
|
-
- to: /home/runner/work/kouji-ui/kouji-ui/dist/kj-core
|
|
27
|
-
------------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
Build at: 2026-07-03T12:29:59.171Z - Time: 14974ms
|
|
30
|
-
|
package/CHANGELOG.md
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
# @kouji-ui/core
|
|
2
|
-
|
|
3
|
-
## 0.1.1
|
|
4
|
-
|
|
5
|
-
### Major Changes
|
|
6
|
-
|
|
7
|
-
- ec17a49: Upgrade to Angular 22. Peer dependency ranges for `@angular/core`, `@angular/common`, and `@angular/cdk` now require `^22.0.0` (was `^21.0.0`) — consumers must upgrade to Angular 22 to use this version.
|
|
8
|
-
|
|
9
|
-
Internal changes as part of the upgrade:
|
|
10
|
-
- `KjSpeedDial`, `KjPagination`, and `KjCombobox`'s two-way-bindable inputs (`kjOpen`, `kjPage`, `kjQuery`) now use `input()` + `linkedSignal()` instead of `model()`, to avoid colliding with their paired convenience outputs under Angular 22's stricter duplicate-output check. Public API is unchanged.
|
|
11
|
-
- `packages/core`'s build now passes `-c tsconfig.lib.prod.json` explicitly to `ng-packagr`, fixing a silent fallback to an internal `es2018` lib default that broke `Intl`/`Array.prototype.at` typings.
|
|
12
|
-
|
|
13
|
-
Known issue: a subset of overlay-based components (confirm-popup, drawer, popover, date-picker, and others using the shared overlay `attachComponent()` primitive) hit `NG0950` (required input not available) under Angular 22's stricter dynamic-component input timing. Tracked as follow-up work, not fixed in this release.
|
|
14
|
-
|
|
15
|
-
### Minor Changes
|
|
16
|
-
|
|
17
|
-
- 658554d: Add leading dot indicator to badge (superset, additive).
|
|
18
|
-
- core: `[kjBadge]` gains `kjBadgeDot` input reflecting a `data-dot` attribute; defaults off, existing consumers unaffected.
|
|
19
|
-
- components: `<kj-badge>` gains `dot` input rendering a `::before` indicator, themeable via `--kj-badge-dot-size` and `--kj-badge-dot-color` (defaults to `currentColor`).
|
|
20
|
-
|
|
21
|
-
- be6386d: Data-table polish: server-mode pagination, virtualization fix, inline-edit overlay, xs pagination tier.
|
|
22
|
-
- `KjTable` (core): dedupe identity-only slice patches; expose
|
|
23
|
-
`setRowCount` / `manualPagination` so resource-backed tables report the
|
|
24
|
-
full remote total instead of just the visible page.
|
|
25
|
-
- `KjSelect` / `KjSelectTrigger` (core): trigger registers its element
|
|
26
|
-
with the parent at construction time. `KjSelect.focus()` delegates to
|
|
27
|
-
the registered trigger — no view-query timing dance for consumers.
|
|
28
|
-
- `KjTableComponent`: virtualization reads pre-pagination rows (10k rows
|
|
29
|
-
scroll correctly); inline editors mount as `position: absolute` overlays
|
|
30
|
-
with a hidden ghost preserving column width; column meta (`selectOptions`)
|
|
31
|
-
forwarded to dynamically-mounted editors via the cell-editor outlet.
|
|
32
|
-
- `KjTablePaginationComponent`: three-column footer (page size · summary ·
|
|
33
|
-
nav), `space-between` nav cluster, full `xs | sm | md | lg` size tier
|
|
34
|
-
forwarded to the boundary buttons.
|
|
35
|
-
- `KjPagination`: `xs` registered in `KJ_PAGINATION_DEFAULTS.sizes` + CSS.
|
|
36
|
-
- `KjSelectComponent` / `KjInputComponent` / `KjNumberInputComponent`:
|
|
37
|
-
public `focus()` methods, no DOM querying.
|
|
38
|
-
- Renamed `KjCellEditorOutlet` output `cancel` → `editCancel` to avoid
|
|
39
|
-
the DOM-event collision flagged by angular-eslint.
|
|
40
|
-
- `kjTableVirtual` directive selector + exportAs lowercased for the `kj`
|
|
41
|
-
prefix rule.
|
|
42
|
-
|
|
43
|
-
### Patch Changes
|
|
44
|
-
|
|
45
|
-
- d2150ee: fix(signals): widen `nonRecords` constructor type to accept native builtins (WeakSet/WeakMap/Promise/Error/RegExp/DataView/Function) — pure type-level change, no runtime behavior change.
|
|
46
|
-
|
|
47
|
-
## 0.0.6
|
|
48
|
-
|
|
49
|
-
### Patch Changes
|
|
50
|
-
|
|
51
|
-
- 625e81a: Add three new themes: `retro`, `cyberpunk`, `corporate`.
|
|
52
|
-
- **retro** — warm cream surfaces with terracotta + sand accents, soft rounding (vintage paper feel).
|
|
53
|
-
- **cyberpunk** — hot yellow base with magenta/cyan accents, hard edges and mono type.
|
|
54
|
-
- **corporate** — clean white surfaces, blue primary, subtle rounding (calm, business-ready).
|
|
55
|
-
|
|
56
|
-
Each theme defines every required shared-layer token, verified by the contract test in `themes.spec.ts`. Activate via `data-theme="retro"` (or `cyberpunk` / `corporate`) on the `<html>` element.
|
|
57
|
-
|
|
58
|
-
- 9acdb07: Add Wave 2 Batch 8 components plus cross-cutting fixes and version bump to 0.0.5.
|
|
59
|
-
|
|
60
|
-
## New components in `@kouji-ui/core` + `@kouji-ui/components`
|
|
61
|
-
|
|
62
|
-
**Data input**
|
|
63
|
-
- `<kj-input-group>` + `<kj-input-group-addon>` — flex addon wrapper joining inputs with prefix/suffix addons into a single visually-unified field with `aria-labelledby` composition
|
|
64
|
-
- `<kj-input-mask>` — fixed-format input (phone, card, date, custom token alphabet) with built-in `NG_VALIDATORS` mask error
|
|
65
|
-
- `<kj-input-otp>` — N-cell one-time-code input with auto-advance, paste distribution, and `KjLiveRegion` completion announcement
|
|
66
|
-
- `<kj-cascade-select>` + `<kj-cascade-option>` + `<kj-cascade-sub-panel>` — hierarchical flyout-chain picker composing `KjSelect`
|
|
67
|
-
- `<kj-tree-select>` + `<kj-tree-select-node>` — flat-rendered hierarchical dropdown with single and multi-select modes
|
|
68
|
-
|
|
69
|
-
**Actions**
|
|
70
|
-
- `<kj-command-palette>` + `<kj-command-item>` + `<kj-command-group>` + `<kj-command-input>` + `<kj-command-separator>` + `<kj-command-empty>` — full combobox-with-listbox command palette with substring and fuzzy filters and `[kjCommandPaletteHotkey]` global Cmd-K listener.
|
|
71
|
-
Modal-by-default API: `[(kjOpen)]` 2-way binding, `[kjHotkey]` opt-in keyboard chord, `[kjItems]` + `<ng-template kjCommandPaletteItemTemplate let-item>` for templated item lists (with `<kj-command-item>` projection still supported as a fallback). Built-in backdrop, centered dialog, fade/slide animations, ESC + backdrop-click to close, auto-focus input on open, default keyboard-hint footer with `[kjCommandPaletteFooter]` slot for override.
|
|
72
|
-
|
|
73
|
-
## Fixes
|
|
74
|
-
- **`<kj-input>` CVA** — `KjInputComponent` now implements `ControlValueAccessor` so `[(ngModel)]` and `[formControl]` work directly on `<kj-input>`
|
|
75
|
-
- **Input group visual parity** — addon background, line-height, and border-width now match `<kj-input>`; removed wrapper `overflow: hidden` that was clipping the input's focus outline
|
|
76
|
-
- **Command palette CSS** — replaced hardcoded light-mode colors with theme tokens (`--kj-color-base-100/300`, `--kj-color-neutral`, `--kj-color-primary`, `--kj-font-mono`) and added modal-shell, backdrop, and animation styles
|
|
77
|
-
- **Cascade select / Input group CSS** — fixed `var(--kj-border)` → `1px` so borders render in all themes
|
|
78
|
-
- **Docs search** — refactored to use `<kj-command-palette>` with `[kjItems]` + `kjCommandPaletteItemTemplate` instead of bespoke palette markup; backdrop, animations, and Cmd-K wiring now come from the wrapper
|
|
79
|
-
- **Page TOC** — `overflow-x: hidden` on `.toc-col`, removed `min-width` on `.toc-nav`, dropped `max-height` so the column can grow to full page height
|
|
80
|
-
- **Input group examples** — updated to use `<kj-input>` component instead of bare `[kjInput]` directive, consistent with components-layer convention
|
|
81
|
-
- **E2E coverage** — new Playwright specs verifying input-group visual parity and command-palette modal flow + Ctrl/Cmd+K hotkey
|
|
82
|
-
|
|
83
|
-
- 58b3b98: Fix command palette ArrowUp/Down: stop resetting highlight when async results update the list; resolve item values dynamically for stable activation.
|
|
84
|
-
- f93e535: Expand `@kouji-ui/components` from 5 wrappers to 16, with code+preview docs and daisyUI-style sidebar grouping.
|
|
85
|
-
|
|
86
|
-
**New components** (each ships multiple `@doc-example` panels):
|
|
87
|
-
- **Actions** — `<kj-button>` (variants/sizes/disabled examples), `<kj-dialog>` with `<kj-dialog-overlay>`/`<kj-dialog-header>`/`<kj-dialog-title>`/`<kj-dialog-body>`/`<kj-dialog-footer>` slots
|
|
88
|
-
- **Data input** — `<kj-checkbox>`, `<kj-radio-group>` + `<kj-radio>`, `<kj-select>` + `<kj-option>`, `<kj-toggle>` (each projects label content; `disabled` dims the entire control)
|
|
89
|
-
- **Data display** — `<kj-accordion>` + `<kj-accordion-item>` (label-input shorthand) + `<kj-accordion-trigger>` + `<kj-accordion-content>`, `<kj-avatar>` (with `src`/`alt`/`content` inputs), `<kj-badge>`, plus `<kj-card>` upgraded to ant-design / PrimeNG-style sub-components (`<kj-card-cover>` with `size`/`fit` inputs, `<kj-card-header>`, `<kj-card-title>`, `<kj-card-subtitle>`, `<kj-card-content>`, `<kj-card-footer>`)
|
|
90
|
-
- **Navigation** — `<kj-menu>` + `<kj-menu-trigger>`/`<kj-menu-content>`/`<kj-menu-item>`, `<kj-tabs>` + `<kj-tab>` (flat config-element API with `id`, `label`, `disabled` inputs)
|
|
91
|
-
- **Feedback** — `<kj-toast-viewport>` + `<kj-toast>` + `<kj-toast-close>` (templated render, driven by `KjToastService`)
|
|
92
|
-
|
|
93
|
-
**Public API additions on existing wrappers**:
|
|
94
|
-
- `<kj-button>` gains `type` (button/submit/reset) and `ariaLabel` inputs.
|
|
95
|
-
- `<kj-radio>` and `<kj-checkbox>` project content as their own label and wire `aria-labelledby` for the role-bearing element (fixes axe-core `aria-toggle-field-name` violations).
|
|
96
|
-
- `<kj-avatar>` mirrors `alt` to a host `title` attribute for native hover tooltip.
|
|
97
|
-
|
|
98
|
-
**Theming**:
|
|
99
|
-
- Each shipped theme now declares `--kj-color-primary-hover` and `--kj-color-destructive-hover` so filled-button hover uses a brand-correct shade. `light`/`dark`/`corporate`/`retro`/`cyberpunk` define values; `kouji` keeps its existing component-layer brightening override. The button stylesheet falls back to a base-content color-mix when the token isn't defined, so consumer themes don't break.
|
|
100
|
-
- `base.css` gains `blue-700`, `red-400`, and `red-600` shades that the new hover tokens reference.
|
|
101
|
-
|
|
102
|
-
**Categorization**:
|
|
103
|
-
- The docs extractor adds the daisyUI-style category union (`actions` / `data-input` / `data-display` / `navigation` / `feedback`) for the components track. The core track keeps its existing categories.
|
|
104
|
-
- Manifest dev-watcher now invalidates on `packages/components/src` changes too.
|
|
105
|
-
|
|
106
|
-
- 51422f1: Use `forwardRef` for the self-referential `KJ_ROVING_TABINDEX` provider on `KjRovingTabindex`. Behavior is unchanged in normal Angular builds (the compiler already handles the self-reference); this prevents a temporal-dead-zone error when the file is loaded by tooling that runs the raw decorator metadata (e.g. Playwright's TS loader sweeping spec files).
|
|
107
|
-
- 2484383: Add `@kouji-ui/core/icon` — provider-agnostic icon layer:
|
|
108
|
-
- `KjIconDirective` (`[span,i][kjIcon]`) renders icons via CSS custom
|
|
109
|
-
properties (`--kj-icon` + `mask-image` for svg, `content` for font).
|
|
110
|
-
- `provideIcons` / `provideIconResolver` / `provideIconLoader` for
|
|
111
|
-
registering icon sets, sync URL synthesis, or async loaders.
|
|
112
|
-
- `injectKjIconResolver()` exposes the unified resolver in injection
|
|
113
|
-
contexts.
|
|
114
|
-
- `KJ_ICON_REGISTRY` / `KJ_ICON_RESOLVER` / `KJ_ICON_LOADER` /
|
|
115
|
-
`KJ_ICON_CSS_PATH` tokens published.
|
|
116
|
-
- Stylesheet shipped at `@kouji-ui/core/icon/icon.css` with mask-image
|
|
117
|
-
rendering for monochrome SVG and `content` for font glyphs.
|
|
118
|
-
|
|
119
|
-
- 4b7487f: Restore nullable input types on component wrappers (kjValue, kjMin, kjMax, kjReferenceDate, etc.) to match the headless directives' contracts. Sentinel-default approach was producing broken 2-way binding chains and incorrect runtime behaviour on null. Time-picker core now caches a stable per-instance reference Date so `serialise()` doesn't churn new Date() on every commit.
|
|
120
|
-
- 8406d0f: Finalize the listbox-primitives migration for cascade-select, tree-select, menubar, and combobox.
|
|
121
|
-
|
|
122
|
-
**`@kouji-ui/core`**
|
|
123
|
-
- `KjSelectionModel` now receives its source signals via a `bind()` call from the consumer root (replacing the older inject-the-config pattern). The model auto-derives a tree shape from each `KjListItem`'s parent DI pointer when the consumer doesn't supply one explicitly — DOM-nested clusters (cascade-select, sub-menus) are tree-aware out of the box. `'single'` mode now respects the shape and blocks branch commits at the model layer.
|
|
124
|
-
- `KjListItem` exposes a `parent` reference (nearest ancestor `KjListItem` via `skipSelf` element-injector lookup) and gates activation through `KjSelectionModel.canActivate(value)` — branch options serve purely as disclosure controls without leaking values.
|
|
125
|
-
- `KjCascadeSelectOption` migrates to mode `'single'` (was `'leaf'`) for a clean string value rather than an array; aliases `KjListItem` inputs as `kjValue`/`kjLabel`/`kjDisabled` (was `kjOptionValue`/`kjOptionLabel`/`kjDisabled`) to match `KjTreeSelectNode`'s convention. Branch detection switched from imperative `_registerSubPanel()` to a `contentChildren(KjCascadeSelectSubPanel)` query.
|
|
126
|
-
- `KjCascadeSelect` removes the required `kjTreeShape` input — the consumer-supplied shape is optional now (defaults to the auto-derived one). Path derivation moves to `KjSelectionModel.pathTo()`.
|
|
127
|
-
- `KjMenubarItem` gains a `kjActivate` output (bridged from `KjListItem.activate`) and now early-returns from its open/close toggle when `kjDropdownMenuTriggerFor` is unset, so a sibling `[kjDropdownMenuTrigger]` on the same element can own the overlay state without the item's toggle handler closing the dropdown that just opened (the two directives share a single per-element `KjOverlayController`).
|
|
128
|
-
|
|
129
|
-
**`@kouji-ui/components`**
|
|
130
|
-
- `KjCascadeOptionComponent` now extends `KjCascadeSelectOption` directly and registers itself under the directive's token via `useExisting` so projected sub-panels resolve their parent option through normal element-injector DI. This works around Angular 21's NG2017 rule (chained hostDirective alias forwarding is forbidden) while keeping the markup-driven recursive API.
|
|
131
|
-
- Cascade-option public inputs renamed to `kjValue`/`kjLabel`/`kjDisabled` to match tree-select-node and the new core aliases.
|
|
132
|
-
- `kj-menubar-item` wrapper forwards the new `(kjActivate)` output.
|
|
133
|
-
- Menubar examples rewritten (the previous files were placeholders): `default`, `disabled-item`, `with-shortcuts` (composes `<kj-kbd>`), `with-submenu` (uses the standard `kjDropdownMenuTrigger` + `<kj-dropdown-menu-content [kjFor]>` idiom).
|
|
134
|
-
- Dropdown-menu playground gains a "Last selected" readout wired through `(kjSelect)` on each item; menubar playground gets the same readout wired through the new `(kjActivate)`.
|
|
135
|
-
- `kj-option` (select) selected-state styling now uses a tinted primary token (`color-mix(in oklab, var(--kj-bg-primary) 12%, transparent)` + `var(--kj-fg-primary)` + `font-weight: 600`), mirroring `kj-tree-select-node` so the listbox family stays visually consistent across themes.
|
|
136
|
-
- New `packages/components/src/overlay/` aggregator stylesheet so consumers register a single overlay CSS entry rather than per-component overlays in `angular.json`.
|
|
137
|
-
|
|
138
|
-
- 2484383: Overlay primitive refactor and select-family alignment.
|
|
139
|
-
|
|
140
|
-
**`@kouji-ui/core`**
|
|
141
|
-
- New overlay primitives layer: `KjOverlayController`, `KjOverlayPanel`, `KjOverlayTrigger`, `KjOverlayBuilder`, `KjOverlayHandle`, `KjOverlayWrapper`, `KjOverlayContainer`, `KjOverlayStack`. Strategies (`mount`, `position`, `backdrop`, `focus-trap`, `scroll-lock`, `trigger-event`) compose into per-overlay configs (`inPlace()` for service-launched, `bodyPortal()` for declarative).
|
|
142
|
-
- `select`, `tree-select`, `combobox`, and `cascade-select` all follow the same root-controller pattern: a single `[kjXxx]` root directive provides `KjOverlayController` and owns selection state; trigger no longer self-provides; consumer-action methods call `controller.close()` directly (no signal indirection).
|
|
143
|
-
- Cascade-select adds dedicated branch sub-panels with `position: fixed` so they escape the root panel's `overflow: auto`. Branch detection uses `contentChildren` (declaration tree) — no DOM querying.
|
|
144
|
-
- Tree-select splits into root + per-node directives.
|
|
145
|
-
- Re-entrancy guards on `open()` / `close()` / `toggle()`. Outside-click flicker fixed by hiding the panel synchronously in the rAF before strategy cleanup.
|
|
146
|
-
|
|
147
|
-
**`@kouji-ui/components`**
|
|
148
|
-
- Cascade-select wrapper composes the new root via `hostDirectives` (`kjValue`, `kjCascadePath`).
|
|
149
|
-
- Confirm-popup, dialog, drawer, popover, tooltip, dropdown-menu, and toast JSDoc `@category` regrouped under `Library/Overlay` and `Core/Overlay` for the docs sidebar.
|
|
150
|
-
|
|
151
|
-
- a485472: - `<kj-select>` now exposes `[multiple]`, forwarding to the underlying
|
|
152
|
-
`KjSelectTrigger`'s `kjMultiple` input. The wrapper's display label
|
|
153
|
-
joins array values into a comma-separated list when multi mode is
|
|
154
|
-
on (placeholder shown when empty). Fills the gap that previously
|
|
155
|
-
required dropping to the headless directives for multi-select.
|
|
156
|
-
- `KjTimePickerSegment` reflect-effect now guards the `document`
|
|
157
|
-
reference so server-side rendering no longer throws
|
|
158
|
-
`ReferenceError: document is not defined` while pre-rendering the
|
|
159
|
-
time-picker.
|
|
160
|
-
- 884c5a1: Prerender/SSR: avoid `document` ReferenceError in time-picker segment and calendar day (browser guard + `inject(DOCUMENT)` for `activeElement`).
|
|
161
|
-
- a015b14: Theme generator (docs app): accessibility tooling and configurator-related updates in components/core — `@docCategory` on directives, tag `xs` size, tooltip `[hidden]` guard, calendar SSR guard, overlay/command-palette/browser DOM safety.
|
|
162
|
-
- 7f95f75: `kj-input` now supports `type="color"` and a new `value` input that forwards to the underlying native input via property binding. Includes a `data-type` host attribute (mirrors `type`) and a small built-in style normalization for color swatches (44×32px). Existing `type` values and form-control bindings continue to work unchanged.
|
|
163
|
-
|
|
164
|
-
Core fix in `kjInput`: the directive's CVA-to-DOM reflection now skips writing when the form control's value is null/undefined, so external `[value]` bindings work for non-form usage. Form-bound usage is unchanged (callers clear via `setValue('')`).
|
|
165
|
-
|
|
166
|
-
These changes power the new in-app theme generator at `/theme-generator` in the docs site — fork built-in themes, edit colors with the native picker, tweak shape/font/motion controls, save multiple drafts to localStorage, export as CSS or JSON, import JSON back.
|
|
167
|
-
|
|
168
|
-
- 1968274: Workspace resolution metadata: `@kouji-ui/core`'s `package.json` now declares `module`, `typings`, `exports`, and `type: "module"` so other workspace packages (`@kouji-ui/components`, future packages) can resolve `@kouji-ui/core` via Node module resolution after `ng build kj-core` runs. Workspace-only paths point at `../../dist/kj-core/...`; a `publishConfig` override rewrites them to in-package paths (`./fesm2022/...`, `./types/...`) for the published npm artifact, so consumers see the same shape as before.
|
|
169
|
-
|
|
170
|
-
No public API change. Pure infrastructure for the upcoming `@kouji-ui/components` package (Wave 0 of the themes & components architecture).
|
|
171
|
-
|
|
172
|
-
## 0.0.4
|
|
173
|
-
|
|
174
|
-
### Patch Changes
|
|
175
|
-
|
|
176
|
-
- 202d9de: CI fix: husky pre-push hook now skips in CI environments (`$CI` or `$GITHUB_ACTIONS` set). Prevents the Changesets action's automated push from being blocked by the changeset-status gate. No runtime effect on the published package.
|
|
177
|
-
- dc0fe0f: Test-only fix: rewrite `KjToastService` test suite to use `TestBed.inject()` so `inject(KJ_TOAST_STRATEGY)` resolves through Angular DI (was crashing with `new KjToastService()` outside an injection context). No runtime change.
|
|
178
|
-
- d6b40e1: Internal lint cleanup — replace `any` casts in select option storage with typed `HTMLElement & { __kjOptionValue?: unknown }` and convert ternary statement to if/else in overlay toggle. No public API or behavior change.
|
|
179
|
-
|
|
180
|
-
## 0.0.3
|
|
181
|
-
|
|
182
|
-
### Patch Changes
|
|
183
|
-
|
|
184
|
-
- c177d1e: Rewrite README with real install/usage docs, primitive index, and design principles. Replaces the Angular CLI scaffold placeholder.
|
|
185
|
-
|
|
186
|
-
## 0.0.2
|
|
187
|
-
|
|
188
|
-
### Patch Changes
|
|
189
|
-
|
|
190
|
-
- 1813d21: Initial publish — headless Angular 21 UI primitives over CDK with WCAG 2.1 AAA semantics and zero CSS.
|
package/ng-package.json
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
|
3
|
-
"dest": "../../dist/kj-core",
|
|
4
|
-
"lib": {
|
|
5
|
-
"entryFile": "src/public-api.ts"
|
|
6
|
-
},
|
|
7
|
-
"assets": [
|
|
8
|
-
{ "input": "src/typography", "glob": "prose.css", "output": "typography" },
|
|
9
|
-
{ "input": "src/icon", "glob": "icon.css", "output": "icon" }
|
|
10
|
-
]
|
|
11
|
-
}
|
package/src/a11y/.gitkeep
DELETED
|
File without changes
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { render } from '@testing-library/angular';
|
|
2
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
3
|
-
import { KjAriaDescribedBy } from './aria-describedby';
|
|
4
|
-
|
|
5
|
-
expect.extend(toHaveNoViolations);
|
|
6
|
-
|
|
7
|
-
describe('KjAriaDescribedBy', () => {
|
|
8
|
-
it('sets aria-describedby from a single id string', async () => {
|
|
9
|
-
const { container } = await render(
|
|
10
|
-
`<input kjAriaDescribedBy [kjDescribedBy]="'hint-1'" />
|
|
11
|
-
<span id="hint-1">This is a hint</span>`,
|
|
12
|
-
{ imports: [KjAriaDescribedBy] },
|
|
13
|
-
);
|
|
14
|
-
expect(container.querySelector('input')).toHaveAttribute('aria-describedby', 'hint-1');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('sets aria-describedby from multiple ids', async () => {
|
|
18
|
-
const { container } = await render(
|
|
19
|
-
`<input kjAriaDescribedBy [kjDescribedBy]="['hint-1', 'error-1']" />
|
|
20
|
-
<span id="hint-1">Hint</span>
|
|
21
|
-
<span id="error-1">Error</span>`,
|
|
22
|
-
{ imports: [KjAriaDescribedBy] },
|
|
23
|
-
);
|
|
24
|
-
expect(container.querySelector('input')).toHaveAttribute(
|
|
25
|
-
'aria-describedby',
|
|
26
|
-
'hint-1 error-1',
|
|
27
|
-
);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('removes aria-describedby when given empty array', async () => {
|
|
31
|
-
const { container } = await render(
|
|
32
|
-
`<input kjAriaDescribedBy [kjDescribedBy]="[]" />`,
|
|
33
|
-
{ imports: [KjAriaDescribedBy] },
|
|
34
|
-
);
|
|
35
|
-
expect(container.querySelector('input')).not.toHaveAttribute('aria-describedby');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('removes aria-describedby when given empty string', async () => {
|
|
39
|
-
const { container } = await render(
|
|
40
|
-
`<input kjAriaDescribedBy [kjDescribedBy]="''" />`,
|
|
41
|
-
{ imports: [KjAriaDescribedBy] },
|
|
42
|
-
);
|
|
43
|
-
expect(container.querySelector('input')).not.toHaveAttribute('aria-describedby');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('passes axe accessibility audit', async () => {
|
|
47
|
-
const { container } = await render(
|
|
48
|
-
`<label for="f">Name</label>
|
|
49
|
-
<input id="f" kjAriaDescribedBy [kjDescribedBy]="'hint'" />
|
|
50
|
-
<span id="hint">Enter your full name</span>`,
|
|
51
|
-
{ imports: [KjAriaDescribedBy] },
|
|
52
|
-
);
|
|
53
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Directive, computed, input } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Wires `aria-describedby` to one or more element IDs.
|
|
5
|
-
* Accepts a single ID string or an array of ID strings.
|
|
6
|
-
* Removes the attribute automatically when the value is empty.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```html
|
|
10
|
-
* <input kjAriaDescribedBy [kjDescribedBy]="['hint-id', errorId()]" />
|
|
11
|
-
* <span id="hint-id">Format: DD/MM/YYYY</span>
|
|
12
|
-
* ```
|
|
13
|
-
* @doc-category Core/Accessibility
|
|
14
|
-
* @doc
|
|
15
|
-
* @doc-name a11y
|
|
16
|
-
* @doc-description Wires `aria-describedby` from a single id or an array of ids onto any element.
|
|
17
|
-
* @doc-is-main
|
|
18
|
-
*/
|
|
19
|
-
@Directive({
|
|
20
|
-
selector: '[kjAriaDescribedBy]',
|
|
21
|
-
standalone: true,
|
|
22
|
-
host: {
|
|
23
|
-
'[attr.aria-describedby]': 'ariaDescribedBy()',
|
|
24
|
-
},
|
|
25
|
-
})
|
|
26
|
-
export class KjAriaDescribedBy {
|
|
27
|
-
/** One or more element IDs to reference via `aria-describedby`. */
|
|
28
|
-
kjDescribedBy = input<string | readonly string[]>('');
|
|
29
|
-
|
|
30
|
-
/** @internal */
|
|
31
|
-
readonly ariaDescribedBy = computed(() => {
|
|
32
|
-
const val = this.kjDescribedBy();
|
|
33
|
-
const ids = Array.isArray(val) ? val : [val];
|
|
34
|
-
const filtered = ids.filter(Boolean);
|
|
35
|
-
return filtered.length ? filtered.join(' ') : null;
|
|
36
|
-
});
|
|
37
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { render } from '@testing-library/angular';
|
|
2
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
3
|
-
import { KjAriaLabelledBy } from './aria-labelledby';
|
|
4
|
-
|
|
5
|
-
expect.extend(toHaveNoViolations);
|
|
6
|
-
|
|
7
|
-
describe('KjAriaLabelledBy', () => {
|
|
8
|
-
it('sets aria-labelledby from a single id string', async () => {
|
|
9
|
-
const { container } = await render(
|
|
10
|
-
`<section kjAriaLabelledBy [kjLabelledBy]="'h-1'">
|
|
11
|
-
<h2 id="h-1">Features</h2>
|
|
12
|
-
</section>`,
|
|
13
|
-
{ imports: [KjAriaLabelledBy] },
|
|
14
|
-
);
|
|
15
|
-
expect(container.querySelector('section')).toHaveAttribute('aria-labelledby', 'h-1');
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('sets aria-labelledby from multiple ids', async () => {
|
|
19
|
-
const { container } = await render(
|
|
20
|
-
`<section kjAriaLabelledBy [kjLabelledBy]="['h-1', 'h-2']">
|
|
21
|
-
<h2 id="h-1">A</h2>
|
|
22
|
-
<h2 id="h-2">B</h2>
|
|
23
|
-
</section>`,
|
|
24
|
-
{ imports: [KjAriaLabelledBy] },
|
|
25
|
-
);
|
|
26
|
-
expect(container.querySelector('section')).toHaveAttribute('aria-labelledby', 'h-1 h-2');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('removes aria-labelledby when given empty array', async () => {
|
|
30
|
-
const { container } = await render(
|
|
31
|
-
`<section kjAriaLabelledBy [kjLabelledBy]="[]"></section>`,
|
|
32
|
-
{ imports: [KjAriaLabelledBy] },
|
|
33
|
-
);
|
|
34
|
-
expect(container.querySelector('section')).not.toHaveAttribute('aria-labelledby');
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('removes aria-labelledby when given empty string', async () => {
|
|
38
|
-
const { container } = await render(
|
|
39
|
-
`<section kjAriaLabelledBy [kjLabelledBy]="''"></section>`,
|
|
40
|
-
{ imports: [KjAriaLabelledBy] },
|
|
41
|
-
);
|
|
42
|
-
expect(container.querySelector('section')).not.toHaveAttribute('aria-labelledby');
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('passes axe accessibility audit', async () => {
|
|
46
|
-
const { container } = await render(
|
|
47
|
-
`<section kjAriaLabelledBy [kjLabelledBy]="'h-1'">
|
|
48
|
-
<h2 id="h-1">Features</h2>
|
|
49
|
-
<p>Stuff</p>
|
|
50
|
-
</section>`,
|
|
51
|
-
{ imports: [KjAriaLabelledBy] },
|
|
52
|
-
);
|
|
53
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Directive, computed, input } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Wires `aria-labelledby` to one or more element IDs.
|
|
5
|
-
* Accepts a single ID string or an array of ID strings.
|
|
6
|
-
* Removes the attribute automatically when the value is empty.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```html
|
|
10
|
-
* <section kjAriaLabelledBy [kjLabelledBy]="'features-heading'">
|
|
11
|
-
* <h2 id="features-heading">Features</h2>
|
|
12
|
-
* …
|
|
13
|
-
* </section>
|
|
14
|
-
* ```
|
|
15
|
-
* @doc-category Core/Accessibility
|
|
16
|
-
* @doc
|
|
17
|
-
* @doc-name a11y
|
|
18
|
-
* @doc-description Wires `aria-labelledby` from a single id or an array of ids onto any element.
|
|
19
|
-
*/
|
|
20
|
-
@Directive({
|
|
21
|
-
selector: '[kjAriaLabelledBy]',
|
|
22
|
-
standalone: true,
|
|
23
|
-
host: {
|
|
24
|
-
'[attr.aria-labelledby]': 'ariaLabelledBy()',
|
|
25
|
-
},
|
|
26
|
-
})
|
|
27
|
-
export class KjAriaLabelledBy {
|
|
28
|
-
/** One or more element IDs to reference via `aria-labelledby`. */
|
|
29
|
-
kjLabelledBy = input<string | readonly string[]>('');
|
|
30
|
-
|
|
31
|
-
/** @internal */
|
|
32
|
-
readonly ariaLabelledBy = computed(() => {
|
|
33
|
-
const val = this.kjLabelledBy();
|
|
34
|
-
const ids = Array.isArray(val) ? val : [val];
|
|
35
|
-
const filtered = ids.filter(Boolean);
|
|
36
|
-
return filtered.length ? filtered.join(' ') : null;
|
|
37
|
-
});
|
|
38
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { render, fireEvent } from '@testing-library/angular';
|
|
2
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
3
|
-
import { KjFocusTrap } from './focus-trap';
|
|
4
|
-
|
|
5
|
-
expect.extend(toHaveNoViolations);
|
|
6
|
-
|
|
7
|
-
describe('KjFocusTrap', () => {
|
|
8
|
-
it('renders without error when enabled', async () => {
|
|
9
|
-
const { container } = await render(
|
|
10
|
-
`<div kjFocusTrap [kjFocusTrapEnabled]="true">
|
|
11
|
-
<button>First</button>
|
|
12
|
-
<button>Last</button>
|
|
13
|
-
</div>`,
|
|
14
|
-
{ imports: [KjFocusTrap] },
|
|
15
|
-
);
|
|
16
|
-
expect(container.querySelector('[kjFocusTrap]')).toBeInTheDocument();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('renders without error when disabled', async () => {
|
|
20
|
-
const { container } = await render(
|
|
21
|
-
`<div kjFocusTrap [kjFocusTrapEnabled]="false">
|
|
22
|
-
<button>First</button>
|
|
23
|
-
</div>`,
|
|
24
|
-
{ imports: [KjFocusTrap] },
|
|
25
|
-
);
|
|
26
|
-
expect(container.querySelector('[kjFocusTrap]')).toBeInTheDocument();
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('wraps focus from last to first on Tab when enabled', async () => {
|
|
30
|
-
const { container } = await render(
|
|
31
|
-
`<div kjFocusTrap [kjFocusTrapEnabled]="true">
|
|
32
|
-
<button>First</button>
|
|
33
|
-
<button>Last</button>
|
|
34
|
-
</div>`,
|
|
35
|
-
{ imports: [KjFocusTrap] },
|
|
36
|
-
);
|
|
37
|
-
const buttons = container.querySelectorAll('button');
|
|
38
|
-
const last = buttons[buttons.length - 1] as HTMLElement;
|
|
39
|
-
last.focus();
|
|
40
|
-
fireEvent.keyDown(document, { key: 'Tab', shiftKey: false });
|
|
41
|
-
expect(document.activeElement).toBe(buttons[0]);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('wraps focus from first to last on Shift+Tab when enabled', async () => {
|
|
45
|
-
const { container } = await render(
|
|
46
|
-
`<div kjFocusTrap [kjFocusTrapEnabled]="true">
|
|
47
|
-
<button>First</button>
|
|
48
|
-
<button>Last</button>
|
|
49
|
-
</div>`,
|
|
50
|
-
{ imports: [KjFocusTrap] },
|
|
51
|
-
);
|
|
52
|
-
const buttons = container.querySelectorAll('button');
|
|
53
|
-
const first = buttons[0] as HTMLElement;
|
|
54
|
-
first.focus();
|
|
55
|
-
fireEvent.keyDown(document, { key: 'Tab', shiftKey: true });
|
|
56
|
-
expect(document.activeElement).toBe(buttons[buttons.length - 1]);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('does not trap focus when disabled', async () => {
|
|
60
|
-
const { container } = await render(
|
|
61
|
-
`<div kjFocusTrap [kjFocusTrapEnabled]="false">
|
|
62
|
-
<button>First</button>
|
|
63
|
-
<button>Last</button>
|
|
64
|
-
</div>`,
|
|
65
|
-
{ imports: [KjFocusTrap] },
|
|
66
|
-
);
|
|
67
|
-
const buttons = container.querySelectorAll('button');
|
|
68
|
-
const last = buttons[buttons.length - 1] as HTMLElement;
|
|
69
|
-
last.focus();
|
|
70
|
-
// Tab should not redirect focus — no focus change from the handler.
|
|
71
|
-
const activeBeforeTab = document.activeElement;
|
|
72
|
-
fireEvent.keyDown(document, { key: 'Tab', shiftKey: false });
|
|
73
|
-
// When disabled, the handler does nothing, so focus stays on last.
|
|
74
|
-
expect(document.activeElement).toBe(activeBeforeTab);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('passes axe accessibility audit', async () => {
|
|
78
|
-
const { container } = await render(
|
|
79
|
-
`<div role="dialog" aria-label="Test dialog" kjFocusTrap [kjFocusTrapEnabled]="true">
|
|
80
|
-
<button>Action</button>
|
|
81
|
-
</div>`,
|
|
82
|
-
{ imports: [KjFocusTrap] },
|
|
83
|
-
);
|
|
84
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
85
|
-
});
|
|
86
|
-
});
|
package/src/a11y/focus-trap.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { Directive, DestroyRef, ElementRef, afterNextRender, inject, input } from '@angular/core';
|
|
2
|
-
import { PLATFORM_ID } from '@angular/core';
|
|
3
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
4
|
-
|
|
5
|
-
const FOCUSABLE = [
|
|
6
|
-
'a[href]', 'button:not([disabled])', 'input:not([disabled])',
|
|
7
|
-
'select:not([disabled])', 'textarea:not([disabled])',
|
|
8
|
-
'[tabindex]:not([tabindex="-1"])', '[contenteditable="true"]',
|
|
9
|
-
].join(',');
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Traps keyboard focus within the host element using a native Tab-key interceptor.
|
|
13
|
-
* Designed for modal dialogs, drawers, and other overlay patterns.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```html
|
|
17
|
-
* <div role="dialog" kjFocusTrap [kjFocusTrapEnabled]="isOpen()">
|
|
18
|
-
* <button>Action</button>
|
|
19
|
-
* </div>
|
|
20
|
-
* ```
|
|
21
|
-
* @doc-category Core/Accessibility
|
|
22
|
-
* @doc
|
|
23
|
-
* @doc-name a11y
|
|
24
|
-
*/
|
|
25
|
-
@Directive({
|
|
26
|
-
selector: '[kjFocusTrap]',
|
|
27
|
-
standalone: true,
|
|
28
|
-
})
|
|
29
|
-
export class KjFocusTrap {
|
|
30
|
-
private readonly el = inject(ElementRef<HTMLElement>);
|
|
31
|
-
private readonly destroyRef = inject(DestroyRef);
|
|
32
|
-
private readonly platformId = inject(PLATFORM_ID);
|
|
33
|
-
|
|
34
|
-
/** Whether the focus trap is active. Set to true when the overlay is open. */
|
|
35
|
-
kjFocusTrapEnabled = input<boolean>(false);
|
|
36
|
-
|
|
37
|
-
constructor() {
|
|
38
|
-
afterNextRender(() => {
|
|
39
|
-
if (!isPlatformBrowser(this.platformId)) return;
|
|
40
|
-
|
|
41
|
-
const handleKeydown = (e: KeyboardEvent) => {
|
|
42
|
-
if (!this.kjFocusTrapEnabled() || e.key !== 'Tab') return;
|
|
43
|
-
const focusable = (Array.from(
|
|
44
|
-
this.el.nativeElement.querySelectorAll(FOCUSABLE)
|
|
45
|
-
) as HTMLElement[]).filter(el => !el.closest('[hidden]') && getComputedStyle(el).display !== 'none');
|
|
46
|
-
|
|
47
|
-
if (!focusable.length) { e.preventDefault(); return; }
|
|
48
|
-
const first = focusable[0];
|
|
49
|
-
const last = focusable[focusable.length - 1];
|
|
50
|
-
|
|
51
|
-
if (e.shiftKey) {
|
|
52
|
-
if (document.activeElement === first || !this.el.nativeElement.contains(document.activeElement)) {
|
|
53
|
-
e.preventDefault(); last.focus();
|
|
54
|
-
}
|
|
55
|
-
} else {
|
|
56
|
-
if (document.activeElement === last || !this.el.nativeElement.contains(document.activeElement)) {
|
|
57
|
-
e.preventDefault(); first.focus();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
document.addEventListener('keydown', handleKeydown);
|
|
63
|
-
this.destroyRef.onDestroy(() => document.removeEventListener('keydown', handleKeydown));
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/** Focuses the first tabbable element inside the trap. */
|
|
68
|
-
focusFirst(): void {
|
|
69
|
-
const el = this.el.nativeElement.querySelector(FOCUSABLE) as HTMLElement | null;
|
|
70
|
-
el?.focus();
|
|
71
|
-
}
|
|
72
|
-
}
|
package/src/a11y/index.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { KjAriaDescribedBy } from './aria-describedby';
|
|
2
|
-
export { KjAriaLabelledBy } from './aria-labelledby';
|
|
3
|
-
export { KjFocusTrap } from './focus-trap';
|
|
4
|
-
export { KjLiveRegion, type KjLivePoliteness } from './live-region';
|
|
5
|
-
export {
|
|
6
|
-
KjRovingTabindex,
|
|
7
|
-
KjRovingTabindexItemDirective,
|
|
8
|
-
KJ_ROVING_TABINDEX,
|
|
9
|
-
} from './roving-tabindex';
|
|
10
|
-
export { KjVisuallyHidden } from './visually-hidden';
|