@eagami/ui 5.71.1 → 5.72.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.
package/README.md CHANGED
@@ -78,6 +78,7 @@ Everything else is a CSS custom property you can override. See [Design tokens](h
78
78
  `showErrorsOn` sets when form components show a validation error:
79
79
 
80
80
  - `'change'` (the default): once the user changes the field and leaves it, or submits the form. A field the user tabs past stays quiet, and a new error waits until focus leaves the field.
81
+ - `'blur'`: as soon as the user leaves the field, even unchanged, while a new error still waits until focus leaves the field.
81
82
  - `'touch'`: as soon as the user leaves the field, even unchanged, and live while they edit it after that.
82
83
 
83
84
  Set it app-wide with `forms`, or on a single field with the `showErrorsOn` input every form component takes:
@@ -5570,7 +5570,7 @@ function controlErrorStateFrom(control, config) {
5570
5570
  const destroyRef = inject(DestroyRef);
5571
5571
  const host = inject(ElementRef, { optional: true });
5572
5572
  const formsConfig = inject(EAGAMI_FORMS_CONFIG);
5573
- const showOnTouch = computed(() => (config.showErrorsOn?.() ?? formsConfig.showErrorsOn ?? "change") === "touch", ...ngDevMode ? [{ debugName: "showOnTouch" }] : /* istanbul ignore next */ []);
5573
+ const showErrorsOn = computed(() => config.showErrorsOn?.() ?? formsConfig.showErrorsOn ?? "change", ...ngDevMode ? [{ debugName: "showErrorsOn" }] : /* istanbul ignore next */ []);
5574
5574
  const revision = signal(0, ...ngDevMode ? [{ debugName: "revision" }] : /* istanbul ignore next */ []);
5575
5575
  const editing = signal(false, ...ngDevMode ? [{ debugName: "editing" }] : /* istanbul ignore next */ []);
5576
5576
  const revealedBySubmit = signal(false, ...ngDevMode ? [{ debugName: "revealedBySubmit" }] : /* istanbul ignore next */ []);
@@ -5634,14 +5634,14 @@ function controlErrorStateFrom(control, config) {
5634
5634
  revision();
5635
5635
  const ctrl = control();
5636
5636
  if (!ctrl || !ctrl.invalid || !ctrl.touched || !ctrl.errors) return null;
5637
- if (ctrl.pristine && passedThrough() && !showOnTouch()) return null;
5637
+ if (ctrl.pristine && passedThrough() && showErrorsOn() === "change") return null;
5638
5638
  return resolveValidationMessage(ctrl.errors, config.errorMessages(), i18n.messages());
5639
5639
  }, ...ngDevMode ? [{ debugName: "validationError" }] : /* istanbul ignore next */ []);
5640
5640
  const autoError = linkedSignal({
5641
5641
  ...ngDevMode ? { debugName: "autoError" } : /* istanbul ignore next */ {},
5642
5642
  source: () => ({
5643
5643
  message: validationError(),
5644
- holding: revealPending() || editing() && !revealedBySubmit() && !showOnTouch()
5644
+ holding: revealPending() || editing() && !revealedBySubmit() && showErrorsOn() !== "touch"
5645
5645
  }),
5646
5646
  computation: ({ message, holding }, previous) => previous?.value || !holding ? message : null
5647
5647
  });
@@ -15067,6 +15067,8 @@ var MenuComponent = class MenuComponent {
15067
15067
  triggerEl = signal(void 0, ...ngDevMode ? [{ debugName: "triggerEl" }] : /* istanbul ignore next */ []);
15068
15068
  asContextMenu = signal(false, ...ngDevMode ? [{ debugName: "asContextMenu" }] : /* istanbul ignore next */ []);
15069
15069
  anchorPoint = signal(null, ...ngDevMode ? [{ debugName: "anchorPoint" }] : /* istanbul ignore next */ []);
15070
+ openedWith = signal(void 0, ...ngDevMode ? [{ debugName: "openedWith" }] : /* istanbul ignore next */ []);
15071
+ triggerData = this.openedWith.asReadonly();
15070
15072
  activeItemId = signal(null, ...ngDevMode ? [{ debugName: "activeItemId" }] : /* istanbul ignore next */ []);
15071
15073
  constructor() {
15072
15074
  effect(() => {
@@ -15093,12 +15095,14 @@ var MenuComponent = class MenuComponent {
15093
15095
  if (this.disabled()) return;
15094
15096
  this.asContextMenu.set(false);
15095
15097
  this.anchorPoint.set(null);
15098
+ this.openedWith.set(void 0);
15096
15099
  this.show(triggerEl);
15097
15100
  }
15098
- openAsContextMenu(anchorEl, point = null) {
15101
+ openAsContextMenu(anchorEl, point = null, data = void 0) {
15099
15102
  if (this.disabled()) return;
15100
15103
  this.asContextMenu.set(true);
15101
15104
  this.anchorPoint.set(point);
15105
+ this.openedWith.set(data);
15102
15106
  this.show(anchorEl);
15103
15107
  }
15104
15108
  show(triggerEl) {
@@ -15393,6 +15397,95 @@ function fromKeyboard(event) {
15393
15397
  if (typeof PointerEvent !== "undefined" && event instanceof PointerEvent) return event.pointerType === "";
15394
15398
  return event.button === 0 && event.buttons === 0;
15395
15399
  }
15400
+ const LONG_PRESS_TOLERANCE_PX = 10;
15401
+ function watchLongPress(element, onLongPress) {
15402
+ let pointerId = null;
15403
+ let start = null;
15404
+ let startTarget = null;
15405
+ let timer = null;
15406
+ let claimed = false;
15407
+ const stopTimer = () => {
15408
+ if (timer !== null) {
15409
+ clearTimeout(timer);
15410
+ timer = null;
15411
+ }
15412
+ };
15413
+ const endPress = () => {
15414
+ stopTimer();
15415
+ pointerId = null;
15416
+ start = null;
15417
+ startTarget = null;
15418
+ };
15419
+ const swallowClick = (event) => {
15420
+ event.preventDefault();
15421
+ event.stopPropagation();
15422
+ disarmClick();
15423
+ };
15424
+ const disarmClick = () => {
15425
+ window.removeEventListener("click", swallowClick, true);
15426
+ window.removeEventListener("pointerdown", disarmClick, true);
15427
+ window.removeEventListener("keydown", disarmClick, true);
15428
+ };
15429
+ const armClick = () => {
15430
+ disarmClick();
15431
+ window.addEventListener("click", swallowClick, true);
15432
+ window.addEventListener("pointerdown", disarmClick, true);
15433
+ window.addEventListener("keydown", disarmClick, true);
15434
+ };
15435
+ const onPointerDown = (event) => {
15436
+ if (event.pointerType !== "touch" || !event.isPrimary) return;
15437
+ endPress();
15438
+ claimed = false;
15439
+ pointerId = event.pointerId;
15440
+ start = {
15441
+ x: event.clientX,
15442
+ y: event.clientY
15443
+ };
15444
+ startTarget = event.target;
15445
+ timer = setTimeout(() => {
15446
+ timer = null;
15447
+ if (start && onLongPress(start, startTarget)) {
15448
+ claimed = true;
15449
+ armClick();
15450
+ window.getSelection()?.removeAllRanges();
15451
+ }
15452
+ }, 500);
15453
+ };
15454
+ const onPointerMove = (event) => {
15455
+ if (event.pointerId !== pointerId || !start) return;
15456
+ if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > LONG_PRESS_TOLERANCE_PX) stopTimer();
15457
+ };
15458
+ const onPointerEnd = (event) => {
15459
+ if (event.pointerId === pointerId) endPress();
15460
+ };
15461
+ const onContextMenu = (event) => {
15462
+ if (pointerId === null || !(event.target instanceof Node)) return;
15463
+ if (!element.contains(event.target)) return;
15464
+ if (claimed) {
15465
+ event.preventDefault();
15466
+ event.stopImmediatePropagation();
15467
+ } else stopTimer();
15468
+ };
15469
+ const onSelectStart = (event) => {
15470
+ if (claimed && pointerId !== null) event.preventDefault();
15471
+ };
15472
+ element.addEventListener("pointerdown", onPointerDown);
15473
+ element.addEventListener("pointermove", onPointerMove);
15474
+ element.addEventListener("pointerup", onPointerEnd);
15475
+ element.addEventListener("pointercancel", onPointerEnd);
15476
+ element.addEventListener("selectstart", onSelectStart);
15477
+ window.addEventListener("contextmenu", onContextMenu, true);
15478
+ return () => {
15479
+ endPress();
15480
+ disarmClick();
15481
+ element.removeEventListener("pointerdown", onPointerDown);
15482
+ element.removeEventListener("pointermove", onPointerMove);
15483
+ element.removeEventListener("pointerup", onPointerEnd);
15484
+ element.removeEventListener("pointercancel", onPointerEnd);
15485
+ element.removeEventListener("selectstart", onSelectStart);
15486
+ window.removeEventListener("contextmenu", onContextMenu, true);
15487
+ };
15488
+ }
15396
15489
  var ContextMenuTriggerDirective = class ContextMenuTriggerDirective {
15397
15490
  el = inject(ElementRef);
15398
15491
  target = input(void 0, {
@@ -15400,6 +15493,16 @@ var ContextMenuTriggerDirective = class ContextMenuTriggerDirective {
15400
15493
  alias: "eaContextMenuTrigger"
15401
15494
  });
15402
15495
  contextMenuPosition = input("pointer", ...ngDevMode ? [{ debugName: "contextMenuPosition" }] : /* istanbul ignore next */ []);
15496
+ contextMenuData = input(void 0, ...ngDevMode ? [{ debugName: "contextMenuData" }] : /* istanbul ignore next */ []);
15497
+ constructor() {
15498
+ if (typeof window === "undefined") return;
15499
+ const host = this.el.nativeElement;
15500
+ inject(DestroyRef).onDestroy(watchLongPress(host, (point) => this.open(point)));
15501
+ effect(() => {
15502
+ if (this.target()) host.style.setProperty("-webkit-touch-callout", "none");
15503
+ else host.style.removeProperty("-webkit-touch-callout");
15504
+ });
15505
+ }
15403
15506
  onContextMenu(event) {
15404
15507
  this.request(event);
15405
15508
  }
@@ -15407,14 +15510,22 @@ var ContextMenuTriggerDirective = class ContextMenuTriggerDirective {
15407
15510
  if (isContextMenuShortcut(event)) this.request(event);
15408
15511
  }
15409
15512
  request(event) {
15410
- const target = this.target();
15411
- if (!target || event.defaultPrevented) return;
15412
- if (target instanceof MenuComponent && target.disabled()) return;
15513
+ if (event.defaultPrevented || !this.canOpen()) return;
15413
15514
  event.preventDefault();
15515
+ this.open(contextMenuPoint(event, this.el.nativeElement));
15516
+ }
15517
+ canOpen() {
15518
+ const target = this.target();
15519
+ return !!target && !(target instanceof MenuComponent && target.disabled());
15520
+ }
15521
+ open(point) {
15522
+ const target = this.target();
15523
+ if (!target || !this.canOpen()) return false;
15414
15524
  const host = this.el.nativeElement;
15415
- const point = this.contextMenuPosition() === "pointer" ? contextMenuPoint(event, host) : null;
15416
- if (target instanceof MenuComponent) target.openAsContextMenu(host, point);
15417
- else target.requestOpen(point);
15525
+ const at = this.contextMenuPosition() === "pointer" ? point : null;
15526
+ if (target instanceof MenuComponent) target.openAsContextMenu(host, at, this.contextMenuData());
15527
+ else target.requestOpen(at);
15528
+ return true;
15418
15529
  }
15419
15530
  static ɵfac = i0.ɵɵngDeclareFactory({
15420
15531
  minVersion: "12.0.0",
@@ -15444,6 +15555,13 @@ var ContextMenuTriggerDirective = class ContextMenuTriggerDirective {
15444
15555
  isSignal: true,
15445
15556
  isRequired: false,
15446
15557
  transformFunction: null
15558
+ },
15559
+ contextMenuData: {
15560
+ classPropertyName: "contextMenuData",
15561
+ publicName: "contextMenuData",
15562
+ isSignal: true,
15563
+ isRequired: false,
15564
+ transformFunction: null
15447
15565
  }
15448
15566
  },
15449
15567
  host: { listeners: {
@@ -15468,6 +15586,7 @@ i0.ɵɵngDeclareClassMetadata({
15468
15586
  }
15469
15587
  }]
15470
15588
  }],
15589
+ ctorParameters: () => [],
15471
15590
  propDecorators: {
15472
15591
  target: [{
15473
15592
  type: i0.Input,
@@ -15484,6 +15603,14 @@ i0.ɵɵngDeclareClassMetadata({
15484
15603
  alias: "contextMenuPosition",
15485
15604
  required: false
15486
15605
  }]
15606
+ }],
15607
+ contextMenuData: [{
15608
+ type: i0.Input,
15609
+ args: [{
15610
+ isSignal: true,
15611
+ alias: "contextMenuData",
15612
+ required: false
15613
+ }]
15487
15614
  }]
15488
15615
  }
15489
15616
  });
@@ -15753,6 +15880,7 @@ function isModifiedClick(event) {
15753
15880
  var DataTableComponent = class DataTableComponent {
15754
15881
  i18n = inject(EagamiI18nService);
15755
15882
  host = inject(ElementRef);
15883
+ rowEls = viewChildren("rowEl", ...ngDevMode ? [{ debugName: "rowEls" }] : /* istanbul ignore next */ []);
15756
15884
  activeCell = signal({
15757
15885
  row: 0,
15758
15886
  col: 0
@@ -15818,6 +15946,7 @@ var DataTableComponent = class DataTableComponent {
15818
15946
  col: nextCol
15819
15947
  });
15820
15948
  });
15949
+ if (typeof window !== "undefined") inject(DestroyRef).onDestroy(watchLongPress(this.host.nativeElement, (point, target) => this.onRowLongPress(point, target)));
15821
15950
  }
15822
15951
  sortedData = computed(() => {
15823
15952
  const items = this.data();
@@ -15899,6 +16028,24 @@ var DataTableComponent = class DataTableComponent {
15899
16028
  });
15900
16029
  if (event instanceof KeyboardEvent && !event.defaultPrevented) this.keyboardRequestPending = true;
15901
16030
  }
16031
+ onRowLongPress(point, target) {
16032
+ if (!(target instanceof Node)) return false;
16033
+ const index = this.rowEls().findIndex((ref) => ref.nativeElement.contains(target));
16034
+ const row = this.sortedData()[index];
16035
+ if (index < 0 || row === void 0) return false;
16036
+ const event = new MouseEvent("contextmenu", {
16037
+ cancelable: true,
16038
+ clientX: point.x,
16039
+ clientY: point.y
16040
+ });
16041
+ this.rowContextMenu.emit({
16042
+ row,
16043
+ rowElement: this.rowEls()[index].nativeElement,
16044
+ point,
16045
+ event
16046
+ });
16047
+ return event.defaultPrevented;
16048
+ }
15902
16049
  clearKeyboardRequest() {
15903
16050
  this.keyboardRequestPending = false;
15904
16051
  }
@@ -16134,6 +16281,12 @@ var DataTableComponent = class DataTableComponent {
16134
16281
  descendants: true,
16135
16282
  isSignal: true
16136
16283
  }],
16284
+ viewQueries: [{
16285
+ propertyName: "rowEls",
16286
+ predicate: ["rowEl"],
16287
+ descendants: true,
16288
+ isSignal: true
16289
+ }],
16137
16290
  ngImport: i0,
16138
16291
  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",
16139
16292
  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;outline:var(--border-width-medium) solid var(--color-border-focus);outline-offset:2px}@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{max-height:inherit;height:inherit}.ea-data-table--fixed .ea-data-table__table{table-layout:fixed}.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(-2 * var(--border-width-medium))}@media(forced-colors:active){.ea-data-table--navigable .ea-data-table__cell:focus-visible{outline-color:Highlight}}.ea-data-table--navigable .ea-data-table__cell:focus-visible{box-shadow:none}.ea-data-table__body .ea-data-table__row:focus-visible{outline:var(--border-width-medium) solid var(--color-border-focus);outline-offset:calc(-2 * var(--border-width-medium))}@media(forced-colors:active){.ea-data-table__body .ea-data-table__row:focus-visible{outline-color:Highlight}}\n"],
@@ -16210,6 +16363,10 @@ i0.ɵɵngDeclareClassMetadata({
16210
16363
  }],
16211
16364
  ctorParameters: () => [],
16212
16365
  propDecorators: {
16366
+ rowEls: [{
16367
+ type: i0.ViewChildren,
16368
+ args: ["rowEl", { isSignal: true }]
16369
+ }],
16213
16370
  columns: [{
16214
16371
  type: i0.Input,
16215
16372
  args: [{