@kouji-ui/core 0.6.3 → 0.7.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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, booleanAttribute, Directive, inject, ElementRef, DestroyRef, PLATFORM_ID, signal, afterNextRender, forwardRef, InjectionToken, Injectable, computed, viewChild, ViewContainerRef, ViewEncapsulation, ChangeDetectionStrategy, Component, ApplicationRef, EnvironmentInjector, Injector, createComponent, model, effect, untracked, isSignal, DOCUMENT, output, contentChildren, makeEnvironmentProviders, LOCALE_ID, provideEnvironmentInitializer, isDevMode, numberAttribute, contentChild, runInInjectionContext, HostListener, linkedSignal, TemplateRef, resource, EventEmitter, Output, afterEveryRender } from '@angular/core';
2
+ import { input, booleanAttribute, Directive, inject, ElementRef, DestroyRef, PLATFORM_ID, signal, afterNextRender, forwardRef, InjectionToken, Injectable, computed, viewChild, ViewContainerRef, ViewEncapsulation, ChangeDetectionStrategy, Component, ApplicationRef, EnvironmentInjector, Injector, createComponent, model, effect, untracked, isSignal, DOCUMENT, output, contentChildren, makeEnvironmentProviders, LOCALE_ID, provideEnvironmentInitializer, isDevMode, numberAttribute, contentChild, TemplateRef, runInInjectionContext, HostListener, linkedSignal, resource, EventEmitter, Output, afterEveryRender } from '@angular/core';
3
3
  import { isPlatformBrowser, DOCUMENT as DOCUMENT$1 } from '@angular/common';
4
4
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, NgForm, FormGroupDirective, FormGroup, FormArray } from '@angular/forms';
5
5
  import { Subject } from 'rxjs';
@@ -1761,7 +1761,7 @@ function silent() {
1761
1761
  return { attach() { }, onOpen() { }, onClose() { }, detach() { }, announce() { } };
1762
1762
  }
1763
1763
 
