@kouji-ui/core 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/kouji-ui-core.mjs +26789 -0
- package/fesm2022/kouji-ui-core.mjs.map +1 -0
- package/package.json +5 -6
- package/types/kouji-ui-core.d.ts +13545 -0
- package/.turbo/turbo-build.log +0 -30
- package/CHANGELOG.md +0 -190
- package/ng-package.json +0 -11
- package/src/a11y/.gitkeep +0 -0
- package/src/a11y/aria-describedby.spec.ts +0 -55
- package/src/a11y/aria-describedby.ts +0 -37
- package/src/a11y/aria-labelledby.spec.ts +0 -55
- package/src/a11y/aria-labelledby.ts +0 -38
- package/src/a11y/focus-trap.spec.ts +0 -86
- package/src/a11y/focus-trap.ts +0 -72
- package/src/a11y/index.ts +0 -10
- package/src/a11y/live-region.spec.ts +0 -58
- package/src/a11y/live-region.ts +0 -50
- package/src/a11y/roving-tabindex.spec.ts +0 -201
- package/src/a11y/roving-tabindex.ts +0 -153
- package/src/a11y/visually-hidden.spec.ts +0 -34
- package/src/a11y/visually-hidden.ts +0 -26
- package/src/accordion/accordion.context.ts +0 -44
- package/src/accordion/accordion.spec.ts +0 -242
- package/src/accordion/accordion.ts +0 -401
- package/src/accordion/index.ts +0 -8
- package/src/alert/alert.context.ts +0 -28
- package/src/alert/alert.spec.ts +0 -217
- package/src/alert/alert.ts +0 -417
- package/src/alert/config.ts +0 -46
- package/src/alert/index.ts +0 -19
- package/src/avatar/avatar-group.context.ts +0 -45
- package/src/avatar/avatar-group.spec.ts +0 -358
- package/src/avatar/avatar-group.ts +0 -259
- package/src/avatar/avatar.spec.ts +0 -18
- package/src/avatar/avatar.ts +0 -39
- package/src/avatar/index.ts +0 -11
- package/src/badge/badge.spec.ts +0 -28
- package/src/badge/badge.ts +0 -35
- package/src/badge/index.ts +0 -1
- package/src/breadcrumb/breadcrumb-current.ts +0 -38
- package/src/breadcrumb/breadcrumb-ellipsis.ts +0 -71
- package/src/breadcrumb/breadcrumb-item.ts +0 -41
- package/src/breadcrumb/breadcrumb-link.ts +0 -44
- package/src/breadcrumb/breadcrumb-list.ts +0 -42
- package/src/breadcrumb/breadcrumb-separator.ts +0 -45
- package/src/breadcrumb/breadcrumb.context.ts +0 -45
- package/src/breadcrumb/breadcrumb.spec.ts +0 -354
- package/src/breadcrumb/breadcrumb.ts +0 -239
- package/src/breadcrumb/config.ts +0 -84
- package/src/breadcrumb/index.ts +0 -18
- package/src/button/_examples/button.example.ts +0 -71
- package/src/button/_examples/button.finance.example.ts +0 -83
- package/src/button/_examples/button.retro.example.ts +0 -91
- package/src/button/_examples/button.sizes.example.ts +0 -60
- package/src/button/_examples/index.ts +0 -6
- package/src/button/button.spec.ts +0 -163
- package/src/button/button.ts +0 -142
- package/src/button/config.spec.ts +0 -33
- package/src/button/config.ts +0 -45
- package/src/button/index.ts +0 -2
- package/src/button-group/button-group.context.ts +0 -28
- package/src/button-group/button-group.spec.ts +0 -99
- package/src/button-group/button-group.ts +0 -99
- package/src/button-group/index.ts +0 -2
- package/src/calendar/calendar-day.ts +0 -102
- package/src/calendar/calendar-grid.ts +0 -90
- package/src/calendar/calendar-header.ts +0 -65
- package/src/calendar/calendar.context.ts +0 -53
- package/src/calendar/calendar.spec.ts +0 -225
- package/src/calendar/calendar.ts +0 -233
- package/src/calendar/date-utils.ts +0 -225
- package/src/calendar/index.ts +0 -28
- package/src/carousel/carousel.context.ts +0 -81
- package/src/carousel/carousel.spec.ts +0 -337
- package/src/carousel/carousel.ts +0 -919
- package/src/carousel/index.ts +0 -22
- package/src/cascade-select/cascade-select-option.ts +0 -205
- package/src/cascade-select/cascade-select-panel.ts +0 -106
- package/src/cascade-select/cascade-select-root.ts +0 -265
- package/src/cascade-select/cascade-select-sub-panel.ts +0 -168
- package/src/cascade-select/cascade-select-trigger.ts +0 -44
- package/src/cascade-select/cascade-select.context.ts +0 -71
- package/src/cascade-select/cascade-select.spec.ts +0 -241
- package/src/cascade-select/cascade-select.ts +0 -5
- package/src/cascade-select/index.ts +0 -11
- package/src/chart/chart.spec.ts +0 -27
- package/src/chart/chart.ts +0 -52
- package/src/chart/index.ts +0 -1
- package/src/chat/chat-avatar.ts +0 -31
- package/src/chat/chat-bubble.ts +0 -49
- package/src/chat/chat-footer.ts +0 -67
- package/src/chat/chat-header.ts +0 -41
- package/src/chat/chat-log.ts +0 -43
- package/src/chat/chat.context.ts +0 -64
- package/src/chat/chat.spec.ts +0 -341
- package/src/chat/chat.ts +0 -191
- package/src/chat/config.ts +0 -53
- package/src/chat/index.ts +0 -21
- package/src/checkbox/checkbox.spec.ts +0 -35
- package/src/checkbox/checkbox.ts +0 -89
- package/src/checkbox/index.ts +0 -1
- package/src/color-picker/color-picker.context.ts +0 -74
- package/src/color-picker/color-picker.spec.ts +0 -241
- package/src/color-picker/color-picker.ts +0 -698
- package/src/color-picker/color-picker.utils.ts +0 -140
- package/src/color-picker/index.ts +0 -28
- package/src/combobox/combobox-input.ts +0 -143
- package/src/combobox/combobox-listbox.ts +0 -49
- package/src/combobox/combobox-option.ts +0 -43
- package/src/combobox/combobox-root.ts +0 -281
- package/src/combobox/combobox.spec.ts +0 -75
- package/src/combobox/combobox.ts +0 -4
- package/src/combobox/index.ts +0 -4
- package/src/command-palette/command-empty.ts +0 -36
- package/src/command-palette/command-group.ts +0 -21
- package/src/command-palette/command-input.ts +0 -70
- package/src/command-palette/command-item.ts +0 -60
- package/src/command-palette/command-list.ts +0 -25
- package/src/command-palette/command-palette-dialog.ts +0 -74
- package/src/command-palette/command-palette-trigger.ts +0 -64
- package/src/command-palette/command-palette.filters.ts +0 -53
- package/src/command-palette/command-palette.spec.ts +0 -349
- package/src/command-palette/command-palette.ts +0 -204
- package/src/command-palette/command-separator.ts +0 -18
- package/src/command-palette/index.ts +0 -15
- package/src/confirm-popup/confirm-popup-action.ts +0 -39
- package/src/confirm-popup/confirm-popup-cancel.ts +0 -38
- package/src/confirm-popup/confirm-popup-content.ts +0 -113
- package/src/confirm-popup/confirm-popup-message.ts +0 -36
- package/src/confirm-popup/confirm-popup-trigger.ts +0 -31
- package/src/confirm-popup/confirm-popup.context.ts +0 -41
- package/src/confirm-popup/confirm-popup.spec.ts +0 -337
- package/src/confirm-popup/confirm-popup.ts +0 -109
- package/src/confirm-popup/index.ts +0 -12
- package/src/date-picker/date-picker-calendar.ts +0 -65
- package/src/date-picker/date-picker-trigger.ts +0 -215
- package/src/date-picker/date-picker.context.ts +0 -50
- package/src/date-picker/date-picker.spec.ts +0 -117
- package/src/date-picker/date-picker.ts +0 -127
- package/src/date-picker/index.ts +0 -7
- package/src/dialog/_examples/dialog.confirm.example.ts +0 -145
- package/src/dialog/_examples/dialog.example.ts +0 -106
- package/src/dialog/_examples/dialog.finance.example.ts +0 -121
- package/src/dialog/_examples/dialog.retro.example.ts +0 -126
- package/src/dialog/_examples/index.ts +0 -6
- package/src/dialog/dialog.ref.ts +0 -42
- package/src/dialog/dialog.service.ts +0 -66
- package/src/dialog/dialog.spec.ts +0 -37
- package/src/dialog/dialog.ts +0 -26
- package/src/dialog/index.ts +0 -3
- package/src/divider/divider.spec.ts +0 -223
- package/src/divider/divider.ts +0 -137
- package/src/divider/index.ts +0 -5
- package/src/drawer/drawer.ref.ts +0 -63
- package/src/drawer/drawer.service.ts +0 -106
- package/src/drawer/drawer.spec.ts +0 -117
- package/src/drawer/drawer.ts +0 -122
- package/src/drawer/index.ts +0 -10
- package/src/dropdown-menu/dropdown-menu-content.ts +0 -258
- package/src/dropdown-menu/dropdown-menu-group.ts +0 -31
- package/src/dropdown-menu/dropdown-menu-item.ts +0 -51
- package/src/dropdown-menu/dropdown-menu-label.ts +0 -41
- package/src/dropdown-menu/dropdown-menu-separator.ts +0 -27
- package/src/dropdown-menu/dropdown-menu-trigger.ts +0 -140
- package/src/dropdown-menu/dropdown-menu.spec.ts +0 -265
- package/src/dropdown-menu/dropdown-menu.ts +0 -60
- package/src/dropdown-menu/index.ts +0 -15
- package/src/example-components.ts +0 -42
- package/src/field/field-error.ts +0 -49
- package/src/field/field-group.ts +0 -39
- package/src/field/field-help.ts +0 -47
- package/src/field/field-label.ts +0 -30
- package/src/field/field.context.ts +0 -28
- package/src/field/field.spec.ts +0 -179
- package/src/field/field.ts +0 -121
- package/src/field/index.ts +0 -6
- package/src/file-upload/file-upload.context.ts +0 -89
- package/src/file-upload/file-upload.spec.ts +0 -290
- package/src/file-upload/file-upload.ts +0 -639
- package/src/file-upload/file-upload.types.ts +0 -59
- package/src/file-upload/index.ts +0 -23
- package/src/form/form-error-summary.ts +0 -87
- package/src/form/form-field.context.ts +0 -3
- package/src/form/form-field.spec.ts +0 -25
- package/src/form/form-field.ts +0 -52
- package/src/form/form.context.ts +0 -53
- package/src/form/form.spec.ts +0 -162
- package/src/form/form.ts +0 -326
- package/src/form/index.ts +0 -11
- package/src/icon/E2E.md +0 -14
- package/src/icon/icon.directive.spec.ts +0 -198
- package/src/icon/icon.directive.ts +0 -113
- package/src/icon/icon.mode.spec.ts +0 -29
- package/src/icon/icon.mode.ts +0 -23
- package/src/icon/icon.providers.spec.ts +0 -63
- package/src/icon/icon.providers.ts +0 -47
- package/src/icon/icon.resolver.spec.ts +0 -96
- package/src/icon/icon.resolver.ts +0 -49
- package/src/icon/icon.tokens.ts +0 -88
- package/src/icon/icon.types.ts +0 -48
- package/src/icon/index.ts +0 -21
- package/src/input/index.ts +0 -1
- package/src/input/input.spec.ts +0 -43
- package/src/input/input.ts +0 -89
- package/src/input-group/index.ts +0 -3
- package/src/input-group/input-group-addon.ts +0 -92
- package/src/input-group/input-group.context.ts +0 -27
- package/src/input-group/input-group.spec.ts +0 -186
- package/src/input-group/input-group.ts +0 -136
- package/src/input-mask/index.ts +0 -11
- package/src/input-mask/input-mask.compile.ts +0 -69
- package/src/input-mask/input-mask.engine.ts +0 -376
- package/src/input-mask/input-mask.presets.ts +0 -24
- package/src/input-mask/input-mask.spec.ts +0 -304
- package/src/input-mask/input-mask.tokens.ts +0 -49
- package/src/input-mask/input-mask.ts +0 -280
- package/src/input-otp/index.ts +0 -2
- package/src/input-otp/input-otp.context.ts +0 -41
- package/src/input-otp/input-otp.spec.ts +0 -308
- package/src/input-otp/input-otp.ts +0 -470
- package/src/kbd/index.ts +0 -1
- package/src/kbd/kbd.spec.ts +0 -127
- package/src/kbd/kbd.ts +0 -132
- package/src/link/config.ts +0 -44
- package/src/link/index.ts +0 -2
- package/src/link/link.spec.ts +0 -246
- package/src/link/link.ts +0 -226
- package/src/list/index.ts +0 -11
- package/src/list/list.spec.ts +0 -237
- package/src/list/list.ts +0 -277
- package/src/menubar/index.ts +0 -7
- package/src/menubar/menubar-item.ts +0 -204
- package/src/menubar/menubar.context.ts +0 -43
- package/src/menubar/menubar.spec.ts +0 -433
- package/src/menubar/menubar.ts +0 -309
- package/src/number-input/index.ts +0 -4
- package/src/number-input/number-input-group.ts +0 -64
- package/src/number-input/number-input.context.ts +0 -31
- package/src/number-input/number-input.format.ts +0 -148
- package/src/number-input/number-input.spec.ts +0 -170
- package/src/number-input/number-input.ts +0 -457
- package/src/number-input/number-stepper.ts +0 -193
- package/src/overlay-badge/index.ts +0 -7
- package/src/overlay-badge/overlay-badge-content.ts +0 -73
- package/src/overlay-badge/overlay-badge.context.ts +0 -37
- package/src/overlay-badge/overlay-badge.spec.ts +0 -220
- package/src/overlay-badge/overlay-badge.ts +0 -128
- package/src/pagination/config.ts +0 -82
- package/src/pagination/index.ts +0 -19
- package/src/pagination/page-tokens.ts +0 -78
- package/src/pagination/pagination-ellipsis.ts +0 -69
- package/src/pagination/pagination-first.ts +0 -84
- package/src/pagination/pagination-info.ts +0 -70
- package/src/pagination/pagination-item.ts +0 -81
- package/src/pagination/pagination-last.ts +0 -85
- package/src/pagination/pagination-next.ts +0 -86
- package/src/pagination/pagination-previous.ts +0 -90
- package/src/pagination/pagination.context.ts +0 -52
- package/src/pagination/pagination.spec.ts +0 -388
- package/src/pagination/pagination.ts +0 -288
- package/src/password-input/index.ts +0 -15
- package/src/password-input/password-input.context.ts +0 -65
- package/src/password-input/password-input.scorer.ts +0 -34
- package/src/password-input/password-input.spec.ts +0 -274
- package/src/password-input/password-input.ts +0 -488
- package/src/popover/_examples/index.ts +0 -5
- package/src/popover/_examples/popover.example.ts +0 -92
- package/src/popover/_examples/popover.finance.example.ts +0 -106
- package/src/popover/_examples/popover.retro.example.ts +0 -103
- package/src/popover/index.ts +0 -5
- package/src/popover/popover-arrow.ts +0 -30
- package/src/popover/popover-close.ts +0 -36
- package/src/popover/popover-content.ts +0 -41
- package/src/popover/popover-title.ts +0 -39
- package/src/popover/popover-trigger.ts +0 -40
- package/src/popover/popover.spec.ts +0 -59
- package/src/popover/popover.ts +0 -5
- package/src/presets/bind-presets.spec.ts +0 -50
- package/src/presets/bind-presets.ts +0 -43
- package/src/presets/index.ts +0 -3
- package/src/presets/size.spec.ts +0 -67
- package/src/presets/size.ts +0 -59
- package/src/presets/variant.spec.ts +0 -72
- package/src/presets/variant.ts +0 -62
- package/src/primitives/.gitkeep +0 -0
- package/src/primitives/directionality/directionality.spec.ts +0 -112
- package/src/primitives/directionality/directionality.ts +0 -89
- package/src/primitives/directionality/index.ts +0 -1
- package/src/primitives/forms/form-control.spec.ts +0 -67
- package/src/primitives/forms/form-control.ts +0 -94
- package/src/primitives/forms/index.ts +0 -1
- package/src/primitives/index.ts +0 -6
- package/src/primitives/interaction/disabled.spec.ts +0 -47
- package/src/primitives/interaction/disabled.ts +0 -31
- package/src/primitives/interaction/focus-ring.spec.ts +0 -62
- package/src/primitives/interaction/focus-ring.ts +0 -59
- package/src/primitives/interaction/index.ts +0 -2
- package/src/primitives/list/filterable-list.spec.ts +0 -114
- package/src/primitives/list/filterable-list.ts +0 -126
- package/src/primitives/list/group.spec.ts +0 -99
- package/src/primitives/list/group.ts +0 -139
- package/src/primitives/list/index.ts +0 -8
- package/src/primitives/list/inject-helpers.ts +0 -8
- package/src/primitives/list/item.spec.ts +0 -173
- package/src/primitives/list/item.ts +0 -222
- package/src/primitives/list/navigator.spec.ts +0 -286
- package/src/primitives/list/navigator.ts +0 -238
- package/src/primitives/list/selection.spec.ts +0 -214
- package/src/primitives/list/selection.ts +0 -339
- package/src/primitives/list/tokens.ts +0 -106
- package/src/primitives/list/type-ahead.spec.ts +0 -58
- package/src/primitives/list/type-ahead.ts +0 -46
- package/src/primitives/overlay/backdrop.spec.ts +0 -54
- package/src/primitives/overlay/backdrop.ts +0 -31
- package/src/primitives/overlay/builder.spec.ts +0 -38
- package/src/primitives/overlay/builder.ts +0 -151
- package/src/primitives/overlay/container.ts +0 -42
- package/src/primitives/overlay/context.ts +0 -14
- package/src/primitives/overlay/controller.spec.ts +0 -86
- package/src/primitives/overlay/controller.ts +0 -190
- package/src/primitives/overlay/id.spec.ts +0 -24
- package/src/primitives/overlay/id.ts +0 -17
- package/src/primitives/overlay/index.ts +0 -18
- package/src/primitives/overlay/overlay.css +0 -42
- package/src/primitives/overlay/panel.spec.ts +0 -52
- package/src/primitives/overlay/panel.ts +0 -102
- package/src/primitives/overlay/stack.spec.ts +0 -55
- package/src/primitives/overlay/stack.ts +0 -113
- package/src/primitives/overlay/strategies/backdrop/blurred.spec.ts +0 -11
- package/src/primitives/overlay/strategies/backdrop/blurred.ts +0 -5
- package/src/primitives/overlay/strategies/backdrop/none.spec.ts +0 -10
- package/src/primitives/overlay/strategies/backdrop/none.ts +0 -9
- package/src/primitives/overlay/strategies/backdrop/solid.spec.ts +0 -18
- package/src/primitives/overlay/strategies/backdrop/solid.ts +0 -23
- package/src/primitives/overlay/strategies/focus-trap/inert-based.spec.ts +0 -28
- package/src/primitives/overlay/strategies/focus-trap/inert-based.ts +0 -38
- package/src/primitives/overlay/strategies/focus-trap/no-trap.spec.ts +0 -9
- package/src/primitives/overlay/strategies/focus-trap/no-trap.ts +0 -8
- package/src/primitives/overlay/strategies/focus-trap/tab-cycle.spec.ts +0 -49
- package/src/primitives/overlay/strategies/focus-trap/tab-cycle.ts +0 -85
- package/src/primitives/overlay/strategies/index.ts +0 -34
- package/src/primitives/overlay/strategies/live-announcer/_announce.ts +0 -35
- package/src/primitives/overlay/strategies/live-announcer/assertive.spec.ts +0 -21
- package/src/primitives/overlay/strategies/live-announcer/assertive.ts +0 -11
- package/src/primitives/overlay/strategies/live-announcer/polite.spec.ts +0 -21
- package/src/primitives/overlay/strategies/live-announcer/polite.ts +0 -11
- package/src/primitives/overlay/strategies/live-announcer/silent.spec.ts +0 -12
- package/src/primitives/overlay/strategies/live-announcer/silent.ts +0 -5
- package/src/primitives/overlay/strategies/mount/body-portal.spec.ts +0 -40
- package/src/primitives/overlay/strategies/mount/body-portal.ts +0 -91
- package/src/primitives/overlay/strategies/mount/in-container.spec.ts +0 -43
- package/src/primitives/overlay/strategies/mount/in-container.ts +0 -39
- package/src/primitives/overlay/strategies/mount/in-place.spec.ts +0 -40
- package/src/primitives/overlay/strategies/mount/in-place.ts +0 -20
- package/src/primitives/overlay/strategies/position/anchored-to.spec.ts +0 -56
- package/src/primitives/overlay/strategies/position/anchored-to.ts +0 -248
- package/src/primitives/overlay/strategies/position/corner.spec.ts +0 -36
- package/src/primitives/overlay/strategies/position/corner.ts +0 -33
- package/src/primitives/overlay/strategies/position/edge-sheet.spec.ts +0 -32
- package/src/primitives/overlay/strategies/position/edge-sheet.ts +0 -36
- package/src/primitives/overlay/strategies/position/in-place-sibling.spec.ts +0 -25
- package/src/primitives/overlay/strategies/position/in-place-sibling.ts +0 -13
- package/src/primitives/overlay/strategies/position/point-at.spec.ts +0 -40
- package/src/primitives/overlay/strategies/position/point-at.ts +0 -34
- package/src/primitives/overlay/strategies/position/viewport-centered.spec.ts +0 -31
- package/src/primitives/overlay/strategies/position/viewport-centered.ts +0 -31
- package/src/primitives/overlay/strategies/scroll-lock/css-clip.spec.ts +0 -15
- package/src/primitives/overlay/strategies/scroll-lock/css-clip.ts +0 -39
- package/src/primitives/overlay/strategies/scroll-lock/html-overflow.spec.ts +0 -21
- package/src/primitives/overlay/strategies/scroll-lock/html-overflow.ts +0 -44
- package/src/primitives/overlay/strategies/scroll-lock/none.spec.ts +0 -9
- package/src/primitives/overlay/strategies/scroll-lock/none.ts +0 -5
- package/src/primitives/overlay/strategies/trigger-event/on-click.spec.ts +0 -32
- package/src/primitives/overlay/strategies/trigger-event/on-click.ts +0 -28
- package/src/primitives/overlay/strategies/trigger-event/on-context-menu.spec.ts +0 -45
- package/src/primitives/overlay/strategies/trigger-event/on-context-menu.ts +0 -70
- package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.spec.ts +0 -35
- package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.ts +0 -34
- package/src/primitives/overlay/strategies/trigger-event/on-focus.spec.ts +0 -64
- package/src/primitives/overlay/strategies/trigger-event/on-focus.ts +0 -37
- package/src/primitives/overlay/strategies/trigger-event/on-hotkey.spec.ts +0 -37
- package/src/primitives/overlay/strategies/trigger-event/on-hotkey.ts +0 -59
- package/src/primitives/overlay/strategies/trigger-event/on-hover.spec.ts +0 -34
- package/src/primitives/overlay/strategies/trigger-event/on-hover.ts +0 -86
- package/src/primitives/overlay/strategies/trigger-event/programmatic.spec.ts +0 -16
- package/src/primitives/overlay/strategies/trigger-event/programmatic.ts +0 -12
- package/src/primitives/overlay/tokens.ts +0 -54
- package/src/primitives/overlay/trigger.spec.ts +0 -103
- package/src/primitives/overlay/trigger.ts +0 -75
- package/src/primitives/overlay/types.ts +0 -24
- package/src/primitives/overlay/wrapper.ts +0 -50
- package/src/primitives/signals/deep-signal.ts +0 -109
- package/src/primitives/signals/index.ts +0 -1
- package/src/progress-bar/config.ts +0 -48
- package/src/progress-bar/index.ts +0 -12
- package/src/progress-bar/progress-bar-fill.ts +0 -37
- package/src/progress-bar/progress-bar.context.ts +0 -34
- package/src/progress-bar/progress-bar.spec.ts +0 -423
- package/src/progress-bar/progress-bar.ts +0 -217
- package/src/public-api.ts +0 -84
- package/src/radio/index.ts +0 -2
- package/src/radio/radio.context.ts +0 -3
- package/src/radio/radio.spec.ts +0 -36
- package/src/radio/radio.ts +0 -66
- package/src/select/index.ts +0 -4
- package/src/select/select-content.ts +0 -69
- package/src/select/select-option.ts +0 -35
- package/src/select/select-root.ts +0 -129
- package/src/select/select-trigger.ts +0 -93
- package/src/select/select.spec.ts +0 -138
- package/src/select/select.ts +0 -4
- package/src/skeleton/index.ts +0 -5
- package/src/skeleton/skeleton.spec.ts +0 -115
- package/src/skeleton/skeleton.ts +0 -56
- package/src/slider/index.ts +0 -10
- package/src/slider/slider-range.ts +0 -49
- package/src/slider/slider-thumb.ts +0 -335
- package/src/slider/slider-track.ts +0 -70
- package/src/slider/slider.context.ts +0 -79
- package/src/slider/slider.geometry.ts +0 -73
- package/src/slider/slider.spec.ts +0 -216
- package/src/slider/slider.ts +0 -443
- package/src/speed-dial/index.ts +0 -10
- package/src/speed-dial/speed-dial-action.ts +0 -40
- package/src/speed-dial/speed-dial-actions.ts +0 -31
- package/src/speed-dial/speed-dial-trigger.ts +0 -55
- package/src/speed-dial/speed-dial.context.ts +0 -36
- package/src/speed-dial/speed-dial.spec.ts +0 -143
- package/src/speed-dial/speed-dial.ts +0 -127
- package/src/spinner/config.ts +0 -48
- package/src/spinner/index.ts +0 -8
- package/src/spinner/spinner.spec.ts +0 -262
- package/src/spinner/spinner.ts +0 -129
- package/src/stepper/index.ts +0 -15
- package/src/stepper/stepper.context.ts +0 -63
- package/src/stepper/stepper.spec.ts +0 -403
- package/src/stepper/stepper.ts +0 -544
- package/src/styles/docs-themes.css +0 -82
- package/src/styles.css +0 -17
- package/src/table/column-helpers.spec.ts +0 -74
- package/src/table/column-helpers.ts +0 -68
- package/src/table/filter-fns.ts +0 -230
- package/src/table/filter-models.spec.ts +0 -240
- package/src/table/filter-models.ts +0 -124
- package/src/table/filter-params.ts +0 -90
- package/src/table/grid-api-impl.ts +0 -321
- package/src/table/grid-api.spec.ts +0 -178
- package/src/table/grid-api.ts +0 -285
- package/src/table/index.ts +0 -73
- package/src/table/table-cell.spec.ts +0 -43
- package/src/table/table-cell.ts +0 -38
- package/src/table/table-filter-outlet.ts +0 -120
- package/src/table/table-header.spec.ts +0 -54
- package/src/table/table-header.ts +0 -63
- package/src/table/table-keyboard.spec.ts +0 -68
- package/src/table/table-keyboard.ts +0 -107
- package/src/table/table-resource.spec.ts +0 -37
- package/src/table/table-resource.ts +0 -36
- package/src/table/table-row.spec.ts +0 -54
- package/src/table/table-row.ts +0 -31
- package/src/table/table-storage.spec.ts +0 -67
- package/src/table/table-storage.ts +0 -76
- package/src/table/table.spec.ts +0 -172
- package/src/table/table.ts +0 -281
- package/src/table/table.types.ts +0 -83
- package/src/tabs/index.ts +0 -7
- package/src/tabs/tabs.context.ts +0 -32
- package/src/tabs/tabs.spec.ts +0 -352
- package/src/tabs/tabs.ts +0 -364
- package/src/tag/config.ts +0 -53
- package/src/tag/index.ts +0 -7
- package/src/tag/tag-list.ts +0 -76
- package/src/tag/tag-remove.ts +0 -61
- package/src/tag/tag.context.ts +0 -36
- package/src/tag/tag.spec.ts +0 -240
- package/src/tag/tag.ts +0 -203
- package/src/test-setup.ts +0 -5
- package/src/textarea/config.ts +0 -42
- package/src/textarea/index.ts +0 -8
- package/src/textarea/textarea.spec.ts +0 -176
- package/src/textarea/textarea.ts +0 -235
- package/src/time-picker/index.ts +0 -15
- package/src/time-picker/time-picker-meridiem.ts +0 -123
- package/src/time-picker/time-picker-segment.ts +0 -318
- package/src/time-picker/time-picker.context.ts +0 -38
- package/src/time-picker/time-picker.format.ts +0 -181
- package/src/time-picker/time-picker.spec.ts +0 -189
- package/src/time-picker/time-picker.ts +0 -274
- package/src/toast/_examples/index.ts +0 -5
- package/src/toast/_examples/toast.example.ts +0 -282
- package/src/toast/_examples/toast.finance.example.ts +0 -180
- package/src/toast/_examples/toast.retro.example.ts +0 -161
- package/src/toast/index.ts +0 -28
- package/src/toast/toast.ref.ts +0 -26
- package/src/toast/toast.service.ts +0 -339
- package/src/toast/toast.spec.ts +0 -247
- package/src/toast/toast.strategy.ts +0 -112
- package/src/toast/toast.ts +0 -463
- package/src/toast/toast.types.ts +0 -5
- package/src/toggle/index.ts +0 -1
- package/src/toggle/toggle.spec.ts +0 -24
- package/src/toggle/toggle.ts +0 -48
- package/src/tooltip/_examples/index.ts +0 -6
- package/src/tooltip/_examples/tooltip.example.ts +0 -82
- package/src/tooltip/_examples/tooltip.finance.example.ts +0 -97
- package/src/tooltip/_examples/tooltip.placements.example.ts +0 -83
- package/src/tooltip/_examples/tooltip.retro.example.ts +0 -107
- package/src/tooltip/index.ts +0 -4
- package/src/tooltip/tooltip-arrow.ts +0 -31
- package/src/tooltip/tooltip-content.ts +0 -38
- package/src/tooltip/tooltip-group.ts +0 -32
- package/src/tooltip/tooltip-trigger.ts +0 -47
- package/src/tooltip/tooltip.spec.ts +0 -40
- package/src/tooltip/tooltip.ts +0 -5
- package/src/tree-select/index.ts +0 -12
- package/src/tree-select/tree-select-content.ts +0 -199
- package/src/tree-select/tree-select-node.ts +0 -132
- package/src/tree-select/tree-select-root.ts +0 -272
- package/src/tree-select/tree-select-trigger.ts +0 -90
- package/src/tree-select/tree-select.context.ts +0 -63
- package/src/tree-select/tree-select.spec.ts +0 -433
- package/src/tree-select/tree-select.ts +0 -2
- package/src/typography/blockquote.ts +0 -57
- package/src/typography/code.ts +0 -53
- package/src/typography/index.ts +0 -22
- package/src/typography/lead.ts +0 -49
- package/src/typography/muted.ts +0 -29
- package/src/typography/truncate.ts +0 -99
- package/src/typography/typography.spec.ts +0 -203
- package/tsconfig.lib.json +0 -21
- package/tsconfig.lib.prod.json +0 -17
- package/tsconfig.spec.json +0 -18
- package/vite.config.ts +0 -27
- /package/{src/icon → icon}/icon.css +0 -0
- /package/{src/typography → typography}/prose.css +0 -0
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { render, fireEvent } from '@testing-library/angular';
|
|
2
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
3
|
-
import { KjButton } from '../button/button';
|
|
4
|
-
import {
|
|
5
|
-
KjSpeedDial,
|
|
6
|
-
KjSpeedDialAction,
|
|
7
|
-
KjSpeedDialActions,
|
|
8
|
-
KjSpeedDialTrigger,
|
|
9
|
-
} from './index';
|
|
10
|
-
|
|
11
|
-
expect.extend(toHaveNoViolations);
|
|
12
|
-
|
|
13
|
-
const imports = [
|
|
14
|
-
KjButton,
|
|
15
|
-
KjSpeedDial,
|
|
16
|
-
KjSpeedDialTrigger,
|
|
17
|
-
KjSpeedDialActions,
|
|
18
|
-
KjSpeedDialAction,
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
const TEMPLATE = `
|
|
22
|
-
<div kjSpeedDial>
|
|
23
|
-
<button kjButton kjSpeedDialTrigger aria-label="Open">+</button>
|
|
24
|
-
<div kjSpeedDialActions>
|
|
25
|
-
<button kjButton kjSpeedDialAction aria-label="Edit">E</button>
|
|
26
|
-
<button kjButton kjSpeedDialAction aria-label="Share">S</button>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
`;
|
|
30
|
-
|
|
31
|
-
describe('KjSpeedDial', () => {
|
|
32
|
-
it('starts collapsed and reflects ARIA on the trigger', async () => {
|
|
33
|
-
const { getByLabelText, container } = await render(TEMPLATE, { imports });
|
|
34
|
-
const trigger = getByLabelText('Open');
|
|
35
|
-
expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
|
|
36
|
-
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
37
|
-
expect(trigger.getAttribute('aria-controls')).toMatch(/^kj-speed-dial-\d+$/);
|
|
38
|
-
|
|
39
|
-
const actions = container.querySelector('[kjSpeedDialActions]') as HTMLElement;
|
|
40
|
-
expect(actions).toHaveAttribute('aria-hidden', 'true');
|
|
41
|
-
expect(actions.id).toMatch(/^kj-speed-dial-\d+$/);
|
|
42
|
-
expect(trigger.getAttribute('aria-controls')).toBe(actions.id);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('reflects kjDirection as data-direction on root and actions container', async () => {
|
|
46
|
-
const { container } = await render(
|
|
47
|
-
`
|
|
48
|
-
<div kjSpeedDial kjDirection="left">
|
|
49
|
-
<button kjButton kjSpeedDialTrigger aria-label="Open">+</button>
|
|
50
|
-
<div kjSpeedDialActions>
|
|
51
|
-
<button kjButton kjSpeedDialAction aria-label="A">A</button>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
`,
|
|
55
|
-
{ imports },
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
const root = container.querySelector('[kjSpeedDial]') as HTMLElement;
|
|
59
|
-
const actions = container.querySelector('[kjSpeedDialActions]') as HTMLElement;
|
|
60
|
-
expect(root).toHaveAttribute('data-direction', 'left');
|
|
61
|
-
expect(actions).toHaveAttribute('data-direction', 'left');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('toggles open on trigger click and expands the cluster', async () => {
|
|
65
|
-
const { getByLabelText, container } = await render(TEMPLATE, { imports });
|
|
66
|
-
const trigger = getByLabelText('Open');
|
|
67
|
-
const actions = container.querySelector('[kjSpeedDialActions]') as HTMLElement;
|
|
68
|
-
const root = container.querySelector('[kjSpeedDial]') as HTMLElement;
|
|
69
|
-
|
|
70
|
-
fireEvent.click(trigger);
|
|
71
|
-
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
72
|
-
expect(trigger).toHaveAttribute('data-state', 'open');
|
|
73
|
-
expect(actions).not.toHaveAttribute('aria-hidden');
|
|
74
|
-
expect(actions).toHaveAttribute('data-expanded', '');
|
|
75
|
-
expect(root).toHaveAttribute('data-expanded', '');
|
|
76
|
-
|
|
77
|
-
fireEvent.click(trigger);
|
|
78
|
-
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
79
|
-
expect(actions).toHaveAttribute('aria-hidden', 'true');
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('closes when an action is activated (default kjCloseOnActivate=true)', async () => {
|
|
83
|
-
const { getByLabelText } = await render(TEMPLATE, { imports });
|
|
84
|
-
fireEvent.click(getByLabelText('Open'));
|
|
85
|
-
expect(getByLabelText('Open')).toHaveAttribute('aria-expanded', 'true');
|
|
86
|
-
|
|
87
|
-
fireEvent.click(getByLabelText('Edit'));
|
|
88
|
-
expect(getByLabelText('Open')).toHaveAttribute('aria-expanded', 'false');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('keeps the dial open when kjCloseOnActivate=false', async () => {
|
|
92
|
-
const { getByLabelText } = await render(
|
|
93
|
-
`
|
|
94
|
-
<div kjSpeedDial>
|
|
95
|
-
<button kjButton kjSpeedDialTrigger aria-label="Open">+</button>
|
|
96
|
-
<div kjSpeedDialActions>
|
|
97
|
-
<button kjButton kjSpeedDialAction [kjCloseOnActivate]="false" aria-label="Stay">S</button>
|
|
98
|
-
</div>
|
|
99
|
-
</div>
|
|
100
|
-
`,
|
|
101
|
-
{ imports },
|
|
102
|
-
);
|
|
103
|
-
fireEvent.click(getByLabelText('Open'));
|
|
104
|
-
fireEvent.click(getByLabelText('Stay'));
|
|
105
|
-
expect(getByLabelText('Open')).toHaveAttribute('aria-expanded', 'true');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('closes when Escape is pressed on the trigger', async () => {
|
|
109
|
-
const { getByLabelText } = await render(TEMPLATE, { imports });
|
|
110
|
-
fireEvent.click(getByLabelText('Open'));
|
|
111
|
-
expect(getByLabelText('Open')).toHaveAttribute('aria-expanded', 'true');
|
|
112
|
-
|
|
113
|
-
fireEvent.keyDown(getByLabelText('Open'), { key: 'Escape' });
|
|
114
|
-
expect(getByLabelText('Open')).toHaveAttribute('aria-expanded', 'false');
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('does not open when kjDisabled', async () => {
|
|
118
|
-
const { getByLabelText } = await render(
|
|
119
|
-
`
|
|
120
|
-
<div kjSpeedDial [kjDisabled]="true">
|
|
121
|
-
<button kjButton kjSpeedDialTrigger aria-label="Open">+</button>
|
|
122
|
-
<div kjSpeedDialActions>
|
|
123
|
-
<button kjButton kjSpeedDialAction aria-label="A">A</button>
|
|
124
|
-
</div>
|
|
125
|
-
</div>
|
|
126
|
-
`,
|
|
127
|
-
{ imports },
|
|
128
|
-
);
|
|
129
|
-
fireEvent.click(getByLabelText('Open'));
|
|
130
|
-
expect(getByLabelText('Open')).toHaveAttribute('aria-expanded', 'false');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('passes axe audit when collapsed', async () => {
|
|
134
|
-
const { container } = await render(TEMPLATE, { imports });
|
|
135
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('passes axe audit when expanded', async () => {
|
|
139
|
-
const { getByLabelText, container } = await render(TEMPLATE, { imports });
|
|
140
|
-
fireEvent.click(getByLabelText('Open'));
|
|
141
|
-
expect(await axe(container)).toHaveNoViolations();
|
|
142
|
-
});
|
|
143
|
-
});
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Directive,
|
|
3
|
-
booleanAttribute,
|
|
4
|
-
computed,
|
|
5
|
-
input,
|
|
6
|
-
linkedSignal,
|
|
7
|
-
output,
|
|
8
|
-
signal,
|
|
9
|
-
} from '@angular/core';
|
|
10
|
-
import {
|
|
11
|
-
KJ_SPEED_DIAL,
|
|
12
|
-
type KjSpeedDialContext,
|
|
13
|
-
type KjSpeedDialDirection,
|
|
14
|
-
nextKjSpeedDialId,
|
|
15
|
-
} from './speed-dial.context';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Root container for a Speed Dial / FAB.
|
|
19
|
-
*
|
|
20
|
-
* A Speed Dial is a viewport-anchored floating action button that, when
|
|
21
|
-
* activated, fans out a cluster of secondary action buttons. This directive
|
|
22
|
-
* owns the open/closed state and exposes it to descendant trigger, container
|
|
23
|
-
* and action directives via the {@link KJ_SPEED_DIAL} injection token.
|
|
24
|
-
*
|
|
25
|
-
* Reflects `data-direction`, `data-expanded` and `data-disabled` host
|
|
26
|
-
* attributes for the styled wrapper to drive its layout and animation.
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```html
|
|
30
|
-
* <div kjSpeedDial kjDirection="up">
|
|
31
|
-
* <button kjButton kjSpeedDialTrigger aria-label="Open menu">+</button>
|
|
32
|
-
* <div kjSpeedDialActions>
|
|
33
|
-
* <button kjButton kjSpeedDialAction aria-label="Edit">E</button>
|
|
34
|
-
* <button kjButton kjSpeedDialAction aria-label="Share">S</button>
|
|
35
|
-
* </div>
|
|
36
|
-
* </div>
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @doc-category Core/Actions
|
|
40
|
-
* @doc
|
|
41
|
-
* @doc-name speed-dial
|
|
42
|
-
* @doc-description Unstyled speed dial root that owns open state and fan-out direction for trigger and action children.
|
|
43
|
-
* @doc-is-main
|
|
44
|
-
*/
|
|
45
|
-
@Directive({
|
|
46
|
-
selector: '[kjSpeedDial]',
|
|
47
|
-
standalone: true,
|
|
48
|
-
exportAs: 'kjSpeedDial',
|
|
49
|
-
providers: [{ provide: KJ_SPEED_DIAL, useExisting: KjSpeedDial }],
|
|
50
|
-
host: {
|
|
51
|
-
'[attr.data-direction]': 'kjDirection()',
|
|
52
|
-
'[attr.data-expanded]': 'expanded() ? "" : null',
|
|
53
|
-
'[attr.data-disabled]': 'kjDisabled() ? "" : null',
|
|
54
|
-
'(mouseenter)': 'onPointerEnter()',
|
|
55
|
-
'(mouseleave)': 'onPointerLeave()',
|
|
56
|
-
},
|
|
57
|
-
})
|
|
58
|
-
export class KjSpeedDial implements KjSpeedDialContext {
|
|
59
|
-
/** Direction the action cluster fans out from the trigger. */
|
|
60
|
-
readonly kjDirection = input<KjSpeedDialDirection>('up');
|
|
61
|
-
|
|
62
|
-
/** Two-way bindable expanded state. */
|
|
63
|
-
// eslint-disable-next-line @angular-eslint/no-input-rename -- alias keeps the public `kjOpen` name distinct from this internal linkedSignal-backed property
|
|
64
|
-
readonly kjOpenInput = input<boolean>(false, { alias: 'kjOpen' });
|
|
65
|
-
readonly kjOpen = linkedSignal(this.kjOpenInput);
|
|
66
|
-
|
|
67
|
-
/** Disables opening; if open, closes. */
|
|
68
|
-
readonly kjDisabled = input(false, { transform: booleanAttribute });
|
|
69
|
-
|
|
70
|
-
/** Open on hover (desktop only — coarse pointers always click-to-open). */
|
|
71
|
-
readonly kjOpenOnHover = input(false, { transform: booleanAttribute });
|
|
72
|
-
|
|
73
|
-
/** Convenience output paired with the `kjOpen` input, deduplicated against internal writes. */
|
|
74
|
-
readonly kjOpenChange = output<boolean>();
|
|
75
|
-
|
|
76
|
-
// ── KjSpeedDialContext fields ────────────────────────────────────────
|
|
77
|
-
|
|
78
|
-
readonly contentId: string = nextKjSpeedDialId();
|
|
79
|
-
readonly expanded = computed(() => this.kjOpen() && !this.kjDisabled());
|
|
80
|
-
readonly disabled = computed(() => this.kjDisabled());
|
|
81
|
-
readonly direction = computed(() => this.kjDirection());
|
|
82
|
-
|
|
83
|
-
// Track the last value emitted to consumers so we don't double-emit when
|
|
84
|
-
// an internal close is followed by the model effect.
|
|
85
|
-
private readonly lastEmitted = signal<boolean>(false);
|
|
86
|
-
|
|
87
|
-
// ── Mutations ────────────────────────────────────────────────────────
|
|
88
|
-
|
|
89
|
-
open(): void {
|
|
90
|
-
if (this.kjDisabled()) return;
|
|
91
|
-
if (this.kjOpen()) return;
|
|
92
|
-
this.kjOpen.set(true);
|
|
93
|
-
if (this.lastEmitted() !== true) {
|
|
94
|
-
this.lastEmitted.set(true);
|
|
95
|
-
this.kjOpenChange.emit(true);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
close(): void {
|
|
100
|
-
if (!this.kjOpen()) return;
|
|
101
|
-
this.kjOpen.set(false);
|
|
102
|
-
if (this.lastEmitted() !== false) {
|
|
103
|
-
this.lastEmitted.set(false);
|
|
104
|
-
this.kjOpenChange.emit(false);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
toggle(): void {
|
|
109
|
-
if (this.kjOpen()) this.close();
|
|
110
|
-
else this.open();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
protected onPointerEnter(): void {
|
|
114
|
-
if (!this.kjOpenOnHover()) return;
|
|
115
|
-
if (this.kjDisabled()) return;
|
|
116
|
-
if (typeof window !== 'undefined' && window.matchMedia?.('(pointer: coarse)').matches) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
this.open();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
protected onPointerLeave(): void {
|
|
123
|
-
if (!this.kjOpenOnHover()) return;
|
|
124
|
-
if (this.kjDisabled()) return;
|
|
125
|
-
this.close();
|
|
126
|
-
}
|
|
127
|
-
}
|
package/src/spinner/config.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, Provider } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Animation shape preset for `KjSpinner`. Reflected to `data-animation`;
|
|
5
|
-
* themes own the keyframes.
|
|
6
|
-
*/
|
|
7
|
-
export type KjSpinnerAnimation = 'spin' | 'dots' | 'pulse' | 'bars';
|
|
8
|
-
|
|
9
|
-
export interface KjSpinnerConfig {
|
|
10
|
-
variants: string[];
|
|
11
|
-
sizes: string[];
|
|
12
|
-
animations: string[];
|
|
13
|
-
defaults: { variant: string; size: string; animation: string; ariaLabel: string };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Default Spinner presets shipped by kouji-ui. Exported so consumers can
|
|
18
|
-
* spread them when extending: `[...KJ_SPINNER_DEFAULTS.animations, 'ring']`.
|
|
19
|
-
*/
|
|
20
|
-
export const KJ_SPINNER_DEFAULTS: KjSpinnerConfig = {
|
|
21
|
-
variants: ['neutral', 'primary', 'secondary', 'success', 'warning', 'error', 'info'],
|
|
22
|
-
sizes: ['xs', 'sm', 'md', 'lg'],
|
|
23
|
-
animations: ['spin', 'dots', 'pulse', 'bars'],
|
|
24
|
-
defaults: { variant: 'neutral', size: 'md', animation: 'spin', ariaLabel: 'Loading' },
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* DI token for the active Spinner presets. Default factory yields
|
|
29
|
-
* `KJ_SPINNER_DEFAULTS`. Override via `provideKjSpinner(…)` at the
|
|
30
|
-
* application scope or at a component scope.
|
|
31
|
-
*/
|
|
32
|
-
export const KJ_SPINNER_CONFIG = new InjectionToken<KjSpinnerConfig>('kj.spinner.config', {
|
|
33
|
-
factory: () => KJ_SPINNER_DEFAULTS,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Configures the Spinner presets for the enclosing injector. Replaces (does
|
|
38
|
-
* not merge) `variants`, `sizes`, and `animations`; spread
|
|
39
|
-
* `KJ_SPINNER_DEFAULTS.*` to extend.
|
|
40
|
-
*/
|
|
41
|
-
export function provideKjSpinner(config: Partial<KjSpinnerConfig>): Provider[] {
|
|
42
|
-
return [
|
|
43
|
-
{
|
|
44
|
-
provide: KJ_SPINNER_CONFIG,
|
|
45
|
-
useValue: { ...KJ_SPINNER_DEFAULTS, ...config },
|
|
46
|
-
},
|
|
47
|
-
];
|
|
48
|
-
}
|
package/src/spinner/index.ts
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
import { render } from '@testing-library/angular';
|
|
2
|
-
import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';
|
|
3
|
-
import { KjSpinner } from './spinner';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Flush microtasks + the rAF that backs `afterNextRender` so the directive
|
|
7
|
-
* has a chance to read host attributes and the `prefers-reduced-motion`
|
|
8
|
-
* media query.
|
|
9
|
-
*/
|
|
10
|
-
async function flushAfterNextRender(): Promise<void> {
|
|
11
|
-
await new Promise<void>((resolve) => setTimeout(resolve, 0));
|
|
12
|
-
await Promise.resolve();
|
|
13
|
-
await Promise.resolve();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Stub `window.matchMedia` for a deterministic `prefers-reduced-motion`
|
|
18
|
-
* value during a test. Returns the listener registered by the directive so
|
|
19
|
-
* the test can simulate a runtime change of the user preference.
|
|
20
|
-
*/
|
|
21
|
-
function stubMatchMedia(initial: boolean): {
|
|
22
|
-
fire: (matches: boolean) => void;
|
|
23
|
-
restore: () => void;
|
|
24
|
-
} {
|
|
25
|
-
const original = window.matchMedia;
|
|
26
|
-
let listener: ((e: MediaQueryListEvent) => void) | null = null;
|
|
27
|
-
const mql: Partial<MediaQueryList> = {
|
|
28
|
-
matches: initial,
|
|
29
|
-
media: '(prefers-reduced-motion: reduce)',
|
|
30
|
-
addEventListener: ((_type: string, l: EventListener) => {
|
|
31
|
-
listener = l as (e: MediaQueryListEvent) => void;
|
|
32
|
-
}) as MediaQueryList['addEventListener'],
|
|
33
|
-
removeEventListener: (() => {
|
|
34
|
-
listener = null;
|
|
35
|
-
}) as MediaQueryList['removeEventListener'],
|
|
36
|
-
addListener: () => {},
|
|
37
|
-
removeListener: () => {},
|
|
38
|
-
onchange: null,
|
|
39
|
-
dispatchEvent: () => true,
|
|
40
|
-
};
|
|
41
|
-
(window as unknown as { matchMedia: (q: string) => MediaQueryList }).matchMedia = () =>
|
|
42
|
-
mql as MediaQueryList;
|
|
43
|
-
return {
|
|
44
|
-
fire: (matches: boolean) => {
|
|
45
|
-
(mql as { matches: boolean }).matches = matches;
|
|
46
|
-
listener?.({ matches } as MediaQueryListEvent);
|
|
47
|
-
},
|
|
48
|
-
restore: () => {
|
|
49
|
-
window.matchMedia = original;
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
describe('KjSpinner', () => {
|
|
55
|
-
let mm: ReturnType<typeof stubMatchMedia>;
|
|
56
|
-
|
|
57
|
-
beforeEach(() => {
|
|
58
|
-
mm = stubMatchMedia(false);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
afterEach(() => {
|
|
62
|
-
mm.restore();
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
describe('a11y contract', () => {
|
|
66
|
-
it('sets role="status" on the host', async () => {
|
|
67
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
68
|
-
imports: [KjSpinner],
|
|
69
|
-
});
|
|
70
|
-
await flushAfterNextRender();
|
|
71
|
-
expect(container.querySelector('span')).toHaveAttribute('role', 'status');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('sets aria-live="polite" and aria-atomic="true"', async () => {
|
|
75
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
76
|
-
imports: [KjSpinner],
|
|
77
|
-
});
|
|
78
|
-
await flushAfterNextRender();
|
|
79
|
-
const host = container.querySelector('span')!;
|
|
80
|
-
expect(host).toHaveAttribute('aria-live', 'polite');
|
|
81
|
-
expect(host).toHaveAttribute('aria-atomic', 'true');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('applies default aria-label="Loading" when no consumer label is provided', async () => {
|
|
85
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
86
|
-
imports: [KjSpinner],
|
|
87
|
-
});
|
|
88
|
-
await flushAfterNextRender();
|
|
89
|
-
expect(container.querySelector('span')).toHaveAttribute('aria-label', 'Loading');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('consumer kjAriaLabel input wins over the default', async () => {
|
|
93
|
-
const { container } = await render(
|
|
94
|
-
`<span kjSpinner kjAriaLabel="Sending"></span>`,
|
|
95
|
-
{ imports: [KjSpinner] },
|
|
96
|
-
);
|
|
97
|
-
await flushAfterNextRender();
|
|
98
|
-
expect(container.querySelector('span')).toHaveAttribute('aria-label', 'Sending');
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('does not override a consumer-authored aria-label attribute on the host', async () => {
|
|
102
|
-
const { container } = await render(
|
|
103
|
-
`<span kjSpinner aria-label="Saving draft"></span>`,
|
|
104
|
-
{ imports: [KjSpinner] },
|
|
105
|
-
);
|
|
106
|
-
await flushAfterNextRender();
|
|
107
|
-
expect(container.querySelector('span')).toHaveAttribute('aria-label', 'Saving draft');
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('does not set aria-label when host carries aria-labelledby', async () => {
|
|
111
|
-
const { container } = await render(
|
|
112
|
-
`<span id="lbl">Loading users</span>
|
|
113
|
-
<span kjSpinner aria-labelledby="lbl"></span>`,
|
|
114
|
-
{ imports: [KjSpinner] },
|
|
115
|
-
);
|
|
116
|
-
await flushAfterNextRender();
|
|
117
|
-
const host = container.querySelector('span[kjSpinner]')!;
|
|
118
|
-
expect(host).not.toHaveAttribute('aria-label');
|
|
119
|
-
expect(host).toHaveAttribute('aria-labelledby', 'lbl');
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
describe('data-animation reflection', () => {
|
|
124
|
-
it('defaults to data-animation="spin"', async () => {
|
|
125
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
126
|
-
imports: [KjSpinner],
|
|
127
|
-
});
|
|
128
|
-
await flushAfterNextRender();
|
|
129
|
-
expect(container.querySelector('span')).toHaveAttribute('data-animation', 'spin');
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('reflects kjAnimation="dots"', async () => {
|
|
133
|
-
const { container } = await render(
|
|
134
|
-
`<span kjSpinner kjAnimation="dots"></span>`,
|
|
135
|
-
{ imports: [KjSpinner] },
|
|
136
|
-
);
|
|
137
|
-
await flushAfterNextRender();
|
|
138
|
-
expect(container.querySelector('span')).toHaveAttribute('data-animation', 'dots');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('reflects kjAnimation="pulse"', async () => {
|
|
142
|
-
const { container } = await render(
|
|
143
|
-
`<span kjSpinner kjAnimation="pulse"></span>`,
|
|
144
|
-
{ imports: [KjSpinner] },
|
|
145
|
-
);
|
|
146
|
-
await flushAfterNextRender();
|
|
147
|
-
expect(container.querySelector('span')).toHaveAttribute('data-animation', 'pulse');
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it('reflects kjAnimation="bars"', async () => {
|
|
151
|
-
const { container } = await render(
|
|
152
|
-
`<span kjSpinner kjAnimation="bars"></span>`,
|
|
153
|
-
{ imports: [KjSpinner] },
|
|
154
|
-
);
|
|
155
|
-
await flushAfterNextRender();
|
|
156
|
-
expect(container.querySelector('span')).toHaveAttribute('data-animation', 'bars');
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
describe('data-reduced-motion mirrors prefers-reduced-motion', () => {
|
|
161
|
-
it('omits data-reduced-motion when the user preference is not set', async () => {
|
|
162
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
163
|
-
imports: [KjSpinner],
|
|
164
|
-
});
|
|
165
|
-
await flushAfterNextRender();
|
|
166
|
-
expect(container.querySelector('span')).not.toHaveAttribute('data-reduced-motion');
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('reflects data-reduced-motion="true" when the media query matches at mount', async () => {
|
|
170
|
-
mm.restore();
|
|
171
|
-
mm = stubMatchMedia(true);
|
|
172
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
173
|
-
imports: [KjSpinner],
|
|
174
|
-
});
|
|
175
|
-
await flushAfterNextRender();
|
|
176
|
-
expect(container.querySelector('span')).toHaveAttribute('data-reduced-motion', 'true');
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('updates data-reduced-motion when the media query changes at runtime', async () => {
|
|
180
|
-
const { container, fixture } = await render(`<span kjSpinner></span>`, {
|
|
181
|
-
imports: [KjSpinner],
|
|
182
|
-
});
|
|
183
|
-
await flushAfterNextRender();
|
|
184
|
-
const host = container.querySelector('span')!;
|
|
185
|
-
expect(host).not.toHaveAttribute('data-reduced-motion');
|
|
186
|
-
|
|
187
|
-
mm.fire(true);
|
|
188
|
-
fixture.detectChanges();
|
|
189
|
-
expect(host).toHaveAttribute('data-reduced-motion', 'true');
|
|
190
|
-
|
|
191
|
-
mm.fire(false);
|
|
192
|
-
fixture.detectChanges();
|
|
193
|
-
expect(host).not.toHaveAttribute('data-reduced-motion');
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it('does not throw when window.matchMedia is unavailable (SSR-style)', async () => {
|
|
197
|
-
mm.restore();
|
|
198
|
-
const original = window.matchMedia;
|
|
199
|
-
// Simulate non-browser env at the time afterNextRender runs.
|
|
200
|
-
(window as unknown as { matchMedia: undefined }).matchMedia = undefined;
|
|
201
|
-
try {
|
|
202
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
203
|
-
imports: [KjSpinner],
|
|
204
|
-
});
|
|
205
|
-
await flushAfterNextRender();
|
|
206
|
-
expect(container.querySelector('span')).not.toHaveAttribute('data-reduced-motion');
|
|
207
|
-
} finally {
|
|
208
|
-
window.matchMedia = original;
|
|
209
|
-
mm = stubMatchMedia(false);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
describe('KjVariant + KjSize composition', () => {
|
|
215
|
-
it('reflects default data-variant="neutral" from KJ_SPINNER_DEFAULTS', async () => {
|
|
216
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
217
|
-
imports: [KjSpinner],
|
|
218
|
-
});
|
|
219
|
-
await flushAfterNextRender();
|
|
220
|
-
expect(container.querySelector('span')).toHaveAttribute('data-variant', 'neutral');
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('reflects default data-size="md" from KJ_SPINNER_DEFAULTS', async () => {
|
|
224
|
-
const { container } = await render(`<span kjSpinner></span>`, {
|
|
225
|
-
imports: [KjSpinner],
|
|
226
|
-
});
|
|
227
|
-
await flushAfterNextRender();
|
|
228
|
-
expect(container.querySelector('span')).toHaveAttribute('data-size', 'md');
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it('forwards kjVariant input to data-variant (composed via hostDirectives)', async () => {
|
|
232
|
-
const { container } = await render(
|
|
233
|
-
`<span kjSpinner kjVariant="primary"></span>`,
|
|
234
|
-
{ imports: [KjSpinner] },
|
|
235
|
-
);
|
|
236
|
-
await flushAfterNextRender();
|
|
237
|
-
expect(container.querySelector('span')).toHaveAttribute('data-variant', 'primary');
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
it('forwards kjSize input to data-size (composed via hostDirectives)', async () => {
|
|
241
|
-
const { container } = await render(
|
|
242
|
-
`<span kjSpinner kjSize="xs"></span>`,
|
|
243
|
-
{ imports: [KjSpinner] },
|
|
244
|
-
);
|
|
245
|
-
await flushAfterNextRender();
|
|
246
|
-
expect(container.querySelector('span')).toHaveAttribute('data-size', 'xs');
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
it('warns on unknown variant in dev mode', async () => {
|
|
250
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
251
|
-
try {
|
|
252
|
-
await render(`<span kjSpinner kjVariant="bogus"></span>`, {
|
|
253
|
-
imports: [KjSpinner],
|
|
254
|
-
});
|
|
255
|
-
await flushAfterNextRender();
|
|
256
|
-
expect(warn).toHaveBeenCalled();
|
|
257
|
-
} finally {
|
|
258
|
-
warn.mockRestore();
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
});
|