@kouji-ui/components 0.7.0 → 0.8.0

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.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ChangeDetectionStrategy, ViewEncapsulation, Component, input, inject, Injectable, booleanAttribute, computed, TemplateRef, model, ViewChild, contentChildren, ElementRef, PLATFORM_ID, DestroyRef, afterNextRender, effect, signal, Injector, viewChild, untracked, output, EventEmitter, Output, makeEnvironmentProviders, provideEnvironmentInitializer, forwardRef, EnvironmentInjector, Directive, InjectionToken, ViewContainerRef, contentChild, numberAttribute } from '@angular/core';
2
+ import { ChangeDetectionStrategy, ViewEncapsulation, Component, input, inject, Injectable, booleanAttribute, computed, TemplateRef, viewChild, ElementRef, contentChildren, contentChild, model, ViewChild, PLATFORM_ID, DestroyRef, afterNextRender, effect, signal, Injector, untracked, output, EventEmitter, Output, makeEnvironmentProviders, provideEnvironmentInitializer, forwardRef, EnvironmentInjector, Directive, InjectionToken, ViewContainerRef, numberAttribute } from '@angular/core';
3
3
  import * as i1 from '@kouji-ui/core';
4
- import { KjAccordion, KjAccordionTrigger, KjAccordionItem, KjAccordionContent, SHEET_DATA, KjSheetRef, KjSheet, KjIconDirective, KjSheetService, KjAlert, KjAlertIcon, KjAlertTitle, KjAlertDescription, KjAlertActions, KjAlertDismiss, KJ_AVATAR_GROUP, KjAvatarImage, KjAvatarFallback, KjAvatar, KjAvatarGroup, KjBadge, KjBreadcrumb, KjSize, KjBreadcrumbList, KjBreadcrumbItem, KJ_BREADCRUMB_CONFIG, KjLink, KjBreadcrumbCurrent, KjBreadcrumbSeparator, KjBreadcrumbEllipsis, KjButton, KjButtonGroup, KjCalendar, KjCalendarHeader, KjCalendarGrid, KjCalendarDay, KjCarousel, KjLiveRegion, KjVisuallyHidden, KjCarouselViewport, KjCarouselSlide, KjCarouselPrevious, KjCarouselNext, KJ_CAROUSEL, KjCarouselIndicator, KjCarouselIndicators, KjCarouselAutoplay, KjCarouselPauseToggle, KjChatLog, KjChat, KjChatAvatar, KjChatHeader, KjChatBubble, KjChatFooter, KjChatAnnouncer, parseSlash, matchSlashCommands, KjCheckbox, KjColorPicker, KjColorPickerTrigger, KjColorPickerPanel, KjColorPickerArea, KjColorPickerHueSlider, KjColorPickerAlphaSlider, KjColorPickerInput, KjComboboxInput, KjComboboxListbox, KjCombobox, KjComboboxOption, KjConfirmPopup, KjConfirmPopupTrigger, KjPopoverContent, KjConfirmPopupContent, KjConfirmPopupMessage, KjConfirmPopupAction, KjConfirmPopupCancel, KjDatePicker, KjDatePickerTrigger, KjDatePickerCalendar, defaultDateRangePresets, KjDateRangePresets, KjDateRangePresetOption, KjLocale, KjDropdownMenuTrigger, KjDropdownMenuContent, KjDropdownMenuItem, KjDropdownMenuSeparator, KjDropdownMenuLabel, KjDropdownMenuGroup, KjSpinner, KjVariant, KjEditorLoader, KjEditor, KJ_SIZE_PRESET, KjField, KjFieldLabel, KjFieldHelp, KjFieldError, KjFieldGroup, KjFileUpload, KjFileUploadTrigger, KjFileUploadDropzone, KjFileUploadList, KjFileUploadItem, KjProgressBar, KjProgressBarFill, KjForm, KjFormErrorSummary, KJ_ICON_REGISTRY, KjInput, KjInputGroup, KjInputGroupAddon, KjInputMask, KJ_INPUT_MASK_PRESETS, KjInputOtp, KjInputOtpCell, KjKbd, KJ_KBD_SIZE_PRESET, KjDivider, KJ_VARIANT_PRESET, KjList, KjListRow, KjMenubar, KjMenubarItem, KjNumberInput, KjNumberInputGroup, KjNumberStepper, KJ_OVERLAY_BADGE, KjOverlayBadgeContent, KjOverlayBadge, KjPagination, KjPaginationItem, KjPaginationPrevious, KjPaginationNext, KjPaginationFirst, KjPaginationLast, KjPaginationEllipsis, KjPaginationInfo, KJ_PASSWORD_INPUT, KjPasswordInput, KjPasswordInputScope, KjPasswordToggle, KjPasswordStrength, KjPasswordCapsLockWarning, KjPopoverTrigger, KjPopoverArrow, KjPopoverClose, KjPopoverTitle, KjRadioGroup, KjRadio, injectRteOverlayData, createKjImageNode, KJ_RTE_OVERLAY_DATA, KjRichTextEditor, KjRovingTabindex, KjRovingTabindexItemDirective, KjSelect, KjSelectTrigger, KjSelectContent, KjOption, KjSkeleton, KjSkipLink, KjSlider, KjSliderTrack, KjSliderRange, KjSliderThumb, KjSpeedDial, KjSpeedDialTrigger, KjSpeedDialActions, KjSpeedDialAction, KjStepper, KjStep, KjStepLabel, KjStepContent, KjStepperNext, KjStepperPrevious, KjStepperReset, KjToggle, KJ_TABLE, provideKjFilterParams, KjTable, KJ_TABLE_STORAGE, KjTableHeader, KjTableRow, KjTableCell, KjTableKeyboardNav, DRAWER_DATA, KjDrawer, KjDrawerService, bindPresets, KJ_TABS_CONFIG, KjTabs, KjTabList, KjTab, KjTabPanel, KjTag, KjTagRemove, KjTagList, KjTextarea, KjTimePicker, KjTimePickerHours, KjTimePickerMinutes, KjTimePickerSeconds, KjTimePickerMeridiem, KjToastViewport, KjToast, KjToastClose, KjTooltipTrigger, KjTooltipContent, KjTooltipArrow, KjTooltipGroup, KjCascadeSelect, KjCascadeSelectTrigger, KjCascadeSelectPanel, KjCascadeSelectOption, KjCascadeSelectSubPanel, KjCommandPalette, KjCommandInput, KjCommandList, KjCommandEmpty, injectListItem, KjListItem, KjCommandGroup, KjCommandSeparator, KjTreeSelectNode, KjTreeSelectToggle, KjTreeSelect, KjTreeSelectTrigger, KjTreeSelectContent } from '@kouji-ui/core';
4
+ import { KjAccordion, KjAccordionTrigger, KjAccordionItem, KjAccordionContent, SHEET_DATA, KjSheetRef, KjSheet, KjIconDirective, KjSheetService, KjAlert, KjAlertIcon, KjAlertTitle, KjAlertDescription, KjAlertActions, KjAlertDismiss, KJ_AVATAR_GROUP, KjAvatarImage, KjAvatarFallback, KjAvatar, KjPopoverTrigger, KjPopoverContent, KjPopoverArrow, KjPopoverClose, KjPopoverTitle, KjTranslateService, KjOverflowContent, KjAvatarGroup, KjBadge, KjBreadcrumb, KjSize, KjBreadcrumbList, KjBreadcrumbItem, KJ_BREADCRUMB_CONFIG, KjLink, KjBreadcrumbCurrent, KjBreadcrumbSeparator, KjBreadcrumbEllipsis, KjButton, KjButtonGroup, KjCalendar, KjCalendarHeader, KjCalendarGrid, KjCalendarDay, KjCarousel, KjLiveRegion, KjVisuallyHidden, KjCarouselViewport, KjCarouselSlide, KjCarouselPrevious, KjCarouselNext, KJ_CAROUSEL, KjCarouselIndicator, KjCarouselIndicators, KjCarouselAutoplay, KjCarouselPauseToggle, KjChatLog, KjChat, KjChatAvatar, KjChatHeader, KjChatBubble, KjChatFooter, KjChatAnnouncer, parseSlash, matchSlashCommands, KjCheckbox, KjColorPicker, KjColorPickerTrigger, KjColorPickerPanel, KjColorPickerArea, KjColorPickerHueSlider, KjColorPickerAlphaSlider, KjColorPickerInput, KjComboboxInput, KjComboboxListbox, KjCombobox, KjComboboxOption, KjConfirmPopup, KjConfirmPopupTrigger, KjConfirmPopupContent, KjConfirmPopupMessage, KjConfirmPopupAction, KjConfirmPopupCancel, KjDatePicker, KjDatePickerTrigger, KjDatePickerCalendar, defaultDateRangePresets, KjDateRangePresets, KjDateRangePresetOption, KjLocale, KjDropdownMenuTrigger, KjDropdownMenuContent, KjDropdownMenuItem, KjDropdownMenuSeparator, KjDropdownMenuLabel, KjDropdownMenuGroup, KjSpinner, KjVariant, KjEditorLoader, KjEditor, KJ_SIZE_PRESET, KjField, KjFieldLabel, KjFieldHelp, KjFieldError, KjFieldGroup, KjFileUpload, KjFileUploadTrigger, KjFileUploadDropzone, KjFileUploadList, KjFileUploadItem, KjProgressBar, KjProgressBarFill, KjForm, KjFormErrorSummary, KJ_ICON_REGISTRY, KjInput, KjInputGroup, KjInputGroupAddon, KjInputMask, KJ_INPUT_MASK_PRESETS, KjInputOtp, KjInputOtpCell, KjKbd, KJ_KBD_SIZE_PRESET, KjDivider, KJ_VARIANT_PRESET, KjList, KjListRow, KjMenubar, KjMenubarItem, KjNumberInput, KjNumberInputGroup, KjNumberStepper, KJ_OVERLAY_BADGE, KjOverlayBadgeContent, KjOverlayBadge, KjPagination, KjPaginationItem, KjPaginationPrevious, KjPaginationNext, KjPaginationFirst, KjPaginationLast, KjPaginationEllipsis, KjPaginationInfo, KJ_PASSWORD_INPUT, KjPasswordInput, KjPasswordInputScope, KjPasswordToggle, KjPasswordStrength, KjPasswordCapsLockWarning, KjRadioGroup, KjRadio, injectRteOverlayData, createKjImageNode, KJ_RTE_OVERLAY_DATA, KjRichTextEditor, KjRovingTabindex, KjRovingTabindexItemDirective, KjSelect, KjSelectTrigger, KjSelectContent, KjOption, KjSkeleton, KjSkipLink, KjSlider, KjSliderTrack, KjSliderRange, KjSliderThumb, KjSpeedDial, KjSpeedDialTrigger, KjSpeedDialActions, KjSpeedDialAction, KjStepper, KjStep, KjStepLabel, KjStepContent, KjStepperNext, KjStepperPrevious, KjStepperReset, KjToggle, KJ_TABLE, provideKjFilterParams, KjTable, KJ_TABLE_STORAGE, KjTableHeader, KjTableRow, KjTableCell, KjTableKeyboardNav, DRAWER_DATA, KjDrawer, KjDrawerService, bindPresets, KJ_TABS_CONFIG, KjTabs, KjTabList, KjTab, KjTabPanel, KjTag, KjTagRemove, KjTagList, KjTextarea, KjTimePicker, KjTimePickerHours, KjTimePickerMinutes, KjTimePickerSeconds, KjTimePickerMeridiem, KjToastViewport, KjToast, KjToastClose, KjTooltipTrigger, KjTooltipContent, KjTooltipArrow, KjTooltipGroup, KjCascadeSelect, KjCascadeSelectTrigger, KjCascadeSelectPanel, KjCascadeSelectOption, KjCascadeSelectSubPanel, KjCommandPalette, KjCommandInput, KjCommandList, KjCommandEmpty, injectListItem, KjListItem, KjCommandGroup, KjCommandSeparator, KjTreeSelectNode, KjTreeSelectToggle, KjTreeSelect, KjTreeSelectTrigger, KjTreeSelectContent } from '@kouji-ui/core';
5
5
  export { KJ_DROPDOWN_MENU, KjBlockquote, KjCarousel, KjCarouselSlide, KjCascadeSelectOption, KjChatAnnouncer, KjChatStore, KjCode, KjColorPicker, KjCombobox, KjDatePicker, KjDialog, KjDialogRef, KjDialogService, KjDrawer, KjDrawerRef, KjDrawerService, KjDropdownMenuContent, KjDropdownMenuGroup, KjDropdownMenuItem, KjDropdownMenuLabel, KjDropdownMenuSeparator, KjDropdownMenuTrigger, KjFileUpload, KjInput, KjLead, KjLiveRegion, KjMuted, KjOverlayPanel, KjPopoverArrow, KjPopoverClose, KjPopoverContent, KjPopoverTitle, KjPopoverTrigger, KjRichTextEditor, KjSheet, KjSheetRef, KjSheetService, KjTabPanel, KjTable, KjTooltipArrow, KjTooltipContent, KjTooltipGroup, KjTooltipTrigger, KjTreeSelect, KjTruncate, SHEET_ARIA_LABEL, SHEET_DATA, SHEET_DETENT, SHEET_DISMISSIBLE } from '@kouji-ui/core';
6
6
  import { NgTemplateOutlet, isPlatformBrowser, NgComponentOutlet } from '@angular/common';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
@@ -773,7 +773,7 @@ class KjAvatarComponent {
773
773
  {{ content() }}
774
774
  }
775
775
  </span>