1764
- function onClick() {
1764
+ function onClick(opts = {}) {
1765
1765
  let ctx = null;
1766
1766
  let toggle = null;
1767
1767
  let listener = null;
@@ -1771,14 +1771,25 @@ function onClick() {
1771
1771
  const trigger = ctx.triggerEl();
1772
1772
  if (!trigger || listener)
1773
1773
  return;
1774
- listener = () => toggle?.();
1774
+ listener = () => {
1775
+ if (opts.openOnly && ctx?.isOpen())
1776
+ return;
1777
+ toggle?.();
1778
+ };
1775
1779
  trigger.addEventListener('click', listener);
1776
1780
  };
1777
1781
  return {
1778
1782
  ariaHasPopup: null,
1779
- attach(c) { ctx = c; wireListener(); },
1780
- bindToggle(t) { toggle = t; wireListener(); },
1781
- onOpen() { }, onClose() { },
1783
+ attach(c) {
1784
+ ctx = c;
1785
+ wireListener();
1786
+ },
1787
+ bindToggle(t) {
1788
+ toggle = t;
1789
+ wireListener();
1790
+ },
1791
+ onOpen() { },
1792
+ onClose() { },
1782
1793
  detach() {
1783
1794
  const trigger = ctx?.triggerEl();
1784
1795
  if (trigger && listener)
@@ -1831,6 +1842,39 @@ function onHover(initialOpts = {}) {
1831
1842
  let onEnter = null;
1832
1843
  let onLeave = null;
1833
1844
  let listenTarget = null;
1845
+ let panelTarget = null;
1846
+ const cancelClose = () => {
1847
+ if (closeTimer) {
1848
+ clearTimeout(closeTimer);
1849
+ closeTimer = 0;
1850
+ }
1851
+ };
1852
+ const scheduleClose = () => {
1853
+ if (openTimer) {
1854
+ clearTimeout(openTimer);
1855
+ openTimer = 0;
1856
+ }
1857
+ if (!ctx?.isOpen())
1858
+ return;
1859
+ cancelClose();
1860
+ closeTimer = setTimeout(() => {
1861
+ toggle?.();
1862
+ closeTimer = 0;
1863
+ }, read$2(opts.closeDelay, 0));
1864
+ };
1865
+ // The panel is bound to the controller after the trigger attaches (a
1866
+ // `[kjFor]` panel registers itself later), so its listeners are wired
1867
+ // lazily — on the first hover intent, once the panel element exists.
1868
+ const wirePanel = () => {
1869
+ if (panelTarget || !read$2(opts.interactive, false))
1870
+ return;
1871
+ const panel = ctx?.panelEl();
1872
+ if (!panel)
1873
+ return;
1874
+ panelTarget = panel;
1875
+ panel.addEventListener('pointerenter', cancelClose);
1876
+ panel.addEventListener('pointerleave', scheduleClose);
1877
+ };
1834
1878
  const wire = () => {
1835
1879
  if (!ctx?.platform.isBrowser)
1836
1880
  return;
@@ -1839,47 +1883,57 @@ function onHover(initialOpts = {}) {
1839
1883
  return;
1840
1884
  listenTarget = effectiveHoverTarget(trigger);
1841
1885
  onEnter = () => {
1842
- if (closeTimer) {
1843
- clearTimeout(closeTimer);
1844
- closeTimer = 0;
1845
- }
1886
+ cancelClose();
1887
+ wirePanel();
1846
1888
  if (ctx?.isOpen())
1847
1889
  return;
1848
- openTimer = setTimeout(() => { toggle?.(); openTimer = 0; }, read$2(opts.openDelay, 0));
1890
+ openTimer = setTimeout(() => {
1891
+ toggle?.();
1892
+ openTimer = 0;
1893
+ }, read$2(opts.openDelay, 0));
1849
1894
  };
1850
1895
  onLeave = () => {
1851
- if (openTimer) {
1852
- clearTimeout(openTimer);
1853
- openTimer = 0;
1854
- }
1855
- if (!ctx?.isOpen())
1856
- return;
1857
- closeTimer = setTimeout(() => { toggle?.(); closeTimer = 0; }, read$2(opts.closeDelay, 0));
1896
+ wirePanel();
1897
+ scheduleClose();
1858
1898
  };
1859
1899
  listenTarget.addEventListener('pointerenter', onEnter);
1860
1900
  listenTarget.addEventListener('pointerleave', onLeave);
1861
1901
  };
1862
1902
  return {
1863
1903
  ariaHasPopup: null,
1864
- attach(c) { ctx = c; wire(); },
1865
- bindToggle(t) { toggle = t; wire(); },
1866
- onOpen() { }, onClose() { },
1904
+ attach(c) {
1905
+ ctx = c;
1906
+ wire();
1907
+ },
1908
+ bindToggle(t) {
1909
+ toggle = t;
1910
+ wire();
1911
+ },
1912
+ onOpen() { },
1913
+ onClose() { },
1867
1914
  detach() {
1868
1915
  if (listenTarget && onEnter)
1869
1916
  listenTarget.removeEventListener('pointerenter', onEnter);
1870
1917
  if (listenTarget && onLeave)
1871
1918
  listenTarget.removeEventListener('pointerleave', onLeave);
1919
+ if (panelTarget) {
1920
+ panelTarget.removeEventListener('pointerenter', cancelClose);
1921
+ panelTarget.removeEventListener('pointerleave', scheduleClose);
1922
+ }
1872
1923
  if (openTimer)
1873
1924
  clearTimeout(openTimer);
1874
1925
  if (closeTimer)
1875
1926
  clearTimeout(closeTimer);
1876
1927
  onEnter = onLeave = null;
1877
1928
  listenTarget = null;
1929
+ panelTarget = null;
1878
1930
  openTimer = closeTimer = 0;
1879
1931
  toggle = null;
1880
1932
  ctx = null;
1881
1933
  },
1882
- configure(newOpts) { opts = { ...opts, ...newOpts }; },
1934
+ configure(newOpts) {
1935
+ opts = { ...opts, ...newOpts };
1936
+ },
1883
1937
  };
1884
1938
  }
1885
1939
 
@@ -4215,6 +4269,9 @@ const EN_CATALOG = {
4215
4269
  // -- Overlays --
4216
4270
  'toast.close': 'Close notification',
4217
4271
  'dialog.close': 'Close dialog',
4272
+ // -- Collapsed groups (tag list / avatar group "+N" chip) --
4273
+ 'overflow.more': '+{count}',
4274
+ 'overflow.show': 'Show {count} more',
4218
4275
  // -- Pagination --
4219
4276
  'pagination.nav': 'Pagination',
4220
4277
  'pagination.previous': 'Previous page',
@@ -4243,6 +4300,9 @@ const FR_CATALOG = {
4243
4300
  // -- Overlays --
4244
4301
  'toast.close': 'Fermer la notification',
4245
4302
  'dialog.close': 'Fermer la boîte de dialogue',
4303
+ // -- Collapsed groups --
4304
+ 'overflow.more': '+{count}',
4305
+ 'overflow.show': 'Afficher {count} de plus',
4246
4306
  // -- Pagination --
4247
4307
  'pagination.nav': 'Pagination',
4248
4308
  'pagination.previous': 'Page précédente',
@@ -12475,9 +12535,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12475
12535
 
12476
12536
  /**
12477
12537
  * Optional container that coordinates a group of `KjTag` chips. Provides
12478
- * the chip-group keyboard story (roving tabindex via `KjRovingTabindex`)
12479
- * and the ARIA wiring for the `listbox` / `grid` / `group` shapes called
12480
- * out in the analysis.
12538
+ * the chip-group keyboard story (roving tabindex via `KjRovingTabindex`),
12539
+ * the ARIA wiring for the `listbox` / `grid` / `group` shapes, and — with
12540
+ * `kjMax` collapses the chips past the cap: they get `[hidden]` and
12541
+ * `data-overflow`, and `overflowCount` / `hiddenLabels` let a wrapper render
12542
+ * a "+N" chip that reveals them.
12481
12543
  *
12482
12544
  * Standalone tags work fine without this container — the container is the
12483
12545
  * opt-in surface that turns a pile of independent chips into a single
@@ -12495,6 +12557,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12495
12557
  * @doc-name tag
12496
12558
  */
12497
12559
  class KjTagList {
12560
+ platformId = inject(PLATFORM_ID);
12498
12561
  /** Container ARIA role — drives chip role selection (option / row / none). */
12499
12562
  kjTagListRole = input('group', /* @ts-ignore */
12500
12563
  ...(ngDevMode ? [{ debugName: "kjTagListRole" }] : /* istanbul ignore next */ []));
@@ -12507,19 +12570,50 @@ class KjTagList {
12507
12570
  /** Cascading disabled flag. Each chip's effective disabled OR-merges this. */
12508
12571
  kjTagListDisabled = input(false, /* @ts-ignore */
12509
12572
  ...(ngDevMode ? [{ debugName: "kjTagListDisabled" }] : /* istanbul ignore next */ []));
12573
+ /**
12574
+ * Maximum number of chips shown before the rest collapse. Chips past this
12575
+ * index are hidden (`[hidden]` + `data-overflow`) and counted in
12576
+ * `overflowCount`. `0` disables the cap (show everything).
12577
+ * @default 0
12578
+ */
12579
+ kjMax = input(0, /* @ts-ignore */
12580
+ ...(ngDevMode ? [{ debugName: "kjMax" }] : /* istanbul ignore next */ []));
12510
12581
  /** Read-only role view used by `KjTag` to compute its own role. */
12511
12582
  role = this.kjTagListRole;
12512
12583
  /** Read-only disabled view used by `KjTag` to merge into its effective disabled. */
12513
12584
  disabled = this.kjTagListDisabled;
12514
12585
  /** Read-only multi-selectable view (listbox-only meaning). */
12515
12586
  multiple = this.kjTagListMultiple;
12587
+ /**
12588
+ * Every projected `KjTag` (including those composed via `hostDirectives`
12589
+ * on a wrapper). `descendants: true` so a chip wrapped in an anchor or a
12590
+ * form control still counts.
12591
+ */
12592
+ tags = contentChildren(KjTag, { ...(ngDevMode ? { debugName: "tags" } : /* istanbul ignore next */ {}), descendants: true });
12593
+ tagHosts = contentChildren(KjTag, { ...(ngDevMode ? { debugName: "tagHosts" } : /* istanbul ignore next */ {}), descendants: true, read: ElementRef });
12594
+ /** Projected chip count. */
12595
+ total = computed(() => this.tags().length, /* @ts-ignore */
12596
+ ...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
12597
+ /** Number of chips rendered visibly (the rest are `[hidden]`). */
12598
+ visibleCount = computed(() => {
12599
+ const max = this.kjMax();
12600
+ const count = this.tags().length;
12601
+ return max <= 0 ? count : Math.min(count, max);
12602
+ }, /* @ts-ignore */
12603
+ ...(ngDevMode ? [{ debugName: "visibleCount" }] : /* istanbul ignore next */ []));
12604
+ /** Number of chips collapsed by the cap. `0` when nothing overflows. */
12605
+ overflowCount = computed(() => Math.max(0, this.total() - this.visibleCount()), /* @ts-ignore */
12606
+ ...(ngDevMode ? [{ debugName: "overflowCount" }] : /* istanbul ignore next */ []));
12607
+ /** Labels of the collapsed chips, in order — the wrapper's default panel content. */
12608
+ hiddenLabels = computed(() => this.tags()
12609
+ .slice(this.visibleCount())
12610
+ .map((t) => t.textContent()), /* @ts-ignore */
12611
+ ...(ngDevMode ? [{ debugName: "hiddenLabels" }] : /* istanbul ignore next */ []));
12516
12612
  /** Only emit `aria-orientation` when the container has a real role. */
12517
12613
  ariaOrientation = computed(() => {
12518
12614
  if (this.kjTagListRole() === 'group')
12519
12615
  return null;
12520
- return this.kjTagListOrientation() === 'both'
12521
- ? 'horizontal'
12522
- : this.kjTagListOrientation();
12616
+ return this.kjTagListOrientation() === 'both' ? 'horizontal' : this.kjTagListOrientation();
12523
12617
  }, /* @ts-ignore */
12524
12618
  ...(ngDevMode ? [{ debugName: "ariaOrientation" }] : /* istanbul ignore next */ []));
12525
12619
  /** `aria-multiselectable` only set in listbox mode. */
@@ -12529,8 +12623,32 @@ class KjTagList {
12529
12623
  return this.kjTagListMultiple() ? 'true' : 'false';
12530
12624
  }, /* @ts-ignore */
12531
12625
  ...(ngDevMode ? [{ debugName: "ariaMultiSelectable" }] : /* istanbul ignore next */ []));
12626
+ constructor() {
12627
+ // Same contract as `KjAvatarGroup`: the group owns the visibility of its
12628
+ // collapsed chips and writes it onto their host elements.
12629
+ effect(() => {
12630
+ const hosts = this.tagHosts();
12631
+ const cap = this.visibleCount();
12632
+ const capped = this.kjMax() > 0;
12633
+ if (!isPlatformBrowser(this.platformId))
12634
+ return;
12635
+ hosts.forEach((ref, index) => {
12636
+ const el = ref.nativeElement;
12637
+ if (!el)
12638
+ return;
12639
+ if (capped && index >= cap) {
12640
+ el.setAttribute('hidden', '');
12641
+ el.setAttribute('data-overflow', 'true');
12642
+ }
12643
+ else {
12644
+ el.removeAttribute('hidden');
12645
+ el.removeAttribute('data-overflow');
12646
+ }
12647
+ });
12648
+ });
12649
+ }
12532
12650
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjTagList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12533
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: KjTagList, isStandalone: true, selector: "[kjTagList]", inputs: { kjTagListRole: { classPropertyName: "kjTagListRole", publicName: "kjTagListRole", isSignal: true, isRequired: false, transformFunction: null }, kjTagListOrientation: { classPropertyName: "kjTagListOrientation", publicName: "kjTagListOrientation", isSignal: true, isRequired: false, transformFunction: null }, kjTagListMultiple: { classPropertyName: "kjTagListMultiple", publicName: "kjTagListMultiple", isSignal: true, isRequired: false, transformFunction: null }, kjTagListDisabled: { classPropertyName: "kjTagListDisabled", publicName: "kjTagListDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.role": "kjTagListRole()", "attr.aria-orientation": "ariaOrientation()", "attr.aria-multiselectable": "ariaMultiSelectable()", "attr.aria-disabled": "kjTagListDisabled() ? \"true\" : null", "attr.tabindex": "kjTagListRole() !== \"group\" ? \"-1\" : null" } }, providers: [{ provide: KJ_TAG_LIST, useExisting: KjTagList }], hostDirectives: [{ directive: KjRovingTabindex, inputs: ["kjRovingOrientation", "kjTagListOrientation"] }], ngImport: i0 });
12651
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.5", type: KjTagList, isStandalone: true, selector: "[kjTagList]", inputs: { kjTagListRole: { classPropertyName: "kjTagListRole", publicName: "kjTagListRole", isSignal: true, isRequired: false, transformFunction: null }, kjTagListOrientation: { classPropertyName: "kjTagListOrientation", publicName: "kjTagListOrientation", isSignal: true, isRequired: false, transformFunction: null }, kjTagListMultiple: { classPropertyName: "kjTagListMultiple", publicName: "kjTagListMultiple", isSignal: true, isRequired: false, transformFunction: null }, kjTagListDisabled: { classPropertyName: "kjTagListDisabled", publicName: "kjTagListDisabled", isSignal: true, isRequired: false, transformFunction: null }, kjMax: { classPropertyName: "kjMax", publicName: "kjMax", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.role": "kjTagListRole()", "attr.aria-orientation": "ariaOrientation()", "attr.aria-multiselectable": "ariaMultiSelectable()", "attr.aria-disabled": "kjTagListDisabled() ? \"true\" : null", "attr.tabindex": "kjTagListRole() !== \"group\" ? \"-1\" : null" } }, providers: [{ provide: KJ_TAG_LIST, useExisting: KjTagList }], queries: [{ propertyName: "tags", predicate: KjTag, descendants: true, isSignal: true }, { propertyName: "tagHosts", predicate: KjTag, descendants: true, read: ElementRef, isSignal: true }], hostDirectives: [{ directive: KjRovingTabindex, inputs: ["kjRovingOrientation", "kjTagListOrientation"] }], ngImport: i0 });
12534
12652
  }
12535
12653
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjTagList, decorators: [{
12536
12654
  type: Directive,
@@ -12549,7 +12667,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12549
12667
  '[attr.tabindex]': 'kjTagListRole() !== "group" ? "-1" : null',
12550
12668
  },
12551
12669
  }]
12552
- }], propDecorators: { kjTagListRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListRole", required: false }] }], kjTagListOrientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListOrientation", required: false }] }], kjTagListMultiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListMultiple", required: false }] }], kjTagListDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListDisabled", required: false }] }] } });
12670
+ }], ctorParameters: () => [], propDecorators: { kjTagListRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListRole", required: false }] }], kjTagListOrientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListOrientation", required: false }] }], kjTagListMultiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListMultiple", required: false }] }], kjTagListDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTagListDisabled", required: false }] }], kjMax: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjMax", required: false }] }], tags: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KjTag), { ...{ descendants: true }, isSignal: true }] }], tagHosts: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KjTag), { ...{ descendants: true, read: ElementRef }, isSignal: true }] }] } });
12671
+
12672
+ /**
12673
+ * Marks the template a collapsing group (`kj-tag-list`, `kj-avatar-group`)
12674
+ * renders inside the "+N" chip's panel instead of its default list of labels.
12675
+ * The context carries the collapsed range so the consumer slices its own
12676
+ * data and renders the hidden items with any layout or actions it needs.
12677
+ *
12678
+ * @example
12679
+ * ```html
12680
+ * <kj-tag-list [kjMax]="3">
12681
+ * @for (u of users(); track u.id) { <kj-tag>{{ u.name }}</kj-tag> }
12682
+ * <ng-template kjOverflowContent let-count let-start="start">
12683
+ * @for (u of users().slice(start); track u.id) {
12684
+ * <button (click)="remove(u)">Remove {{ u.name }}</button>
12685
+ * }
12686
+ * </ng-template>
12687
+ * </kj-tag-list>
12688
+ * ```
12689
+ * @doc-category Core/Data display
12690
+ * @doc
12691
+ * @doc-name overflow
12692
+ * @doc-is-main
12693
+ * @doc-description Provides the template a tag list or avatar group shows for the items collapsed behind its "+N" chip.
12694
+ */
12695
+ class KjOverflowContent {
12696
+ template = inject(TemplateRef);
12697
+ /** Type guard for template type-checking (`*ngTemplateOutlet` context inference). */
12698
+ static ngTemplateContextGuard(_dir, _ctx) {
12699
+ return true;
12700
+ }
12701
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjOverflowContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12702
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.5", type: KjOverflowContent, isStandalone: true, selector: "ng-template[kjOverflowContent]", ngImport: i0 });
12703
+ }
12704
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjOverflowContent, decorators: [{
12705
+ type: Directive,
12706
+ args: [{
12707
+ selector: 'ng-template[kjOverflowContent]',
12708
+ standalone: true,
12709
+ }]
12710
+ }] });
12553
12711
 
