@eagami/ui 5.54.0 → 5.55.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 { CSP_NONCE, ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, HostAttributeToken, HostBinding, HostListener, Injectable, InjectionToken, Injector, PLATFORM_ID, Renderer2, RendererStyleFlags2, TemplateRef, ViewContainerRef, ViewEncapsulation, afterNextRender, afterRenderEffect, computed, contentChild, effect, forwardRef, inject, input, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
2
+ import { ApplicationRef, CSP_NONCE, ChangeDetectionStrategy, Component, DOCUMENT, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostAttributeToken, HostBinding, HostListener, Injectable, InjectionToken, Injector, PLATFORM_ID, Renderer2, RendererStyleFlags2, TemplateRef, ViewContainerRef, ViewEncapsulation, afterNextRender, afterRenderEffect, computed, contentChild, createComponent, effect, forwardRef, inject, input, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
3
3
  import { NgClass, NgComponentOutlet, NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
4
4
  import { NG_VALUE_ACCESSOR, NgControl, TouchedChangeEvent } from "@angular/forms";
5
5
  const EAGAMI_I18N_CONFIG = new InjectionToken("EAGAMI_I18N_CONFIG");
@@ -4769,6 +4769,9 @@ i0.ɵɵngDeclareClassMetadata({
4769
4769
  }],
4770
4770
  ctorParameters: () => []
4771
4771
  });
4772
+ function isInside(placement) {
4773
+ return placement.startsWith("inside-");
4774
+ }
4772
4775
  function isCardinal(placement) {
4773
4776
  return placement === "top" || placement === "bottom" || placement === "left" || placement === "right";
4774
4777
  }
@@ -4804,14 +4807,52 @@ function placeRaw(anchor, popover, placement, offset, rtl) {
4804
4807
  left
4805
4808
  };
4806
4809
  }