776
- `, isInline: true, styles: ["@layer kj.component{.kj-avatar{--kj-avatar-size: 2.5rem;--kj-avatar-bg: var(--kj-bg-field);--kj-avatar-fg: var(--kj-fg-default);--kj-avatar-radius: 9999px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:var(--kj-avatar-size);height:var(--kj-avatar-size);background:var(--kj-avatar-bg);color:var(--kj-avatar-fg);border-radius:var(--kj-avatar-radius);overflow:hidden;font:.875rem / 1 var(--kj-font-sans);font-weight:600}.kj-avatar[data-shape=rounded]{--kj-avatar-radius: var(--kj-radius-box-lg)}.kj-avatar[hidden]{display:none}.kj-avatar[data-size=xs]{--kj-avatar-size: 1.5rem;font-size:.6875rem}.kj-avatar[data-size=sm]{--kj-avatar-size: 2rem;font-size:.75rem}.kj-avatar[data-size=lg]{--kj-avatar-size: 3rem;font-size:1rem}.kj-avatar[data-size=xl]{--kj-avatar-size: 4rem;font-size:1.25rem}.kj-avatar-image{width:100%;height:100%;object-fit:cover;display:block}.kj-avatar-image:not([data-loaded]){opacity:0}.kj-avatar-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.kj-avatar-fallback:not([data-visible]){opacity:0;pointer-events:none}}\n"], dependencies: [{ kind: "directive", type: KjAvatarImage, selector: "[kjAvatarImage]" }, { kind: "directive", type: KjAvatarFallback, selector: "[kjAvatarFallback]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
776
+ `, isInline: true, styles: ["@layer kj.component{.kj-avatar{--kj-avatar-size: 2.5rem;--kj-avatar-bg: var(--kj-bg-field);--kj-avatar-fg: var(--kj-fg-default);--kj-avatar-radius: 9999px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:var(--kj-avatar-size);height:var(--kj-avatar-size);background:var(--kj-avatar-bg);color:var(--kj-avatar-fg);border-radius:var(--kj-avatar-radius);overflow:hidden;font:.875rem / 1 var(--kj-font-sans);font-weight:600}.kj-avatar[data-shape=rounded]{--kj-avatar-radius: var(--kj-radius-box-lg)}.kj-avatar[hidden]{display:none}.kj-avatar-group-overflow-trigger{display:inline-flex;padding:0;border:0;background:none;border-radius:9999px}.kj-avatar-group-overflow-trigger[aria-expanded=true] .kj-avatar{--kj-avatar-bg: var(--kj-bg-primary);--kj-avatar-fg: var(--kj-fg-on-primary)}.kj-avatar[data-size=xs]{--kj-avatar-size: 1.5rem;font-size:.6875rem}.kj-avatar[data-size=sm]{--kj-avatar-size: 2rem;font-size:.75rem}.kj-avatar[data-size=lg]{--kj-avatar-size: 3rem;font-size:1rem}.kj-avatar[data-size=xl]{--kj-avatar-size: 4rem;font-size:1.25rem}.kj-avatar-image{width:100%;height:100%;object-fit:cover;display:block}.kj-avatar-image:not([data-loaded]){opacity:0}.kj-avatar-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.kj-avatar-fallback:not([data-visible]){opacity:0;pointer-events:none}}\n"], dependencies: [{ kind: "directive", type: KjAvatarImage, selector: "[kjAvatarImage]" }, { kind: "directive", type: KjAvatarFallback, selector: "[kjAvatarFallback]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
777
777
  }
778
778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjAvatarComponent, decorators: [{
779
779
  type: Component,
@@ -795,9 +795,206 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
795
795
  // Mirror `alt` to `title` so hovering the avatar shows a native tooltip.
796
796
  // `alt` alone only surfaces to screen readers / fallback rendering.
797
797
  '[attr.title]': 'alt()',
798
- }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-avatar{--kj-avatar-size: 2.5rem;--kj-avatar-bg: var(--kj-bg-field);--kj-avatar-fg: var(--kj-fg-default);--kj-avatar-radius: 9999px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:var(--kj-avatar-size);height:var(--kj-avatar-size);background:var(--kj-avatar-bg);color:var(--kj-avatar-fg);border-radius:var(--kj-avatar-radius);overflow:hidden;font:.875rem / 1 var(--kj-font-sans);font-weight:600}.kj-avatar[data-shape=rounded]{--kj-avatar-radius: var(--kj-radius-box-lg)}.kj-avatar[hidden]{display:none}.kj-avatar[data-size=xs]{--kj-avatar-size: 1.5rem;font-size:.6875rem}.kj-avatar[data-size=sm]{--kj-avatar-size: 2rem;font-size:.75rem}.kj-avatar[data-size=lg]{--kj-avatar-size: 3rem;font-size:1rem}.kj-avatar[data-size=xl]{--kj-avatar-size: 4rem;font-size:1.25rem}.kj-avatar-image{width:100%;height:100%;object-fit:cover;display:block}.kj-avatar-image:not([data-loaded]){opacity:0}.kj-avatar-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.kj-avatar-fallback:not([data-visible]){opacity:0;pointer-events:none}}\n"] }]
798
+ }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-avatar{--kj-avatar-size: 2.5rem;--kj-avatar-bg: var(--kj-bg-field);--kj-avatar-fg: var(--kj-fg-default);--kj-avatar-radius: 9999px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:var(--kj-avatar-size);height:var(--kj-avatar-size);background:var(--kj-avatar-bg);color:var(--kj-avatar-fg);border-radius:var(--kj-avatar-radius);overflow:hidden;font:.875rem / 1 var(--kj-font-sans);font-weight:600}.kj-avatar[data-shape=rounded]{--kj-avatar-radius: var(--kj-radius-box-lg)}.kj-avatar[hidden]{display:none}.kj-avatar-group-overflow-trigger{display:inline-flex;padding:0;border:0;background:none;border-radius:9999px}.kj-avatar-group-overflow-trigger[aria-expanded=true] .kj-avatar{--kj-avatar-bg: var(--kj-bg-primary);--kj-avatar-fg: var(--kj-fg-on-primary)}.kj-avatar[data-size=xs]{--kj-avatar-size: 1.5rem;font-size:.6875rem}.kj-avatar[data-size=sm]{--kj-avatar-size: 2rem;font-size:.75rem}.kj-avatar[data-size=lg]{--kj-avatar-size: 3rem;font-size:1rem}.kj-avatar[data-size=xl]{--kj-avatar-size: 4rem;font-size:1.25rem}.kj-avatar-image{width:100%;height:100%;object-fit:cover;display:block}.kj-avatar-image:not([data-loaded]){opacity:0}.kj-avatar-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.kj-avatar-fallback:not([data-visible]){opacity:0;pointer-events:none}}\n"] }]
799
799
  }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }] } });
800
800
 