12554
12712
  /**
12555
12713
  * Dialog body component. Composes `KjOverlayPanel` as a host directive so
@@ -13339,10 +13497,107 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
13339
13497
  }]
13340
13498
  }], propDecorators: { kjTooltipOpened: [{ type: i0.Output, args: ["kjTooltipOpened"] }], kjTooltipClosed: [{ type: i0.Output, args: ["kjTooltipClosed"] }] } });
13341
13499
 
13500
+ /**
13501
+ * Fans one trigger slot out to several event strategies — e.g. hover for
13502
+ * pointer users, focus for keyboard users and an open-only click for touch —
13503
+ * so a single overlay opens from whichever the user has. `ariaHasPopup` is
13504
+ * the first non-null value among the parts.
13505
+ */
13506
+ function composeTriggerEvents(...parts) {
13507
+ return {
13508
+ ariaHasPopup: parts.find((p) => p.ariaHasPopup !== null)?.ariaHasPopup ?? null,
13509
+ attach(ctx) {
13510
+ for (const p of parts)
13511
+ p.attach(ctx);
13512
+ },
13513
+ bindToggle(toggle) {
13514
+ for (const p of parts)
13515
+ p.bindToggle(toggle);
13516
+ },
13517
+ onOpen() {
13518
+ for (const p of parts)
13519
+ p.onOpen?.();
13520
+ },
13521
+ onClose() {
13522
+ for (const p of parts)
13523
+ p.onClose?.();
13524
+ },
13525
+ detach() {
13526
+ for (const p of parts)
13527
+ p.detach();
13528
+ },
13529
+ };
13530
+ }
13531
+ /**
13532
+ * A trigger slot whose concrete strategy is chosen after construction. The
13533
+ * DI factory that provides a trigger strategy runs before the directive's
13534
+ * inputs are set, so a directive that offers `kjTrigger="click|hover"` cannot
13535
+ * pick the strategy in the factory; it provides this shell and calls `use()`
13536
+ * from an effect once the input is known (and again if it changes).
13537
+ */
13538
+ function switchableTriggerEvent(opts = {}) {
13539
+ let ctx = null;
13540
+ let toggle = null;
13541
+ let current = null;
13542
+ return {
13543
+ // Fixed up front: the host reads it once, before `use()` picks a strategy.
13544
+ ariaHasPopup: opts.ariaHasPopup ?? null,
13545
+ attach(c) {
13546
+ ctx = c;
13547
+ current?.attach(c);
13548
+ },
13549
+ bindToggle(t) {
13550
+ toggle = t;
13551
+ current?.bindToggle(t);
13552
+ },
13553
+ onOpen() {
13554
+ current?.onOpen?.();
13555
+ },
13556
+ onClose() {
13557
+ current?.onClose?.();
13558
+ },
13559
+ detach() {
13560
+ current?.detach();
13561
+ current = null;
13562
+ ctx = null;
13563
+ toggle = null;
13564
+ },
13565
+ use(strategy) {
13566
+ current?.detach();
13567
+ current = strategy;
13568
+ if (ctx)
13569
+ strategy.attach(ctx);
13570
+ if (toggle)
13571
+ strategy.bindToggle(toggle);
13572
+ },
13573
+ };
13574
+ }
13575
+
13576
+ /**
13577
+ * Opens the sibling `<kj-popover-content [kjFor]>` panel. `kjTrigger="click"`
13578
+ * (default) toggles on click; `kjTrigger="hover"` opens on hover intent and
13579
+ * keeps the panel open while the pointer rests on it — and, because a hover
13580
+ * popover may hold controls, it also opens on keyboard focus and on click
13581
+ * (touch), so every input modality reaches the panel.
13582
+ *
13583
+ * @example
13584
+ * ```html
13585
+ * <button kjPopoverTrigger kjTrigger="hover" #t="kjPopoverTrigger">+3</button>
13586
+ * <kj-popover-content [kjFor]="t">…</kj-popover-content>
13587
+ * ```
13588
+ * @doc-category Core/Overlay
13589
+ * @doc
13590
+ * @doc-name popover
13591
+ */
13342
13592
  class KjPopoverTrigger {
13593
+ /** How the panel opens: `click` toggles; `hover` opens on hover intent, focus, or tap. */
13343
13594
  kjTrigger = input('click', /* @ts-ignore */
13344
13595
  ...(ngDevMode ? [{ debugName: "kjTrigger" }] : /* istanbul ignore next */ []));
13345
13596
  kjDisabled = input(false, { ...(ngDevMode ? { debugName: "kjDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
13597
+ /** Hover intent before opening, in ms (`hover` kind only). Default 150. */
13598
+ kjOpenDelay = input(150, { ...(ngDevMode ? { debugName: "kjOpenDelay" } : /* istanbul ignore next */ {}), transform: (v) => Number(v) || 0 });
13599
+ /** Grace period after the pointer leaves the trigger or the panel, in ms (`hover` kind only). Default 150. */
13600
+ kjCloseDelay = input(150, { ...(ngDevMode ? { debugName: "kjCloseDelay" } : /* istanbul ignore next */ {}), transform: (v) => Number(v) || 0 });
13346
13601
  _overlayTrigger = inject(KjOverlayTrigger, { self: true });
13347
13602
  /** The controller of the composed `KjOverlayTrigger`, exposed for sibling `[kjFor]` panels. */
13348
13603
  get controller() {
@@ -13351,13 +13606,26 @@ class KjPopoverTrigger {
13351
13606
  attachPanel(panel) {
13352
13607
  this._overlayTrigger.attachPanel(panel);
13353
13608
  }
13609
+ constructor() {
13610
+ const strategy = inject(KJ_OVERLAY_TRIGGER_EVENT_STRATEGY);
13611
+ effect(() => {
13612
+ strategy.use(this.kjTrigger() === 'hover'
13613
+ ? composeTriggerEvents(onHover({
13614
+ openDelay: this.kjOpenDelay,
13615
+ closeDelay: this.kjCloseDelay,
13616
+ interactive: true,
13617
+ }), onFocus(), onClick({ openOnly: true }))
13618
+ : onClick());
13619
+ });
13620
+ }
13354
13621
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: KjPopoverTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13355
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: KjPopoverTrigger, isStandalone: true, selector: "[kjPopoverTrigger]", inputs: { kjTrigger: { classPropertyName: "kjTrigger", publicName: "kjTrigger", isSignal: true, isRequired: false, transformFunction: null }, kjDisabled: { classPropertyName: "kjDisabled", publicName: "kjDisabled", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
13622
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: KjPopoverTrigger, isStandalone: true, selector: "[kjPopoverTrigger]", inputs: { kjTrigger: { classPropertyName: "kjTrigger", publicName: "kjTrigger", isSignal: true, isRequired: false, transformFunction: null }, kjDisabled: { classPropertyName: "kjDisabled", publicName: "kjDisabled", isSignal: true, isRequired: false, transformFunction: null }, kjOpenDelay: { classPropertyName: "kjOpenDelay", publicName: "kjOpenDelay", isSignal: true, isRequired: false, transformFunction: null }, kjCloseDelay: { classPropertyName: "kjCloseDelay", publicName: "kjCloseDelay", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
13356
13623
  KjOverlayController,
13357
- // For an MVP we resolve at construction; reactive switch is a follow-up.
13624
+ // The kind is an input, unknown when this factory runs the shell is
13625
+ // filled from the effect below once inputs are set.
13358
13626
  {
13359
13627
  provide: KJ_OVERLAY_TRIGGER_EVENT_STRATEGY,
13360
- useFactory: () => onClick(),
13628
+ useFactory: () => switchableTriggerEvent({ ariaHasPopup: 'dialog' }),
13361
13629
  },
13362
13630
  { provide: KJ_OVERLAY_PANEL_ROLE, useValue: 'dialog' },
13363
13631
  ], exportAs: ["kjPopoverTrigger"], hostDirectives: [{ directive: KjOverlayTrigger, inputs: ["kjOpen", "kjOpen"] }], ngImport: i0 });
@@ -13371,15 +13639,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
13371
13639
  hostDirectives: [{ directive: KjOverlayTrigger, inputs: ['kjOpen'] }],
13372
13640
  providers: [
13373
13641
  KjOverlayController,
13374
- // For an MVP we resolve at construction; reactive switch is a follow-up.
13642
+ // The kind is an input, unknown when this factory runs the shell is
13643
+ // filled from the effect below once inputs are set.
13375
13644
  {
13376
13645
  provide: KJ_OVERLAY_TRIGGER_EVENT_STRATEGY,
13377
- useFactory: () => onClick(),
13646
+ useFactory: () => switchableTriggerEvent({ ariaHasPopup: 'dialog' }),
13378
13647
  },
13379
13648
  { provide: KJ_OVERLAY_PANEL_ROLE, useValue: 'dialog' },
13380
13649
  ],
13381
13650
  }]
13382
- }], propDecorators: { kjTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTrigger", required: false }] }], kjDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjDisabled", required: false }] }] } });
13651
+ }], ctorParameters: () => [], propDecorators: { kjTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjTrigger", required: false }] }], kjDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjDisabled", required: false }] }], kjOpenDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjOpenDelay", required: false }] }], kjCloseDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "kjCloseDelay", required: false }] }] } });
13383
13652
 