4810
+ function placeInside(anchor, popover, placement, inset, rtl) {
4811
+ const edges = placement.slice(7);
4812
+ let top = anchor.top + (anchor.height - popover.height) / 2;
4813
+ if (edges.startsWith("top")) top = anchor.top + inset;
4814
+ else if (edges.startsWith("bottom")) top = anchor.bottom - popover.height - inset;
4815
+ let left = anchor.left + (anchor.width - popover.width) / 2;
4816
+ if (edges.endsWith("start") || edges.endsWith("end")) left = edges.endsWith("start") !== rtl ? anchor.left + inset : anchor.right - popover.width - inset;
4817
+ return {
4818
+ top,
4819
+ left
4820
+ };
4821
+ }
4822
+ function clampAxis(value, size, extent, margin) {
4823
+ return Math.max(margin, Math.min(value, Math.max(margin, extent - size - margin)));
4824
+ }
4807
4825
  function computePopoverPosition(anchorRect, popoverRect, viewport, options) {
4808
4826
  const offset = options.offset ?? 4;
4809
4827
  const margin = options.margin ?? 8;
4810
4828
  const flip = options.flip ?? true;
4811
4829
  const clamp = options.clamp ?? true;
4812
4830
  const rtl = options.rtl ?? false;
4813
- let placement = options.placement;
4814
- let pos = placeRaw(anchorRect, popoverRect, placement, offset, rtl);
4831
+ const point = options.point;
4832
+ const anchor = point ? {
4833
+ top: point.y,
4834
+ bottom: point.y,
4835
+ left: point.x,
4836
+ right: point.x,
4837
+ width: 0,
4838
+ height: 0
4839
+ } : anchorRect;
4840
+ const sizing = {
4841
+ anchorWidth: anchorRect.width,
4842
+ ...options.matchAnchorWidth ? { width: anchorRect.width } : {}
4843
+ };
4844
+ const requested = options.placement;
4845
+ if (isInside(requested)) {
4846
+ const inside = placeInside(anchor, popoverRect, requested, offset, rtl);
4847
+ return {
4848
+ top: clamp ? clampAxis(inside.top, popoverRect.height, viewport.height, margin) : inside.top,
4849
+ left: clamp ? clampAxis(inside.left, popoverRect.width, viewport.width, margin) : inside.left,
4850
+ placement: requested,
4851
+ ...sizing
4852
+ };
4853
+ }
4854
+ let placement = requested;
4855
+ let pos = placeRaw(anchor, popoverRect, placement, offset, rtl);
4815
4856
  if (flip) {
4816
4857
  const overflowsTop = pos.top < margin;
4817
4858
  const overflowsBottom = pos.top + popoverRect.height > viewport.height - margin;
@@ -4820,7 +4861,7 @@ function computePopoverPosition(anchorRect, popoverRect, viewport, options) {
4820
4861
  const s = side(placement);
4821
4862
  if (s === "top" && overflowsTop || s === "bottom" && overflowsBottom || s === "left" && overflowsLeft || s === "right" && overflowsRight) {
4822
4863
  const flipped = flipPlacement(placement);
4823
- const flippedPos = placeRaw(anchorRect, popoverRect, flipped, offset, rtl);
4864
+ const flippedPos = placeRaw(anchor, popoverRect, flipped, offset, rtl);
4824
4865
  if (s === "top" && flippedPos.top + popoverRect.height <= viewport.height - margin || s === "bottom" && flippedPos.top >= margin || s === "left" && flippedPos.left + popoverRect.width <= viewport.width - margin || s === "right" && flippedPos.left >= margin) {
4825
4866
  placement = flipped;
4826
4867
  pos = flippedPos;
@@ -4829,26 +4870,20 @@ function computePopoverPosition(anchorRect, popoverRect, viewport, options) {
4829
4870
  }
4830
4871
  if (clamp) {
4831
4872
  const s = side(placement);
4832
- if (s === "top" || s === "bottom") {
4833
- const maxLeft = viewport.width - popoverRect.width - margin;
4834
- pos = {
4835
- top: pos.top,
4836
- left: Math.max(margin, Math.min(pos.left, Math.max(margin, maxLeft)))
4837
- };
4838
- } else {
4839
- const maxTop = viewport.height - popoverRect.height - margin;
4840
- pos = {
4841
- top: Math.max(margin, Math.min(pos.top, Math.max(margin, maxTop))),
4842
- left: pos.left
4843
- };
4844
- }
4873
+ if (s === "top" || s === "bottom") pos = {
4874
+ top: pos.top,
4875
+ left: clampAxis(pos.left, popoverRect.width, viewport.width, margin)
4876
+ };
4877
+ else pos = {
4878
+ top: clampAxis(pos.top, popoverRect.height, viewport.height, margin),
4879
+ left: pos.left
4880
+ };
4845
4881
  }
4846
4882
  return {
4847
4883
  top: pos.top,
4848
4884
  left: pos.left,
4849
4885
  placement,
4850
- anchorWidth: anchorRect.width,
4851
- ...options.matchAnchorWidth ? { width: anchorRect.width } : {}
4886
+ ...sizing
4852
4887
  };
4853
4888
  }
4854
4889
  const HELP_GAP = 4;
@@ -5341,6 +5376,7 @@ var PopoverComponent = class PopoverComponent {
5341
5376
  anchor = input.required(...ngDevMode ? [{ debugName: "anchor" }] : /* istanbul ignore next */ []);
5342
5377
  open = input(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
5343
5378
  placement = input("bottom-start", ...ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []);
5379
+ anchorPoint = input(null, ...ngDevMode ? [{ debugName: "anchorPoint" }] : /* istanbul ignore next */ []);
5344
5380
  role = input("dialog", ...ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []);
5345
5381
  ariaLabel = input(void 0, {
5346
5382
  ...ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {},
@@ -5360,9 +5396,13 @@ var PopoverComponent = class PopoverComponent {
5360
5396
  closeOnOutsideClick = input(true, ...ngDevMode ? [{ debugName: "closeOnOutsideClick" }] : /* istanbul ignore next */ []);
5361
5397
  closeOnEscape = input(true, ...ngDevMode ? [{ debugName: "closeOnEscape" }] : /* istanbul ignore next */ []);
5362
5398
  scrollBehavior = input("reposition", ...ngDevMode ? [{ debugName: "scrollBehavior" }] : /* istanbul ignore next */ []);
5399
+ contextMenu = input(false, ...ngDevMode ? [{ debugName: "contextMenu" }] : /* istanbul ignore next */ []);
5363
5400
  closeRequested = output();
5401
+ openRequested = output();
5364
5402
  position = signal(null, ...ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []);
5365
5403
  latched = null;
5404
+ pointOffset = null;
5405
+ focusReturn = null;
5366
5406
  effectivePlacement = computed(() => this.position()?.placement ?? this.placement(), ...ngDevMode ? [{ debugName: "effectivePlacement" }] : /* istanbul ignore next */ []);
5367
5407
  stable = signal(false, ...ngDevMode ? [{ debugName: "stable" }] : /* istanbul ignore next */ []);
5368
5408
  isPositioned = computed(() => this.open() && this.position() !== null && this.stable(), ...ngDevMode ? [{ debugName: "isPositioned" }] : /* istanbul ignore next */ []);
@@ -5401,10 +5441,12 @@ var PopoverComponent = class PopoverComponent {
5401
5441
  this.position.set(null);
5402
5442
  this.stable.set(false);
5403
5443
  this.latched = null;
5444
+ this.pointOffset = null;
5404
5445
  return;
5405
5446
  }
5406
5447
  enterTopLayer(surface, anchor);
5407
5448
  this.placement();
5449
+ this.anchorPoint();
5408
5450
  this.offset();
5409
5451
  this.flip();
5410
5452
  this.clamp();
@@ -5448,11 +5490,32 @@ var PopoverComponent = class PopoverComponent {
5448
5490
  window.removeEventListener("resize", onViewportChange);
5449
5491
  });
5450
5492
  }
5493
+ if (typeof document !== "undefined") {
5494
+ effect(() => {
5495
+ const isOpen = this.open();
5496
+ const asContextMenu = this.contextMenu();
5497
+ untracked(() => this.trackFocusReturn(isOpen && asContextMenu));
5498
+ });
5499
+ afterRenderEffect(() => {
5500
+ if (this.contextMenu() && this.isPositioned()) untracked(() => this.focusFirstElement());
5501
+ });
5502
+ const onContextMenu = (event) => {
5503
+ if (!this.open() || !this.contextMenu() || !this.closeOnOutsideClick()) return;
5504
+ const target = event.target instanceof Node ? event.target : null;
5505
+ if (target && this.surfaceEl()?.nativeElement.contains(target)) return;
5506
+ this.closeRequested.emit();
5507
+ };
5508
+ document.addEventListener("contextmenu", onContextMenu, true);
5509
+ this.destroyRef.onDestroy(() => document.removeEventListener("contextmenu", onContextMenu, true));
5510
+ }
5451
5511
  this.destroyRef.onDestroy(() => {
5452
5512
  const surface = this.surfaceEl()?.nativeElement;
5453
5513
  surface?.parentNode?.removeChild(surface);
5454
5514
  });
5455
5515
  }
5516
+ requestOpen(point) {
5517
+ this.openRequested.emit({ point });
5518
+ }
5456
5519
  resolveAnchor() {
5457
5520
  const a = this.anchor();
5458
5521
  if (!a) return null;
@@ -5476,6 +5539,16 @@ var PopoverComponent = class PopoverComponent {
5476
5539
  }
5477
5540
  const anchorRect = anchor.getBoundingClientRect();
5478
5541
  const surfaceRect = surface.getBoundingClientRect();
5542
+ const point = this.anchorPoint();
5543
+ if (point && this.pointOffset?.point !== point) {
5544
+ this.pointOffset = {
5545
+ point,
5546
+ x: point.x - anchorRect.left,
5547
+ y: point.y - anchorRect.top
5548
+ };
5549
+ this.latched = null;
5550
+ }
5551
+ const tracked = point ? this.pointOffset : null;
5479
5552
  const requested = this.placement();
5480
5553
  const placement = untracked(this.stable) && this.latched?.requested === requested ? this.latched.resolved : requested;
5481
5554
  const result = computePopoverPosition(anchorRect, {
@@ -5490,7 +5563,11 @@ var PopoverComponent = class PopoverComponent {
5490
5563
  flip: this.flip(),
5491
5564
  clamp: this.clamp(),
5492
5565
  matchAnchorWidth: this.matchAnchorWidth(),
5493
- rtl: isRtl(anchor)
5566
+ rtl: isRtl(anchor),
5567
+ point: tracked ? {
5568
+ x: anchorRect.left + tracked.x,
5569
+ y: anchorRect.top + tracked.y
5570
+ } : null
5494
5571
  });
5495
5572
  this.latched = {
5496
5573
  requested,
@@ -5502,7 +5579,7 @@ var PopoverComponent = class PopoverComponent {
5502
5579
  if (!this.open() || !this.closeOnOutsideClick()) return;
5503
5580
  const target = event.target;
5504
5581
  if (!target) return;
5505
- const anchor = this.resolveAnchor();
5582
+ const anchor = this.contextMenu() ? null : this.resolveAnchor();
5506
5583
  const surface = this.surfaceEl()?.nativeElement;
5507
5584
  if (anchor?.contains(target) || surface?.contains(target)) return;
5508
5585
  if (this.press.touchedInside(anchor) || this.press.touchedInside(surface)) return;
@@ -5512,7 +5589,7 @@ var PopoverComponent = class PopoverComponent {
5512
5589
  if (event.key !== "Tab" || !this.open() || !this.trapFocus()) return;
5513
5590
  const surface = this.surfaceEl()?.nativeElement;
5514
5591
  if (!surface) return;
5515
- const focusable = Array.from(surface.querySelectorAll("a[href], button, input, select, textarea, [tabindex]")).filter((el) => el.tabIndex >= 0 && !el.hasAttribute("disabled") && el.getClientRects().length > 0);
5592
+ const focusable = this.focusableElements(surface);
5516
5593
  if (focusable.length === 0) {
5517
5594
  event.preventDefault();
5518
5595
  return;
@@ -5530,6 +5607,27 @@ var PopoverComponent = class PopoverComponent {
5530
5607
  first.focus();
5531
5608
  }
5532
5609
  }
5610
+ focusableElements(surface) {
5611
+ return Array.from(surface.querySelectorAll("a[href], button, input, select, textarea, [tabindex]")).filter((el) => el.tabIndex >= 0 && !el.hasAttribute("disabled") && el.getClientRects().length > 0);
5612
+ }
5613
+ focusFirstElement() {
5614
+ const surface = this.surfaceEl()?.nativeElement;
5615
+ if (!surface || surface.contains(document.activeElement)) return;
5616
+ this.focusableElements(surface)[0]?.focus({ preventScroll: true });
5617
+ }
5618
+ trackFocusReturn(active) {
5619
+ if (active) {
5620
+ const focused = document.activeElement;
5621
+ this.focusReturn ??= focused instanceof HTMLElement && focused !== document.body ? focused : null;
5622
+ return;
5623
+ }
5624
+ const target = this.focusReturn;
5625
+ this.focusReturn = null;
5626
+ if (!target || this.open()) return;
5627
+ const focused = document.activeElement;
5628
+ const surface = this.surfaceEl()?.nativeElement;
5629
+ if (!focused || focused === document.body || surface?.contains(focused)) target.focus({ preventScroll: true });
5630
+ }
5533
5631
  onEscape(event) {
5534
5632
  if (!this.open() || !this.closeOnEscape()) return;
5535
5633
  event.preventDefault();
@@ -5571,6 +5669,13 @@ var PopoverComponent = class PopoverComponent {
5571
5669
  isRequired: false,
5572
5670
  transformFunction: null
5573
5671
  },
5672
+ anchorPoint: {
5673
+ classPropertyName: "anchorPoint",
5674
+ publicName: "anchorPoint",
5675
+ isSignal: true,
5676
+ isRequired: false,
5677
+ transformFunction: null
5678
+ },
5574
5679
  role: {
5575
5680
  classPropertyName: "role",
5576
5681
  publicName: "role",
@@ -5661,9 +5766,19 @@ var PopoverComponent = class PopoverComponent {
5661
5766
  isSignal: true,
5662
5767
  isRequired: false,
5663
5768
  transformFunction: null
5769
+ },
5770
+ contextMenu: {
5771
+ classPropertyName: "contextMenu",
5772
+ publicName: "contextMenu",
5773
+ isSignal: true,
5774
+ isRequired: false,
5775
+ transformFunction: null
5664
5776
  }
5665
5777
  },
5666
- outputs: { closeRequested: "closeRequested" },
5778
+ outputs: {
5779
+ closeRequested: "closeRequested",
5780
+ openRequested: "openRequested"
5781
+ },
5667
5782
  host: {
5668
5783
  listeners: {
5669
5784
  "document:click": "onDocumentClick($event)",
@@ -5737,6 +5852,14 @@ i0.ɵɵngDeclareClassMetadata({
5737
5852
  required: false
5738
5853
  }]
5739
5854
  }],
5855
+ anchorPoint: [{
5856
+ type: i0.Input,
5857
+ args: [{
5858
+ isSignal: true,
5859
+ alias: "anchorPoint",
5860
+ required: false
5861
+ }]
5862
+ }],
5740
5863
  role: [{
5741
5864
  type: i0.Input,
5742
5865
  args: [{
@@ -5841,10 +5964,22 @@ i0.ɵɵngDeclareClassMetadata({
5841
5964
  required: false
5842
5965
  }]
5843
5966
  }],
5967
+ contextMenu: [{
5968
+ type: i0.Input,
5969
+ args: [{
5970
+ isSignal: true,
5971
+ alias: "contextMenu",
5972
+ required: false
5973
+ }]
5974
+ }],
5844
5975
  closeRequested: [{
5845
5976
  type: i0.Output,
5846
5977
  args: ["closeRequested"]
5847
5978
  }],
5979
+ openRequested: [{
5980
+ type: i0.Output,
5981
+ args: ["openRequested"]
5982
+ }],
5848
5983
  onDocumentClick: [{
5849
5984
  type: HostListener,
5850
5985
  args: ["document:click", ["$event"]]
@@ -6284,6 +6419,7 @@ var AutocompleteComponent = class AutocompleteComponent {
6284
6419
  "anchor",
6285
6420
  "open",
6286
6421
  "placement",
6422
+ "anchorPoint",
6287
6423
  "role",
6288
6424
  "aria-label",
6289
6425
  "aria-labelledby",
@@ -6296,9 +6432,10 @@ var AutocompleteComponent = class AutocompleteComponent {
6296
6432
  "maxWidth",
6297
6433
  "closeOnOutsideClick",
6298
6434
  "closeOnEscape",
6299
- "scrollBehavior"
6435
+ "scrollBehavior",
6436
+ "contextMenu"
6300
6437
  ],
6301
- outputs: ["closeRequested"]
6438
+ outputs: ["closeRequested", "openRequested"]
6302
6439
  }
6303
6440
  ],
6304
6441
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -13204,6 +13341,7 @@ var ColorPickerComponent = class ColorPickerComponent {
13204
13341
  "anchor",
13205
13342
  "open",
13206
13343
  "placement",
13344
+ "anchorPoint",
13207
13345
  "role",
13208
13346
  "aria-label",
13209
13347
  "aria-labelledby",
@@ -13216,9 +13354,10 @@ var ColorPickerComponent = class ColorPickerComponent {
13216
13354
  "maxWidth",
13217
13355
  "closeOnOutsideClick",
13218
13356
  "closeOnEscape",
13219
- "scrollBehavior"
13357
+ "scrollBehavior",
13358
+ "contextMenu"
13220
13359
  ],
13221
- outputs: ["closeRequested"]
13360
+ outputs: ["closeRequested", "openRequested"]
13222
13361
  },
13223
13362
  {
13224
13363
  kind: "component",
@@ -13645,6 +13784,447 @@ function clampAlpha(value) {
13645
13784
  if (value.endsWith("%")) return clamp01(parseFloat(value) / 100);
13646
13785
  return clamp01(parseFloat(value));
13647
13786
  }
13787
+ var MenuComponent = class MenuComponent {
13788
+ injector = inject(Injector);
13789
+ i18n = inject(EagamiI18nService);
13790
+ listEl = viewChild("listEl", ...ngDevMode ? [{ debugName: "listEl" }] : /* istanbul ignore next */ []);
13791
+ placement = input("bottom-start", ...ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []);
13792
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
13793
+ maxHeight = input("20rem", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
13794
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
13795
+ ariaLabel = input(void 0, {
13796
+ ...ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {},
13797
+ alias: "aria-label"
13798
+ });
13799
+ id = input(uniqueId("ea-menu"), ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
13800
+ resolvedAriaLabel = computed(() => this.ariaLabel() ?? this.i18n.messages().menu.label, ...ngDevMode ? [{ debugName: "resolvedAriaLabel" }] : /* istanbul ignore next */ []);
13801
+ open = model(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
13802
+ opened = output();
13803
+ closed = output();
13804
+ triggerEl = signal(void 0, ...ngDevMode ? [{ debugName: "triggerEl" }] : /* istanbul ignore next */ []);
13805
+ asContextMenu = signal(false, ...ngDevMode ? [{ debugName: "asContextMenu" }] : /* istanbul ignore next */ []);
13806
+ anchorPoint = signal(null, ...ngDevMode ? [{ debugName: "anchorPoint" }] : /* istanbul ignore next */ []);
13807
+ activeItemId = signal(null, ...ngDevMode ? [{ debugName: "activeItemId" }] : /* istanbul ignore next */ []);
13808
+ constructor() {
13809
+ effect(() => {
13810
+ if (!this.open()) {
13811
+ this.activeItemId.set(null);
13812
+ this.asContextMenu.set(false);
13813
+ this.anchorPoint.set(null);
13814
+ return;
13815
+ }
13816
+ afterNextRender(() => {
13817
+ if (this.open() && !this.activeItemId()) {
13818
+ const first = this.getEnabledItems()[0];
13819
+ if (first) this.activeItemId.set(first.id);
13820
+ }
13821
+ }, { injector: this.injector });
13822
+ });
13823
+ }
13824
+ toggleAt(triggerEl) {
13825
+ if (this.disabled()) return;
13826
+ if (this.open()) this.close();
13827
+ else this.openAt(triggerEl);
13828
+ }
13829
+ openAt(triggerEl) {
13830
+ if (this.disabled()) return;
13831
+ this.asContextMenu.set(false);
13832
+ this.anchorPoint.set(null);
13833
+ this.show(triggerEl);
13834
+ }
13835
+ openAsContextMenu(anchorEl, point = null) {
13836
+ if (this.disabled()) return;
13837
+ this.asContextMenu.set(true);
13838
+ this.anchorPoint.set(point);
13839
+ this.show(anchorEl);
13840
+ }
13841
+ show(triggerEl) {
13842
+ this.triggerEl.set(triggerEl);
13843
+ this.open.set(true);
13844
+ this.opened.emit();
13845
+ afterNextRender(() => this.focusFirstItem(), { injector: this.injector });
13846
+ }
13847
+ close(restoreFocus = false) {
13848
+ if (!this.open()) return;
13849
+ const focusTrigger = restoreFocus && !this.asContextMenu();
13850
+ this.open.set(false);
13851
+ this.closed.emit();
13852
+ if (focusTrigger) this.triggerEl()?.focus({ preventScroll: true });
13853
+ }
13854
+ onPopoverCloseRequested() {
13855
+ this.close();
13856
+ }
13857
+ getEnabledItems() {
13858
+ const list = this.listEl()?.nativeElement;
13859
+ if (!list) return [];
13860
+ return Array.from(list.querySelectorAll("[role=\"menuitem\"]:not([disabled])"));
13861
+ }
13862
+ focusFirstItem() {
13863
+ this.focusItem(this.getEnabledItems()[0]);
13864
+ }
13865
+ focusItem(item) {
13866
+ if (!item) return;
13867
+ this.activeItemId.set(item.id);
13868
+ item.focus({ preventScroll: true });
13869
+ }
13870
+ onKeydown(event) {
13871
+ if (!this.open()) return;
13872
+ const list = this.listEl()?.nativeElement;
13873
+ const active = document.activeElement;
13874
+ if (!list || !active || !list.contains(active)) return;
13875
+ const items = this.getEnabledItems();
13876
+ if (items.length === 0) return;
13877
+ const current = items.indexOf(active);
13878
+ let next = -1;
13879
+ switch (event.key) {
13880
+ case "ArrowDown":
13881
+ event.preventDefault();
13882
+ next = current < items.length - 1 ? current + 1 : 0;
13883
+ break;
13884
+ case "ArrowUp":
13885
+ event.preventDefault();
13886
+ next = current > 0 ? current - 1 : items.length - 1;
13887
+ break;
13888
+ case "Home":
13889
+ event.preventDefault();
13890
+ next = 0;
13891
+ break;
13892
+ case "End":
13893
+ event.preventDefault();
13894
+ next = items.length - 1;
13895
+ break;
13896
+ }
13897
+ if (next >= 0) this.focusItem(items[next]);
13898
+ }
13899
+ onEscape(event) {
13900
+ if (!this.open()) return;
13901
+ event.preventDefault();
13902
+ this.close(true);
13903
+ }
13904
+ static ɵfac = i0.ɵɵngDeclareFactory({
13905
+ minVersion: "12.0.0",
13906
+ version: "22.2.0",
13907
+ ngImport: i0,
13908
+ type: MenuComponent,
13909
+ deps: [],
13910
+ target: i0.ɵɵFactoryTarget.Component
13911
+ });
13912
+ static ɵcmp = i0.ɵɵngDeclareComponent({
13913
+ minVersion: "17.2.0",
13914
+ version: "22.2.0",
13915
+ type: MenuComponent,
13916
+ isStandalone: true,
13917
+ selector: "ea-menu",
13918
+ inputs: {
13919
+ placement: {
13920
+ classPropertyName: "placement",
13921
+ publicName: "placement",
13922
+ isSignal: true,
13923
+ isRequired: false,
13924
+ transformFunction: null
13925
+ },
13926
+ size: {
13927
+ classPropertyName: "size",
13928
+ publicName: "size",
13929
+ isSignal: true,
13930
+ isRequired: false,
13931
+ transformFunction: null
13932
+ },
13933
+ maxHeight: {
13934
+ classPropertyName: "maxHeight",
13935
+ publicName: "maxHeight",
13936
+ isSignal: true,
13937
+ isRequired: false,
13938
+ transformFunction: null
13939
+ },
13940
+ disabled: {
13941
+ classPropertyName: "disabled",
13942
+ publicName: "disabled",
13943
+ isSignal: true,
13944
+ isRequired: false,
13945
+ transformFunction: null
13946
+ },
13947
+ ariaLabel: {
13948
+ classPropertyName: "ariaLabel",
13949
+ publicName: "aria-label",
13950
+ isSignal: true,
13951
+ isRequired: false,
13952
+ transformFunction: null
13953
+ },
13954
+ id: {
13955
+ classPropertyName: "id",
13956
+ publicName: "id",
13957
+ isSignal: true,
13958
+ isRequired: false,
13959
+ transformFunction: null
13960
+ },
13961
+ open: {
13962
+ classPropertyName: "open",
13963
+ publicName: "open",
13964
+ isSignal: true,
13965
+ isRequired: false,
13966
+ transformFunction: null
13967
+ }
13968
+ },
13969
+ outputs: {
13970
+ open: "openChange",
13971
+ opened: "opened",
13972
+ closed: "closed"
13973
+ },
13974
+ host: { listeners: {
13975
+ "document:keydown": "onKeydown($event)",
13976
+ "document:keydown.escape": "onEscape($event)"
13977
+ } },
13978
+ viewQueries: [{
13979
+ propertyName: "listEl",
13980
+ first: true,
13981
+ predicate: ["listEl"],
13982
+ descendants: true,
13983
+ isSignal: true
13984
+ }],
13985
+ ngImport: i0,
13986
+ template: "<ea-popover\n [anchor]=\"triggerEl()\"\n [open]=\"open()\"\n [placement]=\"placement()\"\n [anchorPoint]=\"anchorPoint()\"\n [contextMenu]=\"asContextMenu()\"\n role=\"menu\"\n [surfaceId]=\"id()\"\n [aria-label]=\"resolvedAriaLabel()\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n #listEl\n class=\"ea-menu__list ea-menu__list--{{ size() }}\"\n [style.max-height]=\"maxHeight()\">\n <ng-content />\n </div>\n</ea-popover>\n",
13987
+ styles: [":host{display:contents}.ea-menu__list{min-width:10em;padding:.25em 0;overflow-y:auto;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-menu-list-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-menu__list{border:1px solid CanvasText}}.ea-menu__list--2xs{font-size:var(--font-size-2xs)}.ea-menu__list--xs{font-size:var(--font-size-xs)}.ea-menu__list--sm{font-size:var(--font-size-sm)}.ea-menu__list--md{font-size:var(--font-size-md)}.ea-menu__list--lg{font-size:var(--font-size-lg)}.ea-menu__list--xl{font-size:var(--font-size-xl)}\n"],
13988
+ dependencies: [{
13989
+ kind: "component",
13990
+ type: PopoverComponent,
13991
+ selector: "ea-popover",
13992
+ inputs: [
13993
+ "anchor",
13994
+ "open",
13995
+ "placement",
13996
+ "anchorPoint",
13997
+ "role",
13998
+ "aria-label",
13999
+ "aria-labelledby",
14000
+ "trapFocus",
14001
+ "surfaceId",
14002
+ "offset",
14003
+ "flip",
14004
+ "clamp",
14005
+ "matchAnchorWidth",
14006
+ "maxWidth",
14007
+ "closeOnOutsideClick",
14008
+ "closeOnEscape",
14009
+ "scrollBehavior",
14010
+ "contextMenu"
14011
+ ],
14012
+ outputs: ["closeRequested", "openRequested"]
14013
+ }],
14014
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
14015
+ });
14016
+ };
14017
+ i0.ɵɵngDeclareClassMetadata({
14018
+ minVersion: "12.0.0",
14019
+ version: "22.2.0",
14020
+ ngImport: i0,
14021
+ type: MenuComponent,
14022
+ decorators: [{
14023
+ type: Component,
14024
+ args: [{
14025
+ selector: "ea-menu",
14026
+ imports: [PopoverComponent],
14027
+ changeDetection: ChangeDetectionStrategy.OnPush,
14028
+ template: "<ea-popover\n [anchor]=\"triggerEl()\"\n [open]=\"open()\"\n [placement]=\"placement()\"\n [anchorPoint]=\"anchorPoint()\"\n [contextMenu]=\"asContextMenu()\"\n role=\"menu\"\n [surfaceId]=\"id()\"\n [aria-label]=\"resolvedAriaLabel()\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n #listEl\n class=\"ea-menu__list ea-menu__list--{{ size() }}\"\n [style.max-height]=\"maxHeight()\">\n <ng-content />\n </div>\n</ea-popover>\n",
14029
+ styles: [":host{display:contents}.ea-menu__list{min-width:10em;padding:.25em 0;overflow-y:auto;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-menu-list-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-menu__list{border:1px solid CanvasText}}.ea-menu__list--2xs{font-size:var(--font-size-2xs)}.ea-menu__list--xs{font-size:var(--font-size-xs)}.ea-menu__list--sm{font-size:var(--font-size-sm)}.ea-menu__list--md{font-size:var(--font-size-md)}.ea-menu__list--lg{font-size:var(--font-size-lg)}.ea-menu__list--xl{font-size:var(--font-size-xl)}\n"]
14030
+ }]
14031
+ }],
14032
+ ctorParameters: () => [],
14033
+ propDecorators: {
14034
+ listEl: [{
14035
+ type: i0.ViewChild,
14036
+ args: ["listEl", { isSignal: true }]
14037
+ }],
14038
+ placement: [{
14039
+ type: i0.Input,
14040
+ args: [{
14041
+ isSignal: true,
14042
+ alias: "placement",
14043
+ required: false
14044
+ }]
14045
+ }],
14046
+ size: [{
14047
+ type: i0.Input,
14048
+ args: [{
14049
+ isSignal: true,
14050
+ alias: "size",
14051
+ required: false
14052
+ }]
14053
+ }],
14054
+ maxHeight: [{
14055
+ type: i0.Input,
14056
+ args: [{
14057
+ isSignal: true,
14058
+ alias: "maxHeight",
14059
+ required: false
14060
+ }]
14061
+ }],
14062
+ disabled: [{
14063
+ type: i0.Input,
14064
+ args: [{
14065
+ isSignal: true,
14066
+ alias: "disabled",
14067
+ required: false
14068
+ }]
14069
+ }],
14070
+ ariaLabel: [{
14071
+ type: i0.Input,
14072
+ args: [{
14073
+ isSignal: true,
14074
+ alias: "aria-label",
14075
+ required: false
14076
+ }]
14077
+ }],
14078
+ id: [{
14079
+ type: i0.Input,
14080
+ args: [{
14081
+ isSignal: true,
14082
+ alias: "id",
14083
+ required: false
14084
+ }]
14085
+ }],
14086
+ open: [{
14087
+ type: i0.Input,
14088
+ args: [{
14089
+ isSignal: true,
14090
+ alias: "open",
14091
+ required: false
14092
+ }]
14093
+ }, {
14094
+ type: i0.Output,
14095
+ args: ["openChange"]
14096
+ }],
14097
+ opened: [{
14098
+ type: i0.Output,
14099
+ args: ["opened"]
14100
+ }],
14101
+ closed: [{
14102
+ type: i0.Output,
14103
+ args: ["closed"]
14104
+ }],
14105
+ onKeydown: [{
14106
+ type: HostListener,
14107
+ args: ["document:keydown", ["$event"]]
14108
+ }],
14109
+ onEscape: [{
14110
+ type: HostListener,
14111
+ args: ["document:keydown.escape", ["$event"]]
14112
+ }]
14113
+ }
14114
+ });
14115
+ function isContextMenuShortcut(event) {
14116
+ return event.key === "F10" && event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey;
14117
+ }
14118
+ function contextMenuPoint(event, fallback) {
14119
+ if (event instanceof MouseEvent && !fromKeyboard(event)) return {
14120
+ x: event.clientX,
14121
+ y: event.clientY
14122
+ };
14123
+ const focused = event.target instanceof Element ? event.target : fallback;
14124
+ const rect = focused.getBoundingClientRect();
14125
+ return {
14126
+ x: isRtl(focused) ? rect.right : rect.left,
14127
+ y: rect.bottom
14128
+ };
14129
+ }
14130
+ function fromKeyboard(event) {
14131
+ if (typeof PointerEvent !== "undefined" && event instanceof PointerEvent) return event.pointerType === "";
14132
+ return event.button === 0 && event.buttons === 0;
14133
+ }
14134
+ var ContextMenuTriggerDirective = class ContextMenuTriggerDirective {
14135
+ el = inject(ElementRef);
14136
+ target = input(void 0, {
14137
+ ...ngDevMode ? { debugName: "target" } : /* istanbul ignore next */ {},
14138
+ alias: "eaContextMenuTrigger"
14139
+ });
14140
+ contextMenuPosition = input("pointer", ...ngDevMode ? [{ debugName: "contextMenuPosition" }] : /* istanbul ignore next */ []);
14141
+ onContextMenu(event) {
14142
+ this.request(event);
14143
+ }
14144
+ onKeydown(event) {
14145
+ if (isContextMenuShortcut(event)) this.request(event);
14146
+ }
14147
+ request(event) {
14148
+ const target = this.target();
14149
+ if (!target || event.defaultPrevented) return;
14150
+ if (target instanceof MenuComponent && target.disabled()) return;
14151
+ event.preventDefault();
14152
+ const host = this.el.nativeElement;
14153
+ const point = this.contextMenuPosition() === "pointer" ? contextMenuPoint(event, host) : null;
14154
+ if (target instanceof MenuComponent) target.openAsContextMenu(host, point);
14155
+ else target.requestOpen(point);
14156
+ }
14157
+ static ɵfac = i0.ɵɵngDeclareFactory({
14158
+ minVersion: "12.0.0",
14159
+ version: "22.2.0",
14160
+ ngImport: i0,
14161
+ type: ContextMenuTriggerDirective,
14162
+ deps: [],
14163
+ target: i0.ɵɵFactoryTarget.Directive
14164
+ });
14165
+ static ɵdir = i0.ɵɵngDeclareDirective({
14166
+ minVersion: "17.1.0",
14167
+ version: "22.2.0",
14168
+ type: ContextMenuTriggerDirective,
14169
+ isStandalone: true,
14170
+ selector: "[eaContextMenuTrigger]",
14171
+ inputs: {
14172
+ target: {
14173
+ classPropertyName: "target",
14174
+ publicName: "eaContextMenuTrigger",
14175
+ isSignal: true,
14176
+ isRequired: false,
14177
+ transformFunction: null
14178
+ },
14179
+ contextMenuPosition: {
14180
+ classPropertyName: "contextMenuPosition",
14181
+ publicName: "contextMenuPosition",
14182
+ isSignal: true,
14183
+ isRequired: false,
14184
+ transformFunction: null
14185
+ }
14186
+ },
14187
+ host: { listeners: {
14188
+ "contextmenu": "onContextMenu($event)",
14189
+ "keydown": "onKeydown($event)"
14190
+ } },
14191
+ ngImport: i0
14192
+ });
14193
+ };
14194
+ i0.ɵɵngDeclareClassMetadata({
14195
+ minVersion: "12.0.0",
14196
+ version: "22.2.0",
14197
+ ngImport: i0,
14198
+ type: ContextMenuTriggerDirective,
14199
+ decorators: [{
14200
+ type: Directive,
14201
+ args: [{
14202
+ selector: "[eaContextMenuTrigger]",
14203
+ host: {
14204
+ "(contextmenu)": "onContextMenu($event)",
14205
+ "(keydown)": "onKeydown($event)"
14206
+ }
14207
+ }]
14208
+ }],
14209
+ propDecorators: {
14210
+ target: [{
14211
+ type: i0.Input,
14212
+ args: [{
14213
+ isSignal: true,
14214
+ alias: "eaContextMenuTrigger",
14215
+ required: false
14216
+ }]
14217
+ }],
14218
+ contextMenuPosition: [{
14219
+ type: i0.Input,
14220
+ args: [{
14221
+ isSignal: true,
14222
+ alias: "contextMenuPosition",
14223
+ required: false
14224
+ }]
14225
+ }]
14226
+ }
14227
+ });
13648
14228
  var ArrowDownIconComponent = class ArrowDownIconComponent extends IconComponentBase {
13649
14229
  static slug = "arrow-down";
13650
14230
  static category = "feather";
@@ -13916,6 +14496,7 @@ var DataTableComponent = class DataTableComponent {
13916
14496
  col: 0
13917
14497
  }, ...ngDevMode ? [{ debugName: "activeCell" }] : /* istanbul ignore next */ []);
13918
14498
  static PAGE_JUMP = 10;
14499
+ keyboardRequestPending = false;
13919
14500
  columns = input.required(...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
13920
14501
  data = input.required(...ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []);
13921
14502
  sizingRows = input([], ...ngDevMode ? [{ debugName: "sizingRows" }] : /* istanbul ignore next */ []);
@@ -13936,14 +14517,19 @@ var DataTableComponent = class DataTableComponent {
13936
14517
  navigable = input(false, ...ngDevMode ? [{ debugName: "navigable" }] : /* istanbul ignore next */ []);
13937
14518
  clickable = input(false, ...ngDevMode ? [{ debugName: "clickable" }] : /* istanbul ignore next */ []);
13938
14519
  rowHref = input(void 0, ...ngDevMode ? [{ debugName: "rowHref" }] : /* istanbul ignore next */ []);
14520
+ loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
14521
+ loadingRowCount = input(5, ...ngDevMode ? [{ debugName: "loadingRowCount" }] : /* istanbul ignore next */ []);
13939
14522
  sort = model({
13940
14523
  column: "",
13941
14524
  direction: null
13942
14525
  }, ...ngDevMode ? [{ debugName: "sort" }] : /* istanbul ignore next */ []);
13943
14526
  sorted = output();
13944
14527
  rowActivate = output();
14528
+ rowContextMenu = output();
13945
14529
  noDataTemplate = contentChild("noData", ...ngDevMode ? [{ debugName: "noDataTemplate" }] : /* istanbul ignore next */ []);
13946
14530
  resolvedNoDataText = computed(() => this.noDataText() ?? this.i18n.messages().dataTable.noData, ...ngDevMode ? [{ debugName: "resolvedNoDataText" }] : /* istanbul ignore next */ []);
14531
+ placeholderRows = computed(() => Array.from({ length: Math.max(0, Math.floor(this.loadingRowCount())) }, (_, i) => i), ...ngDevMode ? [{ debugName: "placeholderRows" }] : /* istanbul ignore next */ []);
14532
+ bodyRowCount = computed(() => this.loading() ? 0 : this.sortedData().length, ...ngDevMode ? [{ debugName: "bodyRowCount" }] : /* istanbul ignore next */ []);
13947
14533
  hostClasses = computed(() => ({
13948
14534
  [`ea-data-table--${this.density()}`]: true,
13949
14535
  [`ea-data-table--${this.size()}`]: true,
@@ -13958,7 +14544,7 @@ var DataTableComponent = class DataTableComponent {
13958
14544
  }), ...ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []);
13959
14545
  constructor() {
13960
14546
  effect(() => {
13961
- const rows = this.sortedData().length;
14547
+ const rows = this.bodyRowCount();
13962
14548
  const cols = this.columns().length;
13963
14549
  const { row, col } = untracked(this.activeCell);
13964
14550
  const nextRow = Math.min(row, rows);
@@ -14034,6 +14620,24 @@ var DataTableComponent = class DataTableComponent {
14034
14620
  event?.preventDefault();
14035
14621
  this.rowActivate.emit(row);
14036
14622
  }
14623
+ onRowContextMenu(row, rowElement, event) {
14624
+ if (event instanceof KeyboardEvent) {
14625
+ if (!isContextMenuShortcut(event)) return;
14626
+ } else if (this.keyboardRequestPending) {
14627
+ this.keyboardRequestPending = false;
14628
+ return;
14629
+ }
14630
+ this.rowContextMenu.emit({
14631
+ row,
14632
+ rowElement,
14633
+ point: contextMenuPoint(event, rowElement),
14634
+ event
14635
+ });
14636
+ if (event instanceof KeyboardEvent && !event.defaultPrevented) this.keyboardRequestPending = true;
14637
+ }
14638
+ clearKeyboardRequest() {
14639
+ this.keyboardRequestPending = false;
14640
+ }
14037
14641
  onCellFocus(row, col) {
14038
14642
  if (!this.navigable()) return;
14039
14643
  const active = this.activeCell();
@@ -14045,7 +14649,7 @@ var DataTableComponent = class DataTableComponent {
14045
14649
  onGridKeydown(event) {
14046
14650
  if (!this.navigable()) return;
14047
14651
  const cols = this.columns().length;
14048
- const rows = this.sortedData().length;
14652
+ const rows = this.bodyRowCount();
14049
14653
  if (cols === 0) return;
14050
14654
  const { row, col } = this.activeCell();
14051
14655
  let nextRow = row;
@@ -14224,6 +14828,20 @@ var DataTableComponent = class DataTableComponent {
14224
14828
  isRequired: false,
14225
14829
  transformFunction: null
14226
14830
  },
14831
+ loading: {
14832
+ classPropertyName: "loading",
14833
+ publicName: "loading",
14834
+ isSignal: true,
14835
+ isRequired: false,
14836
+ transformFunction: null
14837
+ },
14838
+ loadingRowCount: {
14839
+ classPropertyName: "loadingRowCount",
14840
+ publicName: "loadingRowCount",
14841
+ isSignal: true,
14842
+ isRequired: false,
14843
+ transformFunction: null
14844
+ },
14227
14845
  sort: {
14228
14846
  classPropertyName: "sort",
14229
14847
  publicName: "sort",
@@ -14235,7 +14853,8 @@ var DataTableComponent = class DataTableComponent {
14235
14853
  outputs: {
14236
14854
  sort: "sortChange",
14237
14855
  sorted: "sorted",
14238
- rowActivate: "rowActivate"
14856
+ rowActivate: "rowActivate",
14857
+ rowContextMenu: "rowContextMenu"
14239
14858
  },
14240
14859
  queries: [{
14241
14860
  propertyName: "noDataTemplate",
@@ -14245,8 +14864,8 @@ var DataTableComponent = class DataTableComponent {
14245
14864
  isSignal: true
14246
14865
  }],
14247
14866
  ngImport: i0,
14248
- template: "<ng-template\n #cellContent\n let-row\n let-col=\"col\">\n @if (col.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.cellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, value: getCellValue(row, col.key) }\" />\n } @else if (col.format) {\n {{ col.format(getCellValue(row, col.key)) }}\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n</ng-template>\n\n<div\n class=\"ea-data-table\"\n [ngClass]=\"hostClasses()\">\n <div class=\"ea-data-table__scroll\">\n <table\n class=\"ea-data-table__table\"\n [attr.role]=\"navigable() ? 'grid' : null\"\n [attr.aria-label]=\"caption() ? null : (ariaLabel() ?? null)\"\n (keydown)=\"onGridKeydown($event)\">\n @if (caption(); as captionText) {\n <caption class=\"ea-data-table__caption\">\n {{ captionText }}\n </caption>\n }\n <thead class=\"ea-data-table__head\">\n <tr\n class=\"ea-data-table__row ea-data-table__row--header\"\n [attr.role]=\"navigable() ? 'row' : null\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <th\n scope=\"col\"\n class=\"ea-data-table__cell ea-data-table__cell--header\"\n [attr.role]=\"navigable() ? 'columnheader' : null\"\n [attr.data-ea-cell]=\"navigable() ? '0-' + colIndex : null\"\n [class.ea-data-table__cell--sortable]=\"col.sortable\"\n [class.ea-data-table__cell--sorted]=\"\n sort().column === col.key && sort().direction\n \"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.aria-sort]=\"\n sort().column === col.key && sort().direction === 'asc'\n ? 'ascending'\n : sort().column === col.key && sort().direction === 'desc'\n ? 'descending'\n : col.sortable\n ? 'none'\n : null\n \"\n (keydown.enter)=\"onHeaderKeydown($event, col)\"\n (keydown.space)=\"onHeaderKeydown($event, col)\"\n (focus)=\"onCellFocus(0, colIndex)\"\n [attr.tabindex]=\"headerTabindex(colIndex)\">\n @if (col.sortable) {\n <button\n type=\"button\"\n class=\"ea-data-table__sort-button\"\n [attr.tabindex]=\"navigable() ? -1 : null\"\n (click)=\"onHeaderClick(col)\"\n (focus)=\"onCellFocus(0, colIndex)\">\n @if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n <span class=\"ea-data-table__sort-icon\">\n @if (sort().column === col.key && sort().direction === 'asc') {\n <ea-icon-arrow-up />\n } @else if (\n sort().column === col.key && sort().direction === 'desc'\n ) {\n <ea-icon-arrow-down />\n } @else {\n <ea-icon-chevrons-up-down />\n }\n </span>\n </button>\n } @else if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n @if (sizingRows().length) {\n <tbody\n class=\"ea-data-table__sizing\"\n aria-hidden=\"true\">\n @for (row of sizingRows(); track $index) {\n <tr class=\"ea-data-table__row ea-data-table__row--sizing\">\n @for (col of columns(); track col.key) {\n <td\n class=\"ea-data-table__cell ea-data-table__cell--sizing\"\n [style.width]=\"col.width ?? null\">\n <div class=\"ea-data-table__sizing-content\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n }\n <tbody class=\"ea-data-table__body\">\n @if (sortedData().length === 0) {\n <tr\n class=\"ea-data-table__row ea-data-table__row--empty\"\n [attr.role]=\"navigable() ? 'row' : null\">\n <td\n class=\"ea-data-table__cell ea-data-table__cell--empty\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.colspan]=\"columns().length\">\n <div role=\"status\">\n @if (noDataTemplate()) {\n <ng-container [ngTemplateOutlet]=\"noDataTemplate()!\" />\n } @else {\n {{ resolvedNoDataText() }}\n }\n </div>\n </td>\n </tr>\n } @else {\n @for (\n row of sortedData();\n track trackByFn($index, row);\n let rowIndex = $index\n ) {\n <tr\n class=\"ea-data-table__row\"\n [class.ea-data-table__row--inert]=\"isInert(row)\"\n [attr.role]=\"navigable() ? 'row' : null\"\n [attr.tabindex]=\"rowTabindex(row)\"\n (click)=\"onRowActivate(row, $event)\"\n (keydown.enter)=\"onRowActivate(row, $event)\"\n (keydown.space)=\"onRowActivate(row, $event)\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <td\n class=\"ea-data-table__cell\"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.data-ea-cell]=\"navigable() ? rowIndex + 1 + '-' + colIndex : null\"\n [attr.tabindex]=\"bodyCellTabindex(rowIndex + 1, colIndex)\"\n (focus)=\"onCellFocus(rowIndex + 1, colIndex)\">\n @if (rowHref()?.(row); as url) {\n <a\n class=\"ea-data-table__row-link\"\n [href]=\"url\"\n tabindex=\"-1\"\n [attr.aria-hidden]=\"colIndex > 0 ? true : null\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </a>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n <ng-content select=\"ea-paginator\" />\n</div>\n",
14249
- styles: [".ea-data-table{--ea-data-table-font-size: var(--font-size-md);overflow:hidden;width:100%;border:var(--border-width-thin) solid var(--color-border-subtle);border-radius:var(--radius-lg);background-color:var(--ea-data-table-background-color, var(--color-bg-base))}.ea-data-table__scroll{overflow-x:auto}.ea-data-table--2xs{--ea-data-table-font-size: var(--font-size-2xs)}.ea-data-table--xs{--ea-data-table-font-size: var(--font-size-xs)}.ea-data-table--sm{--ea-data-table-font-size: var(--font-size-sm)}.ea-data-table--md{--ea-data-table-font-size: var(--font-size-md)}.ea-data-table--lg{--ea-data-table-font-size: var(--font-size-lg)}.ea-data-table--xl{--ea-data-table-font-size: var(--font-size-xl)}.ea-data-table__table{width:100%;border-spacing:0;border-collapse:collapse;font-family:var(--font-family-sans);font-size:var(--ea-data-table-font-size);color:var(--ea-data-table-color, var(--color-text-primary));table-layout:auto}.ea-data-table__caption{padding:calc(var(--ea-data-table-font-size) * .5) calc(var(--ea-data-table-font-size) * .75);text-align:start;font-weight:var(--font-weight-medium);color:var(--color-text-secondary);caption-side:top}.ea-data-table__head{background-color:var(--ea-data-table-header-background-color, var(--color-bg-stripe))}.ea-data-table__cell--header{position:relative;font-weight:var(--font-weight-medium);font-size:var(--ea-data-table-header-font-size, calc(var(--ea-data-table-font-size) * .75));line-height:var(--text-label-sm-lh);letter-spacing:var(--letter-spacing-wide);text-transform:var(--ea-data-table-header-text-transform, uppercase);text-align:start;white-space:nowrap;color:var(--ea-data-table-header-color, var(--color-text-secondary));border-bottom:var(--border-width-thin) solid var(--color-border-subtle);-webkit-user-select:none;user-select:none}.ea-data-table__cell--sortable{cursor:pointer;transition:var(--transition-colors)}.ea-data-table__cell--sortable:hover{color:var(--ea-data-table-header-hover-color, var(--color-text-primary));background-color:var(--ea-data-table-header-hover-background-color, var(--color-state-hover))}.ea-data-table__cell--sorted{color:var(--ea-data-table-header-sorted-color, var(--color-brand-text))}.ea-data-table__sort-button{display:inline-flex;align-items:center;width:100%;padding:0;margin:0;font:inherit;text-transform:inherit;letter-spacing:inherit;border:none;background:none;color:inherit;cursor:pointer}.ea-data-table__sort-button:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-data-table__sort-button:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-data-table__cell--align-center .ea-data-table__sort-button{justify-content:center}.ea-data-table__cell--align-right .ea-data-table__sort-button{justify-content:flex-end}.ea-data-table__header-text{display:inline;vertical-align:middle}.ea-data-table__sort-icon{display:inline-flex;vertical-align:middle;width:1em;height:1em;margin-inline-start:calc(var(--ea-data-table-font-size) * .25);opacity:.5;transition:var(--transition-opacity)}.ea-data-table__cell--sortable:hover .ea-data-table__sort-icon,.ea-data-table__cell--sorted .ea-data-table__sort-icon{opacity:1}.ea-data-table__row{border-bottom:var(--border-width-thin) solid var(--ea-data-table-row-border-color, var(--color-border-subtle));transition:var(--transition-colors)}.ea-data-table__row:last-child{border-bottom-width:0}.ea-data-table__cell{text-align:start;vertical-align:middle}.ea-data-table__cell--align-center{text-align:center}.ea-data-table__cell--align-right{text-align:end}.ea-data-table__cell--empty{text-align:center;color:var(--color-text-tertiary);font-style:italic}.ea-data-table--compact .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .375) calc(var(--ea-data-table-font-size) * .75)}.ea-data-table--comfortable .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .625) var(--ea-data-table-font-size)}.ea-data-table--spacious .ea-data-table__cell{padding:var(--ea-data-table-font-size) calc(var(--ea-data-table-font-size) * 1.5)}.ea-data-table__sizing .ea-data-table__row{border-bottom:none}.ea-data-table__sizing .ea-data-table__cell{padding-top:0;padding-bottom:0}.ea-data-table__sizing-content{overflow:hidden;visibility:hidden;height:0}.ea-data-table--sticky .ea-data-table__sizing{display:none}.ea-data-table--sticky,.ea-data-table--sticky .ea-data-table__scroll{max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__table{display:flex;flex-direction:column;min-width:calc(var(--ea-data-table-font-size) * 32);max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__head{display:block;flex-shrink:0}.ea-data-table--sticky .ea-data-table__head .ea-data-table__row--header{display:table;width:100%;table-layout:fixed}.ea-data-table--sticky .ea-data-table__body{display:block;overflow-y:auto;flex:1 1 auto;min-height:0}.ea-data-table--sticky .ea-data-table__body .ea-data-table__row{display:table;width:100%;table-layout:fixed}.ea-data-table--striped .ea-data-table__body .ea-data-table__row:nth-child(2n){background-color:var(--ea-data-table-row-stripe-background-color, var(--color-bg-stripe-subtle))}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):hover{background-color:var(--ea-data-table-row-hover-background-color, var(--color-state-hover))}@media(forced-colors:active){.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):hover{background-color:Highlight;color:HighlightText}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):hover .ea-data-table__cell--sorted{color:HighlightText}}.ea-data-table--clickable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert){cursor:var(--ea-data-table-row-cursor, pointer)}.ea-data-table--linked .ea-data-table__cell{position:relative}.ea-data-table__row-link{text-decoration:none;color:inherit}.ea-data-table__row-link:hover{color:inherit}.ea-data-table__row-link:after{position:absolute;inset:0;content:\"\"}.ea-data-table--nowrap .ea-data-table__cell{white-space:nowrap}.ea-data-table--bordered .ea-data-table__cell{border-inline-end:var(--border-width-thin) solid var(--color-border-subtle)}.ea-data-table--bordered .ea-data-table__cell:last-child{border-inline-end:none}.ea-data-table--navigable .ea-data-table__cell:focus-visible{outline:var(--border-width-medium) solid var(--color-border-focus);outline-offset:calc(-1 * var(--border-width-medium));box-shadow:none}\n"],
14867
+ template: "<ng-template\n #cellContent\n let-row\n let-col=\"col\">\n @if (col.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.cellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, value: getCellValue(row, col.key) }\" />\n } @else if (col.format) {\n {{ col.format(getCellValue(row, col.key)) }}\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n</ng-template>\n\n<div\n class=\"ea-data-table\"\n [ngClass]=\"hostClasses()\">\n <div class=\"ea-data-table__scroll\">\n <table\n class=\"ea-data-table__table\"\n [attr.role]=\"navigable() ? 'grid' : null\"\n [attr.aria-label]=\"caption() ? null : (ariaLabel() ?? null)\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (keydown)=\"onGridKeydown($event)\"\n (keyup)=\"clearKeyboardRequest()\"\n (pointerdown)=\"clearKeyboardRequest()\">\n @if (caption(); as captionText) {\n <caption class=\"ea-data-table__caption\">\n {{ captionText }}\n </caption>\n }\n <thead class=\"ea-data-table__head\">\n <tr\n class=\"ea-data-table__row ea-data-table__row--header\"\n [attr.role]=\"navigable() ? 'row' : null\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <th\n scope=\"col\"\n class=\"ea-data-table__cell ea-data-table__cell--header\"\n [attr.role]=\"navigable() ? 'columnheader' : null\"\n [attr.data-ea-cell]=\"navigable() ? '0-' + colIndex : null\"\n [class.ea-data-table__cell--sortable]=\"col.sortable\"\n [class.ea-data-table__cell--sorted]=\"\n sort().column === col.key && sort().direction\n \"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.aria-sort]=\"\n sort().column === col.key && sort().direction === 'asc'\n ? 'ascending'\n : sort().column === col.key && sort().direction === 'desc'\n ? 'descending'\n : col.sortable\n ? 'none'\n : null\n \"\n (keydown.enter)=\"onHeaderKeydown($event, col)\"\n (keydown.space)=\"onHeaderKeydown($event, col)\"\n (focus)=\"onCellFocus(0, colIndex)\"\n [attr.tabindex]=\"headerTabindex(colIndex)\">\n @if (col.sortable) {\n <button\n type=\"button\"\n class=\"ea-data-table__sort-button\"\n [attr.tabindex]=\"navigable() ? -1 : null\"\n (click)=\"onHeaderClick(col)\"\n (focus)=\"onCellFocus(0, colIndex)\">\n @if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n <span class=\"ea-data-table__sort-icon\">\n @if (sort().column === col.key && sort().direction === 'asc') {\n <ea-icon-arrow-up />\n } @else if (\n sort().column === col.key && sort().direction === 'desc'\n ) {\n <ea-icon-arrow-down />\n } @else {\n <ea-icon-chevrons-up-down />\n }\n </span>\n </button>\n } @else if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n @if (sizingRows().length) {\n <tbody\n class=\"ea-data-table__sizing\"\n aria-hidden=\"true\">\n @for (row of sizingRows(); track $index) {\n <tr class=\"ea-data-table__row ea-data-table__row--sizing\">\n @for (col of columns(); track col.key) {\n <td\n class=\"ea-data-table__cell ea-data-table__cell--sizing\"\n [style.width]=\"col.width ?? null\">\n <div class=\"ea-data-table__sizing-content\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n }\n <tbody class=\"ea-data-table__body\">\n @if (loading()) {\n @for (index of placeholderRows(); track index) {\n <tr\n class=\"ea-data-table__row ea-data-table__row--placeholder\"\n aria-hidden=\"true\"\n [attr.role]=\"navigable() ? 'row' : null\">\n @for (col of columns(); track col.key) {\n <td\n class=\"ea-data-table__cell\"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.role]=\"navigable() ? 'gridcell' : null\">\n @if (col.placeholderTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.placeholderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, index }\" />\n } @else {\n <span class=\"ea-data-table__placeholder\">\n <ea-skeleton height=\"1em\" />\n </span>\n }\n </td>\n }\n </tr>\n }\n } @else if (sortedData().length === 0) {\n <tr\n class=\"ea-data-table__row ea-data-table__row--empty\"\n [attr.role]=\"navigable() ? 'row' : null\">\n <td\n class=\"ea-data-table__cell ea-data-table__cell--empty\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.colspan]=\"columns().length\">\n <div role=\"status\">\n @if (noDataTemplate()) {\n <ng-container [ngTemplateOutlet]=\"noDataTemplate()!\" />\n } @else {\n {{ resolvedNoDataText() }}\n }\n </div>\n </td>\n </tr>\n } @else {\n @for (\n row of sortedData();\n track trackByFn($index, row);\n let rowIndex = $index\n ) {\n <tr\n #rowEl\n class=\"ea-data-table__row\"\n [class.ea-data-table__row--inert]=\"isInert(row)\"\n [attr.role]=\"navigable() ? 'row' : null\"\n [attr.tabindex]=\"rowTabindex(row)\"\n (click)=\"onRowActivate(row, $event)\"\n (keydown.enter)=\"onRowActivate(row, $event)\"\n (keydown.space)=\"onRowActivate(row, $event)\"\n (keydown)=\"onRowContextMenu(row, rowEl, $event)\"\n (contextmenu)=\"onRowContextMenu(row, rowEl, $event)\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <td\n class=\"ea-data-table__cell\"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.data-ea-cell]=\"navigable() ? rowIndex + 1 + '-' + colIndex : null\"\n [attr.tabindex]=\"bodyCellTabindex(rowIndex + 1, colIndex)\"\n (focus)=\"onCellFocus(rowIndex + 1, colIndex)\">\n @if (rowHref()?.(row); as url) {\n <a\n class=\"ea-data-table__row-link\"\n [href]=\"url\"\n tabindex=\"-1\"\n [attr.aria-hidden]=\"colIndex > 0 ? true : null\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </a>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n <ng-content select=\"ea-paginator\" />\n</div>\n",
14868
+ styles: [".ea-data-table{--ea-data-table-font-size: var(--font-size-md);overflow:hidden;width:100%;border:var(--border-width-thin) solid var(--color-border-subtle);border-radius:var(--radius-lg);background-color:var(--ea-data-table-background-color, var(--color-bg-base))}.ea-data-table__scroll{overflow-x:auto}.ea-data-table--2xs{--ea-data-table-font-size: var(--font-size-2xs)}.ea-data-table--xs{--ea-data-table-font-size: var(--font-size-xs)}.ea-data-table--sm{--ea-data-table-font-size: var(--font-size-sm)}.ea-data-table--md{--ea-data-table-font-size: var(--font-size-md)}.ea-data-table--lg{--ea-data-table-font-size: var(--font-size-lg)}.ea-data-table--xl{--ea-data-table-font-size: var(--font-size-xl)}.ea-data-table__table{width:100%;border-spacing:0;border-collapse:collapse;font-family:var(--font-family-sans);font-size:var(--ea-data-table-font-size);color:var(--ea-data-table-color, var(--color-text-primary));table-layout:auto}.ea-data-table__caption{padding:calc(var(--ea-data-table-font-size) * .5) calc(var(--ea-data-table-font-size) * .75);text-align:start;font-weight:var(--font-weight-medium);color:var(--color-text-secondary);caption-side:top}.ea-data-table__head{background-color:var(--ea-data-table-header-background-color, var(--color-bg-stripe))}.ea-data-table__cell--header{position:relative;font-weight:var(--font-weight-medium);font-size:var(--ea-data-table-header-font-size, calc(var(--ea-data-table-font-size) * .75));line-height:var(--text-label-sm-lh);letter-spacing:var(--letter-spacing-wide);text-transform:var(--ea-data-table-header-text-transform, uppercase);text-align:start;white-space:nowrap;color:var(--ea-data-table-header-color, var(--color-text-secondary));border-bottom:var(--border-width-thin) solid var(--color-border-subtle);-webkit-user-select:none;user-select:none}.ea-data-table__cell--sortable{cursor:pointer;transition:var(--transition-colors)}.ea-data-table__cell--sortable:hover{color:var(--ea-data-table-header-hover-color, var(--color-text-primary));background-color:var(--ea-data-table-header-hover-background-color, var(--color-state-hover))}.ea-data-table__cell--sorted{color:var(--ea-data-table-header-sorted-color, var(--color-brand-text))}.ea-data-table__sort-button{display:inline-flex;align-items:center;width:100%;padding:0;margin:0;font:inherit;text-transform:inherit;letter-spacing:inherit;border:none;background:none;color:inherit;cursor:pointer}.ea-data-table__sort-button:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-data-table__sort-button:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-data-table__cell--align-center .ea-data-table__sort-button{justify-content:center}.ea-data-table__cell--align-right .ea-data-table__sort-button{justify-content:flex-end}.ea-data-table__header-text{display:inline;vertical-align:middle}.ea-data-table__sort-icon{display:inline-flex;vertical-align:middle;width:1em;height:1em;margin-inline-start:calc(var(--ea-data-table-font-size) * .25);opacity:.5;transition:var(--transition-opacity)}.ea-data-table__cell--sortable:hover .ea-data-table__sort-icon,.ea-data-table__cell--sorted .ea-data-table__sort-icon{opacity:1}.ea-data-table__row{border-bottom:var(--border-width-thin) solid var(--ea-data-table-row-border-color, var(--color-border-subtle));transition:var(--transition-colors)}.ea-data-table__row:last-child{border-bottom-width:0}.ea-data-table__cell{text-align:start;vertical-align:middle}.ea-data-table__cell--align-center{text-align:center}.ea-data-table__cell--align-right{text-align:end}.ea-data-table__cell--empty{text-align:center;color:var(--color-text-tertiary);font-style:italic}.ea-data-table--compact .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .375) calc(var(--ea-data-table-font-size) * .75)}.ea-data-table--comfortable .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .625) var(--ea-data-table-font-size)}.ea-data-table--spacious .ea-data-table__cell{padding:var(--ea-data-table-font-size) calc(var(--ea-data-table-font-size) * 1.5)}.ea-data-table__sizing .ea-data-table__row{border-bottom:none}.ea-data-table__sizing .ea-data-table__cell{padding-top:0;padding-bottom:0}.ea-data-table__sizing-content{overflow:hidden;visibility:hidden;height:0}.ea-data-table--sticky .ea-data-table__sizing{display:none}.ea-data-table--sticky,.ea-data-table--sticky .ea-data-table__scroll{max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__table{display:flex;flex-direction:column;min-width:calc(var(--ea-data-table-font-size) * 32);max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__head{display:block;flex-shrink:0}.ea-data-table--sticky .ea-data-table__head .ea-data-table__row--header{display:table;width:100%;table-layout:fixed}.ea-data-table--sticky .ea-data-table__body{display:block;overflow-y:auto;flex:1 1 auto;min-height:0}.ea-data-table--sticky .ea-data-table__body .ea-data-table__row{display:table;width:100%;table-layout:fixed}.ea-data-table--striped .ea-data-table__body .ea-data-table__row:nth-child(2n){background-color:var(--ea-data-table-row-stripe-background-color, var(--color-bg-stripe-subtle))}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder):hover{background-color:var(--ea-data-table-row-hover-background-color, var(--color-state-hover))}@media(forced-colors:active){.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder):hover{background-color:Highlight;color:HighlightText}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder):hover .ea-data-table__cell--sorted{color:HighlightText}}.ea-data-table--clickable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder){cursor:var(--ea-data-table-row-cursor, pointer)}.ea-data-table--linked .ea-data-table__cell{position:relative}.ea-data-table__row-link{text-decoration:none;color:inherit}.ea-data-table__row-link:hover{color:inherit}.ea-data-table__row-link:after{position:absolute;inset:0;content:\"\"}.ea-data-table__placeholder{display:inline-block;vertical-align:middle;width:100%}.ea-data-table--nowrap .ea-data-table__cell{white-space:nowrap}.ea-data-table--bordered .ea-data-table__cell{border-inline-end:var(--border-width-thin) solid var(--color-border-subtle)}.ea-data-table--bordered .ea-data-table__cell:last-child{border-inline-end:none}.ea-data-table--navigable .ea-data-table__cell:focus-visible{outline:var(--border-width-medium) solid var(--color-border-focus);outline-offset:calc(-1 * var(--border-width-medium));box-shadow:none}\n"],
14250
14869
  dependencies: [
14251
14870
  {
14252
14871
  kind: "component",
@@ -14278,6 +14897,17 @@ var DataTableComponent = class DataTableComponent {
14278
14897
  "ngTemplateOutlet",
14279
14898
  "ngTemplateOutletInjector"
14280
14899
  ]
14900
+ },
14901
+ {
14902
+ kind: "component",
14903
+ type: SkeletonComponent,
14904
+ selector: "ea-skeleton",
14905
+ inputs: [
14906
+ "variant",
14907
+ "width",
14908
+ "height",
14909
+ "animated"
14910
+ ]
14281
14911
  }
14282
14912
  ],
14283
14913
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
@@ -14298,12 +14928,13 @@ i0.ɵɵngDeclareClassMetadata({
14298
14928
  ArrowUpIconComponent,
14299
14929
  ChevronsUpDownIconComponent,
14300
14930
  NgClass,
14301
- NgTemplateOutlet
14931
+ NgTemplateOutlet,
14932
+ SkeletonComponent
14302
14933
  ],
14303
14934
  changeDetection: ChangeDetectionStrategy.OnPush,
14304
14935
  encapsulation: ViewEncapsulation.None,
14305
- template: "<ng-template\n #cellContent\n let-row\n let-col=\"col\">\n @if (col.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.cellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, value: getCellValue(row, col.key) }\" />\n } @else if (col.format) {\n {{ col.format(getCellValue(row, col.key)) }}\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n</ng-template>\n\n<div\n class=\"ea-data-table\"\n [ngClass]=\"hostClasses()\">\n <div class=\"ea-data-table__scroll\">\n <table\n class=\"ea-data-table__table\"\n [attr.role]=\"navigable() ? 'grid' : null\"\n [attr.aria-label]=\"caption() ? null : (ariaLabel() ?? null)\"\n (keydown)=\"onGridKeydown($event)\">\n @if (caption(); as captionText) {\n <caption class=\"ea-data-table__caption\">\n {{ captionText }}\n </caption>\n }\n <thead class=\"ea-data-table__head\">\n <tr\n class=\"ea-data-table__row ea-data-table__row--header\"\n [attr.role]=\"navigable() ? 'row' : null\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <th\n scope=\"col\"\n class=\"ea-data-table__cell ea-data-table__cell--header\"\n [attr.role]=\"navigable() ? 'columnheader' : null\"\n [attr.data-ea-cell]=\"navigable() ? '0-' + colIndex : null\"\n [class.ea-data-table__cell--sortable]=\"col.sortable\"\n [class.ea-data-table__cell--sorted]=\"\n sort().column === col.key && sort().direction\n \"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.aria-sort]=\"\n sort().column === col.key && sort().direction === 'asc'\n ? 'ascending'\n : sort().column === col.key && sort().direction === 'desc'\n ? 'descending'\n : col.sortable\n ? 'none'\n : null\n \"\n (keydown.enter)=\"onHeaderKeydown($event, col)\"\n (keydown.space)=\"onHeaderKeydown($event, col)\"\n (focus)=\"onCellFocus(0, colIndex)\"\n [attr.tabindex]=\"headerTabindex(colIndex)\">\n @if (col.sortable) {\n <button\n type=\"button\"\n class=\"ea-data-table__sort-button\"\n [attr.tabindex]=\"navigable() ? -1 : null\"\n (click)=\"onHeaderClick(col)\"\n (focus)=\"onCellFocus(0, colIndex)\">\n @if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n <span class=\"ea-data-table__sort-icon\">\n @if (sort().column === col.key && sort().direction === 'asc') {\n <ea-icon-arrow-up />\n } @else if (\n sort().column === col.key && sort().direction === 'desc'\n ) {\n <ea-icon-arrow-down />\n } @else {\n <ea-icon-chevrons-up-down />\n }\n </span>\n </button>\n } @else if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n @if (sizingRows().length) {\n <tbody\n class=\"ea-data-table__sizing\"\n aria-hidden=\"true\">\n @for (row of sizingRows(); track $index) {\n <tr class=\"ea-data-table__row ea-data-table__row--sizing\">\n @for (col of columns(); track col.key) {\n <td\n class=\"ea-data-table__cell ea-data-table__cell--sizing\"\n [style.width]=\"col.width ?? null\">\n <div class=\"ea-data-table__sizing-content\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n }\n <tbody class=\"ea-data-table__body\">\n @if (sortedData().length === 0) {\n <tr\n class=\"ea-data-table__row ea-data-table__row--empty\"\n [attr.role]=\"navigable() ? 'row' : null\">\n <td\n class=\"ea-data-table__cell ea-data-table__cell--empty\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.colspan]=\"columns().length\">\n <div role=\"status\">\n @if (noDataTemplate()) {\n <ng-container [ngTemplateOutlet]=\"noDataTemplate()!\" />\n } @else {\n {{ resolvedNoDataText() }}\n }\n </div>\n </td>\n </tr>\n } @else {\n @for (\n row of sortedData();\n track trackByFn($index, row);\n let rowIndex = $index\n ) {\n <tr\n class=\"ea-data-table__row\"\n [class.ea-data-table__row--inert]=\"isInert(row)\"\n [attr.role]=\"navigable() ? 'row' : null\"\n [attr.tabindex]=\"rowTabindex(row)\"\n (click)=\"onRowActivate(row, $event)\"\n (keydown.enter)=\"onRowActivate(row, $event)\"\n (keydown.space)=\"onRowActivate(row, $event)\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <td\n class=\"ea-data-table__cell\"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.data-ea-cell]=\"navigable() ? rowIndex + 1 + '-' + colIndex : null\"\n [attr.tabindex]=\"bodyCellTabindex(rowIndex + 1, colIndex)\"\n (focus)=\"onCellFocus(rowIndex + 1, colIndex)\">\n @if (rowHref()?.(row); as url) {\n <a\n class=\"ea-data-table__row-link\"\n [href]=\"url\"\n tabindex=\"-1\"\n [attr.aria-hidden]=\"colIndex > 0 ? true : null\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </a>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n <ng-content select=\"ea-paginator\" />\n</div>\n",
14306
- styles: [".ea-data-table{--ea-data-table-font-size: var(--font-size-md);overflow:hidden;width:100%;border:var(--border-width-thin) solid var(--color-border-subtle);border-radius:var(--radius-lg);background-color:var(--ea-data-table-background-color, var(--color-bg-base))}.ea-data-table__scroll{overflow-x:auto}.ea-data-table--2xs{--ea-data-table-font-size: var(--font-size-2xs)}.ea-data-table--xs{--ea-data-table-font-size: var(--font-size-xs)}.ea-data-table--sm{--ea-data-table-font-size: var(--font-size-sm)}.ea-data-table--md{--ea-data-table-font-size: var(--font-size-md)}.ea-data-table--lg{--ea-data-table-font-size: var(--font-size-lg)}.ea-data-table--xl{--ea-data-table-font-size: var(--font-size-xl)}.ea-data-table__table{width:100%;border-spacing:0;border-collapse:collapse;font-family:var(--font-family-sans);font-size:var(--ea-data-table-font-size);color:var(--ea-data-table-color, var(--color-text-primary));table-layout:auto}.ea-data-table__caption{padding:calc(var(--ea-data-table-font-size) * .5) calc(var(--ea-data-table-font-size) * .75);text-align:start;font-weight:var(--font-weight-medium);color:var(--color-text-secondary);caption-side:top}.ea-data-table__head{background-color:var(--ea-data-table-header-background-color, var(--color-bg-stripe))}.ea-data-table__cell--header{position:relative;font-weight:var(--font-weight-medium);font-size:var(--ea-data-table-header-font-size, calc(var(--ea-data-table-font-size) * .75));line-height:var(--text-label-sm-lh);letter-spacing:var(--letter-spacing-wide);text-transform:var(--ea-data-table-header-text-transform, uppercase);text-align:start;white-space:nowrap;color:var(--ea-data-table-header-color, var(--color-text-secondary));border-bottom:var(--border-width-thin) solid var(--color-border-subtle);-webkit-user-select:none;user-select:none}.ea-data-table__cell--sortable{cursor:pointer;transition:var(--transition-colors)}.ea-data-table__cell--sortable:hover{color:var(--ea-data-table-header-hover-color, var(--color-text-primary));background-color:var(--ea-data-table-header-hover-background-color, var(--color-state-hover))}.ea-data-table__cell--sorted{color:var(--ea-data-table-header-sorted-color, var(--color-brand-text))}.ea-data-table__sort-button{display:inline-flex;align-items:center;width:100%;padding:0;margin:0;font:inherit;text-transform:inherit;letter-spacing:inherit;border:none;background:none;color:inherit;cursor:pointer}.ea-data-table__sort-button:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-data-table__sort-button:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-data-table__cell--align-center .ea-data-table__sort-button{justify-content:center}.ea-data-table__cell--align-right .ea-data-table__sort-button{justify-content:flex-end}.ea-data-table__header-text{display:inline;vertical-align:middle}.ea-data-table__sort-icon{display:inline-flex;vertical-align:middle;width:1em;height:1em;margin-inline-start:calc(var(--ea-data-table-font-size) * .25);opacity:.5;transition:var(--transition-opacity)}.ea-data-table__cell--sortable:hover .ea-data-table__sort-icon,.ea-data-table__cell--sorted .ea-data-table__sort-icon{opacity:1}.ea-data-table__row{border-bottom:var(--border-width-thin) solid var(--ea-data-table-row-border-color, var(--color-border-subtle));transition:var(--transition-colors)}.ea-data-table__row:last-child{border-bottom-width:0}.ea-data-table__cell{text-align:start;vertical-align:middle}.ea-data-table__cell--align-center{text-align:center}.ea-data-table__cell--align-right{text-align:end}.ea-data-table__cell--empty{text-align:center;color:var(--color-text-tertiary);font-style:italic}.ea-data-table--compact .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .375) calc(var(--ea-data-table-font-size) * .75)}.ea-data-table--comfortable .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .625) var(--ea-data-table-font-size)}.ea-data-table--spacious .ea-data-table__cell{padding:var(--ea-data-table-font-size) calc(var(--ea-data-table-font-size) * 1.5)}.ea-data-table__sizing .ea-data-table__row{border-bottom:none}.ea-data-table__sizing .ea-data-table__cell{padding-top:0;padding-bottom:0}.ea-data-table__sizing-content{overflow:hidden;visibility:hidden;height:0}.ea-data-table--sticky .ea-data-table__sizing{display:none}.ea-data-table--sticky,.ea-data-table--sticky .ea-data-table__scroll{max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__table{display:flex;flex-direction:column;min-width:calc(var(--ea-data-table-font-size) * 32);max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__head{display:block;flex-shrink:0}.ea-data-table--sticky .ea-data-table__head .ea-data-table__row--header{display:table;width:100%;table-layout:fixed}.ea-data-table--sticky .ea-data-table__body{display:block;overflow-y:auto;flex:1 1 auto;min-height:0}.ea-data-table--sticky .ea-data-table__body .ea-data-table__row{display:table;width:100%;table-layout:fixed}.ea-data-table--striped .ea-data-table__body .ea-data-table__row:nth-child(2n){background-color:var(--ea-data-table-row-stripe-background-color, var(--color-bg-stripe-subtle))}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):hover{background-color:var(--ea-data-table-row-hover-background-color, var(--color-state-hover))}@media(forced-colors:active){.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):hover{background-color:Highlight;color:HighlightText}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):hover .ea-data-table__cell--sorted{color:HighlightText}}.ea-data-table--clickable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert){cursor:var(--ea-data-table-row-cursor, pointer)}.ea-data-table--linked .ea-data-table__cell{position:relative}.ea-data-table__row-link{text-decoration:none;color:inherit}.ea-data-table__row-link:hover{color:inherit}.ea-data-table__row-link:after{position:absolute;inset:0;content:\"\"}.ea-data-table--nowrap .ea-data-table__cell{white-space:nowrap}.ea-data-table--bordered .ea-data-table__cell{border-inline-end:var(--border-width-thin) solid var(--color-border-subtle)}.ea-data-table--bordered .ea-data-table__cell:last-child{border-inline-end:none}.ea-data-table--navigable .ea-data-table__cell:focus-visible{outline:var(--border-width-medium) solid var(--color-border-focus);outline-offset:calc(-1 * var(--border-width-medium));box-shadow:none}\n"]
14936
+ template: "<ng-template\n #cellContent\n let-row\n let-col=\"col\">\n @if (col.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.cellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, value: getCellValue(row, col.key) }\" />\n } @else if (col.format) {\n {{ col.format(getCellValue(row, col.key)) }}\n } @else {\n {{ getCellValue(row, col.key) }}\n }\n</ng-template>\n\n<div\n class=\"ea-data-table\"\n [ngClass]=\"hostClasses()\">\n <div class=\"ea-data-table__scroll\">\n <table\n class=\"ea-data-table__table\"\n [attr.role]=\"navigable() ? 'grid' : null\"\n [attr.aria-label]=\"caption() ? null : (ariaLabel() ?? null)\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (keydown)=\"onGridKeydown($event)\"\n (keyup)=\"clearKeyboardRequest()\"\n (pointerdown)=\"clearKeyboardRequest()\">\n @if (caption(); as captionText) {\n <caption class=\"ea-data-table__caption\">\n {{ captionText }}\n </caption>\n }\n <thead class=\"ea-data-table__head\">\n <tr\n class=\"ea-data-table__row ea-data-table__row--header\"\n [attr.role]=\"navigable() ? 'row' : null\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <th\n scope=\"col\"\n class=\"ea-data-table__cell ea-data-table__cell--header\"\n [attr.role]=\"navigable() ? 'columnheader' : null\"\n [attr.data-ea-cell]=\"navigable() ? '0-' + colIndex : null\"\n [class.ea-data-table__cell--sortable]=\"col.sortable\"\n [class.ea-data-table__cell--sorted]=\"\n sort().column === col.key && sort().direction\n \"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.aria-sort]=\"\n sort().column === col.key && sort().direction === 'asc'\n ? 'ascending'\n : sort().column === col.key && sort().direction === 'desc'\n ? 'descending'\n : col.sortable\n ? 'none'\n : null\n \"\n (keydown.enter)=\"onHeaderKeydown($event, col)\"\n (keydown.space)=\"onHeaderKeydown($event, col)\"\n (focus)=\"onCellFocus(0, colIndex)\"\n [attr.tabindex]=\"headerTabindex(colIndex)\">\n @if (col.sortable) {\n <button\n type=\"button\"\n class=\"ea-data-table__sort-button\"\n [attr.tabindex]=\"navigable() ? -1 : null\"\n (click)=\"onHeaderClick(col)\"\n (focus)=\"onCellFocus(0, colIndex)\">\n @if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n <span class=\"ea-data-table__sort-icon\">\n @if (sort().column === col.key && sort().direction === 'asc') {\n <ea-icon-arrow-up />\n } @else if (\n sort().column === col.key && sort().direction === 'desc'\n ) {\n <ea-icon-arrow-down />\n } @else {\n <ea-icon-chevrons-up-down />\n }\n </span>\n </button>\n } @else if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col }\" />\n } @else {\n <span class=\"ea-data-table__header-text\">{{ col.label }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n @if (sizingRows().length) {\n <tbody\n class=\"ea-data-table__sizing\"\n aria-hidden=\"true\">\n @for (row of sizingRows(); track $index) {\n <tr class=\"ea-data-table__row ea-data-table__row--sizing\">\n @for (col of columns(); track col.key) {\n <td\n class=\"ea-data-table__cell ea-data-table__cell--sizing\"\n [style.width]=\"col.width ?? null\">\n <div class=\"ea-data-table__sizing-content\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n }\n <tbody class=\"ea-data-table__body\">\n @if (loading()) {\n @for (index of placeholderRows(); track index) {\n <tr\n class=\"ea-data-table__row ea-data-table__row--placeholder\"\n aria-hidden=\"true\"\n [attr.role]=\"navigable() ? 'row' : null\">\n @for (col of columns(); track col.key) {\n <td\n class=\"ea-data-table__cell\"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.role]=\"navigable() ? 'gridcell' : null\">\n @if (col.placeholderTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.placeholderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, index }\" />\n } @else {\n <span class=\"ea-data-table__placeholder\">\n <ea-skeleton height=\"1em\" />\n </span>\n }\n </td>\n }\n </tr>\n }\n } @else if (sortedData().length === 0) {\n <tr\n class=\"ea-data-table__row ea-data-table__row--empty\"\n [attr.role]=\"navigable() ? 'row' : null\">\n <td\n class=\"ea-data-table__cell ea-data-table__cell--empty\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.colspan]=\"columns().length\">\n <div role=\"status\">\n @if (noDataTemplate()) {\n <ng-container [ngTemplateOutlet]=\"noDataTemplate()!\" />\n } @else {\n {{ resolvedNoDataText() }}\n }\n </div>\n </td>\n </tr>\n } @else {\n @for (\n row of sortedData();\n track trackByFn($index, row);\n let rowIndex = $index\n ) {\n <tr\n #rowEl\n class=\"ea-data-table__row\"\n [class.ea-data-table__row--inert]=\"isInert(row)\"\n [attr.role]=\"navigable() ? 'row' : null\"\n [attr.tabindex]=\"rowTabindex(row)\"\n (click)=\"onRowActivate(row, $event)\"\n (keydown.enter)=\"onRowActivate(row, $event)\"\n (keydown.space)=\"onRowActivate(row, $event)\"\n (keydown)=\"onRowContextMenu(row, rowEl, $event)\"\n (contextmenu)=\"onRowContextMenu(row, rowEl, $event)\">\n @for (col of columns(); track col.key; let colIndex = $index) {\n <td\n class=\"ea-data-table__cell\"\n [class.ea-data-table__cell--align-center]=\"col.align === 'center'\"\n [class.ea-data-table__cell--align-right]=\"col.align === 'right'\"\n [style.width]=\"col.width ?? null\"\n [attr.role]=\"navigable() ? 'gridcell' : null\"\n [attr.data-ea-cell]=\"navigable() ? rowIndex + 1 + '-' + colIndex : null\"\n [attr.tabindex]=\"bodyCellTabindex(rowIndex + 1, colIndex)\"\n (focus)=\"onCellFocus(rowIndex + 1, colIndex)\">\n @if (rowHref()?.(row); as url) {\n <a\n class=\"ea-data-table__row-link\"\n [href]=\"url\"\n tabindex=\"-1\"\n [attr.aria-hidden]=\"colIndex > 0 ? true : null\">\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n </a>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"cellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, col }\" />\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n <ng-content select=\"ea-paginator\" />\n</div>\n",
14937
+ styles: [".ea-data-table{--ea-data-table-font-size: var(--font-size-md);overflow:hidden;width:100%;border:var(--border-width-thin) solid var(--color-border-subtle);border-radius:var(--radius-lg);background-color:var(--ea-data-table-background-color, var(--color-bg-base))}.ea-data-table__scroll{overflow-x:auto}.ea-data-table--2xs{--ea-data-table-font-size: var(--font-size-2xs)}.ea-data-table--xs{--ea-data-table-font-size: var(--font-size-xs)}.ea-data-table--sm{--ea-data-table-font-size: var(--font-size-sm)}.ea-data-table--md{--ea-data-table-font-size: var(--font-size-md)}.ea-data-table--lg{--ea-data-table-font-size: var(--font-size-lg)}.ea-data-table--xl{--ea-data-table-font-size: var(--font-size-xl)}.ea-data-table__table{width:100%;border-spacing:0;border-collapse:collapse;font-family:var(--font-family-sans);font-size:var(--ea-data-table-font-size);color:var(--ea-data-table-color, var(--color-text-primary));table-layout:auto}.ea-data-table__caption{padding:calc(var(--ea-data-table-font-size) * .5) calc(var(--ea-data-table-font-size) * .75);text-align:start;font-weight:var(--font-weight-medium);color:var(--color-text-secondary);caption-side:top}.ea-data-table__head{background-color:var(--ea-data-table-header-background-color, var(--color-bg-stripe))}.ea-data-table__cell--header{position:relative;font-weight:var(--font-weight-medium);font-size:var(--ea-data-table-header-font-size, calc(var(--ea-data-table-font-size) * .75));line-height:var(--text-label-sm-lh);letter-spacing:var(--letter-spacing-wide);text-transform:var(--ea-data-table-header-text-transform, uppercase);text-align:start;white-space:nowrap;color:var(--ea-data-table-header-color, var(--color-text-secondary));border-bottom:var(--border-width-thin) solid var(--color-border-subtle);-webkit-user-select:none;user-select:none}.ea-data-table__cell--sortable{cursor:pointer;transition:var(--transition-colors)}.ea-data-table__cell--sortable:hover{color:var(--ea-data-table-header-hover-color, var(--color-text-primary));background-color:var(--ea-data-table-header-hover-background-color, var(--color-state-hover))}.ea-data-table__cell--sorted{color:var(--ea-data-table-header-sorted-color, var(--color-brand-text))}.ea-data-table__sort-button{display:inline-flex;align-items:center;width:100%;padding:0;margin:0;font:inherit;text-transform:inherit;letter-spacing:inherit;border:none;background:none;color:inherit;cursor:pointer}.ea-data-table__sort-button:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-data-table__sort-button:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-data-table__cell--align-center .ea-data-table__sort-button{justify-content:center}.ea-data-table__cell--align-right .ea-data-table__sort-button{justify-content:flex-end}.ea-data-table__header-text{display:inline;vertical-align:middle}.ea-data-table__sort-icon{display:inline-flex;vertical-align:middle;width:1em;height:1em;margin-inline-start:calc(var(--ea-data-table-font-size) * .25);opacity:.5;transition:var(--transition-opacity)}.ea-data-table__cell--sortable:hover .ea-data-table__sort-icon,.ea-data-table__cell--sorted .ea-data-table__sort-icon{opacity:1}.ea-data-table__row{border-bottom:var(--border-width-thin) solid var(--ea-data-table-row-border-color, var(--color-border-subtle));transition:var(--transition-colors)}.ea-data-table__row:last-child{border-bottom-width:0}.ea-data-table__cell{text-align:start;vertical-align:middle}.ea-data-table__cell--align-center{text-align:center}.ea-data-table__cell--align-right{text-align:end}.ea-data-table__cell--empty{text-align:center;color:var(--color-text-tertiary);font-style:italic}.ea-data-table--compact .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .375) calc(var(--ea-data-table-font-size) * .75)}.ea-data-table--comfortable .ea-data-table__cell{padding:calc(var(--ea-data-table-font-size) * .625) var(--ea-data-table-font-size)}.ea-data-table--spacious .ea-data-table__cell{padding:var(--ea-data-table-font-size) calc(var(--ea-data-table-font-size) * 1.5)}.ea-data-table__sizing .ea-data-table__row{border-bottom:none}.ea-data-table__sizing .ea-data-table__cell{padding-top:0;padding-bottom:0}.ea-data-table__sizing-content{overflow:hidden;visibility:hidden;height:0}.ea-data-table--sticky .ea-data-table__sizing{display:none}.ea-data-table--sticky,.ea-data-table--sticky .ea-data-table__scroll{max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__table{display:flex;flex-direction:column;min-width:calc(var(--ea-data-table-font-size) * 32);max-height:inherit;height:inherit}.ea-data-table--sticky .ea-data-table__head{display:block;flex-shrink:0}.ea-data-table--sticky .ea-data-table__head .ea-data-table__row--header{display:table;width:100%;table-layout:fixed}.ea-data-table--sticky .ea-data-table__body{display:block;overflow-y:auto;flex:1 1 auto;min-height:0}.ea-data-table--sticky .ea-data-table__body .ea-data-table__row{display:table;width:100%;table-layout:fixed}.ea-data-table--striped .ea-data-table__body .ea-data-table__row:nth-child(2n){background-color:var(--ea-data-table-row-stripe-background-color, var(--color-bg-stripe-subtle))}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder):hover{background-color:var(--ea-data-table-row-hover-background-color, var(--color-state-hover))}@media(forced-colors:active){.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder):hover{background-color:Highlight;color:HighlightText}.ea-data-table--hoverable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder):hover .ea-data-table__cell--sorted{color:HighlightText}}.ea-data-table--clickable .ea-data-table__body .ea-data-table__row:not(.ea-data-table__row--empty):not(.ea-data-table__row--inert):not(.ea-data-table__row--placeholder){cursor:var(--ea-data-table-row-cursor, pointer)}.ea-data-table--linked .ea-data-table__cell{position:relative}.ea-data-table__row-link{text-decoration:none;color:inherit}.ea-data-table__row-link:hover{color:inherit}.ea-data-table__row-link:after{position:absolute;inset:0;content:\"\"}.ea-data-table__placeholder{display:inline-block;vertical-align:middle;width:100%}.ea-data-table--nowrap .ea-data-table__cell{white-space:nowrap}.ea-data-table--bordered .ea-data-table__cell{border-inline-end:var(--border-width-thin) solid var(--color-border-subtle)}.ea-data-table--bordered .ea-data-table__cell:last-child{border-inline-end:none}.ea-data-table--navigable .ea-data-table__cell:focus-visible{outline:var(--border-width-medium) solid var(--color-border-focus);outline-offset:calc(-1 * var(--border-width-medium));box-shadow:none}\n"]
14307
14938
  }]
14308
14939
  }],
14309
14940
  ctorParameters: () => [],
@@ -14444,6 +15075,22 @@ i0.ɵɵngDeclareClassMetadata({
14444
15075
  required: false
14445
15076
  }]
14446
15077
  }],
15078
+ loading: [{
15079
+ type: i0.Input,
15080
+ args: [{
15081
+ isSignal: true,
15082
+ alias: "loading",
15083
+ required: false
15084
+ }]
15085
+ }],
15086
+ loadingRowCount: [{
15087
+ type: i0.Input,
15088
+ args: [{
15089
+ isSignal: true,
15090
+ alias: "loadingRowCount",
15091
+ required: false
15092
+ }]
15093
+ }],
14447
15094
  sort: [{
14448
15095
  type: i0.Input,
14449
15096
  args: [{
@@ -14463,6 +15110,10 @@ i0.ɵɵngDeclareClassMetadata({
14463
15110
  type: i0.Output,
14464
15111
  args: ["rowActivate"]
14465
15112
  }],
15113
+ rowContextMenu: [{
15114
+ type: i0.Output,
15115
+ args: ["rowContextMenu"]
15116
+ }],
14466
15117
  noDataTemplate: [{
14467
15118
  type: i0.ContentChild,
14468
15119
  args: ["noData", { isSignal: true }]
@@ -15814,6 +16465,7 @@ var DatePickerComponent = class DatePickerComponent {
15814
16465
  "anchor",
15815
16466
  "open",
15816
16467
  "placement",
16468
+ "anchorPoint",
15817
16469
  "role",
15818
16470
  "aria-label",
15819
16471
  "aria-labelledby",
@@ -15826,9 +16478,10 @@ var DatePickerComponent = class DatePickerComponent {
15826
16478
  "maxWidth",
15827
16479
  "closeOnOutsideClick",
15828
16480
  "closeOnEscape",
15829
- "scrollBehavior"
16481
+ "scrollBehavior",
16482
+ "contextMenu"
15830
16483
  ],
15831
- outputs: ["closeRequested"]
16484
+ outputs: ["closeRequested", "openRequested"]
15832
16485
  },
15833
16486
  {
15834
16487
  kind: "component",
@@ -16081,7 +16734,21 @@ i0.ɵɵngDeclareClassMetadata({
16081
16734
  args: [{ providedIn: "root" }]
16082
16735
  }]
16083
16736
  });
16737
+ var DialogRef = class {
16738
+ isClosed = signal(false, ...ngDevMode ? [{ debugName: "isClosed" }] : /* istanbul ignore next */ []);
16739
+ settler = { settle: () => void 0 };
16740
+ closed = this.isClosed.asReadonly();
16741
+ result = new Promise((resolve) => {
16742
+ this.settler = { settle: resolve };
16743
+ });
16744
+ close(value) {
16745
+ if (untracked(this.isClosed)) return;
16746
+ this.isClosed.set(true);
16747
+ this.settler.settle(value);
16748
+ }
16749
+ };
16084
16750
  const FLOATING_SURFACES = "dialog, .ea-popover__surface, .ea-tooltip, .ea-toast";
16751
+ const boundRefs = /* @__PURE__ */ new WeakSet();
16085
16752
  var DialogComponent = class DialogComponent {
16086
16753
  dialogEl = viewChild("dialogEl", ...ngDevMode ? [{ debugName: "dialogEl" }] : /* istanbul ignore next */ []);
16087
16754
  headerEl = viewChild("headerEl", ...ngDevMode ? [{ debugName: "headerEl" }] : /* istanbul ignore next */ []);
@@ -16091,6 +16758,7 @@ var DialogComponent = class DialogComponent {
16091
16758
  press = inject(PointerPressTracker);
16092
16759
  scrollLock = inject(ScrollLock);
16093
16760
  holdsScroll = false;
16761
+ boundRef = null;
16094
16762
  width = input("md", ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
16095
16763
  modal = input(true, ...ngDevMode ? [{ debugName: "modal" }] : /* istanbul ignore next */ []);
16096
16764
  closeOnBackdrop = input(true, ...ngDevMode ? [{ debugName: "closeOnBackdrop" }] : /* istanbul ignore next */ []);
@@ -16114,6 +16782,12 @@ var DialogComponent = class DialogComponent {
16114
16782
  this.hasHeader.set(!!header && (header.children.length > 0 || !!header.textContent?.trim()));
16115
16783
  }
16116
16784
  constructor() {
16785
+ const ref = inject(DialogRef, { optional: true });
16786
+ if (ref && !boundRefs.has(ref) && !untracked(ref.closed)) {
16787
+ boundRefs.add(ref);
16788
+ this.boundRef = ref;
16789
+ this.open.set(true);
16790
+ }
16117
16791
  effect(() => {
16118
16792
  const dialogRef = this.dialogEl()?.nativeElement;
16119
16793
  const open = this.open();
@@ -16127,14 +16801,21 @@ var DialogComponent = class DialogComponent {
16127
16801
  } else dialogRef.show();
16128
16802
  this.opened.emit();
16129
16803
  }
16130
- } else if (dialogRef.open) {
16131
- dialogRef.close();
16132
- this.dropScroll();
16133
- this.previouslyFocused?.focus?.();
16134
- this.previouslyFocused = null;
16135
- }
16804
+ } else if (dialogRef.open) this.closeSurface();
16805
+ });
16806
+ inject(DestroyRef).onDestroy(() => {
16807
+ if (this.boundRef) {
16808
+ boundRefs.delete(this.boundRef);
16809
+ this.closeSurface();
16810
+ } else this.dropScroll();
16136
16811
  });
16137
- inject(DestroyRef).onDestroy(() => this.dropScroll());
16812
+ }
16813
+ closeSurface() {
16814
+ const dialog = this.dialogEl()?.nativeElement;
16815
+ if (dialog?.open) dialog.close();
16816
+ this.dropScroll();
16817
+ this.previouslyFocused?.focus?.();
16818
+ this.previouslyFocused = null;
16138
16819
  }
16139
16820
  holdScroll() {
16140
16821
  if (!this.holdsScroll) {
@@ -16151,6 +16832,7 @@ var DialogComponent = class DialogComponent {
16151
16832
  handleClose() {
16152
16833
  this.open.set(false);
16153
16834
  this.closed.emit();
16835
+ this.boundRef?.close();
16154
16836
  }
16155
16837
  requestClose() {
16156
16838
  if (this.manualClose()) {
@@ -16438,6 +17120,94 @@ i0.ɵɵngDeclareClassMetadata({
16438
17120
  }]
16439
17121
  }
16440
17122
  });
17123
+ var ServiceDialogRef = class extends DialogRef {
17124
+ teardown;
17125
+ constructor(teardown) {
17126
+ super();
17127
+ this.teardown = teardown;
17128
+ }
17129
+ close(value) {
17130
+ if (untracked(this.closed)) return;
17131
+ super.close(value);
17132
+ this.teardown();
17133
+ }
17134
+ };
17135
+ var DialogService = class DialogService {
17136
+ appRef = inject(ApplicationRef);
17137
+ document = inject(DOCUMENT);
17138
+ injector = inject(Injector);
17139
+ isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
17140
+ openDialogs = signal([], ...ngDevMode ? [{ debugName: "openDialogs" }] : /* istanbul ignore next */ []);
17141
+ dialogs = this.openDialogs.asReadonly();
17142
+ constructor() {
17143
+ inject(DestroyRef).onDestroy(() => this.closeAll());
17144
+ }
17145
+ open(component, options = {}) {
17146
+ let componentRef = null;
17147
+ const ref = new ServiceDialogRef(() => {
17148
+ this.openDialogs.update((open) => open.filter((dialog) => dialog !== ref));
17149
+ if (componentRef) {
17150
+ const host = componentRef.location.nativeElement;
17151
+ componentRef.destroy();
17152
+ host.remove();
17153
+ }
17154
+ });
17155
+ if (!this.isBrowser) {
17156
+ ref.close();
17157
+ return ref;
17158
+ }
17159
+ const parent = options.injector ?? this.injector;
17160
+ const created = createComponent(component, {
17161
+ environmentInjector: parent.get(EnvironmentInjector),
17162
+ elementInjector: Injector.create({
17163
+ providers: [{
17164
+ provide: DialogRef,
17165
+ useValue: ref
17166
+ }],
17167
+ parent
17168
+ })
17169
+ });
17170
+ if (untracked(ref.closed)) {
17171
+ created.destroy();
17172
+ return ref;
17173
+ }
17174
+ componentRef = created;
17175
+ for (const [name, value] of Object.entries(options.inputs ?? {})) created.setInput(name, value);
17176
+ this.appRef.attachView(created.hostView);
17177
+ this.document.body.appendChild(created.location.nativeElement);
17178
+ this.openDialogs.update((open) => [...open, ref]);
17179
+ return ref;
17180
+ }
17181
+ closeAll() {
17182
+ for (const ref of [...untracked(this.openDialogs)].reverse()) ref.close();
17183
+ }
17184
+ static ɵfac = i0.ɵɵngDeclareFactory({
17185
+ minVersion: "12.0.0",
17186
+ version: "22.2.0",
17187
+ ngImport: i0,
17188
+ type: DialogService,
17189
+ deps: [],
17190
+ target: i0.ɵɵFactoryTarget.Injectable
17191
+ });
17192
+ static ɵprov = i0.ɵɵngDeclareInjectable({
17193
+ minVersion: "12.0.0",
17194
+ version: "22.2.0",
17195
+ ngImport: i0,
17196
+ type: DialogService,
17197
+ providedIn: "root"
17198
+ });
17199
+ };
17200
+ i0.ɵɵngDeclareClassMetadata({
17201
+ minVersion: "12.0.0",
17202
+ version: "22.2.0",
17203
+ ngImport: i0,
17204
+ type: DialogService,
17205
+ decorators: [{
17206
+ type: Injectable,
17207
+ args: [{ providedIn: "root" }]
17208
+ }],
17209
+ ctorParameters: () => []
17210
+ });
16441
17211
  const PUSH_PROPERTY = {
16442
17212
  right: "padding-right",
16443
17213
  left: "padding-left",
@@ -17339,6 +18109,7 @@ var DropdownComponent = class DropdownComponent {
17339
18109
  "anchor",
17340
18110
  "open",
17341
18111
  "placement",
18112
+ "anchorPoint",
17342
18113
  "role",
17343
18114
  "aria-label",
17344
18115
  "aria-labelledby",
@@ -17351,9 +18122,10 @@ var DropdownComponent = class DropdownComponent {
17351
18122
  "maxWidth",
17352
18123
  "closeOnOutsideClick",
17353
18124
  "closeOnEscape",
17354
- "scrollBehavior"
18125
+ "scrollBehavior",
18126
+ "contextMenu"
17355
18127
  ],
17356
- outputs: ["closeRequested"]
18128
+ outputs: ["closeRequested", "openRequested"]
17357
18129
  }
17358
18130
  ],
17359
18131
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -21159,316 +21931,6 @@ i0.ɵɵngDeclareClassMetadata({
21159
21931
  }]
21160
21932
  }
21161
21933
  });
21162
- var MenuComponent = class MenuComponent {
21163
- injector = inject(Injector);
21164
- i18n = inject(EagamiI18nService);
21165
- listEl = viewChild("listEl", ...ngDevMode ? [{ debugName: "listEl" }] : /* istanbul ignore next */ []);
21166
- placement = input("bottom-start", ...ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []);
21167
- size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
21168
- maxHeight = input("20rem", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
21169
- disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
21170
- ariaLabel = input(void 0, {
21171
- ...ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {},
21172
- alias: "aria-label"
21173
- });
21174
- id = input(uniqueId("ea-menu"), ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
21175
- resolvedAriaLabel = computed(() => this.ariaLabel() ?? this.i18n.messages().menu.label, ...ngDevMode ? [{ debugName: "resolvedAriaLabel" }] : /* istanbul ignore next */ []);
21176
- open = model(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
21177
- opened = output();
21178
- closed = output();
21179
- triggerEl = signal(void 0, ...ngDevMode ? [{ debugName: "triggerEl" }] : /* istanbul ignore next */ []);
21180
- activeItemId = signal(null, ...ngDevMode ? [{ debugName: "activeItemId" }] : /* istanbul ignore next */ []);
21181
- constructor() {
21182
- effect(() => {
21183
- if (!this.open()) {
21184
- this.activeItemId.set(null);
21185
- return;
21186
- }
21187
- afterNextRender(() => {
21188
- if (this.open() && !this.activeItemId()) {
21189
- const first = this.getEnabledItems()[0];
21190
- if (first) this.activeItemId.set(first.id);
21191
- }
21192
- }, { injector: this.injector });
21193
- });
21194
- }
21195
- toggleAt(triggerEl) {
21196
- if (this.disabled()) return;
21197
- if (this.open()) this.close();
21198
- else this.openAt(triggerEl);
21199
- }
21200
- openAt(triggerEl) {
21201
- if (this.disabled()) return;
21202
- this.triggerEl.set(triggerEl);
21203
- this.open.set(true);
21204
- this.opened.emit();
21205
- afterNextRender(() => this.focusFirstItem(), { injector: this.injector });
21206
- }
21207
- close(restoreFocus = false) {
21208
- if (!this.open()) return;
21209
- this.open.set(false);
21210
- this.closed.emit();
21211
- if (restoreFocus) this.triggerEl()?.focus({ preventScroll: true });
21212
- }
21213
- onPopoverCloseRequested() {
21214
- this.close();
21215
- }
21216
- getEnabledItems() {
21217
- const list = this.listEl()?.nativeElement;
21218
- if (!list) return [];
21219
- return Array.from(list.querySelectorAll("[role=\"menuitem\"]:not([disabled])"));
21220
- }
21221
- focusFirstItem() {
21222
- this.focusItem(this.getEnabledItems()[0]);
21223
- }
21224
- focusItem(item) {
21225
- if (!item) return;
21226
- this.activeItemId.set(item.id);
21227
- item.focus({ preventScroll: true });
21228
- }
21229
- onKeydown(event) {
21230
- if (!this.open()) return;
21231
- const list = this.listEl()?.nativeElement;
21232
- const active = document.activeElement;
21233
- if (!list || !active || !list.contains(active)) return;
21234
- const items = this.getEnabledItems();
21235
- if (items.length === 0) return;
21236
- const current = items.indexOf(active);
21237
- let next = -1;
21238
- switch (event.key) {
21239
- case "ArrowDown":
21240
- event.preventDefault();
21241
- next = current < items.length - 1 ? current + 1 : 0;
21242
- break;
21243
- case "ArrowUp":
21244
- event.preventDefault();
21245
- next = current > 0 ? current - 1 : items.length - 1;
21246
- break;
21247
- case "Home":
21248
- event.preventDefault();
21249
- next = 0;
21250
- break;
21251
- case "End":
21252
- event.preventDefault();
21253
- next = items.length - 1;
21254
- break;
21255
- }
21256
- if (next >= 0) this.focusItem(items[next]);
21257
- }
21258
- onEscape(event) {
21259
- if (!this.open()) return;
21260
- event.preventDefault();
21261
- this.close(true);
21262
- }
21263
- static ɵfac = i0.ɵɵngDeclareFactory({
21264
- minVersion: "12.0.0",
21265
- version: "22.2.0",
21266
- ngImport: i0,
21267
- type: MenuComponent,
21268
- deps: [],
21269
- target: i0.ɵɵFactoryTarget.Component
21270
- });
21271
- static ɵcmp = i0.ɵɵngDeclareComponent({
21272
- minVersion: "17.2.0",
21273
- version: "22.2.0",
21274
- type: MenuComponent,
21275
- isStandalone: true,
21276
- selector: "ea-menu",
21277
- inputs: {
21278
- placement: {
21279
- classPropertyName: "placement",
21280
- publicName: "placement",
21281
- isSignal: true,
21282
- isRequired: false,
21283
- transformFunction: null
21284
- },
21285
- size: {
21286
- classPropertyName: "size",
21287
- publicName: "size",
21288
- isSignal: true,
21289
- isRequired: false,
21290
- transformFunction: null
21291
- },
21292
- maxHeight: {
21293
- classPropertyName: "maxHeight",
21294
- publicName: "maxHeight",
21295
- isSignal: true,
21296
- isRequired: false,
21297
- transformFunction: null
21298
- },
21299
- disabled: {
21300
- classPropertyName: "disabled",
21301
- publicName: "disabled",
21302
- isSignal: true,
21303
- isRequired: false,
21304
- transformFunction: null
21305
- },
21306
- ariaLabel: {
21307
- classPropertyName: "ariaLabel",
21308
- publicName: "aria-label",
21309
- isSignal: true,
21310
- isRequired: false,
21311
- transformFunction: null
21312
- },
21313
- id: {
21314
- classPropertyName: "id",
21315
- publicName: "id",
21316
- isSignal: true,
21317
- isRequired: false,
21318
- transformFunction: null
21319
- },
21320
- open: {
21321
- classPropertyName: "open",
21322
- publicName: "open",
21323
- isSignal: true,
21324
- isRequired: false,
21325
- transformFunction: null
21326
- }
21327
- },
21328
- outputs: {
21329
- open: "openChange",
21330
- opened: "opened",
21331
- closed: "closed"
21332
- },
21333
- host: { listeners: {
21334
- "document:keydown": "onKeydown($event)",
21335
- "document:keydown.escape": "onEscape($event)"
21336
- } },
21337
- viewQueries: [{
21338
- propertyName: "listEl",
21339
- first: true,
21340
- predicate: ["listEl"],
21341
- descendants: true,
21342
- isSignal: true
21343
- }],
21344
- ngImport: i0,
21345
- template: "<ea-popover\n [anchor]=\"triggerEl()\"\n [open]=\"open()\"\n [placement]=\"placement()\"\n role=\"menu\"\n [surfaceId]=\"id()\"\n [aria-label]=\"resolvedAriaLabel()\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n #listEl\n class=\"ea-menu__list ea-menu__list--{{ size() }}\"\n [style.max-height]=\"maxHeight()\">\n <ng-content />\n </div>\n</ea-popover>\n",
21346
- styles: [":host{display:contents}.ea-menu__list{min-width:10em;padding:.25em 0;overflow-y:auto;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-menu-list-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-menu__list{border:1px solid CanvasText}}.ea-menu__list--2xs{font-size:var(--font-size-2xs)}.ea-menu__list--xs{font-size:var(--font-size-xs)}.ea-menu__list--sm{font-size:var(--font-size-sm)}.ea-menu__list--md{font-size:var(--font-size-md)}.ea-menu__list--lg{font-size:var(--font-size-lg)}.ea-menu__list--xl{font-size:var(--font-size-xl)}\n"],
21347
- dependencies: [{
21348
- kind: "component",
21349
- type: PopoverComponent,
21350
- selector: "ea-popover",
21351
- inputs: [
21352
- "anchor",
21353
- "open",
21354
- "placement",
21355
- "role",
21356
- "aria-label",
21357
- "aria-labelledby",
21358
- "trapFocus",
21359
- "surfaceId",
21360
- "offset",
21361
- "flip",
21362
- "clamp",
21363
- "matchAnchorWidth",
21364
- "maxWidth",
21365
- "closeOnOutsideClick",
21366
- "closeOnEscape",
21367
- "scrollBehavior"
21368
- ],
21369
- outputs: ["closeRequested"]
21370
- }],
21371
- changeDetection: i0.ChangeDetectionStrategy.OnPush
21372
- });
21373
- };
21374
- i0.ɵɵngDeclareClassMetadata({
21375
- minVersion: "12.0.0",
21376
- version: "22.2.0",
21377
- ngImport: i0,
21378
- type: MenuComponent,
21379
- decorators: [{
21380
- type: Component,
21381
- args: [{
21382
- selector: "ea-menu",
21383
- imports: [PopoverComponent],
21384
- changeDetection: ChangeDetectionStrategy.OnPush,
21385
- template: "<ea-popover\n [anchor]=\"triggerEl()\"\n [open]=\"open()\"\n [placement]=\"placement()\"\n role=\"menu\"\n [surfaceId]=\"id()\"\n [aria-label]=\"resolvedAriaLabel()\"\n [closeOnEscape]=\"false\"\n scrollBehavior=\"reposition\"\n (closeRequested)=\"onPopoverCloseRequested()\">\n <div\n #listEl\n class=\"ea-menu__list ea-menu__list--{{ size() }}\"\n [style.max-height]=\"maxHeight()\">\n <ng-content />\n </div>\n</ea-popover>\n",
21386
- styles: [":host{display:contents}.ea-menu__list{min-width:10em;padding:.25em 0;overflow-y:auto;border:var(--border-width-thin) solid var(--color-border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);background-color:var(--ea-menu-list-background-color, var(--color-bg-elevated))}@media(forced-colors:active){.ea-menu__list{border:1px solid CanvasText}}.ea-menu__list--2xs{font-size:var(--font-size-2xs)}.ea-menu__list--xs{font-size:var(--font-size-xs)}.ea-menu__list--sm{font-size:var(--font-size-sm)}.ea-menu__list--md{font-size:var(--font-size-md)}.ea-menu__list--lg{font-size:var(--font-size-lg)}.ea-menu__list--xl{font-size:var(--font-size-xl)}\n"]
21387
- }]
21388
- }],
21389
- ctorParameters: () => [],
21390
- propDecorators: {
21391
- listEl: [{
21392
- type: i0.ViewChild,
21393
- args: ["listEl", { isSignal: true }]
21394
- }],
21395
- placement: [{
21396
- type: i0.Input,
21397
- args: [{
21398
- isSignal: true,
21399
- alias: "placement",
21400
- required: false
21401
- }]
21402
- }],
21403
- size: [{
21404
- type: i0.Input,
21405
- args: [{
21406
- isSignal: true,
21407
- alias: "size",
21408
- required: false
21409
- }]
21410
- }],
21411
- maxHeight: [{
21412
- type: i0.Input,
21413
- args: [{
21414
- isSignal: true,
21415
- alias: "maxHeight",
21416
- required: false
21417
- }]
21418
- }],
21419
- disabled: [{
21420
- type: i0.Input,
21421
- args: [{
21422
- isSignal: true,
21423
- alias: "disabled",
21424
- required: false
21425
- }]
21426
- }],
21427
- ariaLabel: [{
21428
- type: i0.Input,
21429
- args: [{
21430
- isSignal: true,
21431
- alias: "aria-label",
21432
- required: false
21433
- }]
21434
- }],
21435
- id: [{
21436
- type: i0.Input,
21437
- args: [{
21438
- isSignal: true,
21439
- alias: "id",
21440
- required: false
21441
- }]
21442
- }],
21443
- open: [{
21444
- type: i0.Input,
21445
- args: [{
21446
- isSignal: true,
21447
- alias: "open",
21448
- required: false
21449
- }]
21450
- }, {
21451
- type: i0.Output,
21452
- args: ["openChange"]
21453
- }],
21454
- opened: [{
21455
- type: i0.Output,
21456
- args: ["opened"]
21457
- }],
21458
- closed: [{
21459
- type: i0.Output,
21460
- args: ["closed"]
21461
- }],
21462
- onKeydown: [{
21463
- type: HostListener,
21464
- args: ["document:keydown", ["$event"]]
21465
- }],
21466
- onEscape: [{
21467
- type: HostListener,
21468
- args: ["document:keydown.escape", ["$event"]]
21469
- }]
21470
- }
21471
- });
21472
21934
  var MenuItemComponent = class MenuItemComponent {
21473
21935
  menu = inject(MenuComponent, { optional: true });
21474
21936
  itemId = uniqueId("ea-menu-item");
@@ -22596,6 +23058,7 @@ var MultiSelectComponent = class MultiSelectComponent {
22596
23058
  "anchor",
22597
23059
  "open",
22598
23060
  "placement",
23061
+ "anchorPoint",
22599
23062
  "role",
22600
23063
  "aria-label",
22601
23064
  "aria-labelledby",
@@ -22608,9 +23071,10 @@ var MultiSelectComponent = class MultiSelectComponent {
22608
23071
  "maxWidth",
22609
23072
  "closeOnOutsideClick",
22610
23073
  "closeOnEscape",
22611
- "scrollBehavior"
23074
+ "scrollBehavior",
23075
+ "contextMenu"
22612
23076
  ],
22613
- outputs: ["closeRequested"]
23077
+ outputs: ["closeRequested", "openRequested"]
22614
23078
  },
22615
23079
  {
22616
23080
  kind: "component",
@@ -29623,6 +30087,7 @@ var TimePickerComponent = class TimePickerComponent {
29623
30087
  "anchor",
29624
30088
  "open",
29625
30089
  "placement",
30090
+ "anchorPoint",
29626
30091
  "role",
29627
30092
  "aria-label",
29628
30093
  "aria-labelledby",
@@ -29635,9 +30100,10 @@ var TimePickerComponent = class TimePickerComponent {
29635
30100
  "maxWidth",
29636
30101
  "closeOnOutsideClick",
29637
30102
  "closeOnEscape",
29638
- "scrollBehavior"
30103
+ "scrollBehavior",
30104
+ "contextMenu"
29639
30105
  ],
29640
- outputs: ["closeRequested"]
30106
+ outputs: ["closeRequested", "openRequested"]
29641
30107
  },
29642
30108
  {
29643
30109
  kind: "component",
@@ -73353,6 +73819,6 @@ const ICONS = [
73353
73819
  ZoomInIconComponent,
73354
73820
  ZoomOutIconComponent
73355
73821
  ].sort((a, b) => a.slug.localeCompare(b.slug));
73356
- export { AccessibilityIconComponent, AccordionComponent, AccordionItemComponent, ActivityIconComponent, AirplayIconComponent, AlarmClockIconComponent, AlertCircleIconComponent, AlertComponent, AlertOctagonIconComponent, AlertTriangleIconComponent, AlignCenterIconComponent, AlignJustifyIconComponent, AlignLeftIconComponent, AlignRightIconComponent, AnchorIconComponent, AndroidIconComponent, AngularIconComponent, AnthropicIconComponent, ApertureIconComponent, ArchiveIconComponent, ArrayIconComponent, ArrowDownCircleIconComponent, ArrowDownIconComponent, ArrowDownLeftIconComponent, ArrowDownRightIconComponent, ArrowLeftCircleIconComponent, ArrowLeftIconComponent, ArrowLeftRightIconComponent, ArrowRightCircleIconComponent, ArrowRightIconComponent, ArrowUpCircleIconComponent, ArrowUpDownIconComponent, ArrowUpIconComponent, ArrowUpLeftIconComponent, ArrowUpRightIconComponent, AspectRatioIconComponent, AtSignIconComponent, AutocompleteComponent, AvatarComponent, AvatarEditorComponent, AwardIconComponent, BadgeCheckIconComponent, BadgeComponent, BanIconComponent, BarChart2IconComponent, BarChartComponent, BarChartIconComponent, BatteryChargingIconComponent, BatteryIconComponent, BellIconComponent, BellOffIconComponent, BellRingIconComponent, BitcoinIconComponent, BlueskyIconComponent, BluetoothIconComponent, BoldIconComponent, BookIconComponent, BookOpenIconComponent, BookmarkCheckIconComponent, BookmarkIconComponent, BookmarkPlusIconComponent, BoomboxIconComponent, BotIconComponent, BottleIconComponent, BoxIconComponent, BrainIconComponent, BreadcrumbsComponent, BriefcaseIconComponent, BugIconComponent, BuildingIconComponent, ButtonComponent, ButtonLinkComponent, CalculatorIconComponent, CalendarCheckIconComponent, CalendarDaysIconComponent, CalendarIconComponent, CalendarPlusIconComponent, CameraIconComponent, CameraOffIconComponent, CandleIconComponent, CardComponent, CassetteTapeIconComponent, CastIconComponent, CheckCheckIconComponent, CheckCircleIconComponent, CheckIconComponent, CheckSquareIconComponent, CheckboxComponent, ChevronDownIconComponent, ChevronLeftIconComponent, ChevronRightIconComponent, ChevronUpIconComponent, ChevronsDownIconComponent, ChevronsLeftIconComponent, ChevronsRightIconComponent, ChevronsUpDownIconComponent, ChevronsUpIconComponent, ChromeIconComponent, CircleIconComponent, ClapperboardIconComponent, ClipboardCheckIconComponent, ClipboardIconComponent, ClipboardListIconComponent, ClipboardPasteIconComponent, ClockIconComponent, CloudDrizzleIconComponent, CloudIconComponent, CloudLightningIconComponent, CloudOffIconComponent, CloudRainIconComponent, CloudSnowIconComponent, CloudSunIconComponent, CloudflareIconComponent, CodeIconComponent, CodeInputComponent, CodepenIconComponent, CodesandboxIconComponent, CoffeeIconComponent, CoinsIconComponent, ColorPickerComponent, ColumnsIconComponent, CommandIconComponent, CommandPaletteComponent, CompassIconComponent, ContrastIconComponent, CookieIconComponent, CopyIconComponent, CornerDownLeftIconComponent, CornerDownRightIconComponent, CornerLeftDownIconComponent, CornerLeftUpIconComponent, CornerRightDownIconComponent, CornerRightUpIconComponent, CornerUpLeftIconComponent, CornerUpRightIconComponent, CosineWaveIconComponent, CpuIconComponent, CreditCardIconComponent, CropIconComponent, CrosshairIconComponent, CrownIconComponent, DEFAULT_PALETTE_ROLES, DataTableComponent, DatabaseIconComponent, DatePickerComponent, DeleteIconComponent, DialogComponent, DiamondIconComponent, Dice1IconComponent, Dice2IconComponent, Dice3IconComponent, Dice4IconComponent, Dice5IconComponent, Dice6IconComponent, DiscIconComponent, DiscordIconComponent, DivideCircleIconComponent, DivideIconComponent, DivideSquareIconComponent, DividerComponent, DockerIconComponent, DollarSignIconComponent, DoubleExclamationMarkIconComponent, DoubleQuestionMarkIconComponent, DownloadCloudIconComponent, DownloadIconComponent, DrawerComponent, DribbbleIconComponent, DropboxIconComponent, DropdownComponent, DropletIconComponent, EAGAMI_ALL_LOCALES, EAGAMI_I18N_CONFIG, EAGAMI_LOCALES, EAGAMI_LOCALE_META, EagamiI18nService, EagamiIconComponent, EagamiWordmarkComponent, Edit2IconComponent, Edit3IconComponent, EditIconComponent, EjectIconComponent, EmptyStateComponent, EuroIconComponent, ExclamationMarkIconComponent, ExclamationQuestionMarkIconComponent, ExternalLinkIconComponent, EyeIconComponent, EyeOffIconComponent, Facebook2IconComponent, FacebookIconComponent, FastForwardIconComponent, FeatherIconComponent, FieldLabelComponent, FieldMessagesComponent, Figma2IconComponent, FigmaIconComponent, FileAudioIconComponent, FileCheckIconComponent, FileCodeIconComponent, FileIconComponent, FileImageIconComponent, FileMinusIconComponent, FilePdfIconComponent, FilePlusIconComponent, FileTextIconComponent, FileUploaderComponent, FileVideoIconComponent, FilmIconComponent, FilterIconComponent, FilterXIconComponent, FingerprintIconComponent, FirstPlaceMedalIconComponent, FlagIconComponent, FlameIconComponent, FlaskConicalIconComponent, FolderIconComponent, FolderMinusIconComponent, FolderOpenIconComponent, FolderPlusIconComponent, FormFieldComponent, ForwardIconComponent, FramerIconComponent, FrownIconComponent, GaugeIconComponent, GeminiIconComponent, GiftIconComponent, GitBranchIconComponent, GitCommitIconComponent, GitCompareIconComponent, GitMergeIconComponent, GitPullRequestIconComponent, Github2IconComponent, GithubIconComponent, GitlabIconComponent, GlobeIconComponent, GoogleIconComponent, GraduationCapIconComponent, GridIconComponent, GripHorizontalIconComponent, GripVerticalIconComponent, HalfCircleIconComponent, HalfHeartIconComponent, HardDriveIconComponent, HashIconComponent, HeadphonesIconComponent, HeadsetIconComponent, HeartIconComponent, HelpCircleIconComponent, HeptagonIconComponent, HexagonIconComponent, HistoryIconComponent, HomeIconComponent, HourglassIconComponent, ICONS, IconComponentBase, ImageIconComponent, ImagePlayIconComponent, ImagePlusIconComponent, ImageSearchIconComponent, ImagesIconComponent, InboxIconComponent, InfoIconComponent, InputComponent, InstagramIconComponent, ItalicIconComponent, KeyIconComponent, KeyboardIconComponent, KeyframeIconComponent, KubernetesIconComponent, LampIconComponent, LanguagesIconComponent, LaptopIconComponent, LayersIconComponent, LayoutDashboardIconComponent, LayoutIconComponent, LeafIconComponent, LeftHalfStarIconComponent, LifeBuoyIconComponent, LightbulbIconComponent, LineChartComponent, Link2IconComponent, LinkIconComponent, Linkedin2IconComponent, LinkedinIconComponent, ListChecksIconComponent, ListIconComponent, ListOrderedIconComponent, LoaderIconComponent, LockIconComponent, LogInIconComponent, LogOutIconComponent, MailCheckIconComponent, MailIconComponent, MapIconComponent, MapPinIconComponent, MastercardIconComponent, Maximize2IconComponent, MaximizeIconComponent, MegaphoneIconComponent, MehIconComponent, MenuComponent, MenuIconComponent, MenuItemComponent, MenuTriggerDirective, MessageCircleIconComponent, MessageSquareIconComponent, MicIconComponent, MicOffIconComponent, MicVocalIconComponent, MicroscopeIconComponent, MicrosoftIconComponent, Minimize2IconComponent, MinimizeIconComponent, MinusCircleIconComponent, MinusIconComponent, MinusSquareIconComponent, MongodbIconComponent, MonitorIconComponent, MonitorPlayIconComponent, MoonIconComponent, MoreHorizontalIconComponent, MoreVerticalIconComponent, MousePointerIconComponent, MoveIconComponent, MultiSelectComponent, MusicIconComponent, Navigation2IconComponent, NavigationIconComponent, NetlifyIconComponent, NewspaperIconComponent, NodejsIconComponent, NotionIconComponent, NpmIconComponent, NumberInputComponent, OctagonIconComponent, PAGE_SIZE_ALL, PackageIconComponent, PaginatorComponent, PaletteIconComponent, PaperclipIconComponent, PauseCircleIconComponent, PauseIconComponent, PaypalIconComponent, PenToolIconComponent, PentagonIconComponent, PercentIconComponent, PhoneCallIconComponent, PhoneForwardedIconComponent, PhoneIconComponent, PhoneIncomingIconComponent, PhoneMissedIconComponent, PhoneOffIconComponent, PhoneOutgoingIconComponent, PictureInPictureIconComponent, PieChartComponent, PieChartIconComponent, PinIconComponent, PinterestIconComponent, PlaneIconComponent, PlayCircleIconComponent, PlayIconComponent, PlaylistIconComponent, PlugIconComponent, PlusCircleIconComponent, PlusIconComponent, PlusSquareIconComponent, PocketIconComponent, PodcastIconComponent, PopoverComponent, PowerIconComponent, PrinterIconComponent, ProgressBarComponent, ProjectorIconComponent, PythonIconComponent, QrCodeIconComponent, QuestionExclamationMarkIconComponent, QuestionMarkIconComponent, QuoteIconComponent, RadioComponent, RadioGroupComponent, RadioIconComponent, RadioReceiverIconComponent, RadioTowerIconComponent, RangeSliderComponent, RatingComponent, ReactIconComponent, ReceiptIconComponent, RecordIconComponent, RectangleHorizontalIconComponent, RectangleVerticalIconComponent, RedditIconComponent, RedoIconComponent, RefreshCcwIconComponent, RefreshCwIconComponent, Repeat1IconComponent, RepeatIconComponent, ReplyIconComponent, RewindIconComponent, RightHalfStarIconComponent, RocketIconComponent, RotateCcwIconComponent, RotateCcwSquareIconComponent, RotateCwIconComponent, RowsIconComponent, RssIconComponent, SaveIconComponent, ScanIconComponent, ScissorsIconComponent, ScreenShareIconComponent, SearchIconComponent, SecondPlaceMedalIconComponent, SegmentedComponent, SendIconComponent, ServerIconComponent, SettingsIconComponent, Share2IconComponent, ShareIconComponent, ShieldAlertIconComponent, ShieldCheckIconComponent, ShieldIconComponent, ShieldOffIconComponent, ShopifyIconComponent, ShoppingBagIconComponent, ShoppingCartIconComponent, ShuffleIconComponent, SidebarIconComponent, SineWaveIconComponent, SkeletonComponent, SkipBackIconComponent, SkipForwardIconComponent, Slack2IconComponent, SlackIconComponent, SlashIconComponent, SliderComponent, SlidersIconComponent, SmartphoneIconComponent, SmileIconComponent, SnowflakeIconComponent, SoccerBallIconComponent, SparklesIconComponent, SpeakerIconComponent, SpinnerComponent, SpotifyIconComponent, SquareIconComponent, SquarePlayIconComponent, StarIconComponent, StepBackIconComponent, StepComponent, StepForwardIconComponent, StepperComponent, StopCircleIconComponent, StrikethroughIconComponent, StripeIconComponent, SubtitlesIconComponent, SubtitlesOffIconComponent, SunIconComponent, SunriseIconComponent, SunsetIconComponent, SvelteIconComponent, SwitchCameraIconComponent, SwitchComponent, TabComponent, TableIconComponent, TabletIconComponent, TabsComponent, TagComponent, TagIconComponent, TailwindIconComponent, TargetIconComponent, TelegramIconComponent, TerminalIconComponent, TextareaComponent, ThermometerIconComponent, ThirdPlaceMedalIconComponent, ThreadsIconComponent, ThumbsDownIconComponent, ThumbsUpIconComponent, TiktokIconComponent, TimePickerComponent, TimecodeIconComponent, TimelineComponent, TimerIconComponent, ToastComponent, ToastService, ToggleLeftIconComponent, ToggleRightIconComponent, ToolIconComponent, TooltipDirective, TranscodeIconComponent, TransferListComponent, Trash2IconComponent, TrashIconComponent, TreeComponent, TrelloIconComponent, TrendingDownIconComponent, TrendingUpIconComponent, TriangleIconComponent, TrimIconComponent, TrophyIconComponent, TruckIconComponent, TvIconComponent, Twitch2IconComponent, TwitchIconComponent, TwitterIconComponent, TypeIconComponent, UmbrellaIconComponent, UnderlineIconComponent, UndoIconComponent, UnlinkIconComponent, UnlockIconComponent, UploadCloudIconComponent, UploadIconComponent, UserCheckIconComponent, UserCircleIconComponent, UserIconComponent, UserMinusIconComponent, UserPlusIconComponent, UserXIconComponent, UsersIconComponent, VercelIconComponent, VideoIconComponent, VideoOffIconComponent, VirtualListComponent, VoicemailIconComponent, Volume1IconComponent, Volume2IconComponent, VolumeIconComponent, VolumeXIconComponent, VueIconComponent, WCAG_AA, WalletIconComponent, WandIconComponent, WatchIconComponent, WaveformIconComponent, WebcamIconComponent, WhatsappIconComponent, WifiIconComponent, WifiOffIconComponent, WindIconComponent, WordpressIconComponent, XCircleIconComponent, XIconComponent, XOctagonIconComponent, XSquareIconComponent, XTwitterIconComponent, Youtube2IconComponent, YoutubeIconComponent, ZapIconComponent, ZapOffIconComponent, ZoomInIconComponent, ZoomOutIconComponent, applyPalette, ar, computePopoverPosition, contrastRatio, de, derivePalette, el, en, esES, formatViolations, frFR, frenchSpacing, he, hexToOklch, hi, iconDisplayName, is, isGrouped, nl, oklchToHex, pl, provideEagamiUi, ptBR, relativeLuminance, ru, uk, validatePalette, visibleNodeIds, walkTree, zhCN };
73822
+ export { AccessibilityIconComponent, AccordionComponent, AccordionItemComponent, ActivityIconComponent, AirplayIconComponent, AlarmClockIconComponent, AlertCircleIconComponent, AlertComponent, AlertOctagonIconComponent, AlertTriangleIconComponent, AlignCenterIconComponent, AlignJustifyIconComponent, AlignLeftIconComponent, AlignRightIconComponent, AnchorIconComponent, AndroidIconComponent, AngularIconComponent, AnthropicIconComponent, ApertureIconComponent, ArchiveIconComponent, ArrayIconComponent, ArrowDownCircleIconComponent, ArrowDownIconComponent, ArrowDownLeftIconComponent, ArrowDownRightIconComponent, ArrowLeftCircleIconComponent, ArrowLeftIconComponent, ArrowLeftRightIconComponent, ArrowRightCircleIconComponent, ArrowRightIconComponent, ArrowUpCircleIconComponent, ArrowUpDownIconComponent, ArrowUpIconComponent, ArrowUpLeftIconComponent, ArrowUpRightIconComponent, AspectRatioIconComponent, AtSignIconComponent, AutocompleteComponent, AvatarComponent, AvatarEditorComponent, AwardIconComponent, BadgeCheckIconComponent, BadgeComponent, BanIconComponent, BarChart2IconComponent, BarChartComponent, BarChartIconComponent, BatteryChargingIconComponent, BatteryIconComponent, BellIconComponent, BellOffIconComponent, BellRingIconComponent, BitcoinIconComponent, BlueskyIconComponent, BluetoothIconComponent, BoldIconComponent, BookIconComponent, BookOpenIconComponent, BookmarkCheckIconComponent, BookmarkIconComponent, BookmarkPlusIconComponent, BoomboxIconComponent, BotIconComponent, BottleIconComponent, BoxIconComponent, BrainIconComponent, BreadcrumbsComponent, BriefcaseIconComponent, BugIconComponent, BuildingIconComponent, ButtonComponent, ButtonLinkComponent, CalculatorIconComponent, CalendarCheckIconComponent, CalendarDaysIconComponent, CalendarIconComponent, CalendarPlusIconComponent, CameraIconComponent, CameraOffIconComponent, CandleIconComponent, CardComponent, CassetteTapeIconComponent, CastIconComponent, CheckCheckIconComponent, CheckCircleIconComponent, CheckIconComponent, CheckSquareIconComponent, CheckboxComponent, ChevronDownIconComponent, ChevronLeftIconComponent, ChevronRightIconComponent, ChevronUpIconComponent, ChevronsDownIconComponent, ChevronsLeftIconComponent, ChevronsRightIconComponent, ChevronsUpDownIconComponent, ChevronsUpIconComponent, ChromeIconComponent, CircleIconComponent, ClapperboardIconComponent, ClipboardCheckIconComponent, ClipboardIconComponent, ClipboardListIconComponent, ClipboardPasteIconComponent, ClockIconComponent, CloudDrizzleIconComponent, CloudIconComponent, CloudLightningIconComponent, CloudOffIconComponent, CloudRainIconComponent, CloudSnowIconComponent, CloudSunIconComponent, CloudflareIconComponent, CodeIconComponent, CodeInputComponent, CodepenIconComponent, CodesandboxIconComponent, CoffeeIconComponent, CoinsIconComponent, ColorPickerComponent, ColumnsIconComponent, CommandIconComponent, CommandPaletteComponent, CompassIconComponent, ContextMenuTriggerDirective, ContrastIconComponent, CookieIconComponent, CopyIconComponent, CornerDownLeftIconComponent, CornerDownRightIconComponent, CornerLeftDownIconComponent, CornerLeftUpIconComponent, CornerRightDownIconComponent, CornerRightUpIconComponent, CornerUpLeftIconComponent, CornerUpRightIconComponent, CosineWaveIconComponent, CpuIconComponent, CreditCardIconComponent, CropIconComponent, CrosshairIconComponent, CrownIconComponent, DEFAULT_PALETTE_ROLES, DataTableComponent, DatabaseIconComponent, DatePickerComponent, DeleteIconComponent, DialogComponent, DialogRef, DialogService, DiamondIconComponent, Dice1IconComponent, Dice2IconComponent, Dice3IconComponent, Dice4IconComponent, Dice5IconComponent, Dice6IconComponent, DiscIconComponent, DiscordIconComponent, DivideCircleIconComponent, DivideIconComponent, DivideSquareIconComponent, DividerComponent, DockerIconComponent, DollarSignIconComponent, DoubleExclamationMarkIconComponent, DoubleQuestionMarkIconComponent, DownloadCloudIconComponent, DownloadIconComponent, DrawerComponent, DribbbleIconComponent, DropboxIconComponent, DropdownComponent, DropletIconComponent, EAGAMI_ALL_LOCALES, EAGAMI_I18N_CONFIG, EAGAMI_LOCALES, EAGAMI_LOCALE_META, EagamiI18nService, EagamiIconComponent, EagamiWordmarkComponent, Edit2IconComponent, Edit3IconComponent, EditIconComponent, EjectIconComponent, EmptyStateComponent, EuroIconComponent, ExclamationMarkIconComponent, ExclamationQuestionMarkIconComponent, ExternalLinkIconComponent, EyeIconComponent, EyeOffIconComponent, Facebook2IconComponent, FacebookIconComponent, FastForwardIconComponent, FeatherIconComponent, FieldLabelComponent, FieldMessagesComponent, Figma2IconComponent, FigmaIconComponent, FileAudioIconComponent, FileCheckIconComponent, FileCodeIconComponent, FileIconComponent, FileImageIconComponent, FileMinusIconComponent, FilePdfIconComponent, FilePlusIconComponent, FileTextIconComponent, FileUploaderComponent, FileVideoIconComponent, FilmIconComponent, FilterIconComponent, FilterXIconComponent, FingerprintIconComponent, FirstPlaceMedalIconComponent, FlagIconComponent, FlameIconComponent, FlaskConicalIconComponent, FolderIconComponent, FolderMinusIconComponent, FolderOpenIconComponent, FolderPlusIconComponent, FormFieldComponent, ForwardIconComponent, FramerIconComponent, FrownIconComponent, GaugeIconComponent, GeminiIconComponent, GiftIconComponent, GitBranchIconComponent, GitCommitIconComponent, GitCompareIconComponent, GitMergeIconComponent, GitPullRequestIconComponent, Github2IconComponent, GithubIconComponent, GitlabIconComponent, GlobeIconComponent, GoogleIconComponent, GraduationCapIconComponent, GridIconComponent, GripHorizontalIconComponent, GripVerticalIconComponent, HalfCircleIconComponent, HalfHeartIconComponent, HardDriveIconComponent, HashIconComponent, HeadphonesIconComponent, HeadsetIconComponent, HeartIconComponent, HelpCircleIconComponent, HeptagonIconComponent, HexagonIconComponent, HistoryIconComponent, HomeIconComponent, HourglassIconComponent, ICONS, IconComponentBase, ImageIconComponent, ImagePlayIconComponent, ImagePlusIconComponent, ImageSearchIconComponent, ImagesIconComponent, InboxIconComponent, InfoIconComponent, InputComponent, InstagramIconComponent, ItalicIconComponent, KeyIconComponent, KeyboardIconComponent, KeyframeIconComponent, KubernetesIconComponent, LampIconComponent, LanguagesIconComponent, LaptopIconComponent, LayersIconComponent, LayoutDashboardIconComponent, LayoutIconComponent, LeafIconComponent, LeftHalfStarIconComponent, LifeBuoyIconComponent, LightbulbIconComponent, LineChartComponent, Link2IconComponent, LinkIconComponent, Linkedin2IconComponent, LinkedinIconComponent, ListChecksIconComponent, ListIconComponent, ListOrderedIconComponent, LoaderIconComponent, LockIconComponent, LogInIconComponent, LogOutIconComponent, MailCheckIconComponent, MailIconComponent, MapIconComponent, MapPinIconComponent, MastercardIconComponent, Maximize2IconComponent, MaximizeIconComponent, MegaphoneIconComponent, MehIconComponent, MenuComponent, MenuIconComponent, MenuItemComponent, MenuTriggerDirective, MessageCircleIconComponent, MessageSquareIconComponent, MicIconComponent, MicOffIconComponent, MicVocalIconComponent, MicroscopeIconComponent, MicrosoftIconComponent, Minimize2IconComponent, MinimizeIconComponent, MinusCircleIconComponent, MinusIconComponent, MinusSquareIconComponent, MongodbIconComponent, MonitorIconComponent, MonitorPlayIconComponent, MoonIconComponent, MoreHorizontalIconComponent, MoreVerticalIconComponent, MousePointerIconComponent, MoveIconComponent, MultiSelectComponent, MusicIconComponent, Navigation2IconComponent, NavigationIconComponent, NetlifyIconComponent, NewspaperIconComponent, NodejsIconComponent, NotionIconComponent, NpmIconComponent, NumberInputComponent, OctagonIconComponent, PAGE_SIZE_ALL, PackageIconComponent, PaginatorComponent, PaletteIconComponent, PaperclipIconComponent, PauseCircleIconComponent, PauseIconComponent, PaypalIconComponent, PenToolIconComponent, PentagonIconComponent, PercentIconComponent, PhoneCallIconComponent, PhoneForwardedIconComponent, PhoneIconComponent, PhoneIncomingIconComponent, PhoneMissedIconComponent, PhoneOffIconComponent, PhoneOutgoingIconComponent, PictureInPictureIconComponent, PieChartComponent, PieChartIconComponent, PinIconComponent, PinterestIconComponent, PlaneIconComponent, PlayCircleIconComponent, PlayIconComponent, PlaylistIconComponent, PlugIconComponent, PlusCircleIconComponent, PlusIconComponent, PlusSquareIconComponent, PocketIconComponent, PodcastIconComponent, PopoverComponent, PowerIconComponent, PrinterIconComponent, ProgressBarComponent, ProjectorIconComponent, PythonIconComponent, QrCodeIconComponent, QuestionExclamationMarkIconComponent, QuestionMarkIconComponent, QuoteIconComponent, RadioComponent, RadioGroupComponent, RadioIconComponent, RadioReceiverIconComponent, RadioTowerIconComponent, RangeSliderComponent, RatingComponent, ReactIconComponent, ReceiptIconComponent, RecordIconComponent, RectangleHorizontalIconComponent, RectangleVerticalIconComponent, RedditIconComponent, RedoIconComponent, RefreshCcwIconComponent, RefreshCwIconComponent, Repeat1IconComponent, RepeatIconComponent, ReplyIconComponent, RewindIconComponent, RightHalfStarIconComponent, RocketIconComponent, RotateCcwIconComponent, RotateCcwSquareIconComponent, RotateCwIconComponent, RowsIconComponent, RssIconComponent, SaveIconComponent, ScanIconComponent, ScissorsIconComponent, ScreenShareIconComponent, SearchIconComponent, SecondPlaceMedalIconComponent, SegmentedComponent, SendIconComponent, ServerIconComponent, SettingsIconComponent, Share2IconComponent, ShareIconComponent, ShieldAlertIconComponent, ShieldCheckIconComponent, ShieldIconComponent, ShieldOffIconComponent, ShopifyIconComponent, ShoppingBagIconComponent, ShoppingCartIconComponent, ShuffleIconComponent, SidebarIconComponent, SineWaveIconComponent, SkeletonComponent, SkipBackIconComponent, SkipForwardIconComponent, Slack2IconComponent, SlackIconComponent, SlashIconComponent, SliderComponent, SlidersIconComponent, SmartphoneIconComponent, SmileIconComponent, SnowflakeIconComponent, SoccerBallIconComponent, SparklesIconComponent, SpeakerIconComponent, SpinnerComponent, SpotifyIconComponent, SquareIconComponent, SquarePlayIconComponent, StarIconComponent, StepBackIconComponent, StepComponent, StepForwardIconComponent, StepperComponent, StopCircleIconComponent, StrikethroughIconComponent, StripeIconComponent, SubtitlesIconComponent, SubtitlesOffIconComponent, SunIconComponent, SunriseIconComponent, SunsetIconComponent, SvelteIconComponent, SwitchCameraIconComponent, SwitchComponent, TabComponent, TableIconComponent, TabletIconComponent, TabsComponent, TagComponent, TagIconComponent, TailwindIconComponent, TargetIconComponent, TelegramIconComponent, TerminalIconComponent, TextareaComponent, ThermometerIconComponent, ThirdPlaceMedalIconComponent, ThreadsIconComponent, ThumbsDownIconComponent, ThumbsUpIconComponent, TiktokIconComponent, TimePickerComponent, TimecodeIconComponent, TimelineComponent, TimerIconComponent, ToastComponent, ToastService, ToggleLeftIconComponent, ToggleRightIconComponent, ToolIconComponent, TooltipDirective, TranscodeIconComponent, TransferListComponent, Trash2IconComponent, TrashIconComponent, TreeComponent, TrelloIconComponent, TrendingDownIconComponent, TrendingUpIconComponent, TriangleIconComponent, TrimIconComponent, TrophyIconComponent, TruckIconComponent, TvIconComponent, Twitch2IconComponent, TwitchIconComponent, TwitterIconComponent, TypeIconComponent, UmbrellaIconComponent, UnderlineIconComponent, UndoIconComponent, UnlinkIconComponent, UnlockIconComponent, UploadCloudIconComponent, UploadIconComponent, UserCheckIconComponent, UserCircleIconComponent, UserIconComponent, UserMinusIconComponent, UserPlusIconComponent, UserXIconComponent, UsersIconComponent, VercelIconComponent, VideoIconComponent, VideoOffIconComponent, VirtualListComponent, VoicemailIconComponent, Volume1IconComponent, Volume2IconComponent, VolumeIconComponent, VolumeXIconComponent, VueIconComponent, WCAG_AA, WalletIconComponent, WandIconComponent, WatchIconComponent, WaveformIconComponent, WebcamIconComponent, WhatsappIconComponent, WifiIconComponent, WifiOffIconComponent, WindIconComponent, WordpressIconComponent, XCircleIconComponent, XIconComponent, XOctagonIconComponent, XSquareIconComponent, XTwitterIconComponent, Youtube2IconComponent, YoutubeIconComponent, ZapIconComponent, ZapOffIconComponent, ZoomInIconComponent, ZoomOutIconComponent, applyPalette, ar, computePopoverPosition, contrastRatio, de, derivePalette, el, en, esES, formatViolations, frFR, frenchSpacing, he, hexToOklch, hi, iconDisplayName, is, isGrouped, nl, oklchToHex, pl, provideEagamiUi, ptBR, relativeLuminance, ru, uk, validatePalette, visibleNodeIds, walkTree, zhCN };
73357
73823
 
73358
73824
  //# sourceMappingURL=eagami-ui.mjs.map