801
+ /**
802
+ * Click-triggered popover. Compose `[kjPopoverTrigger]` + `<kj-popover-content [kjFor]="t">`
803
+ * with optional `[kjPopoverTitle]` heading and `[kjPopoverClose]` button. The
804
+ * wrapper itself only projects content — its purpose is to host the docs tags.
805
+ *
806
+ * @doc
807
+ * @doc-name popover
808
+ * @doc-is-main
809
+ * @doc-example Default
810
+ * A trigger button + content panel — the bare-minimum recipe.
811
+ * @doc-file popover.example.ts
812
+ * @doc-example Usage
813
+ * A walkthrough of the most common usages — info panel, side-pinned, and
814
+ * modal confirmation. Use this as the copy-paste starting point.
815
+ * @doc-file popover.usage.example.ts
816
+ * @doc-example Sides
817
+ * `kjSide="top|right|bottom|left"` pins the panel relative to the trigger.
818
+ * @doc-file popover.sides.example.ts
819
+ * @doc-example Modal
820
+ * `[kjTrap]="true"` traps focus inside the panel until it closes.
821
+ * @doc-file popover.modal.example.ts
822
+ * @doc-example Cancellable
823
+ * `[kjPopoverClose]` on a button dismisses the panel and restores focus.
824
+ * @doc-file popover.cancellable.example.ts
825
+ * @doc-example With form
826
+ * Embed inputs inside the panel — focus returns to the trigger on close.
827
+ * @doc-file popover.with-form.example.ts
828
+ *
829
+ * @doc-keyboard
830
+ * Enter|Space — Opens the popover from the trigger
831
+ * Escape — Closes the popover and returns focus to the trigger
832
+ * Tab — Moves focus through the panel; cycles inside when [kjTrap]="true"
833
+ * Shift+Tab — Reverse-cycles focus
834
+ *
835
+ * @doc-aria
836
+ * aria-haspopup — Set to "dialog" on the trigger
837
+ * aria-expanded — Reflects the open/closed state on the trigger
838
+ * aria-controls — Links the trigger to the panel id
839
+ * role="dialog" — On the panel (provided via the overlay primitive)
840
+ * aria-labelledby — Wire to `[kjPopoverTitle]` heading id for an accessible name
841
+ *
842
+ * @doc-touch
843
+ * Trigger buttons inherit `kj-button` sizing — use `kjSize="md"` or larger
844
+ * to satisfy WCAG 2.5.5 (44×44). The panel itself is not a touch target.
845
+ *
846
+ * @doc-a11y
847
+ * The panel is portalled to `document.body` so it escapes clipping
848
+ * ancestors while staying linked via `aria-controls`. Focus is returned
849
+ * to the trigger on close, and outside clicks dismiss by default. For
850
+ * destructive confirmations, set `[kjTrap]="true"` so the user must
851
+ * commit or cancel via a visible affordance.
852
+ *
853
+ * @doc-related dialog,tooltip,dropdown-menu
854
+ *
855
+ * @doc-css-var
856
+ * --kj-popover-bg — Panel background fill. Inherits --kj-bg-elevated.
857
+ * --kj-popover-fg — Panel foreground (text) color.
858
+ * --kj-popover-border-color — Panel border color. Inherits --kj-border-default.
859
+ * --kj-popover-radius — Panel corner radius. Inherits --kj-radius-box.
860
+ * --kj-popover-padding-x — Horizontal padding inside the panel.
861
+ * --kj-popover-padding-y — Vertical padding inside the panel.
862
+ * --kj-popover-shadow — Drop shadow under the panel. Inherits --kj-shadow-md.
863
+ * --kj-popover-arrow-size — Edge length of the optional arrow indicator.
864
+ *
865
+ * @doc-category Library/Overlay
866
+ */
867
+ class KjPopoverComponent {
868
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
869
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: KjPopoverComponent, isStandalone: true, selector: "kj-popover", host: { styleAttribute: "display: contents;" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: ["@layer kj.component{.kj-popover-content{--kj-popover-bg: var(--kj-bg-elevated);--kj-popover-fg: var(--kj-fg-default);--kj-popover-border-color: var(--kj-border-default);--kj-popover-radius: var(--kj-radius-box);--kj-popover-padding-x: var(--kj-space-md);--kj-popover-padding-y: var(--kj-space-md);--kj-popover-shadow: var(--kj-shadow-md, 0 12px 32px rgb(0 0 0 / .18));--kj-popover-arrow-size: 8px;display:block;box-sizing:border-box;max-width:min(28rem,calc(100vw - 2rem));background:var(--kj-popover-bg);color:var(--kj-popover-fg);border:var(--kj-border) solid var(--kj-popover-border-color);border-radius:var(--kj-popover-radius);padding:var(--kj-popover-padding-y) var(--kj-popover-padding-x);font:.875rem / 1.5 var(--kj-font-sans);box-shadow:var(--kj-popover-shadow);pointer-events:auto;z-index:1000;word-wrap:break-word}.kj-popover-content[hidden]{display:none}.kj-popover-title{display:block;font-size:.9375rem;font-weight:600;margin:0 0 var(--kj-space-xs);color:var(--kj-fg-default)}.kj-popover-arrow{position:absolute;width:var(--kj-popover-arrow-size, 8px);height:var(--kj-popover-arrow-size, 8px);background:var(--kj-popover-bg, var(--kj-bg-elevated));border:var(--kj-border) solid var(--kj-popover-border-color, var(--kj-border-default));transform:rotate(45deg)}.kj-popover-content[data-side=top] .kj-popover-arrow{bottom:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-top-color:transparent;border-left-color:transparent}.kj-popover-content[data-side=bottom] .kj-popover-arrow{top:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-bottom-color:transparent;border-right-color:transparent}.kj-popover-content[data-side=left] .kj-popover-arrow{right:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-left-color:transparent;border-bottom-color:transparent}.kj-popover-content[data-side=right] .kj-popover-arrow{left:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-right-color:transparent;border-top-color:transparent}body[data-kj-scroll-lock=true]{overflow:hidden}@media(prefers-reduced-motion:no-preference){.kj-popover-content{transition:opacity .14s ease-out,transform .14s ease-out}.kj-popover-content[data-state=closed]{opacity:0;transform:scale(.98)}.kj-popover-content[data-state=open]{opacity:1;transform:scale(1)}}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
870
+ }
871
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjPopoverComponent, decorators: [{
872
+ type: Component,
873
+ args: [{ selector: 'kj-popover', standalone: true, imports: [KjPopoverTrigger, KjPopoverContent, KjPopoverArrow, KjPopoverClose, KjPopoverTitle], template: `<ng-content />`, encapsulation: ViewEncapsulation.None, host: { style: 'display: contents;' }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-popover-content{--kj-popover-bg: var(--kj-bg-elevated);--kj-popover-fg: var(--kj-fg-default);--kj-popover-border-color: var(--kj-border-default);--kj-popover-radius: var(--kj-radius-box);--kj-popover-padding-x: var(--kj-space-md);--kj-popover-padding-y: var(--kj-space-md);--kj-popover-shadow: var(--kj-shadow-md, 0 12px 32px rgb(0 0 0 / .18));--kj-popover-arrow-size: 8px;display:block;box-sizing:border-box;max-width:min(28rem,calc(100vw - 2rem));background:var(--kj-popover-bg);color:var(--kj-popover-fg);border:var(--kj-border) solid var(--kj-popover-border-color);border-radius:var(--kj-popover-radius);padding:var(--kj-popover-padding-y) var(--kj-popover-padding-x);font:.875rem / 1.5 var(--kj-font-sans);box-shadow:var(--kj-popover-shadow);pointer-events:auto;z-index:1000;word-wrap:break-word}.kj-popover-content[hidden]{display:none}.kj-popover-title{display:block;font-size:.9375rem;font-weight:600;margin:0 0 var(--kj-space-xs);color:var(--kj-fg-default)}.kj-popover-arrow{position:absolute;width:var(--kj-popover-arrow-size, 8px);height:var(--kj-popover-arrow-size, 8px);background:var(--kj-popover-bg, var(--kj-bg-elevated));border:var(--kj-border) solid var(--kj-popover-border-color, var(--kj-border-default));transform:rotate(45deg)}.kj-popover-content[data-side=top] .kj-popover-arrow{bottom:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-top-color:transparent;border-left-color:transparent}.kj-popover-content[data-side=bottom] .kj-popover-arrow{top:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-bottom-color:transparent;border-right-color:transparent}.kj-popover-content[data-side=left] .kj-popover-arrow{right:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-left-color:transparent;border-bottom-color:transparent}.kj-popover-content[data-side=right] .kj-popover-arrow{left:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-right-color:transparent;border-top-color:transparent}body[data-kj-scroll-lock=true]{overflow:hidden}@media(prefers-reduced-motion:no-preference){.kj-popover-content{transition:opacity .14s ease-out,transform .14s ease-out}.kj-popover-content[data-state=closed]{opacity:0;transform:scale(.98)}.kj-popover-content[data-state=open]{opacity:1;transform:scale(1)}}}\n"] }]
874
+ }] });
875
+
876
+ const FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
877
+ /**
878
+ * The panel a collapsing group (`kj-tag-list`, `kj-avatar-group`) opens from
879
+ * its "+N" chip: the consumer's `kjOverflowContent` template when one is
880
+ * projected, otherwise a plain list of the collapsed items' labels.
881
+ *
882
+ * Owns the keyboard story the hover trigger cannot: `focusFirst()` moves
883
+ * focus into the panel (the chip calls it on ArrowDown / Enter), Escape
884
+ * inside the panel returns focus to the chip, and focus leaving the panel
885
+ * closes it.
886
+ *
887
+ * @doc-category Library/Data display
888
+ * @doc
889
+ * @doc-name overflow
890
+ */
891
+ class KjOverflowPanelComponent {
892
+ /** The "+N" chip's popover trigger. */
893
+ kjFor = input.required(/* @ts-ignore */
894
+ ...(ngDevMode ? [{ debugName: "kjFor" }] : /* istanbul ignore next */ []));
895
+ /** Number of collapsed items. */
896
+ kjCount = input.required(/* @ts-ignore */
897
+ ...(ngDevMode ? [{ debugName: "kjCount" }] : /* istanbul ignore next */ []));
898
+ /** Index of the first collapsed item in the consumer's collection. */
899
+ kjStart = input.required(/* @ts-ignore */
900
+ ...(ngDevMode ? [{ debugName: "kjStart" }] : /* istanbul ignore next */ []));
901
+ /** Exclusive end index of the collapsed range. */
902
+ kjEnd = input.required(/* @ts-ignore */
903
+ ...(ngDevMode ? [{ debugName: "kjEnd" }] : /* istanbul ignore next */ []));
904
+ /** Labels of the collapsed items — the default panel content. */
905
+ kjLabels = input([], /* @ts-ignore */
906
+ ...(ngDevMode ? [{ debugName: "kjLabels" }] : /* istanbul ignore next */ []));
907
+ /** Consumer template rendered instead of the label list. */
908
+ kjTemplate = input(undefined, /* @ts-ignore */
909
+ ...(ngDevMode ? [{ debugName: "kjTemplate" }] : /* istanbul ignore next */ []));
910
+ kjSide = input('bottom', /* @ts-ignore */
911
+ ...(ngDevMode ? [{ debugName: "kjSide" }] : /* istanbul ignore next */ []));
912
+ kjAlign = input('start', /* @ts-ignore */
913
+ ...(ngDevMode ? [{ debugName: "kjAlign" }] : /* istanbul ignore next */ []));
914
+ panel = viewChild(KjPopoverContent, { ...(ngDevMode ? { debugName: "panel" } : /* istanbul ignore next */ {}), read: ElementRef });
915
+ context = computed(() => ({
916
+ $implicit: this.kjCount(),
917
+ start: this.kjStart(),
918
+ end: this.kjEnd(),
919
+ labels: this.kjLabels(),
920
+ }), /* @ts-ignore */
921
+ ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
922
+ /** Moves focus to the first focusable element of the panel (or the panel itself). */
923
+ focusFirst() {
924
+ const panel = this.panel()?.nativeElement;
925
+ if (!panel)
926
+ return;
927
+ const first = panel.querySelector(FOCUSABLE);
928
+ if (first) {
929
+ first.focus();
930
+ return;
931
+ }
932
+ if (!panel.hasAttribute('tabindex'))
933
+ panel.setAttribute('tabindex', '-1');
934
+ panel.focus();
935
+ }
936
+ focusTrigger() {
937
+ this.kjFor().controller.context.triggerEl()?.focus();
938
+ }
939
+ onFocusOut(event) {
940
+ const panel = this.panel()?.nativeElement;
941
+ const next = event.relatedTarget;
942
+ if (!panel || !next || panel.contains(next))
943
+ return;
944
+ if (this.kjFor().controller.context.triggerEl()?.contains(next))
945
+ return;
946
+ this.kjFor().controller.close('programmatic');
947
+ }
948
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjOverflowPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
949
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: KjOverflowPanelComponent, isStandalone: true, selector: "kj-overflow-panel", inputs: { kjFor: { classPropertyName: "kjFor", publicName: "kjFor", isSignal: true, isRequired: true, transformFunction: null }, kjCount: { classPropertyName: "kjCount", publicName: "kjCount", isSignal: true, isRequired: true, transformFunction: null }, kjStart: { classPropertyName: "kjStart", publicName: "kjStart", isSignal: true, isRequired: true, transformFunction: null }, kjEnd: { classPropertyName: "kjEnd", publicName: "kjEnd", isSignal: true, isRequired: true, transformFunction: null }, kjLabels: { classPropertyName: "kjLabels", publicName: "kjLabels", isSignal: true, isRequired: false, transformFunction: null }, kjTemplate: { classPropertyName: "kjTemplate", publicName: "kjTemplate", isSignal: true, isRequired: false, transformFunction: null }, kjSide: { classPropertyName: "kjSide", publicName: "kjSide", isSignal: true, isRequired: false, transformFunction: null }, kjAlign: { classPropertyName: "kjAlign", publicName: "kjAlign", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: contents;" }, viewQueries: [{ propertyName: "panel", first: true, predicate: KjPopoverContent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
950
+ <kj-popover>
951
+ <kj-popover-content
952
+ class="kj-overflow-panel"
953
+ [kjFor]="kjFor()"
954
+ [kjSide]="kjSide()"
955
+ [kjAlign]="kjAlign()"
956
+ (keydown.escape)="focusTrigger()"
957
+ (focusout)="onFocusOut($event)"
958
+ >
959
+ @if (kjTemplate(); as tpl) {
960
+ <ng-container *ngTemplateOutlet="tpl.template; context: context()" />
961
+ } @else {
962
+ <ul class="kj-overflow-list" role="list">
963
+ @for (label of kjLabels(); track $index) {
964
+ <li class="kj-overflow-item">{{ label }}</li>
965
+ }
966
+ </ul>
967
+ }
968
+ </kj-popover-content>
969
+ </kj-popover>
970
+ `, isInline: true, styles: ["@layer kj.component{.kj-overflow-panel{--kj-popover-padding-x: var(--kj-space-sm);--kj-popover-padding-y: var(--kj-space-sm);min-width:10rem}.kj-overflow-list{display:flex;flex-direction:column;gap:var(--kj-space-xs);margin:0;padding:0;list-style:none}.kj-overflow-item{padding:var(--kj-space-xs) var(--kj-space-sm);font-size:var(--kj-text-sm);line-height:1.4;color:var(--kj-fg-default);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kj-overflow-trigger{appearance:none;font:inherit;cursor:pointer}.kj-overflow-trigger:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KjPopoverComponent, selector: "kj-popover" }, { kind: "component", type: KjPopoverContent, selector: "kj-popover-content", inputs: ["kjSide", "kjAlign", "kjOffset", "kjTrap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
971
+ }
972
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjOverflowPanelComponent, decorators: [{
973
+ type: Component,
974
+ args: [{ selector: 'kj-overflow-panel', standalone: true, imports: [NgTemplateOutlet, KjPopoverComponent, KjPopoverContent], template: `
975
+ <kj-popover>
976
+ <kj-popover-content
977
+ class="kj-overflow-panel"
978
+ [kjFor]="kjFor()"
979
+ [kjSide]="kjSide()"
980
+ [kjAlign]="kjAlign()"
981
+ (keydown.escape)="focusTrigger()"
982
+ (focusout)="onFocusOut($event)"
983
+ >
984
+ @if (kjTemplate(); as tpl) {
985
+ <ng-container *ngTemplateOutlet="tpl.template; context: context()" />
986
+ } @else {
987
+ <ul class="kj-overflow-list" role="list">
988
+ @for (label of kjLabels(); track $index) {
989
+ <li class="kj-overflow-item">{{ label }}</li>
990
+ }
991
+ </ul>
992
+ }
993
+ </kj-popover-content>
994
+ </kj-popover>
995
+ `, encapsulation: ViewEncapsulation.None, host: { style: 'display: contents;' }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-overflow-panel{--kj-popover-padding-x: var(--kj-space-sm);--kj-popover-padding-y: var(--kj-space-sm);min-width:10rem}.kj-overflow-list{display:flex;flex-direction:column;gap:var(--kj-space-xs);margin:0;padding:0;list-style:none}.kj-overflow-item{padding:var(--kj-space-xs) var(--kj-space-sm);font-size:var(--kj-text-sm);line-height:1.4;color:var(--kj-fg-default);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kj-overflow-trigger{appearance:none;font:inherit;cursor:pointer}.kj-overflow-trigger:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}}\n"] }]
996
+ }], propDecorators: { kjFor: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjFor", required: true }] }], kjCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjCount", required: true }] }], kjStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjStart", required: true }] }], kjEnd: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjEnd", required: true }] }], kjLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjLabels", required: false }] }], kjTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTemplate", required: false }] }], kjSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjSide", required: false }] }], kjAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjAlign", required: false }] }], panel: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KjPopoverContent), { ...{ read: ElementRef }, isSignal: true }] }] } });
997
+
801
998
  /**
802
999
  * Avatar group wrapper. Stacks projected `<kj-avatar>` children with a
803
1000
  * count-aware `aria-label`, an overflow chip when `kjMax` is exceeded, and
@@ -805,10 +1002,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
805
1002
  * core directive. The wrapper supplies the chip element and the host
806
1003
  * `<ng-content/>` slot.
807
1004
  *
808
- * The overflow chip is a regular `<kj-avatar>` rendering `'+N'` text; it is
809
- * `aria-hidden` because the group's count-aware label already conveys
810
- * totality (e.g. `"3 of 8 collaborators"`), so exposing the chip again would
811
- * duplicate the announcement.
1005
+ * The overflow chip is a button: hovering, focusing or tapping it opens a
1006
+ * panel listing the collapsed avatars (their `alt`, else their text content).
1007
+ * Project an `<ng-template kjOverflowContent>` to render that panel yourself
1008
+ * the context carries the collapsed range (`start`/`end`) so the consumer
1009
+ * slices its own data and adds actions (remove, open a profile…).
1010
+ *
1011
+ * The `<kj-avatar>` inside the chip renders `'+N'` and is `aria-hidden`
1012
+ * because the group's count-aware label already conveys totality (e.g.
1013
+ * `"3 of 8 collaborators"`); the button itself is named "Show N more".
812
1014
  *
813
1015
  * @doc-example Default
814
1016
  * The default playground — five stacked avatars with the group's defaults.
@@ -818,8 +1020,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
818
1020
  * and a list-mode variant for documents-shared screens.
819
1021
  * @doc-file avatar-group.usage.example.ts
820
1022
  * @doc-example Overflow
821
- * `kjMax` caps visible avatars; the remainder collapses into a "+N" chip.
1023
+ * `kjMax` caps visible avatars; the remainder collapses into a "+N" chip whose
1024
+ * hover panel lists the hidden names.
822
1025
  * @doc-file avatar-group.overflow.example.ts
1026
+ * @doc-example Overflow template
1027
+ * `<ng-template kjOverflowContent>` renders the hidden avatars your way — here
1028
+ * with a remove action per collaborator.
1029
+ * @doc-file avatar-group.overflow-template.example.ts
823
1030
  * @doc-example Sizes
824
1031
  * Group `kjSize` cascades onto every projected `<kj-avatar>` for a uniform pile.
825
1032
  * @doc-file avatar-group.sizes.example.ts
@@ -830,24 +1037,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
830
1037
  * `kjRole="list"` switches to a list landmark — use for "shared by" rows in docs UIs.
831
1038
  * @doc-file avatar-group.list.example.ts
832
1039
  *
1040
+ * @doc-keyboard
1041
+ * Tab — Focuses the "+N" chip; the panel opens
1042
+ * ArrowDown|Enter — Moves focus into the panel
1043
+ * Escape — Closes the panel and returns focus to the chip
1044
+ *
833
1045
  * @doc-aria
834
1046
  * aria-label — Count-aware label like "3 of 8 collaborators"; override via `kjAriaLabelOverride`
835
1047
  * role — Defaults to `img` (face-pile); set `kjRole="list"` for a true list landmark
836
- * aria-hidden — Forced on the +N chip so the count isn't re-announced
1048
+ * aria-hidden — Forced on the +N avatar so the count isn't re-announced; the chip button is named "Show N more"
1049
+ * aria-expanded — Reflects the panel state on the chip button
837
1050
  *
838
1051
  * @doc-touch
839
- * Stacked avatars are decorative — they aren't tab stops. Pair the group
840
- * with an interactive trigger (button/link) sized 44×44 when clicking is
841
- * meaningful (e.g. opens a collaborator dialog).
1052
+ * Stacked avatars are decorative — they aren't tab stops. The "+N" chip is
1053
+ * a real button (tap opens the panel); pair the group with an interactive
1054
+ * trigger sized 44×44 when clicking an avatar is meaningful.
842
1055
  *
843
1056
  * @doc-a11y
844
1057
  * The face-pile is an `img` landmark with a count-aware accessible name so
845
1058
  * AT users hear "3 of 8 collaborators" rather than every initial. Switch to
846
1059
  * `role="list"` whenever the order/identity of each face matters
847
- * semantically. The overflow chip is always `aria-hidden` because the
848
- * group's name already conveys totality.
1060
+ * semantically. The "+N" chip is a named button, so the collapsed names are
1061
+ * one keystroke away for keyboard and screen-reader users.
849
1062
  *
850
- * @doc-related avatar,badge,tag
1063
+ * @doc-related avatar,badge,tag,overflow
851
1064
  *
852
1065
  * @doc-css-var
853
1066
  * --kj-avatar-size — Avatar diameter. Sizes (xs/sm/md/lg/xl) override.
@@ -868,9 +1081,34 @@ class KjAvatarGroupComponent {
868
1081
  * the same instance and gives us access to `overflowCount`, `shape`, etc.
869
1082
  */
870
1083
  group = inject(KJ_AVATAR_GROUP);
1084
+ i18n = inject(KjTranslateService);
1085
+ /** Text of the "+N" chip. Defaults to the `overflow.more` translation (`+{count}`). */
1086
+ kjOverflowLabel = input(undefined, /* @ts-ignore */
1087
+ ...(ngDevMode ? [{ debugName: "kjOverflowLabel" }] : /* istanbul ignore next */ []));
1088
+ /** Accessible name of the chip button. Defaults to the `overflow.show` translation (`Show {count} more`). */
1089
+ kjOverflowAriaLabel = input(undefined, /* @ts-ignore */
1090
+ ...(ngDevMode ? [{ debugName: "kjOverflowAriaLabel" }] : /* istanbul ignore next */ []));
1091
+ avatars = contentChildren(KjAvatarComponent, { ...(ngDevMode ? { debugName: "avatars" } : /* istanbul ignore next */ {}), descendants: true });
1092
+ overflowTemplate = contentChild(KjOverflowContent, /* @ts-ignore */
1093
+ ...(ngDevMode ? [{ debugName: "overflowTemplate" }] : /* istanbul ignore next */ []));
1094
+ panel = viewChild(KjOverflowPanelComponent, /* @ts-ignore */
1095
+ ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
871
1096
  overflowCount = this.group.overflowCount;
872
- overflowLabel = computed(() => `+${this.overflowCount()}`, /* @ts-ignore */
1097
+ overflowLabel = computed(() => {
1098
+ const n = this.overflowCount();
1099
+ return this.kjOverflowLabel()?.(n) ?? this.i18n.translate('overflow.more', { count: n });
1100
+ }, /* @ts-ignore */
873
1101
  ...(ngDevMode ? [{ debugName: "overflowLabel" }] : /* istanbul ignore next */ []));
1102
+ overflowAriaLabel = computed(() => {
1103
+ const n = this.overflowCount();
1104
+ return this.kjOverflowAriaLabel()?.(n) ?? this.i18n.translate('overflow.show', { count: n });
1105
+ }, /* @ts-ignore */
1106
+ ...(ngDevMode ? [{ debugName: "overflowAriaLabel" }] : /* istanbul ignore next */ []));
1107
+ /** Labels of the collapsed avatars: `alt`, else a string `content`. */
1108
+ hiddenLabels = computed(() => this.avatars()
1109
+ .slice(this.group.visibleCount())
1110
+ .map((a) => a.alt() ?? (typeof a.content() === 'string' ? a.content() : '')), /* @ts-ignore */
1111
+ ...(ngDevMode ? [{ debugName: "hiddenLabels" }] : /* istanbul ignore next */ []));
874
1112
  /**
875
1113
  * Chip shape mirrors the group's default shape so the chip visually
876
1114
  * matches the avatars. `<kj-avatar>`'s own `shape` default is `'circle'`,
@@ -879,18 +1117,41 @@ class KjAvatarGroupComponent {
879
1117
  */
880
1118
  chipShape = computed(() => this.group.shape() ?? 'circle', /* @ts-ignore */
881
1119
  ...(ngDevMode ? [{ debugName: "chipShape" }] : /* istanbul ignore next */ []));
1120
+ focusPanel(event) {
1121
+ event.preventDefault();
1122
+ this.panel()?.focusFirst();
1123
+ }
882
1124
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjAvatarGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
883
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: KjAvatarGroupComponent, isStandalone: true, selector: "kj-avatar-group", host: { classAttribute: "kj-avatar-group" }, hostDirectives: [{ directive: i1.KjAvatarGroup, inputs: ["kjMax", "kjMax", "kjTotal", "kjTotal", "kjSize", "kjSize", "kjShape", "kjShape", "kjAriaLabel", "kjAriaLabel", "kjAriaLabelFormat", "kjAriaLabelFormat", "kjRole", "kjRole", "kjAriaLabelOverride", "kjAriaLabelOverride"] }], ngImport: i0, template: `
1125
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: KjAvatarGroupComponent, isStandalone: true, selector: "kj-avatar-group", inputs: { kjOverflowLabel: { classPropertyName: "kjOverflowLabel", publicName: "kjOverflowLabel", isSignal: true, isRequired: false, transformFunction: null }, kjOverflowAriaLabel: { classPropertyName: "kjOverflowAriaLabel", publicName: "kjOverflowAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "kj-avatar-group" }, queries: [{ propertyName: "avatars", predicate: KjAvatarComponent, descendants: true, isSignal: true }, { propertyName: "overflowTemplate", first: true, predicate: KjOverflowContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "panel", first: true, predicate: KjOverflowPanelComponent, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.KjAvatarGroup, inputs: ["kjMax", "kjMax", "kjTotal", "kjTotal", "kjSize", "kjSize", "kjShape", "kjShape", "kjAriaLabel", "kjAriaLabel", "kjAriaLabelFormat", "kjAriaLabelFormat", "kjRole", "kjRole", "kjAriaLabelOverride", "kjAriaLabelOverride"] }], ngImport: i0, template: `
884
1126
  <ng-content />
885
1127
  @if (overflowCount() > 0) {
886
- <kj-avatar
887
- class="kj-avatar-group-overflow"
888
- aria-hidden="true"
889
- [content]="overflowLabel()"
890
- [shape]="chipShape()"
1128
+ <button
1129
+ type="button"
1130
+ class="kj-overflow-trigger kj-avatar-group-overflow-trigger"
1131
+ kjPopoverTrigger
1132
+ kjTrigger="hover"
1133
+ #trg="kjPopoverTrigger"
1134
+ [attr.aria-label]="overflowAriaLabel()"
1135
+ (keydown.arrowdown)="focusPanel($event)"
1136
+ (keydown.enter)="focusPanel($event)"
1137
+ >
1138
+ <kj-avatar
1139
+ class="kj-avatar-group-overflow"
1140
+ aria-hidden="true"
1141
+ [content]="overflowLabel()"
1142
+ [shape]="chipShape()"
1143
+ />
1144
+ </button>
1145
+ <kj-overflow-panel
1146
+ [kjFor]="trg"
1147
+ [kjCount]="overflowCount()"
1148
+ [kjStart]="group.visibleCount()"
1149
+ [kjEnd]="group.total()"
1150
+ [kjLabels]="hiddenLabels()"
1151
+ [kjTemplate]="overflowTemplate()"
891
1152
  />
892
1153
  }
893
- `, isInline: true, dependencies: [{ kind: "component", type: KjAvatarComponent, selector: "kj-avatar", inputs: ["src", "alt", "content", "size", "shape"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1154
+ `, isInline: true, dependencies: [{ kind: "component", type: KjAvatarComponent, selector: "kj-avatar", inputs: ["src", "alt", "content", "size", "shape"] }, { kind: "directive", type: KjPopoverTrigger, selector: "[kjPopoverTrigger]", inputs: ["kjTrigger", "kjDisabled", "kjOpenDelay", "kjCloseDelay"], exportAs: ["kjPopoverTrigger"] }, { kind: "component", type: KjOverflowPanelComponent, selector: "kj-overflow-panel", inputs: ["kjFor", "kjCount", "kjStart", "kjEnd", "kjLabels", "kjTemplate", "kjSide", "kjAlign"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
894
1155
  }
895
1156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjAvatarGroupComponent, decorators: [{
896
1157
  type: Component,
@@ -912,25 +1173,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
912
1173
  ],
913
1174
  },
914
1175
  ],
915
- imports: [KjAvatarComponent],
1176
+ imports: [KjAvatarComponent, KjPopoverTrigger, KjOverflowPanelComponent],
916
1177
  template: `
917
1178
  <ng-content />
918
1179
  @if (overflowCount() > 0) {
919
- <kj-avatar
920
- class="kj-avatar-group-overflow"
921
- aria-hidden="true"
922
- [content]="overflowLabel()"
923
- [shape]="chipShape()"
1180
+ <button
1181
+ type="button"
1182
+ class="kj-overflow-trigger kj-avatar-group-overflow-trigger"
1183
+ kjPopoverTrigger
1184
+ kjTrigger="hover"
1185
+ #trg="kjPopoverTrigger"
1186
+ [attr.aria-label]="overflowAriaLabel()"
1187
+ (keydown.arrowdown)="focusPanel($event)"
1188
+ (keydown.enter)="focusPanel($event)"
1189
+ >
1190
+ <kj-avatar
1191
+ class="kj-avatar-group-overflow"
1192
+ aria-hidden="true"
1193
+ [content]="overflowLabel()"
1194
+ [shape]="chipShape()"
1195
+ />
1196
+ </button>
1197
+ <kj-overflow-panel
1198
+ [kjFor]="trg"
1199
+ [kjCount]="overflowCount()"
1200
+ [kjStart]="group.visibleCount()"
1201
+ [kjEnd]="group.total()"
1202
+ [kjLabels]="hiddenLabels()"
1203
+ [kjTemplate]="overflowTemplate()"
924
1204
  />
925
1205
  }
926
1206
  `,
927
1207
  encapsulation: ViewEncapsulation.None,
928
1208
  host: {
929
- 'class': 'kj-avatar-group',
1209
+ class: 'kj-avatar-group',
930
1210
  },
931
1211
  changeDetection: ChangeDetectionStrategy.OnPush,
932
1212
  }]
933
- }] });
1213
+ }], propDecorators: { kjOverflowLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjOverflowLabel", required: false }] }], kjOverflowAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjOverflowAriaLabel", required: false }] }], avatars: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KjAvatarComponent), { ...{ descendants: true }, isSignal: true }] }], overflowTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KjOverflowContent), { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KjOverflowPanelComponent), { isSignal: true }] }] } });
934
1214
 