13384
13653
  class KjPopoverContent {
13385
13654
  kjSide = input('bottom', /* @ts-ignore */
@@ -30108,5 +30377,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
30108
30377
  * Generated bundle index. Do not edit.
30109
30378
  */
30110
30379
 
30111
- export { DRAWER_DATA, DRAWER_DRAG, DRAWER_SIDE, EN_CATALOG, FR_CATALOG, KJ_ACCORDION, KJ_ACCORDION_ITEM, KJ_ALERT, KJ_ALERT_CONFIG, KJ_ALERT_DEFAULTS, KJ_AVATAR, KJ_AVATAR_GROUP, KJ_BREADCRUMB, KJ_BREADCRUMB_CONFIG, KJ_BREADCRUMB_DEFAULTS, KJ_BUTTON_CONFIG, KJ_BUTTON_DEFAULTS, KJ_BUTTON_GROUP, KJ_CALENDAR, KJ_CAROUSEL, KJ_CAROUSEL_INDICATORS, KJ_CAROUSEL_SLIDE, KJ_CASCADE_SELECT, KJ_CHAT, KJ_CHAT_BUBBLE_CONFIG, KJ_CHAT_BUBBLE_DEFAULTS, KJ_CHAT_LOG, KJ_COLOR_PICKER, KJ_CONFIRM_POPUP, KJ_DATE_PICKER, KJ_DATE_RANGE_PRESETS, KJ_DROPDOWN_MENU, KJ_ECHARTS, KJ_FIELD, KJ_FILE_UPLOAD, KJ_FILE_UPLOAD_DEFAULT_MESSAGES, KJ_FILE_UPLOAD_ITEM, KJ_FORM, KJ_FORM_FIELD, KJ_ICON_CSS_PATH, KJ_ICON_ENTRIES, KJ_ICON_LOADER, KJ_ICON_REGISTRY, KJ_ICON_RESOLVER, KJ_INPUT_GROUP, KJ_INPUT_MASK_PRESETS, KJ_INPUT_MASK_TOKENS, KJ_INPUT_OTP, KJ_KBD_SIZE_PRESET, KJ_LINK_CONFIG, KJ_LINK_DEFAULTS, KJ_LIST, KJ_LIST_FOCUS_MODE, KJ_LIST_NAVIGATOR_CONFIG, KJ_LIST_ROW, KJ_LOCALE_CONFIG, KJ_MENUBAR, KJ_MONACO_CONFIG, KJ_MONACO_LANGUAGE_LOADERS, KJ_NUMBER_INPUT, KJ_OVERLAY_BACKDROP_STRATEGY, KJ_OVERLAY_BADGE, KJ_OVERLAY_FOCUS_TRAP_STRATEGY, KJ_OVERLAY_LIVE_ANNOUNCER_STRATEGY, KJ_OVERLAY_MOUNT_STRATEGY, KJ_OVERLAY_PANEL_ROLE, KJ_OVERLAY_POSITION_STRATEGY, KJ_OVERLAY_SCROLL_LOCK_STRATEGY, KJ_OVERLAY_TRIGGER_EVENT_STRATEGY, KJ_PAGINATION, KJ_PAGINATION_CONFIG, KJ_PAGINATION_DEFAULTS, KJ_PASSWORD_INPUT, KJ_PROGRESS_BAR, KJ_PROGRESS_BAR_CONFIG, KJ_PROGRESS_BAR_DEFAULTS, KJ_PROSE_CSS_PATH, KJ_RADIO_GROUP, KJ_RICH_TEXT, KJ_RICH_TEXT_EXTENSIONS, KJ_RICH_TEXT_FEATURES, KJ_RICH_TEXT_NODE, KJ_ROVING_TABINDEX, KJ_RTE_OVERLAY_DATA, KJ_SELECT, KJ_SIZE_FALLBACK, KJ_SIZE_PRESET, KJ_SLIDER, KJ_SPEED_DIAL, KJ_SPINNER_CONFIG, KJ_SPINNER_DEFAULTS, KJ_STEP, KJ_STEPPER, KJ_TABLE, KJ_TABLE_STORAGE, KJ_TABS, KJ_TABS_CONFIG, KJ_TABS_DEFAULTS, KJ_TAG, KJ_TAG_CONFIG, KJ_TAG_DEFAULTS, KJ_TAG_LIST, KJ_TEXTAREA_CONFIG, KJ_TEXTAREA_DEFAULTS, KJ_TIME_PICKER, KJ_TOAST_LIST_STRATEGY, KJ_TOAST_SONNER_STRATEGY, KJ_TOAST_STRATEGY, KJ_TRANSLATION_CATALOGS, KJ_TREE_SELECT, KJ_VARIANT_FALLBACK, KJ_VARIANT_PRESET, KjAccordion, KjAccordionContent, KjAccordionItem, KjAccordionTrigger, KjAlert, KjAlertActions, KjAlertDescription, KjAlertDismiss, KjAlertIcon, KjAlertTitle, KjAriaDescribedBy, KjAriaLabelledBy, KjAvatar, KjAvatarFallback, KjAvatarGroup, KjAvatarImage, KjBackdrop, KjBadge, KjBlockquote, KjBreadcrumb, KjBreadcrumbCurrent, KjBreadcrumbEllipsis, KjBreadcrumbItem, KjBreadcrumbLink, KjBreadcrumbList, KjBreadcrumbSeparator, KjButton, KjButtonGroup, KjCalendar, KjCalendarDay, KjCalendarGrid, KjCalendarHeader, KjCarousel, KjCarouselAutoplay, KjCarouselIndicator, KjCarouselIndicators, KjCarouselNext, KjCarouselPauseToggle, KjCarouselPrevious, KjCarouselSlide, KjCarouselViewport, KjCascadeSelect, KjCascadeSelectOption, KjCascadeSelectPanel, KjCascadeSelectSubPanel, KjCascadeSelectTrigger, KjChart, KjChartTableFallback, KjChat, KjChatAnnouncer, KjChatAvatar, KjChatBubble, KjChatFooter, KjChatHeader, KjChatLog, KjChatStore, KjCheckbox, KjCode, KjColorPicker, KjColorPickerAlphaSlider, KjColorPickerArea, KjColorPickerHueSlider, KjColorPickerInput, KjColorPickerPanel, KjColorPickerTrigger, KjCombobox, KjComboboxInput, KjComboboxListbox, KjComboboxOption, KjCommandEmpty, KjCommandGroup, KjCommandInput, KjCommandItem, KjCommandList, KjCommandPalette, KjCommandPaletteDialog, KjCommandPaletteTrigger, KjCommandSeparator, KjConfirmPopup, KjConfirmPopupAction, KjConfirmPopupCancel, KjConfirmPopupContent, KjConfirmPopupMessage, KjConfirmPopupTrigger, KjDatePicker, KjDatePickerCalendar, KjDatePickerTrigger, KjDateRangePresetOption, KjDateRangePresets, KjDialog$1 as KjDialog, KjDialogRef, KjDialog as KjDialogService, KjDirectionality, KjDisabled, KjDivider, KjDrawer, KjDrawerRef, KjDrawerService, KjDropdownMenu, KjDropdownMenuContent, KjDropdownMenuGroup, KjDropdownMenuItem, KjDropdownMenuLabel, KjDropdownMenuSeparator, KjDropdownMenuTrigger, KjEditor, KjEditorLoader, KjField, KjFieldError, KjFieldGroup, KjFieldHelp, KjFieldLabel, KjFileUpload, KjFileUploadDropzone, KjFileUploadItem, KjFileUploadList, KjFileUploadTrigger, KjFilterableList, KjFocusRing, KjFocusTrap, KjForm, KjFormControl, KjFormError, KjFormErrorSummary, KjFormField, KjFormLabel, KjIconDirective, KjId, KjInput, KjInputGroup, KjInputGroupAddon, KjInputMask, KjInputOtp, KjInputOtpCell, KjKbd, KjLead, KjLink, KjList, KjListGroup, KjListGroupLabel, KjListItem, KjListNavigator, KjListRow, KjListSeparator, KjLiveRegion, KjLocale, KjMenubar, KjMenubarItem, KjMotion, KjMuted, KjNumberInput, KjNumberInputGroup, KjNumberStepper, KjOption, KjOverlayBadge, KjOverlayBadgeContent, KjOverlayBuilder, KjOverlayController, KjOverlayHandle, KjOverlayPanel, KjOverlayStack, KjOverlayTrigger, KjOverlayWrapper, KjPagination, KjPaginationEllipsis, KjPaginationFirst, KjPaginationInfo, KjPaginationItem, KjPaginationLast, KjPaginationNext, KjPaginationPrevious, KjPasswordCapsLockWarning, KjPasswordInput, KjPasswordInputScope, KjPasswordStrength, KjPasswordToggle, KjPopoverArrow, KjPopoverClose, KjPopoverContent, KjPopoverTitle, KjPopoverTrigger, KjProgressBar, KjProgressBarFill, KjRadio, KjRadioGroup, KjReducedMotion, KjRichTextEditor, KjRichTextExtensionDirective, KjRovingTabindex, KjRovingTabindexItemDirective, KjSelect, KjSelectContent, KjSelectTrigger, KjSelectionModel, KjSheet, KjSheetRef, KjSheetService, KjSize, KjSkeleton, KjSkipLink, KjSlider, KjSliderRange, KjSliderThumb, KjSliderTrack, KjSpeedDial, KjSpeedDialAction, KjSpeedDialActions, KjSpeedDialTrigger, KjSpinner, KjStep, KjStepContent, KjStepLabel, KjStepper, KjStepperNext, KjStepperPrevious, KjStepperReset, KjTab, KjTabList, KjTabPanel, KjTable, KjTableCell, KjTableFilterOutlet, KjTableHeader, KjTableKeyboardNav, KjTableRow, KjTabs, KjTag, KjTagList, KjTagRemove, KjTextarea, KjTimePicker, KjTimePickerHours, KjTimePickerMeridiem, KjTimePickerMinutes, KjTimePickerSeconds, KjToast, KjToastClose, KjToastPanel, KjToastRef, KjToastService, KjToastViewport, KjToggle, KjTooltipArrow, KjTooltipContent, KjTooltipGroup, KjTooltipTrigger, KjTranslate, KjTranslateService, KjTreeSelect, KjTreeSelectContent, KjTreeSelectNode, KjTreeSelectToggle, KjTreeSelectTrigger, KjTruncate, KjTypeAhead, KjVariant, KjVisuallyHidden, MaskEngine, SHEET_ARIA_LABEL, SHEET_DATA, SHEET_DETENT, SHEET_DISMISSIBLE, addDays, addMonths, addYears, anchoredTo, assertive, bindPresets, blurredBackdrop, bodyPortal, buildMonthMatrix, coalesceAnnouncement, compareDay, compileMask, corner, createKjDecoratorNode, createKjImageNode, cssClip, defaultDateRangePresets, defaultMaskTokens, defaultPasswordScorer, edgeSheet, endOfMonth, firstDayOfWeek, formatDateLong, formatDateShort, formatMonthYear, getIconMode, htmlOverflow, inContainer, inMemoryAdapter, inPlace, inPlaceSibling, inertBased, injectFilterableList, injectKjFilterParams, injectKjIconResolver, injectListItem, injectRichTextNode, injectRteOverlayData, injectSelectionModel, isInRange, isKjFilterModel, isSameDay, isSameMonth, kjColumn, kjColumnGroup, kjContainsFilter, kjDateFilterFn, kjFileMatchesAccept, kjFuzzyFilter, kjHsvToHsl, kjHsvToRgb, kjMultiFilterFn, kjNumberFilterFn, kjParseHex, kjRgbToHex, kjRgbToHsv, kjSetFilterFn, kjStartsWithFilter, kjSubstringFilter, kjTableResource, kjTextFilterFn, localStorageAdapter, matchSlashCommands, nextCascadeId, nextChatMessageId, nextDropdownMenuLabelId, nextPopoverTitleId, noBackdrop, noScrollLock, noTrap, normalizeLanguage, onClick, onContextMenu, onFocus, onFocusOrInput, onHotkey, onHover, parseDate, parseSlash, pointAt, polite, programmatic, provideECharts, provideIconLoader, provideIconResolver, provideIcons, provideKjAlert, provideKjBreadcrumb, provideKjButton, provideKjChatBubble, provideKjDocumentDirection, provideKjFilterParams, provideKjInputMaskTokens, provideKjLink, provideKjLocale, provideKjPagination, provideKjProgressBar, provideKjRichText, provideKjSpinner, provideKjTableStorage, provideKjTabs, provideKjTag, provideKjTextarea, provideKjToastListStrategy, provideKjToastSonnerStrategy, provideKjToastStrategy, provideKjTranslations, provideMonaco, provideMonacoLanguages, resolveChartPalette, resolveDateRangePreset, sessionStorageAdapter, silent, solidBackdrop, startOfDay, startOfMonth, stripDiacritics, tabCycle, toDeepSignal, viewportCentered, weekdayLongNames, weekdayShortNames };
30380
+ export { DRAWER_DATA, DRAWER_DRAG, DRAWER_SIDE, EN_CATALOG, FR_CATALOG, KJ_ACCORDION, KJ_ACCORDION_ITEM, KJ_ALERT, KJ_ALERT_CONFIG, KJ_ALERT_DEFAULTS, KJ_AVATAR, KJ_AVATAR_GROUP, KJ_BREADCRUMB, KJ_BREADCRUMB_CONFIG, KJ_BREADCRUMB_DEFAULTS, KJ_BUTTON_CONFIG, KJ_BUTTON_DEFAULTS, KJ_BUTTON_GROUP, KJ_CALENDAR, KJ_CAROUSEL, KJ_CAROUSEL_INDICATORS, KJ_CAROUSEL_SLIDE, KJ_CASCADE_SELECT, KJ_CHAT, KJ_CHAT_BUBBLE_CONFIG, KJ_CHAT_BUBBLE_DEFAULTS, KJ_CHAT_LOG, KJ_COLOR_PICKER, KJ_CONFIRM_POPUP, KJ_DATE_PICKER, KJ_DATE_RANGE_PRESETS, KJ_DROPDOWN_MENU, KJ_ECHARTS, KJ_FIELD, KJ_FILE_UPLOAD, KJ_FILE_UPLOAD_DEFAULT_MESSAGES, KJ_FILE_UPLOAD_ITEM, KJ_FORM, KJ_FORM_FIELD, KJ_ICON_CSS_PATH, KJ_ICON_ENTRIES, KJ_ICON_LOADER, KJ_ICON_REGISTRY, KJ_ICON_RESOLVER, KJ_INPUT_GROUP, KJ_INPUT_MASK_PRESETS, KJ_INPUT_MASK_TOKENS, KJ_INPUT_OTP, KJ_KBD_SIZE_PRESET, KJ_LINK_CONFIG, KJ_LINK_DEFAULTS, KJ_LIST, KJ_LIST_FOCUS_MODE, KJ_LIST_NAVIGATOR_CONFIG, KJ_LIST_ROW, KJ_LOCALE_CONFIG, KJ_MENUBAR, KJ_MONACO_CONFIG, KJ_MONACO_LANGUAGE_LOADERS, KJ_NUMBER_INPUT, KJ_OVERLAY_BACKDROP_STRATEGY, KJ_OVERLAY_BADGE, KJ_OVERLAY_FOCUS_TRAP_STRATEGY, KJ_OVERLAY_LIVE_ANNOUNCER_STRATEGY, KJ_OVERLAY_MOUNT_STRATEGY, KJ_OVERLAY_PANEL_ROLE, KJ_OVERLAY_POSITION_STRATEGY, KJ_OVERLAY_SCROLL_LOCK_STRATEGY, KJ_OVERLAY_TRIGGER_EVENT_STRATEGY, KJ_PAGINATION, KJ_PAGINATION_CONFIG, KJ_PAGINATION_DEFAULTS, KJ_PASSWORD_INPUT, KJ_PROGRESS_BAR, KJ_PROGRESS_BAR_CONFIG, KJ_PROGRESS_BAR_DEFAULTS, KJ_PROSE_CSS_PATH, KJ_RADIO_GROUP, KJ_RICH_TEXT, KJ_RICH_TEXT_EXTENSIONS, KJ_RICH_TEXT_FEATURES, KJ_RICH_TEXT_NODE, KJ_ROVING_TABINDEX, KJ_RTE_OVERLAY_DATA, KJ_SELECT, KJ_SIZE_FALLBACK, KJ_SIZE_PRESET, KJ_SLIDER, KJ_SPEED_DIAL, KJ_SPINNER_CONFIG, KJ_SPINNER_DEFAULTS, KJ_STEP, KJ_STEPPER, KJ_TABLE, KJ_TABLE_STORAGE, KJ_TABS, KJ_TABS_CONFIG, KJ_TABS_DEFAULTS, KJ_TAG, KJ_TAG_CONFIG, KJ_TAG_DEFAULTS, KJ_TAG_LIST, KJ_TEXTAREA_CONFIG, KJ_TEXTAREA_DEFAULTS, KJ_TIME_PICKER, KJ_TOAST_LIST_STRATEGY, KJ_TOAST_SONNER_STRATEGY, KJ_TOAST_STRATEGY, KJ_TRANSLATION_CATALOGS, KJ_TREE_SELECT, KJ_VARIANT_FALLBACK, KJ_VARIANT_PRESET, KjAccordion, KjAccordionContent, KjAccordionItem, KjAccordionTrigger, KjAlert, KjAlertActions, KjAlertDescription, KjAlertDismiss, KjAlertIcon, KjAlertTitle, KjAriaDescribedBy, KjAriaLabelledBy, KjAvatar, KjAvatarFallback, KjAvatarGroup, KjAvatarImage, KjBackdrop, KjBadge, KjBlockquote, KjBreadcrumb, KjBreadcrumbCurrent, KjBreadcrumbEllipsis, KjBreadcrumbItem, KjBreadcrumbLink, KjBreadcrumbList, KjBreadcrumbSeparator, KjButton, KjButtonGroup, KjCalendar, KjCalendarDay, KjCalendarGrid, KjCalendarHeader, KjCarousel, KjCarouselAutoplay, KjCarouselIndicator, KjCarouselIndicators, KjCarouselNext, KjCarouselPauseToggle, KjCarouselPrevious, KjCarouselSlide, KjCarouselViewport, KjCascadeSelect, KjCascadeSelectOption, KjCascadeSelectPanel, KjCascadeSelectSubPanel, KjCascadeSelectTrigger, KjChart, KjChartTableFallback, KjChat, KjChatAnnouncer, KjChatAvatar, KjChatBubble, KjChatFooter, KjChatHeader, KjChatLog, KjChatStore, KjCheckbox, KjCode, KjColorPicker, KjColorPickerAlphaSlider, KjColorPickerArea, KjColorPickerHueSlider, KjColorPickerInput, KjColorPickerPanel, KjColorPickerTrigger, KjCombobox, KjComboboxInput, KjComboboxListbox, KjComboboxOption, KjCommandEmpty, KjCommandGroup, KjCommandInput, KjCommandItem, KjCommandList, KjCommandPalette, KjCommandPaletteDialog, KjCommandPaletteTrigger, KjCommandSeparator, KjConfirmPopup, KjConfirmPopupAction, KjConfirmPopupCancel, KjConfirmPopupContent, KjConfirmPopupMessage, KjConfirmPopupTrigger, KjDatePicker, KjDatePickerCalendar, KjDatePickerTrigger, KjDateRangePresetOption, KjDateRangePresets, KjDialog$1 as KjDialog, KjDialogRef, KjDialog as KjDialogService, KjDirectionality, KjDisabled, KjDivider, KjDrawer, KjDrawerRef, KjDrawerService, KjDropdownMenu, KjDropdownMenuContent, KjDropdownMenuGroup, KjDropdownMenuItem, KjDropdownMenuLabel, KjDropdownMenuSeparator, KjDropdownMenuTrigger, KjEditor, KjEditorLoader, KjField, KjFieldError, KjFieldGroup, KjFieldHelp, KjFieldLabel, KjFileUpload, KjFileUploadDropzone, KjFileUploadItem, KjFileUploadList, KjFileUploadTrigger, KjFilterableList, KjFocusRing, KjFocusTrap, KjForm, KjFormControl, KjFormError, KjFormErrorSummary, KjFormField, KjFormLabel, KjIconDirective, KjId, KjInput, KjInputGroup, KjInputGroupAddon, KjInputMask, KjInputOtp, KjInputOtpCell, KjKbd, KjLead, KjLink, KjList, KjListGroup, KjListGroupLabel, KjListItem, KjListNavigator, KjListRow, KjListSeparator, KjLiveRegion, KjLocale, KjMenubar, KjMenubarItem, KjMotion, KjMuted, KjNumberInput, KjNumberInputGroup, KjNumberStepper, KjOption, KjOverflowContent, KjOverlayBadge, KjOverlayBadgeContent, KjOverlayBuilder, KjOverlayController, KjOverlayHandle, KjOverlayPanel, KjOverlayStack, KjOverlayTrigger, KjOverlayWrapper, KjPagination, KjPaginationEllipsis, KjPaginationFirst, KjPaginationInfo, KjPaginationItem, KjPaginationLast, KjPaginationNext, KjPaginationPrevious, KjPasswordCapsLockWarning, KjPasswordInput, KjPasswordInputScope, KjPasswordStrength, KjPasswordToggle, KjPopoverArrow, KjPopoverClose, KjPopoverContent, KjPopoverTitle, KjPopoverTrigger, KjProgressBar, KjProgressBarFill, KjRadio, KjRadioGroup, KjReducedMotion, KjRichTextEditor, KjRichTextExtensionDirective, KjRovingTabindex, KjRovingTabindexItemDirective, KjSelect, KjSelectContent, KjSelectTrigger, KjSelectionModel, KjSheet, KjSheetRef, KjSheetService, KjSize, KjSkeleton, KjSkipLink, KjSlider, KjSliderRange, KjSliderThumb, KjSliderTrack, KjSpeedDial, KjSpeedDialAction, KjSpeedDialActions, KjSpeedDialTrigger, KjSpinner, KjStep, KjStepContent, KjStepLabel, KjStepper, KjStepperNext, KjStepperPrevious, KjStepperReset, KjTab, KjTabList, KjTabPanel, KjTable, KjTableCell, KjTableFilterOutlet, KjTableHeader, KjTableKeyboardNav, KjTableRow, KjTabs, KjTag, KjTagList, KjTagRemove, KjTextarea, KjTimePicker, KjTimePickerHours, KjTimePickerMeridiem, KjTimePickerMinutes, KjTimePickerSeconds, KjToast, KjToastClose, KjToastPanel, KjToastRef, KjToastService, KjToastViewport, KjToggle, KjTooltipArrow, KjTooltipContent, KjTooltipGroup, KjTooltipTrigger, KjTranslate, KjTranslateService, KjTreeSelect, KjTreeSelectContent, KjTreeSelectNode, KjTreeSelectToggle, KjTreeSelectTrigger, KjTruncate, KjTypeAhead, KjVariant, KjVisuallyHidden, MaskEngine, SHEET_ARIA_LABEL, SHEET_DATA, SHEET_DETENT, SHEET_DISMISSIBLE, addDays, addMonths, addYears, anchoredTo, assertive, bindPresets, blurredBackdrop, bodyPortal, buildMonthMatrix, coalesceAnnouncement, compareDay, compileMask, corner, createKjDecoratorNode, createKjImageNode, cssClip, defaultDateRangePresets, defaultMaskTokens, defaultPasswordScorer, edgeSheet, endOfMonth, firstDayOfWeek, formatDateLong, formatDateShort, formatMonthYear, getIconMode, htmlOverflow, inContainer, inMemoryAdapter, inPlace, inPlaceSibling, inertBased, injectFilterableList, injectKjFilterParams, injectKjIconResolver, injectListItem, injectRichTextNode, injectRteOverlayData, injectSelectionModel, isInRange, isKjFilterModel, isSameDay, isSameMonth, kjColumn, kjColumnGroup, kjContainsFilter, kjDateFilterFn, kjFileMatchesAccept, kjFuzzyFilter, kjHsvToHsl, kjHsvToRgb, kjMultiFilterFn, kjNumberFilterFn, kjParseHex, kjRgbToHex, kjRgbToHsv, kjSetFilterFn, kjStartsWithFilter, kjSubstringFilter, kjTableResource, kjTextFilterFn, localStorageAdapter, matchSlashCommands, nextCascadeId, nextChatMessageId, nextDropdownMenuLabelId, nextPopoverTitleId, noBackdrop, noScrollLock, noTrap, normalizeLanguage, onClick, onContextMenu, onFocus, onFocusOrInput, onHotkey, onHover, parseDate, parseSlash, pointAt, polite, programmatic, provideECharts, provideIconLoader, provideIconResolver, provideIcons, provideKjAlert, provideKjBreadcrumb, provideKjButton, provideKjChatBubble, provideKjDocumentDirection, provideKjFilterParams, provideKjInputMaskTokens, provideKjLink, provideKjLocale, provideKjPagination, provideKjProgressBar, provideKjRichText, provideKjSpinner, provideKjTableStorage, provideKjTabs, provideKjTag, provideKjTextarea, provideKjToastListStrategy, provideKjToastSonnerStrategy, provideKjToastStrategy, provideKjTranslations, provideMonaco, provideMonacoLanguages, resolveChartPalette, resolveDateRangePreset, sessionStorageAdapter, silent, solidBackdrop, startOfDay, startOfMonth, stripDiacritics, tabCycle, toDeepSignal, viewportCentered, weekdayLongNames, weekdayShortNames };
30112
30381
  //# sourceMappingURL=kouji-ui-core.mjs.map