@kouji-ui/core 0.1.1 → 0.1.3
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 +15 -7
- 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/carousel/index.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
KjCarousel,
|
|
3
|
-
KjCarouselViewport,
|
|
4
|
-
KjCarouselSlide,
|
|
5
|
-
KjCarouselPrevious,
|
|
6
|
-
KjCarouselNext,
|
|
7
|
-
KjCarouselIndicators,
|
|
8
|
-
KjCarouselIndicator,
|
|
9
|
-
KjCarouselAutoplay,
|
|
10
|
-
KjCarouselPauseToggle,
|
|
11
|
-
} from './carousel';
|
|
12
|
-
export {
|
|
13
|
-
KJ_CAROUSEL,
|
|
14
|
-
KJ_CAROUSEL_SLIDE,
|
|
15
|
-
KJ_CAROUSEL_INDICATORS,
|
|
16
|
-
type KjCarouselContext,
|
|
17
|
-
type KjCarouselSlideContext,
|
|
18
|
-
type KjCarouselIndicatorsContext,
|
|
19
|
-
type KjCarouselOrientation,
|
|
20
|
-
type KjCarouselAlign,
|
|
21
|
-
type KjCarouselControlPattern,
|
|
22
|
-
} from './carousel.context';
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
computed,
|
|
3
|
-
contentChildren,
|
|
4
|
-
Directive,
|
|
5
|
-
forwardRef,
|
|
6
|
-
inject,
|
|
7
|
-
OnDestroy,
|
|
8
|
-
} from '@angular/core';
|
|
9
|
-
import { KjListItem, injectListItem } from '../primitives/list';
|
|
10
|
-
import { KJ_CASCADE_SELECT } from './cascade-select.context';
|
|
11
|
-
import { KjCascadeSelectSubPanel } from './cascade-select-sub-panel';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Single row inside a `[kjCascadeSelectPanel]` or
|
|
15
|
-
* `[kjCascadeSelectSubPanel]`. When projected `[kjCascadeSelectSubPanel]`
|
|
16
|
-
* content is present the option becomes a **sub-trigger** (branch node);
|
|
17
|
-
* otherwise it is a **leaf** that commits a value on activation.
|
|
18
|
-
*
|
|
19
|
-
* Composes `KjListItem` via `hostDirectives` — the list item owns the
|
|
20
|
-
* stable `id`, the click / Enter / Space activation, `aria-selected`
|
|
21
|
-
* (via the shared `KjSelectionModel` in `'leaf'` mode), and
|
|
22
|
-
* `aria-disabled`. This directive contributes cascade-specific
|
|
23
|
-
* semantics: `role="treeitem"`, branch `aria-haspopup` / `aria-expanded`,
|
|
24
|
-
* and hover-open / hover-close timers for sub-panels.
|
|
25
|
-
*
|
|
26
|
-
* Branch detection is signal-driven: `KjCascadeSelectSubPanel` instances
|
|
27
|
-
* declared inside this option call `_registerSubPanel()` from their
|
|
28
|
-
* constructor (they inject this directive via the element injector).
|
|
29
|
-
* No `contentChildren` + binding effect — straightforward DI both ways.
|
|
30
|
-
*
|
|
31
|
-
* Branch clicks are no-ops at the selection-model level (leaf mode
|
|
32
|
-
* filters them out when a `treeShape` is provided on the root) but
|
|
33
|
-
* still toggle their own sub-panel via this directive's
|
|
34
|
-
* `handleClick()`.
|
|
35
|
-
*
|
|
36
|
-
* Role: `treeitem`.
|
|
37
|
-
*
|
|
38
|
-
* @example Leaf
|
|
39
|
-
* ```html
|
|
40
|
-
* <div kjCascadeSelectOption [kjValue]="'sf'" kjLabel="San Francisco" />
|
|
41
|
-
* ```
|
|
42
|
-
*
|
|
43
|
-
* @example Branch
|
|
44
|
-
* ```html
|
|
45
|
-
* <div kjCascadeSelectOption [kjValue]="'us'" kjLabel="USA">
|
|
46
|
-
* <div kjCascadeSelectSubPanel>…</div>
|
|
47
|
-
* </div>
|
|
48
|
-
* ```
|
|
49
|
-
* @doc-category Core/Data input
|
|
50
|
-
* @doc
|
|
51
|
-
* @doc-name cascade-select
|
|
52
|
-
*/
|
|
53
|
-
@Directive({
|
|
54
|
-
selector: '[kjCascadeSelectOption]',
|
|
55
|
-
exportAs: 'kjCascadeSelectOption',
|
|
56
|
-
standalone: true,
|
|
57
|
-
hostDirectives: [
|
|
58
|
-
{
|
|
59
|
-
directive: KjListItem,
|
|
60
|
-
inputs: [
|
|
61
|
-
'kjItemValue:kjValue',
|
|
62
|
-
'kjItemLabel:kjLabel',
|
|
63
|
-
'kjDisabled:kjDisabled',
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
host: {
|
|
68
|
-
'role': 'treeitem',
|
|
69
|
-
'[attr.aria-haspopup]': 'isBranch() ? "tree" : null',
|
|
70
|
-
'[attr.aria-expanded]': 'isBranch() ? subPanelOpen().toString() : null',
|
|
71
|
-
'[attr.data-label]': 'item.label()',
|
|
72
|
-
'[attr.data-leaf]': 'isLeaf().toString()',
|
|
73
|
-
'[attr.data-selected]': 'item.ariaSelected() === "true" ? "" : null',
|
|
74
|
-
'[attr.data-active-path]': 'isOnActivePath() ? "" : null',
|
|
75
|
-
'(click)': 'handleClick()',
|
|
76
|
-
'(mouseenter)': 'handleMouseEnter()',
|
|
77
|
-
'(mouseleave)': 'handleMouseLeave()',
|
|
78
|
-
},
|
|
79
|
-
})
|
|
80
|
-
export class KjCascadeSelectOption implements OnDestroy {
|
|
81
|
-
/** @internal — composed list-item primitive providing id/value/disabled/activation. */
|
|
82
|
-
readonly item = injectListItem<unknown>();
|
|
83
|
-
/** @internal */
|
|
84
|
-
readonly ctx = inject(KJ_CASCADE_SELECT);
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* @internal Closest ancestor sub-panel (if any). `null` when this
|
|
88
|
-
* option sits in the root cascade panel. Used by `KjCascadeSelect`'s
|
|
89
|
-
* `openSubPanel` chain rebuild — walking parent panels up to the
|
|
90
|
-
* root produces the exact open-chain that should be set, so opening
|
|
91
|
-
* a sibling at any level closes its siblings automatically (instead
|
|
92
|
-
* of leaving stale entries that a late-firing close timer can then
|
|
93
|
-
* slice through).
|
|
94
|
-
*
|
|
95
|
-
* `forwardRef` defers the class lookup so the option ↔ sub-panel
|
|
96
|
-
* import cycle doesn't trip on first evaluation.
|
|
97
|
-
*/
|
|
98
|
-
readonly parentSubPanel = inject<KjCascadeSelectSubPanel | null>(
|
|
99
|
-
forwardRef(() => KjCascadeSelectSubPanel),
|
|
100
|
-
{ optional: true },
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
// `kjValue`, `kjLabel`, `kjDisabled` are exposed via the composed
|
|
104
|
-
// `KjListItem` host directive above. Don't redeclare them on this
|
|
105
|
-
// class — duplicate public-name inputs route to the local declaration
|
|
106
|
-
// and leave `KjListItem.kjItemValue` unset. Read values back through
|
|
107
|
-
// `this.item.value()` / `this.item.label()`.
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* @internal Sub-panels projected as content of this option. Any
|
|
111
|
-
* `[kjCascadeSelectSubPanel]` declared inside the option's content
|
|
112
|
-
* makes it a branch — Angular keeps this signal in sync.
|
|
113
|
-
*/
|
|
114
|
-
private readonly _subPanels = contentChildren(
|
|
115
|
-
forwardRef(() => KjCascadeSelectSubPanel),
|
|
116
|
-
{ descendants: true },
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
/** @internal Whether this option is a branch node. */
|
|
120
|
-
readonly isBranch = computed(() => this._subPanels().length > 0);
|
|
121
|
-
|
|
122
|
-
/** @internal Inverse of `isBranch` for the `data-leaf` attribute. */
|
|
123
|
-
readonly isLeaf = computed(() => !this.isBranch());
|
|
124
|
-
|
|
125
|
-
private _openTimer: ReturnType<typeof setTimeout> | undefined;
|
|
126
|
-
private _closeTimer: ReturnType<typeof setTimeout> | undefined;
|
|
127
|
-
|
|
128
|
-
/** @internal True when this option's sub-panel is open. */
|
|
129
|
-
readonly subPanelOpen = computed(() =>
|
|
130
|
-
this.isBranch()
|
|
131
|
-
? this.ctx.openSubPanels().includes(this.item.id)
|
|
132
|
-
: false,
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
/** @internal True when the selected value is in this option's sub-tree. */
|
|
136
|
-
readonly isOnActivePath = computed(() => {
|
|
137
|
-
const path = this.ctx.path();
|
|
138
|
-
const v = this.item.value();
|
|
139
|
-
return v !== undefined && path.includes(v);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
ngOnDestroy(): void {
|
|
143
|
-
clearTimeout(this._openTimer);
|
|
144
|
-
clearTimeout(this._closeTimer);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* @internal Click handler — branch-only sub-panel toggle. Leaf clicks
|
|
149
|
-
* are handled by the composed `KjListItem` (which calls
|
|
150
|
-
* `KjSelectionModel.toggle` and then `KjCascadeSelect.afterSelect`).
|
|
151
|
-
* In leaf-mode `KjSelectionModel` no-ops on branches when a tree
|
|
152
|
-
* shape is provided, so we don't need to gate that here.
|
|
153
|
-
*/
|
|
154
|
-
handleClick(): void {
|
|
155
|
-
if (this.item.disabled()) return;
|
|
156
|
-
if (!this.isBranch()) return;
|
|
157
|
-
clearTimeout(this._openTimer);
|
|
158
|
-
clearTimeout(this._closeTimer);
|
|
159
|
-
if (this.subPanelOpen()) this.ctx.closeSubPanel(this.item.id);
|
|
160
|
-
else this.ctx.openSubPanel(this.item.id);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/** @internal */
|
|
164
|
-
handleMouseEnter(): void {
|
|
165
|
-
if (this.item.disabled() || !this.isBranch()) return;
|
|
166
|
-
clearTimeout(this._closeTimer);
|
|
167
|
-
const delay = this.ctx.subPanelOpenDelayMs();
|
|
168
|
-
this._openTimer = setTimeout(() => {
|
|
169
|
-
this.ctx.openSubPanel(this.item.id);
|
|
170
|
-
}, delay);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/** @internal */
|
|
174
|
-
handleMouseLeave(): void {
|
|
175
|
-
if (this.item.disabled() || !this.isBranch()) return;
|
|
176
|
-
clearTimeout(this._openTimer);
|
|
177
|
-
this._scheduleClose();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* @internal Called by `KjCascadeSelectSubPanel` when the cursor enters
|
|
182
|
-
* the sub-panel. The option's `mouseleave` fires the moment the cursor
|
|
183
|
-
* crosses out of the option's bounding box — including the case where
|
|
184
|
-
* the cursor moves *into* the adjacent sub-panel. Without this bridge,
|
|
185
|
-
* the close timer kept ticking and dismissed an actively-hovered
|
|
186
|
-
* sub-panel after `subPanelCloseDelayMs`.
|
|
187
|
-
*/
|
|
188
|
-
_cancelCloseTimer(): void {
|
|
189
|
-
clearTimeout(this._closeTimer);
|
|
190
|
-
this._closeTimer = undefined;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* @internal Called by `KjCascadeSelectSubPanel` when the cursor leaves
|
|
195
|
-
* the sub-panel (to anywhere except back into the parent option).
|
|
196
|
-
* Restarts the same close timer the option's own `mouseleave` would.
|
|
197
|
-
*/
|
|
198
|
-
_scheduleClose(): void {
|
|
199
|
-
const delay = this.ctx.subPanelCloseDelayMs();
|
|
200
|
-
this._closeTimer = setTimeout(() => {
|
|
201
|
-
if (!this.subPanelOpen()) return;
|
|
202
|
-
this.ctx.closeSubPanel(this.item.id);
|
|
203
|
-
}, delay);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Directive,
|
|
3
|
-
inject,
|
|
4
|
-
input,
|
|
5
|
-
} from '@angular/core';
|
|
6
|
-
import { KjOverlayPanel } from '../primitives/overlay/panel';
|
|
7
|
-
import {
|
|
8
|
-
KJ_OVERLAY_MOUNT_STRATEGY,
|
|
9
|
-
KJ_OVERLAY_POSITION_STRATEGY,
|
|
10
|
-
KJ_OVERLAY_PANEL_ROLE,
|
|
11
|
-
} from '../primitives/overlay/tokens';
|
|
12
|
-
import type { KjAlign, KjSide } from '../primitives/overlay/types';
|
|
13
|
-
import { bodyPortal } from '../primitives/overlay/strategies/mount/body-portal';
|
|
14
|
-
import { anchoredTo } from '../primitives/overlay/strategies/position/anchored-to';
|
|
15
|
-
import { KjListNavigator } from '../primitives/list';
|
|
16
|
-
import { KjCascadeSelect } from './cascade-select-root';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Root panel for a Cascade Select. Composes:
|
|
20
|
-
* - `KjOverlayPanel` — mount / position / aria wiring (rendered with
|
|
21
|
-
* `role="tree"` via the panel-role provider).
|
|
22
|
-
* - `KjListNavigator` (vertical + activedescendant) — generic Up/Down /
|
|
23
|
-
* Home/End / Enter / Space / type-ahead navigation across the
|
|
24
|
-
* level-0 options.
|
|
25
|
-
*
|
|
26
|
-
* Cascade-specific ArrowRight (open the active option's sub-panel) and
|
|
27
|
-
* Escape / Tab (close everything) remain handled here because they
|
|
28
|
-
* carry cascade-specific semantics the generic navigator doesn't
|
|
29
|
-
* cover.
|
|
30
|
-
*
|
|
31
|
-
* @doc-category Core/Data input
|
|
32
|
-
* @doc
|
|
33
|
-
* @doc-name cascade-select
|
|
34
|
-
*/
|
|
35
|
-
@Directive({
|
|
36
|
-
selector: '[kjCascadeSelectPanel]',
|
|
37
|
-
exportAs: 'kjCascadeSelectPanel',
|
|
38
|
-
standalone: true,
|
|
39
|
-
hostDirectives: [
|
|
40
|
-
{ directive: KjOverlayPanel, inputs: ['kjFor'] },
|
|
41
|
-
{
|
|
42
|
-
directive: KjListNavigator,
|
|
43
|
-
inputs: ['kjOrientation', 'kjFocusMode'],
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
providers: [
|
|
47
|
-
{ provide: KJ_OVERLAY_PANEL_ROLE, useValue: 'tree' as const },
|
|
48
|
-
{ provide: KJ_OVERLAY_MOUNT_STRATEGY, useFactory: () => bodyPortal() },
|
|
49
|
-
{ provide: KJ_OVERLAY_POSITION_STRATEGY, useFactory: () => anchoredTo() },
|
|
50
|
-
],
|
|
51
|
-
host: {
|
|
52
|
-
'role': 'tree',
|
|
53
|
-
'aria-orientation': 'horizontal',
|
|
54
|
-
'aria-multiselectable': 'false',
|
|
55
|
-
'tabindex': '-1',
|
|
56
|
-
'kjOrientation': 'vertical',
|
|
57
|
-
'kjFocusMode': 'activedescendant',
|
|
58
|
-
'(keydown)': 'onKeydown($event)',
|
|
59
|
-
'(click)': '$event.stopPropagation()',
|
|
60
|
-
},
|
|
61
|
-
})
|
|
62
|
-
export class KjCascadeSelectPanel {
|
|
63
|
-
/** @internal — root directive (typed). Owns sub-panel state + option lookup. */
|
|
64
|
-
private readonly root = inject(KjCascadeSelect);
|
|
65
|
-
/** @internal — generic list navigator composed via `hostDirectives`. */
|
|
66
|
-
private readonly nav = inject(KjListNavigator);
|
|
67
|
-
|
|
68
|
-
/** Anchored side relative to the trigger. */
|
|
69
|
-
readonly kjSide = input<KjSide>('bottom');
|
|
70
|
-
/** Cross-axis alignment relative to the trigger. */
|
|
71
|
-
readonly kjAlign = input<KjAlign>('start');
|
|
72
|
-
|
|
73
|
-
constructor() {
|
|
74
|
-
const pos = inject(KJ_OVERLAY_POSITION_STRATEGY) as ReturnType<typeof anchoredTo>;
|
|
75
|
-
pos.configure({ side: this.kjSide, align: this.kjAlign, matchTriggerWidth: 'min' });
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* @internal Cascade-specific keys — ArrowRight opens the active
|
|
80
|
-
* branch's sub-panel; Escape / Tab dismiss everything. Up/Down /
|
|
81
|
-
* Home/End / Enter / Space / typeahead all flow through the composed
|
|
82
|
-
* `KjListNavigator`.
|
|
83
|
-
*/
|
|
84
|
-
onKeydown(e: KeyboardEvent): void {
|
|
85
|
-
switch (e.key) {
|
|
86
|
-
case 'ArrowRight': {
|
|
87
|
-
e.preventDefault();
|
|
88
|
-
const activeId = this.nav.activeId();
|
|
89
|
-
if (!activeId) return;
|
|
90
|
-
const option = this.root.findOption(activeId);
|
|
91
|
-
if (option?.isBranch()) this.root.openSubPanel(option.item.id);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
case 'Escape':
|
|
95
|
-
e.preventDefault();
|
|
96
|
-
e.stopPropagation();
|
|
97
|
-
this.root.hide();
|
|
98
|
-
this.root.closeAll();
|
|
99
|
-
return;
|
|
100
|
-
case 'Tab':
|
|
101
|
-
this.root.hide();
|
|
102
|
-
this.root.closeAll();
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Directive,
|
|
3
|
-
computed,
|
|
4
|
-
contentChildren,
|
|
5
|
-
forwardRef,
|
|
6
|
-
inject,
|
|
7
|
-
input,
|
|
8
|
-
model,
|
|
9
|
-
output,
|
|
10
|
-
signal,
|
|
11
|
-
type Signal,
|
|
12
|
-
type WritableSignal,
|
|
13
|
-
} from '@angular/core';
|
|
14
|
-
import { KjOverlayController } from '../primitives/overlay/controller';
|
|
15
|
-
import { KJ_SELECT } from '../select/select-root';
|
|
16
|
-
import {
|
|
17
|
-
KJ_LIST_NAVIGATOR_CONFIG,
|
|
18
|
-
KjListItem,
|
|
19
|
-
KjSelectionModel,
|
|
20
|
-
type KjCompareFn,
|
|
21
|
-
type KjListNavigatorConfig,
|
|
22
|
-
type KjListSelectionMode,
|
|
23
|
-
type KjTreeShape,
|
|
24
|
-
} from '../primitives/list';
|
|
25
|
-
import {
|
|
26
|
-
KJ_CASCADE_SELECT,
|
|
27
|
-
type KjCascadeSelectContext,
|
|
28
|
-
} from './cascade-select.context';
|
|
29
|
-
import { KjCascadeSelectOption } from './cascade-select-option';
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Root cascade-select container. Implements
|
|
33
|
-
* {@link KjListNavigatorConfig} (items, value, mode, compareBy,
|
|
34
|
-
* treeShape, afterSelect) and provides itself under
|
|
35
|
-
* `KJ_LIST_NAVIGATOR_CONFIG` via `forwardRef`. Each cascade panel +
|
|
36
|
-
* sub-panel hosts its own `KjListNavigator` (vertical +
|
|
37
|
-
* activedescendant). All tree-walking logic — branch gating, path
|
|
38
|
-
* derivation, isLeaf — lives in the shared `KjSelectionModel`, which
|
|
39
|
-
* auto-derives the tree shape from each `KjListItem.parent` DI pointer.
|
|
40
|
-
* The root just owns cascade-specific UX: the sub-panel open-chain and
|
|
41
|
-
* the overlay close-on-commit behavior.
|
|
42
|
-
*
|
|
43
|
-
* Like `KjSelect`, the root does NOT inject `KjSelectionModel` at
|
|
44
|
-
* construction — doing so creates a runtime cycle (the model's
|
|
45
|
-
* `inject(KJ_LIST_NAVIGATOR_CONFIG)` would resolve to a still-
|
|
46
|
-
* constructing root). Lazy access via the element `Injector` resolves
|
|
47
|
-
* the model after construction finishes.
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```html
|
|
51
|
-
* <div kjCascadeSelect [(kjValue)]="city">
|
|
52
|
-
* <button kjCascadeSelectTrigger #t="kjCascadeSelectTrigger">Pick</button>
|
|
53
|
-
* <div kjCascadeSelectPanel [kjFor]="t">
|
|
54
|
-
* <div kjCascadeSelectOption [kjValue]="'us'" kjLabel="USA">…</div>
|
|
55
|
-
* </div>
|
|
56
|
-
* </div>
|
|
57
|
-
* ```
|
|
58
|
-
*
|
|
59
|
-
* @doc-category Core/Data input
|
|
60
|
-
* @doc
|
|
61
|
-
* @doc-name cascade-select
|
|
62
|
-
* @doc-is-main
|
|
63
|
-
* @doc-description Unstyled cascade-select root that implements KjListNavigatorConfig and owns the shared selection model.
|
|
64
|
-
*/
|
|
65
|
-
@Directive({
|
|
66
|
-
selector: '[kjCascadeSelect]',
|
|
67
|
-
exportAs: 'kjCascadeSelect',
|
|
68
|
-
standalone: true,
|
|
69
|
-
providers: [
|
|
70
|
-
{ provide: KJ_CASCADE_SELECT, useExisting: forwardRef(() => KjCascadeSelect) },
|
|
71
|
-
{ provide: KJ_SELECT, useExisting: forwardRef(() => KjCascadeSelect) },
|
|
72
|
-
{ provide: KJ_LIST_NAVIGATOR_CONFIG, useExisting: forwardRef(() => KjCascadeSelect) },
|
|
73
|
-
KjSelectionModel,
|
|
74
|
-
KjOverlayController,
|
|
75
|
-
],
|
|
76
|
-
})
|
|
77
|
-
export class KjCascadeSelect implements KjListNavigatorConfig, KjCascadeSelectContext {
|
|
78
|
-
/** @internal — shared overlay controller; trigger + panel + options share this. */
|
|
79
|
-
private readonly _controller = inject(KjOverlayController);
|
|
80
|
-
|
|
81
|
-
/** Two-way bindable selected leaf value. */
|
|
82
|
-
readonly kjValue = model<unknown>(undefined);
|
|
83
|
-
|
|
84
|
-
/** Two-way bindable path of values from root to selected leaf. */
|
|
85
|
-
readonly kjCascadePath = model<readonly unknown[]>([]);
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Optional consumer-supplied tree topology. When omitted, the
|
|
89
|
-
* selection model auto-derives one from each `KjListItem.parent`
|
|
90
|
-
* pointer (which Angular resolves via the element injector — the
|
|
91
|
-
* outer cascade option of a sub-panel's contents). Supply this only
|
|
92
|
-
* when the consumer's data model isn't a faithful match for the
|
|
93
|
-
* projected DOM (rare).
|
|
94
|
-
*/
|
|
95
|
-
readonly kjTreeShape = input<KjTreeShape<unknown> | null>(null);
|
|
96
|
-
|
|
97
|
-
/** Sub-panel hover-open delay in ms. Default 100 (matches Dropdown Menu). */
|
|
98
|
-
readonly kjSubPanelOpenDelayMs = input<number>(100);
|
|
99
|
-
|
|
100
|
-
/** Sub-panel hover-out close delay in ms. Default 300 (prevents flicker). */
|
|
101
|
-
readonly kjSubPanelCloseDelayMs = input<number>(300);
|
|
102
|
-
|
|
103
|
-
/** Emitted when the active-descendant crosses a level boundary. */
|
|
104
|
-
readonly kjLevelChange = output<{ levelIndex: number }>();
|
|
105
|
-
|
|
106
|
-
// ── KjListNavigatorConfig implementation ──────────────────────────
|
|
107
|
-
/** All `KjListItem`s under this cascade — source for the navigators. */
|
|
108
|
-
readonly items = contentChildren(KjListItem, { descendants: true });
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Every projected `KjCascadeSelectOption`. Used by {@link findOption}
|
|
112
|
-
* to resolve a `KjListItem` id (typically the navigator's active id)
|
|
113
|
-
* to its wrapping option directive — no `document.getElementById` /
|
|
114
|
-
* `querySelector` lookups in panel keydown handlers.
|
|
115
|
-
*/
|
|
116
|
-
private readonly _options = contentChildren(KjCascadeSelectOption, { descendants: true });
|
|
117
|
-
|
|
118
|
-
private readonly _optionsById = computed(() => {
|
|
119
|
-
const map = new Map<string, KjCascadeSelectOption>();
|
|
120
|
-
for (const o of this._options()) map.set(o.item.id, o);
|
|
121
|
-
return map;
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Resolve the `KjCascadeSelectOption` wrapping the given
|
|
126
|
-
* `KjListItem.id`. Returns `undefined` when no projected option
|
|
127
|
-
* matches.
|
|
128
|
-
*/
|
|
129
|
-
findOption(itemId: string): KjCascadeSelectOption | undefined {
|
|
130
|
-
return this._optionsById().get(itemId);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Implements `KjListNavigatorConfig.value`. Shared with `kjValue` so
|
|
135
|
-
* `KjSelectionModel` reads / writes through the same signal — one
|
|
136
|
-
* source of truth.
|
|
137
|
-
*/
|
|
138
|
-
readonly value = this.kjValue as unknown as WritableSignal<
|
|
139
|
-
unknown | readonly unknown[] | null
|
|
140
|
-
>;
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Cascade is single-leaf select: exactly one leaf value lives in
|
|
144
|
-
* `kjValue`. The selection model's `'single'` + tree-shape branch
|
|
145
|
-
* gate blocks non-leaf commits automatically — branches only toggle
|
|
146
|
-
* their own sub-panel via `KjCascadeSelectOption.handleClick`.
|
|
147
|
-
*/
|
|
148
|
-
readonly mode: Signal<KjListSelectionMode> = signal<KjListSelectionMode>('single');
|
|
149
|
-
|
|
150
|
-
/** Implements `KjListNavigatorConfig.compareBy`. */
|
|
151
|
-
readonly compareBy = signal<KjCompareFn<unknown>>(Object.is as KjCompareFn<unknown>);
|
|
152
|
-
|
|
153
|
-
/** Re-exposes `kjTreeShape` under the {@link KjListNavigatorConfig} key. */
|
|
154
|
-
readonly treeShape = this.kjTreeShape;
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Selection model is injected directly. The model uses a {@link
|
|
158
|
-
* KjSelectionModel.bind} call to receive this root's canonical
|
|
159
|
-
* signals — that pattern keeps the DI graph acyclic (the model does
|
|
160
|
-
* not inject `KJ_LIST_NAVIGATOR_CONFIG` back, so providing both on
|
|
161
|
-
* the same element no longer collides).
|
|
162
|
-
*/
|
|
163
|
-
private readonly _selection = inject(KjSelectionModel);
|
|
164
|
-
|
|
165
|
-
constructor() {
|
|
166
|
-
this._selection.bind({
|
|
167
|
-
value: this.value,
|
|
168
|
-
items: this.items,
|
|
169
|
-
mode: this.mode,
|
|
170
|
-
compareBy: this.compareBy,
|
|
171
|
-
treeShape: this.treeShape,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// ── KjSelectContext-compatible surface ──────────────────────────────
|
|
176
|
-
/** Open state — drives `KjSelect.open` for downstream consumers. */
|
|
177
|
-
readonly open = this._controller.isOpen;
|
|
178
|
-
|
|
179
|
-
/** Compatibility shim — KjSelect-style single setter. Closes the panel. */
|
|
180
|
-
select(val: unknown): void {
|
|
181
|
-
this.kjValue.set(val);
|
|
182
|
-
this._controller.close('programmatic');
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** Compatibility shim — toggles the overlay. */
|
|
186
|
-
toggle(): void {
|
|
187
|
-
if (this._controller.isOpen()) this._controller.close('programmatic');
|
|
188
|
-
else this._controller.open();
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// ── KjCascadeSelectContext implementation ──────────────────────────
|
|
192
|
-
private readonly _openSubPanels = signal<readonly string[]>([]);
|
|
193
|
-
|
|
194
|
-
/** Path of values from root option to the selected leaf. */
|
|
195
|
-
readonly path = computed(() => this.kjCascadePath());
|
|
196
|
-
|
|
197
|
-
/** Open sub-panel ownerOptionIds (level → level chain). */
|
|
198
|
-
readonly openSubPanels = this._openSubPanels.asReadonly();
|
|
199
|
-
|
|
200
|
-
/** Hover-open delay (ms). */
|
|
201
|
-
readonly subPanelOpenDelayMs = computed(() => this.kjSubPanelOpenDelayMs());
|
|
202
|
-
/** Hover-out close delay (ms). */
|
|
203
|
-
readonly subPanelCloseDelayMs = computed(() => this.kjSubPanelCloseDelayMs());
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Implements `KjListNavigatorConfig.afterSelect`. The selection model
|
|
207
|
-
* already gated branches before reaching here (see
|
|
208
|
-
* `KjSelectionModel.canActivate`), so any defined `value` is a leaf
|
|
209
|
-
* commit: derive the path from the model, surface it on
|
|
210
|
-
* `kjCascadePath`, close every sub-panel, and dismiss the overlay.
|
|
211
|
-
*/
|
|
212
|
-
afterSelect(value: unknown, _closeRequested: boolean): void {
|
|
213
|
-
if (value === undefined) return;
|
|
214
|
-
this.kjCascadePath.set(this._selection.pathTo(value));
|
|
215
|
-
this._openSubPanels.set([]);
|
|
216
|
-
this._controller.close('programmatic');
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Open the sub-panel chain ending at `ownerOptionId`. Walking the
|
|
221
|
-
* target's ancestry on every open is the trick that keeps sibling
|
|
222
|
-
* sub-panels mutually exclusive: any stale entries from a prior
|
|
223
|
-
* branch get replaced atomically with the fresh chain, so a
|
|
224
|
-
* mouseleave-queued close timer on a sibling can no longer slice
|
|
225
|
-
* through the new chain after it fires. The walk also cancels any
|
|
226
|
-
* pending close timers along the new chain so a brief inter-option
|
|
227
|
-
* cursor crossing doesn't dismiss a freshly-opened panel.
|
|
228
|
-
*/
|
|
229
|
-
openSubPanel(ownerOptionId: string): void {
|
|
230
|
-
const target = this.findOption(ownerOptionId);
|
|
231
|
-
if (!target) {
|
|
232
|
-
// Fallback: option not yet registered (rare — pre-content-init).
|
|
233
|
-
// Append to keep behavior monotonic; the close path is tolerant.
|
|
234
|
-
this._openSubPanels.update(panels =>
|
|
235
|
-
panels.includes(ownerOptionId) ? panels : [...panels, ownerOptionId],
|
|
236
|
-
);
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
const chain: string[] = [];
|
|
240
|
-
let current: typeof target | null = target;
|
|
241
|
-
while (current) {
|
|
242
|
-
current._cancelCloseTimer();
|
|
243
|
-
chain.unshift(current.item.id);
|
|
244
|
-
current = current.parentSubPanel?.parentOption ?? null;
|
|
245
|
-
}
|
|
246
|
-
this._openSubPanels.set(chain);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
closeSubPanel(ownerOptionId: string): void {
|
|
250
|
-
this._openSubPanels.update(panels => {
|
|
251
|
-
const idx = panels.indexOf(ownerOptionId);
|
|
252
|
-
if (idx < 0) return panels;
|
|
253
|
-
return panels.slice(0, idx);
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
closeAll(): void {
|
|
258
|
-
this._openSubPanels.set([]);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/** Closes the root cascade panel. */
|
|
262
|
-
hide(): void {
|
|
263
|
-
this._controller.close('programmatic');
|
|
264
|
-
}
|
|
265
|
-
}
|