935
1215
  /**
936
1216
  * Styled wrapper around the headless `KjBadge` directive.
@@ -12074,81 +12354,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12074
12354
  `, encapsulation: ViewEncapsulation.None, host: { 'style': 'display: contents;' }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-password-input{--kj-password-input-bg: var(--kj-bg-field);--kj-password-input-fg: var(--kj-fg-default);--kj-password-input-border-color: var(--kj-border-default);--kj-password-input-border-style: solid;--kj-password-input-border-width: var(--kj-border);--kj-password-input-radius: var(--kj-radius-field);--kj-password-input-padding-x: var(--kj-space-md);--kj-password-input-padding-y: var(--kj-space-sm);--kj-password-input-font: var(--kj-font-sans);--kj-password-input-font-size: var(--kj-text-sm);--kj-password-input-placeholder-fg: var(--kj-fg-muted);--kj-password-input-toggle-fg: var(--kj-fg-muted);--kj-password-input-toggle-fg-hover: var(--kj-fg-default);--kj-password-input-height: 2.25rem;display:inline-flex;align-items:center;gap:var(--kj-space-xs);inline-size:100%;height:var(--kj-password-input-height);background:var(--kj-password-input-bg);color:var(--kj-password-input-fg);border:var(--kj-password-input-border-width) var(--kj-password-input-border-style) var(--kj-password-input-border-color);border-radius:var(--kj-password-input-radius);padding:0 var(--kj-password-input-padding-x);font:var(--kj-password-input-font-size) / 1.4 var(--kj-password-input-font);transition:var(--kj-transition)}.kj-password-input[data-size=sm]{--kj-password-input-height: 2rem;--kj-password-input-font-size: .8125rem}.kj-password-input[data-size=lg]{--kj-password-input-height: 2.75rem;--kj-password-input-font-size: 1rem}.kj-password-input__field{flex:1 1 auto;inline-size:100%;height:100%;background:transparent;color:inherit;border:0;outline:0;padding:0;font:inherit}.kj-password-input__field::placeholder{color:var(--kj-password-input-placeholder-fg)}.kj-password-input:focus-within{outline:2px solid var(--kj-fg-primary);outline-offset:2px;--kj-password-input-border-color: var(--kj-fg-primary)}.kj-password-input:has([aria-invalid=true]){--kj-password-input-border-color: var(--kj-fg-danger)}.kj-password-input:has([aria-disabled=true]),.kj-password-input:has(:disabled){opacity:.55;cursor:not-allowed}.kj-password-input__toggle{display:inline-flex;align-items:center;justify-content:center;inline-size:1.75rem;block-size:1.75rem;margin-inline-start:var(--kj-space-xs);color:var(--kj-password-input-toggle-fg);background:transparent;border:0;border-radius:var(--kj-radius-field);cursor:pointer}.kj-password-input__toggle:hover,.kj-password-input__toggle:focus-visible{color:var(--kj-password-input-toggle-fg-hover)}.kj-password-input__toggle:focus-visible{outline:2px solid var(--kj-fg-primary);outline-offset:2px}.kj-password-input__icon{inline-size:1rem;block-size:1rem;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.kj-password-strength{display:flex;gap:var(--kj-space-xs);inline-size:100%;margin-block-start:var(--kj-space-xs)}.kj-password-strength__seg{flex:1 1 0;block-size:.25rem;background:var(--kj-bg-surface);border-radius:2px;transition:background-color var(--kj-transition)}.kj-password-strength[data-score=\"1\"] .kj-password-strength__seg:nth-child(-n+1),.kj-password-strength[data-score=\"2\"] .kj-password-strength__seg:nth-child(-n+2),.kj-password-strength[data-score=\"3\"] .kj-password-strength__seg:nth-child(-n+3),.kj-password-strength[data-score=\"4\"] .kj-password-strength__seg:nth-child(-n+4){background:var(--kj-password-strength-color, var(--kj-bg-primary))}.kj-password-strength[data-score=\"1\"]{--kj-password-strength-color: var(--kj-bg-danger)}.kj-password-strength[data-score=\"2\"]{--kj-password-strength-color: var(--kj-bg-warning, #d97706)}.kj-password-strength[data-score=\"3\"],.kj-password-strength[data-score=\"4\"]{--kj-password-strength-color: var(--kj-bg-success, #059669)}.kj-password-strength__label{display:block;margin-block-start:var(--kj-space-xs);font-size:var(--kj-text-xs);color:var(--kj-fg-muted)}.kj-password-caps-lock-warning{display:block;margin-block-start:var(--kj-space-xs);font-size:var(--kj-text-xs);color:var(--kj-fg-warning, #d97706)}.kj-password-caps-lock-warning[hidden]{display:none}}\n"] }]
12075
12355
  }], ctorParameters: () => [], propDecorators: { kjAutocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjAutocomplete", required: false }] }], kjMaxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjMaxLength", required: false }] }], kjDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjDisabled", required: false }] }], kjInvalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjInvalid", required: false }] }], kjRevealed: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjRevealed", required: false }] }, { type: i0.Output, args: ["kjRevealedChange"] }], kjPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjPlaceholder", required: false }] }], kjValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjValue", required: false }] }, { type: i0.Output, args: ["kjValueChange"] }], kjShowToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjShowToggle", required: false }] }], kjShowStrength: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjShowStrength", required: false }] }], kjShowCapsLockWarning: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjShowCapsLockWarning", required: false }] }], kjShowLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjShowLabel", required: false }] }], kjHideLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjHideLabel", required: false }] }], kjCapsLockMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjCapsLockMessage", required: false }] }] } });
12076
12356
 
12077
- /**
12078
- * Click-triggered popover. Compose `[kjPopoverTrigger]` + `<kj-popover-content [kjFor]="t">`
12079
- * with optional `[kjPopoverTitle]` heading and `[kjPopoverClose]` button. The
12080
- * wrapper itself only projects content — its purpose is to host the docs tags.
12081
- *
12082
- * @doc
12083
- * @doc-name popover
12084
- * @doc-is-main
12085
- * @doc-example Default
12086
- * A trigger button + content panel — the bare-minimum recipe.
12087
- * @doc-file popover.example.ts
12088
- * @doc-example Usage
12089
- * A walkthrough of the most common usages — info panel, side-pinned, and
12090
- * modal confirmation. Use this as the copy-paste starting point.
12091
- * @doc-file popover.usage.example.ts
12092
- * @doc-example Sides
12093
- * `kjSide="top|right|bottom|left"` pins the panel relative to the trigger.
12094
- * @doc-file popover.sides.example.ts
12095
- * @doc-example Modal
12096
- * `[kjTrap]="true"` traps focus inside the panel until it closes.
12097
- * @doc-file popover.modal.example.ts
12098
- * @doc-example Cancellable
12099
- * `[kjPopoverClose]` on a button dismisses the panel and restores focus.
12100
- * @doc-file popover.cancellable.example.ts
12101
- * @doc-example With form
12102
- * Embed inputs inside the panel — focus returns to the trigger on close.
12103
- * @doc-file popover.with-form.example.ts
12104
- *
12105
- * @doc-keyboard
12106
- * Enter|Space — Opens the popover from the trigger
12107
- * Escape — Closes the popover and returns focus to the trigger
12108
- * Tab — Moves focus through the panel; cycles inside when [kjTrap]="true"
12109
- * Shift+Tab — Reverse-cycles focus
12110
- *
12111
- * @doc-aria
12112
- * aria-haspopup — Set to "dialog" on the trigger
12113
- * aria-expanded — Reflects the open/closed state on the trigger
12114
- * aria-controls — Links the trigger to the panel id
12115
- * role="dialog" — On the panel (provided via the overlay primitive)
12116
- * aria-labelledby — Wire to `[kjPopoverTitle]` heading id for an accessible name
12117
- *
12118
- * @doc-touch
12119
- * Trigger buttons inherit `kj-button` sizing — use `kjSize="md"` or larger
12120
- * to satisfy WCAG 2.5.5 (44×44). The panel itself is not a touch target.
12121
- *
12122
- * @doc-a11y
12123
- * The panel is portalled to `document.body` so it escapes clipping
12124
- * ancestors while staying linked via `aria-controls`. Focus is returned
12125
- * to the trigger on close, and outside clicks dismiss by default. For
12126
- * destructive confirmations, set `[kjTrap]="true"` so the user must
12127
- * commit or cancel via a visible affordance.
12128
- *
12129
- * @doc-related dialog,tooltip,dropdown-menu
12130
- *
12131
- * @doc-css-var
12132
- * --kj-popover-bg — Panel background fill. Inherits --kj-bg-elevated.
12133
- * --kj-popover-fg — Panel foreground (text) color.
12134
- * --kj-popover-border-color — Panel border color. Inherits --kj-border-default.
12135
- * --kj-popover-radius — Panel corner radius. Inherits --kj-radius-box.
12136
- * --kj-popover-padding-x — Horizontal padding inside the panel.
12137
- * --kj-popover-padding-y — Vertical padding inside the panel.
12138
- * --kj-popover-shadow — Drop shadow under the panel. Inherits --kj-shadow-md.
12139
- * --kj-popover-arrow-size — Edge length of the optional arrow indicator.
12140
- *
12141
- * @doc-category Library/Overlay
12142
- */
12143
- class KjPopoverComponent {
12144
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12145
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: KjPopoverComponent, isStandalone: true, selector: "kj-popover", host: { styleAttribute: "display: contents;" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: ["@layer kj.component{.kj-popover-content{--kj-popover-bg: var(--kj-bg-elevated);--kj-popover-fg: var(--kj-fg-default);--kj-popover-border-color: var(--kj-border-default);--kj-popover-radius: var(--kj-radius-box);--kj-popover-padding-x: var(--kj-space-md);--kj-popover-padding-y: var(--kj-space-md);--kj-popover-shadow: var(--kj-shadow-md, 0 12px 32px rgb(0 0 0 / .18));--kj-popover-arrow-size: 8px;display:block;box-sizing:border-box;max-width:min(28rem,calc(100vw - 2rem));background:var(--kj-popover-bg);color:var(--kj-popover-fg);border:var(--kj-border) solid var(--kj-popover-border-color);border-radius:var(--kj-popover-radius);padding:var(--kj-popover-padding-y) var(--kj-popover-padding-x);font:.875rem / 1.5 var(--kj-font-sans);box-shadow:var(--kj-popover-shadow);pointer-events:auto;z-index:1000;word-wrap:break-word}.kj-popover-content[hidden]{display:none}.kj-popover-title{display:block;font-size:.9375rem;font-weight:600;margin:0 0 var(--kj-space-xs);color:var(--kj-fg-default)}.kj-popover-arrow{position:absolute;width:var(--kj-popover-arrow-size, 8px);height:var(--kj-popover-arrow-size, 8px);background:var(--kj-popover-bg, var(--kj-bg-elevated));border:var(--kj-border) solid var(--kj-popover-border-color, var(--kj-border-default));transform:rotate(45deg)}.kj-popover-content[data-side=top] .kj-popover-arrow{bottom:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-top-color:transparent;border-left-color:transparent}.kj-popover-content[data-side=bottom] .kj-popover-arrow{top:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-bottom-color:transparent;border-right-color:transparent}.kj-popover-content[data-side=left] .kj-popover-arrow{right:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-left-color:transparent;border-bottom-color:transparent}.kj-popover-content[data-side=right] .kj-popover-arrow{left:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-right-color:transparent;border-top-color:transparent}body[data-kj-scroll-lock=true]{overflow:hidden}@media(prefers-reduced-motion:no-preference){.kj-popover-content{transition:opacity .14s ease-out,transform .14s ease-out}.kj-popover-content[data-state=closed]{opacity:0;transform:scale(.98)}.kj-popover-content[data-state=open]{opacity:1;transform:scale(1)}}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
12146
- }
12147
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjPopoverComponent, decorators: [{
12148
- type: Component,
12149
- args: [{ selector: 'kj-popover', standalone: true, imports: [KjPopoverTrigger, KjPopoverContent, KjPopoverArrow, KjPopoverClose, KjPopoverTitle], template: `<ng-content />`, encapsulation: ViewEncapsulation.None, host: { style: 'display: contents;' }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-popover-content{--kj-popover-bg: var(--kj-bg-elevated);--kj-popover-fg: var(--kj-fg-default);--kj-popover-border-color: var(--kj-border-default);--kj-popover-radius: var(--kj-radius-box);--kj-popover-padding-x: var(--kj-space-md);--kj-popover-padding-y: var(--kj-space-md);--kj-popover-shadow: var(--kj-shadow-md, 0 12px 32px rgb(0 0 0 / .18));--kj-popover-arrow-size: 8px;display:block;box-sizing:border-box;max-width:min(28rem,calc(100vw - 2rem));background:var(--kj-popover-bg);color:var(--kj-popover-fg);border:var(--kj-border) solid var(--kj-popover-border-color);border-radius:var(--kj-popover-radius);padding:var(--kj-popover-padding-y) var(--kj-popover-padding-x);font:.875rem / 1.5 var(--kj-font-sans);box-shadow:var(--kj-popover-shadow);pointer-events:auto;z-index:1000;word-wrap:break-word}.kj-popover-content[hidden]{display:none}.kj-popover-title{display:block;font-size:.9375rem;font-weight:600;margin:0 0 var(--kj-space-xs);color:var(--kj-fg-default)}.kj-popover-arrow{position:absolute;width:var(--kj-popover-arrow-size, 8px);height:var(--kj-popover-arrow-size, 8px);background:var(--kj-popover-bg, var(--kj-bg-elevated));border:var(--kj-border) solid var(--kj-popover-border-color, var(--kj-border-default));transform:rotate(45deg)}.kj-popover-content[data-side=top] .kj-popover-arrow{bottom:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-top-color:transparent;border-left-color:transparent}.kj-popover-content[data-side=bottom] .kj-popover-arrow{top:calc(var(--kj-popover-arrow-size) / -2);left:50%;margin-left:calc(var(--kj-popover-arrow-size) / -2);border-bottom-color:transparent;border-right-color:transparent}.kj-popover-content[data-side=left] .kj-popover-arrow{right:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-left-color:transparent;border-bottom-color:transparent}.kj-popover-content[data-side=right] .kj-popover-arrow{left:calc(var(--kj-popover-arrow-size) / -2);top:50%;margin-top:calc(var(--kj-popover-arrow-size) / -2);border-right-color:transparent;border-top-color:transparent}body[data-kj-scroll-lock=true]{overflow:hidden}@media(prefers-reduced-motion:no-preference){.kj-popover-content{transition:opacity .14s ease-out,transform .14s ease-out}.kj-popover-content[data-state=closed]{opacity:0;transform:scale(.98)}.kj-popover-content[data-state=open]{opacity:1;transform:scale(1)}}}\n"] }]
12150
- }] });
12151
-
12152
12357
  /**
12153
12358
  * Styled wrapper around the headless `KjProgressBar` directive. Composes the
12154
12359
  * core directive on an inner element and renders the inner
@@ -13395,7 +13600,7 @@ class KjSelectComponent {
13395
13600
  <kj-select-content [kjFor]="trig" class="kj-select-content">
13396
13601
  <ng-content />
13397
13602
  </kj-select-content>
13398
- `, isInline: true, styles: ["@layer kj.component{.kj-select{position:relative;display:inline-block;min-width:12rem}.kj-select-trigger{--kj-select-trigger-height: 2.25rem;width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:var(--kj-space-sm);background:var(--kj-bg-field);color:var(--kj-fg-default);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);padding:0 var(--kj-space-md);height:var(--kj-select-trigger-height);font:.875rem var(--kj-font-sans);cursor:pointer}.kj-select[data-size=xs] .kj-select-trigger{--kj-select-trigger-height: 1.75rem;font-size:.75rem;padding-inline:var(--kj-space-sm);gap:var(--kj-space-xs)}.kj-select[data-size=sm] .kj-select-trigger{--kj-select-trigger-height: 2rem;font-size:.8125rem}.kj-select[data-size=lg] .kj-select-trigger{--kj-select-trigger-height: 2.75rem;font-size:1rem}.kj-select[data-size=xs]{min-width:0}.kj-select-trigger-caret{font-size:.875em;color:var(--kj-fg-muted);flex:none}.kj-select-trigger:focus-visible{outline:2px solid var(--kj-fg-primary);outline-offset:2px}.kj-select[data-disabled] .kj-select-trigger{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-select-content{box-sizing:border-box;min-width:12rem;width:max-content;background:var(--kj-bg-elevated);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);box-shadow:var(--kj-shadow-md, 0 8px 24px rgb(0 0 0 / .12));padding:4px;max-height:16rem;overflow:auto;z-index:100}.kj-select-content[hidden]{display:none}.kj-option{padding:var(--kj-space-sm) var(--kj-space-md);border-radius:var(--kj-radius-selector);cursor:pointer;color:var(--kj-fg-default);font:.875rem var(--kj-font-sans)}.kj-option:hover{background:var(--kj-bg-field)}.kj-option[aria-selected=true]{background:color-mix(in oklab,var(--kj-bg-primary) 12%,transparent);color:var(--kj-fg-primary);font-weight:600}.kj-option[aria-selected=true]:hover{background:color-mix(in oklab,var(--kj-bg-primary) 18%,transparent)}}\n"], dependencies: [{ kind: "directive", type: KjIconDirective, selector: "span[kjIcon], i[kjIcon]", inputs: ["kjIcon", "kjIconLabel", "kjIconColor", "kjIconSize"] }, { kind: "directive", type: KjSelectTrigger, selector: "[kjSelectTrigger]", inputs: ["kjMultiple", "kjDisabled"], exportAs: ["kjSelectTrigger"] }, { kind: "component", type: KjSelectContent, selector: "kj-select-content", inputs: ["kjSide", "kjAlign", "kjOffset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
13603
+ `, isInline: true, styles: ["@layer kj.component{.kj-select{position:relative;display:inline-block;min-width:12rem}.kj-select-trigger{--kj-select-trigger-height: 2.25rem;width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:var(--kj-space-sm);background:var(--kj-bg-field);color:var(--kj-fg-default);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);padding:0 var(--kj-space-md);height:var(--kj-select-trigger-height);font:.875rem var(--kj-font-sans);cursor:pointer;min-width:0}.kj-select-trigger-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.kj-select[data-size=xs] .kj-select-trigger{--kj-select-trigger-height: 1.75rem;font-size:.75rem;padding-inline:var(--kj-space-sm);gap:var(--kj-space-xs)}.kj-select[data-size=sm] .kj-select-trigger{--kj-select-trigger-height: 2rem;font-size:.8125rem}.kj-select[data-size=lg] .kj-select-trigger{--kj-select-trigger-height: 2.75rem;font-size:1rem}.kj-select[data-size=xs]{min-width:0}.kj-select-trigger-caret{font-size:.875em;color:var(--kj-fg-muted);flex:none}.kj-select-trigger:focus-visible{outline:2px solid var(--kj-fg-primary);outline-offset:2px}.kj-select[data-disabled] .kj-select-trigger{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-select-content{box-sizing:border-box;min-width:12rem;width:max-content;max-width:min(28rem,calc(100vw - 2rem));background:var(--kj-bg-elevated);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);box-shadow:var(--kj-shadow-md, 0 8px 24px rgb(0 0 0 / .12));padding:4px;max-height:16rem;overflow:auto;z-index:100}.kj-select-content[hidden]{display:none}.kj-option{padding:var(--kj-space-sm) var(--kj-space-md);border-radius:var(--kj-radius-selector);cursor:pointer;color:var(--kj-fg-default);font:.875rem var(--kj-font-sans);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kj-option:hover{background:var(--kj-bg-field)}.kj-option[aria-selected=true]{background:color-mix(in oklab,var(--kj-bg-primary) 12%,transparent);color:var(--kj-fg-primary);font-weight:600}.kj-option[aria-selected=true]:hover{background:color-mix(in oklab,var(--kj-bg-primary) 18%,transparent)}}\n"], dependencies: [{ kind: "directive", type: KjIconDirective, selector: "span[kjIcon], i[kjIcon]", inputs: ["kjIcon", "kjIconLabel", "kjIconColor", "kjIconSize"] }, { kind: "directive", type: KjSelectTrigger, selector: "[kjSelectTrigger]", inputs: ["kjMultiple", "kjDisabled"], exportAs: ["kjSelectTrigger"] }, { kind: "component", type: KjSelectContent, selector: "kj-select-content", inputs: ["kjSide", "kjAlign", "kjOffset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
13399
13604
  }
13400
13605
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjSelectComponent, decorators: [{
13401
13606
  type: Component,
@@ -13414,7 +13619,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
13414
13619
  '[attr.data-disabled]': "disabled() ? '' : null",
13415
13620
  '[attr.data-multiple]': "multiple() ? '' : null",
13416
13621
  '[attr.data-size]': "kjSize() === 'md' ? null : kjSize()",
13417
- }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-select{position:relative;display:inline-block;min-width:12rem}.kj-select-trigger{--kj-select-trigger-height: 2.25rem;width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:var(--kj-space-sm);background:var(--kj-bg-field);color:var(--kj-fg-default);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);padding:0 var(--kj-space-md);height:var(--kj-select-trigger-height);font:.875rem var(--kj-font-sans);cursor:pointer}.kj-select[data-size=xs] .kj-select-trigger{--kj-select-trigger-height: 1.75rem;font-size:.75rem;padding-inline:var(--kj-space-sm);gap:var(--kj-space-xs)}.kj-select[data-size=sm] .kj-select-trigger{--kj-select-trigger-height: 2rem;font-size:.8125rem}.kj-select[data-size=lg] .kj-select-trigger{--kj-select-trigger-height: 2.75rem;font-size:1rem}.kj-select[data-size=xs]{min-width:0}.kj-select-trigger-caret{font-size:.875em;color:var(--kj-fg-muted);flex:none}.kj-select-trigger:focus-visible{outline:2px solid var(--kj-fg-primary);outline-offset:2px}.kj-select[data-disabled] .kj-select-trigger{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-select-content{box-sizing:border-box;min-width:12rem;width:max-content;background:var(--kj-bg-elevated);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);box-shadow:var(--kj-shadow-md, 0 8px 24px rgb(0 0 0 / .12));padding:4px;max-height:16rem;overflow:auto;z-index:100}.kj-select-content[hidden]{display:none}.kj-option{padding:var(--kj-space-sm) var(--kj-space-md);border-radius:var(--kj-radius-selector);cursor:pointer;color:var(--kj-fg-default);font:.875rem var(--kj-font-sans)}.kj-option:hover{background:var(--kj-bg-field)}.kj-option[aria-selected=true]{background:color-mix(in oklab,var(--kj-bg-primary) 12%,transparent);color:var(--kj-fg-primary);font-weight:600}.kj-option[aria-selected=true]:hover{background:color-mix(in oklab,var(--kj-bg-primary) 18%,transparent)}}\n"] }]
13622
+ }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-select{position:relative;display:inline-block;min-width:12rem}.kj-select-trigger{--kj-select-trigger-height: 2.25rem;width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:var(--kj-space-sm);background:var(--kj-bg-field);color:var(--kj-fg-default);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);padding:0 var(--kj-space-md);height:var(--kj-select-trigger-height);font:.875rem var(--kj-font-sans);cursor:pointer;min-width:0}.kj-select-trigger-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.kj-select[data-size=xs] .kj-select-trigger{--kj-select-trigger-height: 1.75rem;font-size:.75rem;padding-inline:var(--kj-space-sm);gap:var(--kj-space-xs)}.kj-select[data-size=sm] .kj-select-trigger{--kj-select-trigger-height: 2rem;font-size:.8125rem}.kj-select[data-size=lg] .kj-select-trigger{--kj-select-trigger-height: 2.75rem;font-size:1rem}.kj-select[data-size=xs]{min-width:0}.kj-select-trigger-caret{font-size:.875em;color:var(--kj-fg-muted);flex:none}.kj-select-trigger:focus-visible{outline:2px solid var(--kj-fg-primary);outline-offset:2px}.kj-select[data-disabled] .kj-select-trigger{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-select-content{box-sizing:border-box;min-width:12rem;width:max-content;max-width:min(28rem,calc(100vw - 2rem));background:var(--kj-bg-elevated);border:var(--kj-border) solid var(--kj-border-default);border-radius:var(--kj-radius-field);box-shadow:var(--kj-shadow-md, 0 8px 24px rgb(0 0 0 / .12));padding:4px;max-height:16rem;overflow:auto;z-index:100}.kj-select-content[hidden]{display:none}.kj-option{padding:var(--kj-space-sm) var(--kj-space-md);border-radius:var(--kj-radius-selector);cursor:pointer;color:var(--kj-fg-default);font:.875rem var(--kj-font-sans);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kj-option:hover{background:var(--kj-bg-field)}.kj-option[aria-selected=true]{background:color-mix(in oklab,var(--kj-bg-primary) 12%,transparent);color:var(--kj-fg-primary);font-weight:600}.kj-option[aria-selected=true]:hover{background:color-mix(in oklab,var(--kj-bg-primary) 18%,transparent)}}\n"] }]
13418
13623
  }], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], kjSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjSize", required: false }] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => forwardRef(() => KjOptionComponent)), { isSignal: true }] }] } });
13419
13624
  /**
13420
13625
  * Single option row.
@@ -18642,6 +18847,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
18642
18847
  * @doc-example Tag list
18643
18848
  * Wrap chips in `<kj-tag-list>` for single-tab-stop + arrow-key navigation.
18644
18849
  * @doc-file tag.list.example.ts
18850
+ * @doc-example Overflow
18851
+ * `[kjMax]` on the list collapses the extra chips into a "+N" chip whose hover
18852
+ * panel lists them.
18853
+ * @doc-file tag.overflow.example.ts
18854
+ * @doc-example Overflow template
18855
+ * `<ng-template kjOverflowContent>` renders the collapsed chips your way — here
18856
+ * as rows with a remove action.
18857
+ * @doc-file tag.overflow-template.example.ts
18645
18858
  *
18646
18859
  * @doc-keyboard
18647
18860
  * Enter|Space — Activates a selectable tag; flips `aria-pressed`
@@ -18688,26 +18901,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
18688
18901
  */
18689
18902
  class KjTagComponent {
18690
18903
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18691
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: KjTagComponent, isStandalone: true, selector: "kj-tag", host: { classAttribute: "kj-tag" }, hostDirectives: [{ directive: i1.KjTag, inputs: ["kjTagSelectable", "kjTagSelectable", "kjTagSelected", "kjTagSelected", "kjTagLabel", "kjTagLabel", "kjTagDisabled", "kjTagDisabled"], outputs: ["kjTagSelectedChange", "kjTagSelectedChange", "kjTagRemoved", "kjTagRemoved"] }], ngImport: i0, template: `<ng-content />`, isInline: true, styles: ["@layer kj.component{.kj-tag{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: transparent;--kj-tag-radius: var(--kj-radius-selector);--kj-tag-padding-x: var(--kj-space-sm);--kj-tag-padding-y: .125rem;--kj-tag-font-size: .75rem;--kj-tag-gap: .25rem;display:inline-flex;align-items:center;gap:var(--kj-tag-gap);background:var(--kj-tag-bg);color:var(--kj-tag-fg);border:var(--kj-border) solid var(--kj-tag-border-color);border-radius:var(--kj-tag-radius);padding:var(--kj-tag-padding-y) var(--kj-tag-padding-x);font:var(--kj-tag-font-size) / 1 var(--kj-font-sans);font-weight:500;transition:background-color var(--kj-transition),color var(--kj-transition),border-color var(--kj-transition)}.kj-tag[data-variant=secondary]{--kj-tag-bg: var(--kj-bg-field);--kj-tag-fg: var(--kj-fg-default)}.kj-tag[data-variant=destructive],.kj-tag[data-variant=danger]{--kj-tag-bg: var(--kj-bg-danger);--kj-tag-fg: var(--kj-fg-on-danger)}.kj-tag[data-variant=success]{--kj-tag-bg: var(--kj-bg-success, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-success, var(--kj-fg-on-primary))}.kj-tag[data-variant=warning]{--kj-tag-bg: var(--kj-bg-warning, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-warning, var(--kj-fg-on-primary))}.kj-tag[data-variant=info]{--kj-tag-bg: var(--kj-bg-info, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-info, var(--kj-fg-on-primary))}.kj-tag[data-variant=outline]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: var(--kj-border-default)}.kj-tag[data-variant=ghost]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: transparent}.kj-tag[data-size=xs]{--kj-tag-padding-x: .1875rem;--kj-tag-padding-y: .03125rem;--kj-tag-font-size: .5625rem;--kj-tag-gap: .125rem}.kj-tag[data-size=sm]{--kj-tag-padding-x: .375rem;--kj-tag-padding-y: .125rem;--kj-tag-font-size: .6875rem}.kj-tag[data-size=lg]{--kj-tag-padding-x: var(--kj-space-md);--kj-tag-font-size: .875rem}.kj-tag[role=button],.kj-tag[role=option]{cursor:pointer;-webkit-user-select:none;user-select:none}.kj-tag[role=button]:hover,.kj-tag[role=option]:hover{--kj-tag-bg: color-mix(in oklab, var(--kj-tag-bg) 88%, var(--kj-fg-default))}.kj-tag[aria-pressed=true],.kj-tag[aria-selected=true],.kj-tag[data-selected]{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: var(--kj-bg-primary)}.kj-tag[data-focus-visible]:focus,.kj-tag:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}.kj-tag[aria-disabled=true],.kj-tag[data-disabled]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag-remove{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;margin-inline-start:.125rem;padding:0;border:none;background:transparent;color:inherit;border-radius:999px;cursor:pointer;line-height:1;font:inherit;position:relative}.kj-tag-remove:after{content:\"\";position:absolute;inset:-.875rem;border-radius:inherit}.kj-tag-remove:hover{background:color-mix(in oklab,currentColor 18%,transparent)}.kj-tag-remove:focus-visible{outline:2px solid currentColor;outline-offset:2px}.kj-tag-remove[aria-disabled=true]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag-list{display:inline-flex;flex-wrap:wrap;gap:var(--kj-space-sm);align-items:center}.kj-tag-list[role=listbox]:focus-visible,.kj-tag-list[role=grid]:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
18904
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: KjTagComponent, isStandalone: true, selector: "kj-tag", host: { classAttribute: "kj-tag" }, hostDirectives: [{ directive: i1.KjTag, inputs: ["kjTagSelectable", "kjTagSelectable", "kjTagSelected", "kjTagSelected", "kjTagLabel", "kjTagLabel", "kjTagDisabled", "kjTagDisabled"], outputs: ["kjTagSelectedChange", "kjTagSelectedChange", "kjTagRemoved", "kjTagRemoved"] }], ngImport: i0, template: `<ng-content />`, isInline: true, styles: ["@layer kj.component{.kj-tag{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: transparent;--kj-tag-radius: var(--kj-radius-selector);--kj-tag-padding-x: var(--kj-space-sm);--kj-tag-padding-y: .125rem;--kj-tag-font-size: .75rem;--kj-tag-gap: .25rem;display:inline-flex;align-items:center;gap:var(--kj-tag-gap);background:var(--kj-tag-bg);color:var(--kj-tag-fg);border:var(--kj-border) solid var(--kj-tag-border-color);border-radius:var(--kj-tag-radius);padding:var(--kj-tag-padding-y) var(--kj-tag-padding-x);font:var(--kj-tag-font-size) / 1 var(--kj-font-sans);font-weight:500;transition:background-color var(--kj-transition),color var(--kj-transition),border-color var(--kj-transition)}.kj-tag[data-variant=secondary]{--kj-tag-bg: var(--kj-bg-field);--kj-tag-fg: var(--kj-fg-default)}.kj-tag[data-variant=destructive],.kj-tag[data-variant=danger]{--kj-tag-bg: var(--kj-bg-danger);--kj-tag-fg: var(--kj-fg-on-danger)}.kj-tag[data-variant=success]{--kj-tag-bg: var(--kj-bg-success, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-success, var(--kj-fg-on-primary))}.kj-tag[data-variant=warning]{--kj-tag-bg: var(--kj-bg-warning, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-warning, var(--kj-fg-on-primary))}.kj-tag[data-variant=info]{--kj-tag-bg: var(--kj-bg-info, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-info, var(--kj-fg-on-primary))}.kj-tag[data-variant=outline]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: var(--kj-border-default)}.kj-tag[data-variant=ghost]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: transparent}.kj-tag[data-size=xs]{--kj-tag-padding-x: .1875rem;--kj-tag-padding-y: .03125rem;--kj-tag-font-size: .5625rem;--kj-tag-gap: .125rem}.kj-tag[data-size=sm]{--kj-tag-padding-x: .375rem;--kj-tag-padding-y: .125rem;--kj-tag-font-size: .6875rem}.kj-tag[data-size=lg]{--kj-tag-padding-x: var(--kj-space-md);--kj-tag-font-size: .875rem}.kj-tag[role=button],.kj-tag[role=option]{cursor:pointer;-webkit-user-select:none;user-select:none}.kj-tag[role=button]:hover,.kj-tag[role=option]:hover{--kj-tag-bg: color-mix(in oklab, var(--kj-tag-bg) 88%, var(--kj-fg-default))}.kj-tag[aria-pressed=true],.kj-tag[aria-selected=true],.kj-tag[data-selected]{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: var(--kj-bg-primary)}.kj-tag[data-focus-visible]:focus,.kj-tag:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}.kj-tag[aria-disabled=true],.kj-tag[data-disabled]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag-remove{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;margin-inline-start:.125rem;padding:0;border:none;background:transparent;color:inherit;border-radius:999px;cursor:pointer;line-height:1;font:inherit;position:relative}.kj-tag-remove:after{content:\"\";position:absolute;inset:-.875rem;border-radius:inherit}.kj-tag-remove:hover{background:color-mix(in oklab,currentColor 18%,transparent)}.kj-tag-remove:focus-visible{outline:2px solid currentColor;outline-offset:2px}.kj-tag-remove[aria-disabled=true]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag[hidden]{display:none}.kj-tag-list{display:inline-flex;flex-wrap:wrap;gap:var(--kj-space-sm);align-items:center}.kj-tag-list-overflow{border-style:dashed;--kj-tag-border-color: var(--kj-border-default)}.kj-tag-list-overflow[aria-expanded=true]{--kj-tag-bg: var(--kj-bg-field)}.kj-tag-list[role=listbox]:focus-visible,.kj-tag-list[role=grid]:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
18692
18905
  }
18693
18906
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjTagComponent, decorators: [{
18694
18907
  type: Component,
18695
18908
  args: [{ selector: 'kj-tag', standalone: true, hostDirectives: [
18696
18909
  {
18697
18910
  directive: KjTag,
18698
- inputs: [
18699
- 'kjTagSelectable',
18700
- 'kjTagSelected',
18701
- 'kjTagLabel',
18702
- 'kjTagDisabled',
18703
- ],
18911
+ inputs: ['kjTagSelectable', 'kjTagSelected', 'kjTagLabel', 'kjTagDisabled'],
18704
18912
  outputs: ['kjTagSelectedChange', 'kjTagRemoved'],
18705
18913
  },
18706
18914
  ], template: `<ng-content />`, encapsulation: ViewEncapsulation.None, host: {
18707
18915
  class: 'kj-tag',
18708
18916
  // The KjVariant / KjSize host directives nested inside KjTag set
18709
18917
  // [data-variant] / [data-size] on the same host element automatically.
18710
- }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-tag{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: transparent;--kj-tag-radius: var(--kj-radius-selector);--kj-tag-padding-x: var(--kj-space-sm);--kj-tag-padding-y: .125rem;--kj-tag-font-size: .75rem;--kj-tag-gap: .25rem;display:inline-flex;align-items:center;gap:var(--kj-tag-gap);background:var(--kj-tag-bg);color:var(--kj-tag-fg);border:var(--kj-border) solid var(--kj-tag-border-color);border-radius:var(--kj-tag-radius);padding:var(--kj-tag-padding-y) var(--kj-tag-padding-x);font:var(--kj-tag-font-size) / 1 var(--kj-font-sans);font-weight:500;transition:background-color var(--kj-transition),color var(--kj-transition),border-color var(--kj-transition)}.kj-tag[data-variant=secondary]{--kj-tag-bg: var(--kj-bg-field);--kj-tag-fg: var(--kj-fg-default)}.kj-tag[data-variant=destructive],.kj-tag[data-variant=danger]{--kj-tag-bg: var(--kj-bg-danger);--kj-tag-fg: var(--kj-fg-on-danger)}.kj-tag[data-variant=success]{--kj-tag-bg: var(--kj-bg-success, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-success, var(--kj-fg-on-primary))}.kj-tag[data-variant=warning]{--kj-tag-bg: var(--kj-bg-warning, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-warning, var(--kj-fg-on-primary))}.kj-tag[data-variant=info]{--kj-tag-bg: var(--kj-bg-info, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-info, var(--kj-fg-on-primary))}.kj-tag[data-variant=outline]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: var(--kj-border-default)}.kj-tag[data-variant=ghost]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: transparent}.kj-tag[data-size=xs]{--kj-tag-padding-x: .1875rem;--kj-tag-padding-y: .03125rem;--kj-tag-font-size: .5625rem;--kj-tag-gap: .125rem}.kj-tag[data-size=sm]{--kj-tag-padding-x: .375rem;--kj-tag-padding-y: .125rem;--kj-tag-font-size: .6875rem}.kj-tag[data-size=lg]{--kj-tag-padding-x: var(--kj-space-md);--kj-tag-font-size: .875rem}.kj-tag[role=button],.kj-tag[role=option]{cursor:pointer;-webkit-user-select:none;user-select:none}.kj-tag[role=button]:hover,.kj-tag[role=option]:hover{--kj-tag-bg: color-mix(in oklab, var(--kj-tag-bg) 88%, var(--kj-fg-default))}.kj-tag[aria-pressed=true],.kj-tag[aria-selected=true],.kj-tag[data-selected]{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: var(--kj-bg-primary)}.kj-tag[data-focus-visible]:focus,.kj-tag:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}.kj-tag[aria-disabled=true],.kj-tag[data-disabled]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag-remove{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;margin-inline-start:.125rem;padding:0;border:none;background:transparent;color:inherit;border-radius:999px;cursor:pointer;line-height:1;font:inherit;position:relative}.kj-tag-remove:after{content:\"\";position:absolute;inset:-.875rem;border-radius:inherit}.kj-tag-remove:hover{background:color-mix(in oklab,currentColor 18%,transparent)}.kj-tag-remove:focus-visible{outline:2px solid currentColor;outline-offset:2px}.kj-tag-remove[aria-disabled=true]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag-list{display:inline-flex;flex-wrap:wrap;gap:var(--kj-space-sm);align-items:center}.kj-tag-list[role=listbox]:focus-visible,.kj-tag-list[role=grid]:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}}\n"] }]
18918
+ }, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@layer kj.component{.kj-tag{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: transparent;--kj-tag-radius: var(--kj-radius-selector);--kj-tag-padding-x: var(--kj-space-sm);--kj-tag-padding-y: .125rem;--kj-tag-font-size: .75rem;--kj-tag-gap: .25rem;display:inline-flex;align-items:center;gap:var(--kj-tag-gap);background:var(--kj-tag-bg);color:var(--kj-tag-fg);border:var(--kj-border) solid var(--kj-tag-border-color);border-radius:var(--kj-tag-radius);padding:var(--kj-tag-padding-y) var(--kj-tag-padding-x);font:var(--kj-tag-font-size) / 1 var(--kj-font-sans);font-weight:500;transition:background-color var(--kj-transition),color var(--kj-transition),border-color var(--kj-transition)}.kj-tag[data-variant=secondary]{--kj-tag-bg: var(--kj-bg-field);--kj-tag-fg: var(--kj-fg-default)}.kj-tag[data-variant=destructive],.kj-tag[data-variant=danger]{--kj-tag-bg: var(--kj-bg-danger);--kj-tag-fg: var(--kj-fg-on-danger)}.kj-tag[data-variant=success]{--kj-tag-bg: var(--kj-bg-success, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-success, var(--kj-fg-on-primary))}.kj-tag[data-variant=warning]{--kj-tag-bg: var(--kj-bg-warning, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-warning, var(--kj-fg-on-primary))}.kj-tag[data-variant=info]{--kj-tag-bg: var(--kj-bg-info, var(--kj-bg-primary));--kj-tag-fg: var(--kj-fg-on-info, var(--kj-fg-on-primary))}.kj-tag[data-variant=outline]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: var(--kj-border-default)}.kj-tag[data-variant=ghost]{--kj-tag-bg: transparent;--kj-tag-fg: var(--kj-fg-default);--kj-tag-border-color: transparent}.kj-tag[data-size=xs]{--kj-tag-padding-x: .1875rem;--kj-tag-padding-y: .03125rem;--kj-tag-font-size: .5625rem;--kj-tag-gap: .125rem}.kj-tag[data-size=sm]{--kj-tag-padding-x: .375rem;--kj-tag-padding-y: .125rem;--kj-tag-font-size: .6875rem}.kj-tag[data-size=lg]{--kj-tag-padding-x: var(--kj-space-md);--kj-tag-font-size: .875rem}.kj-tag[role=button],.kj-tag[role=option]{cursor:pointer;-webkit-user-select:none;user-select:none}.kj-tag[role=button]:hover,.kj-tag[role=option]:hover{--kj-tag-bg: color-mix(in oklab, var(--kj-tag-bg) 88%, var(--kj-fg-default))}.kj-tag[aria-pressed=true],.kj-tag[aria-selected=true],.kj-tag[data-selected]{--kj-tag-bg: var(--kj-bg-primary);--kj-tag-fg: var(--kj-fg-on-primary);--kj-tag-border-color: var(--kj-bg-primary)}.kj-tag[data-focus-visible]:focus,.kj-tag:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}.kj-tag[aria-disabled=true],.kj-tag[data-disabled]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag-remove{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;margin-inline-start:.125rem;padding:0;border:none;background:transparent;color:inherit;border-radius:999px;cursor:pointer;line-height:1;font:inherit;position:relative}.kj-tag-remove:after{content:\"\";position:absolute;inset:-.875rem;border-radius:inherit}.kj-tag-remove:hover{background:color-mix(in oklab,currentColor 18%,transparent)}.kj-tag-remove:focus-visible{outline:2px solid currentColor;outline-offset:2px}.kj-tag-remove[aria-disabled=true]{opacity:.45;cursor:not-allowed;pointer-events:none}.kj-tag[hidden]{display:none}.kj-tag-list{display:inline-flex;flex-wrap:wrap;gap:var(--kj-space-sm);align-items:center}.kj-tag-list-overflow{border-style:dashed;--kj-tag-border-color: var(--kj-border-default)}.kj-tag-list-overflow[aria-expanded=true]{--kj-tag-bg: var(--kj-bg-field)}.kj-tag-list[role=listbox]:focus-visible,.kj-tag-list[role=grid]:focus-visible{outline:2px solid var(--kj-bg-primary);outline-offset:2px}}\n"] }]
18711
18919
  }] });
18712
18920
  /**
18713
18921
  * Trailing remove button for `<kj-tag>`. Composes the headless `KjTagRemove`
@@ -18744,15 +18952,80 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
18744
18952
  }] });
18745
18953
  /**
18746
18954
  * Optional chip-group container. Provides the listbox / grid / group ARIA
18747
- * wiring + roving tabindex via the headless `KjTagList` directive. Standalone
18748
- * tags work without it; wrap chips in `<kj-tag-list>` whenever the group
18749
- * needs a single tab stop and arrow-key navigation.
18955
+ * wiring + roving tabindex via the headless `KjTagList` directive, and — with
18956
+ * `[kjMax]` collapses the chips past the cap into a "+N" chip. Hovering,
18957
+ * focusing or tapping that chip opens a panel listing the collapsed chips;
18958
+ * project an `<ng-template kjOverflowContent>` to render the panel yourself
18959
+ * (the context carries the collapsed range, so you slice your own data and
18960
+ * add actions such as remove).
18961
+ *
18962
+ * Standalone tags work without it; wrap chips in `<kj-tag-list>` whenever the
18963
+ * group needs a single tab stop and arrow-key navigation.
18964
+ *
18965
+ * The "+N" chip is a button rendered inside the container: keep the container
18966
+ * on its default `group` role when using `kjMax` (a `listbox` / `grid` only
18967
+ * admits option / row children).
18750
18968
  * @doc
18751
18969
  * @doc-name tag
18752
18970
  */
18753
18971
  class KjTagListComponent {
18972
+ list = inject(KjTagList, { self: true });
18973
+ i18n = inject(KjTranslateService);
18974
+ /** Text of the "+N" chip. Defaults to the `overflow.more` translation (`+{count}`). */
18975
+ kjOverflowLabel = input(undefined, /* @ts-ignore */
18976
+ ...(ngDevMode ? [{ debugName: "kjOverflowLabel" }] : /* istanbul ignore next */ []));
18977
+ /** Accessible name of the chip button. Defaults to the `overflow.show` translation (`Show {count} more`). */
18978
+ kjOverflowAriaLabel = input(undefined, /* @ts-ignore */
18979
+ ...(ngDevMode ? [{ debugName: "kjOverflowAriaLabel" }] : /* istanbul ignore next */ []));
18980
+ /** Variant of the "+N" chip. Default `secondary`. */
18981
+ kjOverflowVariant = input('secondary', /* @ts-ignore */
18982
+ ...(ngDevMode ? [{ debugName: "kjOverflowVariant" }] : /* istanbul ignore next */ []));
18983
+ overflowTemplate = contentChild(KjOverflowContent, /* @ts-ignore */
18984
+ ...(ngDevMode ? [{ debugName: "overflowTemplate" }] : /* istanbul ignore next */ []));
18985
+ panel = viewChild(KjOverflowPanelComponent, /* @ts-ignore */
18986
+ ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
18987
+ overflowCount = this.list.overflowCount;
18988
+ overflowLabel = computed(() => {
18989
+ const n = this.overflowCount();
18990
+ return this.kjOverflowLabel()?.(n) ?? this.i18n.translate('overflow.more', { count: n });
18991
+ }, /* @ts-ignore */
18992
+ ...(ngDevMode ? [{ debugName: "overflowLabel" }] : /* istanbul ignore next */ []));
18993
+ overflowAriaLabel = computed(() => {
18994
+ const n = this.overflowCount();
18995
+ return this.kjOverflowAriaLabel()?.(n) ?? this.i18n.translate('overflow.show', { count: n });
18996
+ }, /* @ts-ignore */
18997
+ ...(ngDevMode ? [{ debugName: "overflowAriaLabel" }] : /* istanbul ignore next */ []));
18998
+ focusPanel(event) {
18999
+ event.preventDefault();
19000
+ this.panel()?.focusFirst();
19001
+ }
18754
19002
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjTagListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18755
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: KjTagListComponent, isStandalone: true, selector: "kj-tag-list", host: { classAttribute: "kj-tag-list" }, hostDirectives: [{ directive: i1.KjTagList, inputs: ["kjTagListRole", "kjTagListRole", "kjTagListOrientation", "kjTagListOrientation", "kjTagListMultiple", "kjTagListMultiple", "kjTagListDisabled", "kjTagListDisabled"] }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
19003
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: KjTagListComponent, isStandalone: true, selector: "kj-tag-list", inputs: { kjOverflowLabel: { classPropertyName: "kjOverflowLabel", publicName: "kjOverflowLabel", isSignal: true, isRequired: false, transformFunction: null }, kjOverflowAriaLabel: { classPropertyName: "kjOverflowAriaLabel", publicName: "kjOverflowAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, kjOverflowVariant: { classPropertyName: "kjOverflowVariant", publicName: "kjOverflowVariant", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "kj-tag-list" }, queries: [{ propertyName: "overflowTemplate", first: true, predicate: KjOverflowContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "panel", first: true, predicate: KjOverflowPanelComponent, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.KjTagList, inputs: ["kjTagListRole", "kjTagListRole", "kjTagListOrientation", "kjTagListOrientation", "kjTagListMultiple", "kjTagListMultiple", "kjTagListDisabled", "kjTagListDisabled", "kjMax", "kjMax"] }], ngImport: i0, template: `
19004
+ <ng-content />
19005
+ @if (overflowCount() > 0) {
19006
+ <button
19007
+ type="button"
19008
+ class="kj-tag kj-overflow-trigger kj-tag-list-overflow"
19009
+ [attr.data-variant]="kjOverflowVariant()"
19010
+ kjPopoverTrigger
19011
+ kjTrigger="hover"
19012
+ #trg="kjPopoverTrigger"
19013
+ [attr.aria-label]="overflowAriaLabel()"
19014
+ (keydown.arrowdown)="focusPanel($event)"
19015
+ (keydown.enter)="focusPanel($event)"
19016
+ >
19017
+ {{ overflowLabel() }}
19018
+ </button>
19019
+ <kj-overflow-panel
19020
+ [kjFor]="trg"
19021
+ [kjCount]="overflowCount()"
19022
+ [kjStart]="list.visibleCount()"
19023
+ [kjEnd]="list.total()"
19024
+ [kjLabels]="list.hiddenLabels()"
19025
+ [kjTemplate]="overflowTemplate()"
19026
+ />
19027
+ }
19028
+ `, isInline: true, dependencies: [{ kind: "directive", type: KjPopoverTrigger, selector: "[kjPopoverTrigger]", inputs: ["kjTrigger", "kjDisabled", "kjOpenDelay", "kjCloseDelay"], exportAs: ["kjPopoverTrigger"] }, { kind: "component", type: KjOverflowPanelComponent, selector: "kj-overflow-panel", inputs: ["kjFor", "kjCount", "kjStart", "kjEnd", "kjLabels", "kjTemplate", "kjSide", "kjAlign"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
18756
19029
  }
18757
19030
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjTagListComponent, decorators: [{
18758
19031
  type: Component,
@@ -18767,17 +19040,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
18767
19040
  'kjTagListOrientation',
18768
19041
  'kjTagListMultiple',
18769
19042
  'kjTagListDisabled',
19043
+ 'kjMax',
18770
19044
  ],
18771
19045
  },
18772
19046
  ],
18773
- template: `<ng-content />`,
19047
+ imports: [KjPopoverTrigger, KjOverflowPanelComponent],
19048
+ template: `
19049
+ <ng-content />
19050
+ @if (overflowCount() > 0) {
19051
+ <button
19052
+ type="button"
19053
+ class="kj-tag kj-overflow-trigger kj-tag-list-overflow"
19054
+ [attr.data-variant]="kjOverflowVariant()"
19055
+ kjPopoverTrigger
19056
+ kjTrigger="hover"
19057
+ #trg="kjPopoverTrigger"
19058
+ [attr.aria-label]="overflowAriaLabel()"
19059
+ (keydown.arrowdown)="focusPanel($event)"
19060
+ (keydown.enter)="focusPanel($event)"
19061
+ >
19062
+ {{ overflowLabel() }}
19063
+ </button>
19064
+ <kj-overflow-panel
19065
+ [kjFor]="trg"
19066
+ [kjCount]="overflowCount()"
19067
+ [kjStart]="list.visibleCount()"
19068
+ [kjEnd]="list.total()"
19069
+ [kjLabels]="list.hiddenLabels()"
19070
+ [kjTemplate]="overflowTemplate()"
19071
+ />
19072
+ }
19073
+ `,
18774
19074
  encapsulation: ViewEncapsulation.None,
18775
19075
  host: {
18776
19076
  class: 'kj-tag-list',
18777
19077
  },
18778
19078
  changeDetection: ChangeDetectionStrategy.OnPush,
18779
19079
  }]
18780
- }] });
19080
+ }], propDecorators: { kjOverflowLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjOverflowLabel", required: false }] }], kjOverflowAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjOverflowAriaLabel", required: false }] }], kjOverflowVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjOverflowVariant", required: false }] }], overflowTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KjOverflowContent), { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KjOverflowPanelComponent), { isSignal: true }] }] } });
18781
19081
 
18782
19082
  let nextId = 0;
18783
19083
  /**
@@ -20688,5 +20988,5 @@ const KJ_COMPONENTS_VERSION = '0.0.1';
20688
20988
  * Generated bundle index. Do not edit.
20689
20989
  */
20690
20990
 
20691
- export { KJ_COMPONENTS_VERSION, KJ_EDITOR_CONTRACT, KJ_FILTER_CONTEXT, KjAccordionComponent, KjAccordionContentComponent, KjAccordionItemComponent, KjAccordionTriggerComponent, KjActionSheet, KjActionSheetComponent, KjActionSheetRef, KjActionSheetService, KjAlertActionsComponent, KjAlertComponent, KjAlertDescriptionComponent, KjAlertDismissComponent, KjAlertIconComponent, KjAlertTitleComponent, KjAvatarComponent, KjAvatarGroupComponent, KjBadgeComponent, KjBooleanEditor, KjBreadcrumbComponent, KjBreadcrumbCurrentComponent, KjBreadcrumbEllipsisComponent, KjBreadcrumbItemComponent, KjBreadcrumbLinkComponent, KjBreadcrumbListComponent, KjBreadcrumbSeparatorComponent, KjBulkAction, KjButtonComponent, KjButtonGroupComponent, KjCalendarComponent, KjCardComponent, KjCardContentComponent, KjCardCoverComponent, KjCardFooterComponent, KjCardHeaderComponent, KjCardSubtitleComponent, KjCardTitleComponent, KjCarouselAutoplayComponent, KjCarouselComponent, KjCarouselIndicatorsComponent, KjCarouselNextComponent, KjCarouselPauseComponent, KjCarouselPreviousComponent, KjCarouselSlideComponent, KjCarouselViewportComponent, KjCascadeOptionComponent, KjCascadeSelectComponent, KjCascadeSubPanelComponent, KjCellEditorOutlet, KjCellTemplateDirective, KjChartComponent, KjChatAvatarComponent, KjChatBubbleComponent, KjChatComponent, KjChatFooterComponent, KjChatHeaderComponent, KjChatLogComponent, KjChatMessage, KjChatThread, KjCheckboxComponent, KjColorPickerComponent, KjComboboxComponent, KjComboboxEmptyComponent, KjComboboxLoadingComponent, KjComboboxOptionComponent, KjCommandEmptyComponent, KjCommandGroupComponent, KjCommandInputComponent, KjCommandItemComponent, KjCommandPaletteComponent, KjCommandPaletteFooter, KjCommandPaletteItemTemplate, KjCommandSeparatorComponent, KjConfirmPopupActionComponent, KjConfirmPopupActionsComponent, KjConfirmPopupCancelComponent, KjConfirmPopupComponent, KjConfirmPopupContentComponent, KjConfirmPopupMessageComponent, KjConfirmPopupTriggerComponent, KjDateEditor, KjDateFilter, KjDatePickerComponent, KjDateRangePresetsComponent, KjDatetimePickerComponent, KjDialogComponent, KjDirectionToggle, KjDividerComponent, KjDrawerComponent, KjDropdownMenuComponent, KjEditorComponent, KjEmptyStateActionsComponent, KjEmptyStateComponent, KjEmptyStateDescriptionComponent, KjEmptyStateIconComponent, KjEmptyStateTitleComponent, KjFieldComponent, KjFieldErrorComponent, KjFieldGroupComponent, KjFieldHelpComponent, KjFieldLabelComponent, KjFileUploadComponent, KjFilterCellOutlet, KjFormActionsComponent, KjFormComponent, KjFormSummaryComponent, KjIconGalleryExample, KjIconUsageExample, KjInputComponent, KjInputGroupAddonComponent, KjInputGroupComponent, KjInputMaskComponent, KjInputMaskCreditCardExample, KjInputMaskCustomTokensExample, KjInputMaskDateExample, KjInputMaskExample, KjInputMaskUsageExample, KjInputMaskValidationExample, KjInputOtpComponent, KjKbdComponent, KjLinkComponent, KjListComponent, KjListItemComponent, KjMenubarComponent, KjMenubarItemComponent, KjNumberEditor, KjNumberFilter, KjNumberInputComponent, KjOptionComponent, KjOverlayBadgeComponent, KjOverlayBadgeContentComponent, KjPaginationComponent, KjPaginationDefaultComponent, KjPaginationEllipsisComponent, KjPaginationFirstComponent, KjPaginationInfoComponent, KjPaginationItemComponent, KjPaginationLastComponent, KjPaginationNextComponent, KjPaginationPreviousComponent, KjPasswordInputComponent, KjPopoverComponent, KjProgressBarComponent, KjPromptInput, KjRadioComponent, KjRadioGroupComponent, KjRichTextEditorComponent, KjSelectComponent, KjSelectEditor, KjSelectFilter, KjSheetComponent, KjSkeletonComponent, KjSkipLinkComponent, KjSliderComponent, KjSpeedDialActionComponent, KjSpeedDialActionsComponent, KjSpeedDialComponent, KjSpeedDialTriggerComponent, KjSpinnerComponent, KjStepComponent, KjStepContentComponent, KjStepLabelComponent, KjStepperComponent, KjStepperNextComponent, KjStepperPreviousComponent, KjStepperResetComponent, KjTabComponent, KjTabListComponent, KjTabPanelComponent, KjTableComponent, KjTableEmptyTemplate, KjTableErrorTemplate, KjTableLoadingTemplate, KjTablePaginationComponent, KjTableSidePanelComponent, KjTableSidePanelContent, KjTableStatusBarComponent, KjTableToolbarComponent, KjTableVirtual, KjTabsComponent, KjTagComponent, KjTagListComponent, KjTagRemoveComponent, KjTextEditor, KjTextFilter, KjTextareaComponent, KjTimePickerComponent, KjToastCloseComponent, KjToastComponent, KjToastViewportComponent, KjToastWrapperComponent, KjToggleComponent, KjTooltipComponent, KjTreeSelectComponent, KjTreeSelectNodeComponent, LUCIDE_ICON_NAMES, bold, bulletList, codeBlock, copyToClipboard, defaultFeatures, downloadString, exportCsv, exportJson, heading, history, image, inlineCode, italic, link, markdownShortcuts, orderedList, provideLucideIcons, quote, renderMarkdown, strike, toTsv, underline };
20991
+ export { KJ_COMPONENTS_VERSION, KJ_EDITOR_CONTRACT, KJ_FILTER_CONTEXT, KjAccordionComponent, KjAccordionContentComponent, KjAccordionItemComponent, KjAccordionTriggerComponent, KjActionSheet, KjActionSheetComponent, KjActionSheetRef, KjActionSheetService, KjAlertActionsComponent, KjAlertComponent, KjAlertDescriptionComponent, KjAlertDismissComponent, KjAlertIconComponent, KjAlertTitleComponent, KjAvatarComponent, KjAvatarGroupComponent, KjBadgeComponent, KjBooleanEditor, KjBreadcrumbComponent, KjBreadcrumbCurrentComponent, KjBreadcrumbEllipsisComponent, KjBreadcrumbItemComponent, KjBreadcrumbLinkComponent, KjBreadcrumbListComponent, KjBreadcrumbSeparatorComponent, KjBulkAction, KjButtonComponent, KjButtonGroupComponent, KjCalendarComponent, KjCardComponent, KjCardContentComponent, KjCardCoverComponent, KjCardFooterComponent, KjCardHeaderComponent, KjCardSubtitleComponent, KjCardTitleComponent, KjCarouselAutoplayComponent, KjCarouselComponent, KjCarouselIndicatorsComponent, KjCarouselNextComponent, KjCarouselPauseComponent, KjCarouselPreviousComponent, KjCarouselSlideComponent, KjCarouselViewportComponent, KjCascadeOptionComponent, KjCascadeSelectComponent, KjCascadeSubPanelComponent, KjCellEditorOutlet, KjCellTemplateDirective, KjChartComponent, KjChatAvatarComponent, KjChatBubbleComponent, KjChatComponent, KjChatFooterComponent, KjChatHeaderComponent, KjChatLogComponent, KjChatMessage, KjChatThread, KjCheckboxComponent, KjColorPickerComponent, KjComboboxComponent, KjComboboxEmptyComponent, KjComboboxLoadingComponent, KjComboboxOptionComponent, KjCommandEmptyComponent, KjCommandGroupComponent, KjCommandInputComponent, KjCommandItemComponent, KjCommandPaletteComponent, KjCommandPaletteFooter, KjCommandPaletteItemTemplate, KjCommandSeparatorComponent, KjConfirmPopupActionComponent, KjConfirmPopupActionsComponent, KjConfirmPopupCancelComponent, KjConfirmPopupComponent, KjConfirmPopupContentComponent, KjConfirmPopupMessageComponent, KjConfirmPopupTriggerComponent, KjDateEditor, KjDateFilter, KjDatePickerComponent, KjDateRangePresetsComponent, KjDatetimePickerComponent, KjDialogComponent, KjDirectionToggle, KjDividerComponent, KjDrawerComponent, KjDropdownMenuComponent, KjEditorComponent, KjEmptyStateActionsComponent, KjEmptyStateComponent, KjEmptyStateDescriptionComponent, KjEmptyStateIconComponent, KjEmptyStateTitleComponent, KjFieldComponent, KjFieldErrorComponent, KjFieldGroupComponent, KjFieldHelpComponent, KjFieldLabelComponent, KjFileUploadComponent, KjFilterCellOutlet, KjFormActionsComponent, KjFormComponent, KjFormSummaryComponent, KjIconGalleryExample, KjIconUsageExample, KjInputComponent, KjInputGroupAddonComponent, KjInputGroupComponent, KjInputMaskComponent, KjInputMaskCreditCardExample, KjInputMaskCustomTokensExample, KjInputMaskDateExample, KjInputMaskExample, KjInputMaskUsageExample, KjInputMaskValidationExample, KjInputOtpComponent, KjKbdComponent, KjLinkComponent, KjListComponent, KjListItemComponent, KjMenubarComponent, KjMenubarItemComponent, KjNumberEditor, KjNumberFilter, KjNumberInputComponent, KjOptionComponent, KjOverflowPanelComponent, KjOverlayBadgeComponent, KjOverlayBadgeContentComponent, KjPaginationComponent, KjPaginationDefaultComponent, KjPaginationEllipsisComponent, KjPaginationFirstComponent, KjPaginationInfoComponent, KjPaginationItemComponent, KjPaginationLastComponent, KjPaginationNextComponent, KjPaginationPreviousComponent, KjPasswordInputComponent, KjPopoverComponent, KjProgressBarComponent, KjPromptInput, KjRadioComponent, KjRadioGroupComponent, KjRichTextEditorComponent, KjSelectComponent, KjSelectEditor, KjSelectFilter, KjSheetComponent, KjSkeletonComponent, KjSkipLinkComponent, KjSliderComponent, KjSpeedDialActionComponent, KjSpeedDialActionsComponent, KjSpeedDialComponent, KjSpeedDialTriggerComponent, KjSpinnerComponent, KjStepComponent, KjStepContentComponent, KjStepLabelComponent, KjStepperComponent, KjStepperNextComponent, KjStepperPreviousComponent, KjStepperResetComponent, KjTabComponent, KjTabListComponent, KjTabPanelComponent, KjTableComponent, KjTableEmptyTemplate, KjTableErrorTemplate, KjTableLoadingTemplate, KjTablePaginationComponent, KjTableSidePanelComponent, KjTableSidePanelContent, KjTableStatusBarComponent, KjTableToolbarComponent, KjTableVirtual, KjTabsComponent, KjTagComponent, KjTagListComponent, KjTagRemoveComponent, KjTextEditor, KjTextFilter, KjTextareaComponent, KjTimePickerComponent, KjToastCloseComponent, KjToastComponent, KjToastViewportComponent, KjToastWrapperComponent, KjToggleComponent, KjTooltipComponent, KjTreeSelectComponent, KjTreeSelectNodeComponent, LUCIDE_ICON_NAMES, bold, bulletList, codeBlock, copyToClipboard, defaultFeatures, downloadString, exportCsv, exportJson, heading, history, image, inlineCode, italic, link, markdownShortcuts, orderedList, provideLucideIcons, quote, renderMarkdown, strike, toTsv, underline };
20692
20992
  //# sourceMappingURL=kouji-ui-components.mjs.map