@ethlete/components 1.0.0-next.67 → 1.0.0-next.69

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.
@@ -7,7 +7,7 @@ import { DomSanitizer } from '@angular/platform-browser';
7
7
  import { queryStateSignal, isQueryStateLoading, withArgs, createQueryErrorResponse, isQueryStateSuccess, isQueryStateFailure, executeUntilSettled$, extractQuery, createPagedQueryStack, queryComputed, isLegacyQuery, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleEn, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToTitleDe, queryErrorMessages } from '@ethlete/query';
8
8
  import { DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, COMMON_BRACKET_ROUND_TYPE, BracketRuntimeError, BRACKET_ERROR_CODES, SWISS_BRACKET_ROUND_TYPE, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, TOURNAMENT_MODE, BRACKET_DATA_LAYOUT, resolveBracketLayout as resolveBracketLayout$1, createBracket, createPlaceholderBracketSource, drawMan, createDoubleEliminationGrid, ɵcreateStackedDoubleEliminationGrid as _createStackedDoubleEliminationGrid, createSingleEliminationGrid, generateBracketRoundSwissGroupMaps, createSwissGrid, drawSwissMan, standingPickStartOrder } from '@ethlete/bracket';
9
9
  export { BRACKET_DATA_LAYOUT, BRACKET_ERROR_CODES, BRACKET_ROUND_MIRROR_TYPE, BRACKET_SWISS_GROUP_COLOR_TYPE, BracketMap, BracketRuntimeError, COMMON_BRACKET_ROUND_TYPE, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, GROUP_BRACKET_ROUND_TYPE, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, SWISS_BRACKET_ROUND_TYPE, TOURNAMENT_MODE, bracketSlot, createBracket, createPlaceholderBracketSource, isBracketSlotPredictable, migrateBracketPicks, resolveBracketSlot, standingRankSides, swapStandingRank, validateBracketSource } from '@ethlete/bracket';
10
- import { isValid, format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, setYear, parse, setSeconds, setMinutes, setHours, subDays, subWeeks, subMonths, setMilliseconds, differenceInCalendarDays, endOfDay, getDaysInMonth, eachDayOfInterval, addHours } from 'date-fns';
10
+ import { isValid, format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, setYear, parse, setSeconds, setMinutes, setHours, subDays, subWeeks, subMonths, endOfDay, setMilliseconds, differenceInCalendarDays, getDaysInMonth, eachDayOfInterval, addHours } from 'date-fns';
11
11
  import { tap, Subject, take, filter, defer, map, finalize, timer, takeUntil, fromEvent, switchMap, observeOn, asapScheduler, combineLatest, distinctUntilChanged, EMPTY, startWith, debounceTime, merge, catchError, of, delay, isObservable, from, share, scan, concat, firstValueFrom, defaultIfEmpty, Subscription, Observable, interval, ignoreElements, skip, animationFrameScheduler, EmptyError, exhaustMap, shareReplay, throwError, expand, toArray, takeWhile, mergeMap } from 'rxjs';
12
12
  import { takeUntilDestroyed, toSignal, toObservable, outputFromObservable, outputToObservable, rxResource } from '@angular/core/rxjs-interop';
13
13
  import * as i1$1 from '@angular/router';
@@ -16,6 +16,7 @@ import { createMetadataKey, metadata, FORM_FIELD, validate, createManagedMetadat
16
16
  import { tz, TZDate } from '@date-fns/tz';
17
17
  import { enUS } from 'date-fns/locale/en-US';
18
18
  import { tap as tap$1 } from 'rxjs/operators';
19
+ import { HttpEventType } from '@angular/common/http';
19
20
 
20
21
  // codes 3600-3699
21
22
  const ACCORDION_ERROR_CODES = {
@@ -7361,6 +7362,7 @@ const createOverlayRef = (config) => {
7361
7362
  .pipe(take(1), tap((rawEvent) => {
7362
7363
  const event = withDismissResult(rawEvent);
7363
7364
  busyAttributeEffect.destroy();
7365
+ afterOpened$.complete();
7364
7366
  afterClosed$.next(event.result);
7365
7367
  afterClosed$.complete();
7366
7368
  afterClosedEvent$.next(event);
@@ -7403,6 +7405,10 @@ const createOverlayRef = (config) => {
7403
7405
  _componentInstanceOverride = getter;
7404
7406
  },
7405
7407
  closeVia: (source, result) => _runtimeRef?.close(result, source),
7408
+ isClosing: () => {
7409
+ const state = _runtimeRef?.state();
7410
+ return state === 'closing' || state === 'closed';
7411
+ },
7406
7412
  registerHeaderTemplate: (template) => {
7407
7413
  _headerTemplates.update((templates) => [...templates.filter((t) => t !== template), template]);
7408
7414
  return () => _headerTemplates.update((templates) => templates.filter((t) => t !== template));
@@ -11278,7 +11284,7 @@ const OVERLAY_SCROLL_BLOCKER_DEF = /* @__PURE__ */ defineRootProvider(() => {
11278
11284
  }
11279
11285
  return documents;
11280
11286
  }, { ...(ngDevMode ? { debugName: "blockedDocuments" } : /* istanbul ignore next */ {}), equal: (a, b) => a.size === b.size && [...a].every((entry) => b.has(entry)) });
11281
- const savedTops = new Map();
11287
+ const savedOffsets = new Map();
11282
11288
  const canScrollVertically = (target, mainDocumentCanScroll) => {
11283
11289
  if (target === document)
11284
11290
  return mainDocumentCanScroll;
@@ -11287,20 +11293,21 @@ const OVERLAY_SCROLL_BLOCKER_DEF = /* @__PURE__ */ defineRootProvider(() => {
11287
11293
  };
11288
11294
  const lock = (target) => {
11289
11295
  const top = target.defaultView?.scrollY ?? 0;
11290
- savedTops.set(target, top);
11296
+ const left = target.defaultView?.scrollX ?? 0;
11297
+ savedOffsets.set(target, { top, left });
11291
11298
  renderer.setStyle(target.documentElement, {
11292
11299
  position: 'fixed',
11293
11300
  top: `-${top}px`,
11294
- left: '0',
11295
- right: '0',
11301
+ left: `${-left}px`,
11302
+ right: `${left}px`,
11296
11303
  overflowY: 'scroll',
11297
11304
  });
11298
11305
  };
11299
11306
  const unlock = (target) => {
11300
- const top = savedTops.get(target);
11301
- if (top === undefined)
11307
+ const offsets = savedOffsets.get(target);
11308
+ if (!offsets)
11302
11309
  return;
11303
- savedTops.delete(target);
11310
+ savedOffsets.delete(target);
11304
11311
  const root = target.documentElement;
11305
11312
  renderer.setStyle(root, {
11306
11313
  position: null,
@@ -11310,18 +11317,18 @@ const OVERLAY_SCROLL_BLOCKER_DEF = /* @__PURE__ */ defineRootProvider(() => {
11310
11317
  overflowY: null,
11311
11318
  scrollBehavior: 'auto',
11312
11319
  });
11313
- target.defaultView?.scrollTo(0, top);
11320
+ target.defaultView?.scrollTo(offsets.left, offsets.top);
11314
11321
  renderer.setStyle(root, { scrollBehavior: null });
11315
11322
  };
11316
- inject(DestroyRef).onDestroy(() => [...savedTops.keys()].forEach(unlock));
11323
+ inject(DestroyRef).onDestroy(() => [...savedOffsets.keys()].forEach(unlock));
11317
11324
  combineLatest([toObservable(blockedDocuments), toObservable(documentScrollState)])
11318
11325
  .pipe(tap(([blocked, scrollState]) => {
11319
- for (const target of [...savedTops.keys()]) {
11326
+ for (const target of [...savedOffsets.keys()]) {
11320
11327
  if (!blocked.has(target))
11321
11328
  unlock(target);
11322
11329
  }
11323
11330
  for (const target of blocked) {
11324
- if (!savedTops.has(target) && canScrollVertically(target, scrollState.canScrollVertically)) {
11331
+ if (!savedOffsets.has(target) && canScrollVertically(target, scrollState.canScrollVertically)) {
11325
11332
  lock(target);
11326
11333
  }
11327
11334
  }
@@ -13715,7 +13722,7 @@ class CalendarDirective {
13715
13722
  const locale = this.effectiveLocale();
13716
13723
  const labelOptions = locale ? { locale } : undefined;
13717
13724
  const weekStartsOn = this.effectiveFirstDayOfWeek();
13718
- const firstWeekContainsDate = locale?.options?.firstWeekContainsDate ?? 1;
13725
+ const firstWeekContainsDate = locale ? (locale.options?.firstWeekContainsDate ?? 1) : 4;
13719
13726
  const readSelection = this.selectionReader('month');
13720
13727
  return Array.from({ length: this.monthsShown() }, (_, offset) => {
13721
13728
  const month = addMonths(firstMonth, offset);
@@ -16228,6 +16235,17 @@ const useCarouselLoop = (config) => {
16228
16235
  };
16229
16236
 
16230
16237
  const SCROLL_IDLE_DURATION = 140;
16238
+ const SCROLL_KEYS = /* @__PURE__ */ new Set([
16239
+ 'ArrowLeft',
16240
+ 'ArrowRight',
16241
+ 'ArrowUp',
16242
+ 'ArrowDown',
16243
+ 'PageUp',
16244
+ 'PageDown',
16245
+ 'Home',
16246
+ 'End',
16247
+ ' ',
16248
+ ]);
16231
16249
  /** In its own function so the `in` check doesn't narrow the element away for everything after it. */
16232
16250
  const supportsScrollEnd = (element) => 'onscrollend' in element;
16233
16251
  /**
@@ -16272,6 +16290,9 @@ const useCarouselScrollSettled = (config) => {
16272
16290
  return merge(settled$.pipe(tap(() => settle())), fromEvent(scrollContainer, 'pointerdown', { passive: true }).pipe(tap(() => {
16273
16291
  isPointerDown.set(true);
16274
16292
  config.onPointerDown?.();
16293
+ })), fromEvent(scrollContainer, 'wheel', { passive: true }).pipe(tap(() => config.onScrollInput?.())), fromEvent(scrollContainer, 'keydown').pipe(tap((event) => {
16294
+ if (SCROLL_KEYS.has(event.key))
16295
+ config.onScrollInput?.();
16275
16296
  })),
16276
16297
  // on the document, because a drag that starts on the track routinely ends off it
16277
16298
  fromEvent(document, 'pointerup', { passive: true }).pipe(tap(release)), fromEvent(document, 'pointercancel', { passive: true }).pipe(tap(release)));
@@ -16583,6 +16604,7 @@ class CarouselDirective {
16583
16604
  */
16584
16605
  this.requestedDomIndex = signal(null, /* @ts-ignore */
16585
16606
  ...(ngDevMode ? [{ debugName: "requestedDomIndex" }] : /* istanbul ignore next */ []));
16607
+ this.readSettled = null;
16586
16608
  /** @internal Which child the intersections say is in view - the truth, a frame or two late. */
16587
16609
  this.observedDomIndex = computed(() => {
16588
16610
  const scrollable = this.scrollable();
@@ -16677,7 +16699,9 @@ class CarouselDirective {
16677
16699
  slideProgress.flush();
16678
16700
  },
16679
16701
  onPointerDown: () => this.requestedDomIndex.set(null),
16702
+ onScrollInput: () => this.requestedDomIndex.set(null),
16680
16703
  });
16704
+ this.readSettled = loop.readSettled;
16681
16705
  let agreedIndex = null;
16682
16706
  effect(() => {
16683
16707
  const current = this.currentIndex();
@@ -16779,6 +16803,12 @@ class CarouselDirective {
16779
16803
  const scrollable = this.scrollable();
16780
16804
  if (!scrollable || domIndex < 0 || domIndex >= this.domCount())
16781
16805
  return;
16806
+ // The track does not scroll to where it already rests, so no settle would ever clear this request.
16807
+ if (this.requestedDomIndex() === null &&
16808
+ domIndex === this.observedDomIndex() &&
16809
+ this.readSettled?.()?.restsOn(domIndex)) {
16810
+ return;
16811
+ }
16782
16812
  const from = this.activeDomIndex();
16783
16813
  const origin = this.scrollOriginOf(scrollable);
16784
16814
  const distance = from < 0 ? 0 : domIndex - from;
@@ -21825,7 +21855,8 @@ class CommandPaletteShortcutDirective {
21825
21855
  toggle() {
21826
21856
  const openPalette = this.overlayManager
21827
21857
  .openOverlays()
21828
- .find((overlayRef) => overlayRef.componentInstance() instanceof CommandPaletteComponent);
21858
+ .find((overlayRef) => overlayRef.componentInstance() instanceof CommandPaletteComponent &&
21859
+ !getOverlayRefInternals(overlayRef)?.isClosing());
21829
21860
  if (openPalette) {
21830
21861
  openPalette.close();
21831
21862
  return;
@@ -23344,6 +23375,9 @@ const formSupportFactory = () => {
23344
23375
  const warningDimensions = signalElementDimensions(warningContent);
23345
23376
  const hintDimensions = signalElementDimensions(hintContent);
23346
23377
  const counterDimensions = signalElementDimensions(counterContent);
23378
+ const hostDimensions = signalElementDimensions(inject(ElementRef));
23379
+ const hostShown = computed(() => (hostDimensions().offset?.width ?? 0) > 0, /* @ts-ignore */
23380
+ ...(ngDevMode ? [{ debugName: "hostShown" }] : /* istanbul ignore next */ []));
23347
23381
  const effectiveErrors = computed(() => {
23348
23382
  const parseMessage = formFieldDir.parseError() ? formFieldDir.parseErrorMessage() : null;
23349
23383
  return parseMessage ? [{ kind: 'etParseError', message: parseMessage }] : formFieldDir.errors();
@@ -23424,7 +23458,11 @@ const formSupportFactory = () => {
23424
23458
  return supportPresentation().renderedWarnings;
23425
23459
  }, /* @ts-ignore */
23426
23460
  ...(ngDevMode ? [{ debugName: "visibleWarnings" }] : /* istanbul ignore next */ []));
23461
+ const supportCanAnimate = signal(false, /* @ts-ignore */
23462
+ ...(ngDevMode ? [{ debugName: "supportCanAnimate" }] : /* istanbul ignore next */ []));
23427
23463
  const supportHeight = computed(() => {
23464
+ if (!supportCanAnimate())
23465
+ return null;
23428
23466
  const stackHeight = (() => {
23429
23467
  switch (semanticSupportState()) {
23430
23468
  case SUPPORT_CONTENT_STATE.ERROR:
@@ -23441,6 +23479,31 @@ const formSupportFactory = () => {
23441
23479
  return Math.max(stackHeight, counterHeight);
23442
23480
  }, /* @ts-ignore */
23443
23481
  ...(ngDevMode ? [{ debugName: "supportHeight" }] : /* istanbul ignore next */ []));
23482
+ const activeContentWidth = computed(() => {
23483
+ switch (semanticSupportState()) {
23484
+ case SUPPORT_CONTENT_STATE.ERROR:
23485
+ return errorDimensions().offset?.width ?? 0;
23486
+ case SUPPORT_CONTENT_STATE.WARNING:
23487
+ return warningDimensions().offset?.width ?? 0;
23488
+ case SUPPORT_CONTENT_STATE.HINT:
23489
+ return hintDimensions().offset?.width ?? 0;
23490
+ default:
23491
+ return null;
23492
+ }
23493
+ }, /* @ts-ignore */
23494
+ ...(ngDevMode ? [{ debugName: "activeContentWidth" }] : /* istanbul ignore next */ []));
23495
+ // support content already there when the control lays out - first, or again after a hidden
23496
+ // ancestor (an inactive tab panel) shows it - must sit in place in that frame without animating;
23497
+ // the measured height lands a frame late, so the region keeps its natural height until this arms
23498
+ effect((onCleanup) => {
23499
+ if (!hostShown()) {
23500
+ supportCanAnimate.set(false);
23501
+ return;
23502
+ }
23503
+ if (supportCanAnimate() || activeContentWidth() === 0)
23504
+ return;
23505
+ onCleanup(nextFrame(() => supportCanAnimate.set(true)));
23506
+ });
23444
23507
  for (const [state, animatable] of [
23445
23508
  [SUPPORT_CONTENT_STATE.ERROR, errorAnimatable],
23446
23509
  [SUPPORT_CONTENT_STATE.WARNING, warningAnimatable],
@@ -23500,6 +23563,7 @@ const formSupportFactory = () => {
23500
23563
  visibleErrors,
23501
23564
  visibleWarnings,
23502
23565
  supportHeight,
23566
+ supportCanAnimate: supportCanAnimate.asReadonly(),
23503
23567
  };
23504
23568
  };
23505
23569
  const FORM_SUPPORT_DEF = /* @__PURE__ */ defineProvider(formSupportFactory, {
@@ -24066,12 +24130,15 @@ class TextFieldControlDirective extends TextShellControlDirective {
24066
24130
  }
24067
24131
  /** @internal For a directive placed on the native element itself - a wrapper component binds these in its template. */
24068
24132
  mirrorOntoNativeHost(element, state) {
24069
- effect(() => {
24070
- const value = state.value();
24071
- if (!state.skip?.() && element.value !== value) {
24072
- this.nativeHostRenderer.setProperty(element, 'value', value);
24073
- }
24074
- });
24133
+ const readValue = state.value;
24134
+ if (readValue) {
24135
+ effect(() => {
24136
+ const value = readValue();
24137
+ if (!state.skip?.() && element.value !== value) {
24138
+ this.nativeHostRenderer.setProperty(element, 'value', value);
24139
+ }
24140
+ });
24141
+ }
24075
24142
  const type = state.type;
24076
24143
  if (type) {
24077
24144
  effect(() => this.nativeHostRenderer.setProperty(element, 'type', type()));
@@ -24191,6 +24258,7 @@ const toChildrenObservable$1 = (result) => toObservableResult(result);
24191
24258
  const toSearchObservable = (result) => toObservableResult(result);
24192
24259
  /** Normalizes a `resolvePath` result (array | null | Promise | Observable) into an Observable. */
24193
24260
  const toPathObservable = (result) => toObservableResult(result);
24261
+ const isPathDisabled = (path) => path.some((node) => node.disabled);
24194
24262
 
24195
24263
  const CASCADER_SELECTABLE_LEVELS = {
24196
24264
  /** Only terminal leaves commit a value (default). */
@@ -25016,7 +25084,7 @@ class CascaderDirective extends FieldStateControlDirective {
25016
25084
  /** Activates a search result: commits selectable nodes, jumps the browse state to branch-only matches. */
25017
25085
  activateSearchResult(path) {
25018
25086
  const node = path[path.length - 1];
25019
- if (!node || node.disabled || this.disabled() || this.readonly()) {
25087
+ if (!node || isPathDisabled(path) || this.disabled() || this.readonly()) {
25020
25088
  return;
25021
25089
  }
25022
25090
  if (canHaveChildren(node) && this.selectableLevels() !== CASCADER_SELECTABLE_LEVELS.ANY) {
@@ -25036,7 +25104,7 @@ class CascaderDirective extends FieldStateControlDirective {
25036
25104
  /** @internal Enter in the search input activates the focused result, or the first enabled one. */
25037
25105
  activateFocusedSearchResult() {
25038
25106
  const results = this.searchState().results;
25039
- const path = results[this.focusedSearchIndex()] ?? results.find((candidate) => !candidate[candidate.length - 1]?.disabled);
25107
+ const path = results[this.focusedSearchIndex()] ?? results.find((candidate) => !isPathDisabled(candidate));
25040
25108
  if (path) {
25041
25109
  this.activateSearchResult(path);
25042
25110
  }
@@ -25111,7 +25179,7 @@ class CascaderDirective extends FieldStateControlDirective {
25111
25179
  const results = this.searchState().results;
25112
25180
  for (let index = from; index >= 0 && index < results.length; index += step) {
25113
25181
  const path = results[index];
25114
- if (path && !path[path.length - 1]?.disabled) {
25182
+ if (path && !isPathDisabled(path)) {
25115
25183
  return index;
25116
25184
  }
25117
25185
  }
@@ -25473,7 +25541,7 @@ class CascaderSearchOptionDirective {
25473
25541
  /** The path's final node - the one an activation commits (or drills into). */
25474
25542
  this.node = computed(() => this.path()[this.path().length - 1] ?? null, /* @ts-ignore */
25475
25543
  ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
25476
- this.disabled = computed(() => this.node()?.disabled ?? false, /* @ts-ignore */
25544
+ this.disabled = computed(() => isPathDisabled(this.path()), /* @ts-ignore */
25477
25545
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
25478
25546
  this.selected = computed(() => {
25479
25547
  const node = this.node();
@@ -26752,11 +26820,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
26752
26820
  */
26753
26821
  class FormSupportStylesComponent {
26754
26822
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormSupportStylesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26755
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: FormSupportStylesComponent, isStandalone: true, selector: "et-form-support-styles", ngImport: i0, template: '', isInline: true, styles: ["@layer components{@property --et-form-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-support-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}.et-form-support{display:block;overflow:clip;block-size:0;unicode-bidi:isolate}.et-form-support-stack{position:relative;display:grid}.et-form-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}.et-form-support-content[data-active]{opacity:1}.et-form-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}.et-form-support-errors,.et-form-support-warnings{display:flex;flex-direction:column;gap:2px;padding-block-start:4px;color:var(--et-theme-color-ink-solid, currentColor)}.et-form-support-errors{font-size:var(--et-form-support-error-font-size)}.et-form-support-warnings{font-size:var(--et-form-support-warning-font-size)}.et-form-support-hint{padding-block-start:4px;font-size:var(--et-form-support-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor)}.et-form-support-hint:empty{display:none}[data-can-animate] .et-form-support{transition:block-size var(--et-form-support-duration) ease}[data-can-animate] .et-form-support-content{transition:opacity var(--et-form-support-duration) ease}@starting-style{[data-can-animate] .et-form-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){.et-form-support{--et-form-support-duration: 1ms}}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
26823
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: FormSupportStylesComponent, isStandalone: true, selector: "et-form-support-styles", ngImport: i0, template: '', isInline: true, styles: ["@layer components{@property --et-form-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-support-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}.et-form-support{display:block;overflow:clip;unicode-bidi:isolate}.et-form-support-stack{position:relative;display:grid}.et-form-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}.et-form-support-content[data-active]{opacity:1}.et-form-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}.et-form-support-errors,.et-form-support-warnings{display:flex;flex-direction:column;gap:2px;padding-block-start:4px;color:var(--et-theme-color-ink-solid, currentColor)}.et-form-support-errors{font-size:var(--et-form-support-error-font-size)}.et-form-support-warnings{font-size:var(--et-form-support-warning-font-size)}.et-form-support-hint{padding-block-start:4px;font-size:var(--et-form-support-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor)}.et-form-support-hint:empty{display:none}.et-form-support[data-can-animate]{transition:block-size var(--et-form-support-duration) ease}.et-form-support[data-can-animate] .et-form-support-content{transition:opacity var(--et-form-support-duration) ease}@starting-style{.et-form-support[data-can-animate] .et-form-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){.et-form-support{--et-form-support-duration: 1ms}}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
26756
26824
  }
26757
26825
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormSupportStylesComponent, decorators: [{
26758
26826
  type: Component,
26759
- args: [{ selector: 'et-form-support-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{@property --et-form-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-support-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}.et-form-support{display:block;overflow:clip;block-size:0;unicode-bidi:isolate}.et-form-support-stack{position:relative;display:grid}.et-form-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}.et-form-support-content[data-active]{opacity:1}.et-form-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}.et-form-support-errors,.et-form-support-warnings{display:flex;flex-direction:column;gap:2px;padding-block-start:4px;color:var(--et-theme-color-ink-solid, currentColor)}.et-form-support-errors{font-size:var(--et-form-support-error-font-size)}.et-form-support-warnings{font-size:var(--et-form-support-warning-font-size)}.et-form-support-hint{padding-block-start:4px;font-size:var(--et-form-support-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor)}.et-form-support-hint:empty{display:none}[data-can-animate] .et-form-support{transition:block-size var(--et-form-support-duration) ease}[data-can-animate] .et-form-support-content{transition:opacity var(--et-form-support-duration) ease}@starting-style{[data-can-animate] .et-form-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){.et-form-support{--et-form-support-duration: 1ms}}}\n"] }]
26827
+ args: [{ selector: 'et-form-support-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{@property --et-form-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-support-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-support-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}.et-form-support{display:block;overflow:clip;unicode-bidi:isolate}.et-form-support-stack{position:relative;display:grid}.et-form-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}.et-form-support-content[data-active]{opacity:1}.et-form-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}.et-form-support-errors,.et-form-support-warnings{display:flex;flex-direction:column;gap:2px;padding-block-start:4px;color:var(--et-theme-color-ink-solid, currentColor)}.et-form-support-errors{font-size:var(--et-form-support-error-font-size)}.et-form-support-warnings{font-size:var(--et-form-support-warning-font-size)}.et-form-support-hint{padding-block-start:4px;font-size:var(--et-form-support-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor)}.et-form-support-hint:empty{display:none}.et-form-support[data-can-animate]{transition:block-size var(--et-form-support-duration) ease}.et-form-support[data-can-animate] .et-form-support-content{transition:opacity var(--et-form-support-duration) ease}@starting-style{.et-form-support[data-can-animate] .et-form-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){.et-form-support{--et-form-support-duration: 1ms}}}\n"] }]
26760
26828
  }] });
26761
26829
  /** @internal */
26762
26830
  const mountFormSupportStyles = () => injectStyleManager().mount(FormSupportStylesComponent);
@@ -26825,13 +26893,14 @@ class FormSupportComponent {
26825
26893
  });
26826
26894
  }
26827
26895
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormSupportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26828
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: FormSupportComponent, isStandalone: true, selector: "et-form-support", host: { properties: { "style.block-size.px": "support.supportHeight()" }, classAttribute: "et-form-support" }, viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "warningContent", first: true, predicate: ["warningContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "warningAnimatable", first: true, predicate: ["warningAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"et-form-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"support.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-support-content et-form-support-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"support.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-support-content et-form-support-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"support.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-support-content et-form-support-hint\"\n etAnimatable\n >\n <ng-content />\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "component", type: FormWarningComponent, selector: "et-form-warning", inputs: ["warning"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }], encapsulation: i0.ViewEncapsulation.None }); }
26896
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: FormSupportComponent, isStandalone: true, selector: "et-form-support", host: { properties: { "style.block-size.px": "support.supportHeight()", "attr.data-can-animate": "support.supportCanAnimate() || null" }, classAttribute: "et-form-support" }, viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "warningContent", first: true, predicate: ["warningContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "warningAnimatable", first: true, predicate: ["warningAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"et-form-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"support.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-support-content et-form-support-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"support.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-support-content et-form-support-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"support.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-support-content et-form-support-hint\"\n etAnimatable\n >\n <ng-content />\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "component", type: FormWarningComponent, selector: "et-form-warning", inputs: ["warning"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }], encapsulation: i0.ViewEncapsulation.None }); }
26829
26897
  }
26830
26898
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormSupportComponent, decorators: [{
26831
26899
  type: Component,
26832
26900
  args: [{ selector: 'et-form-support', encapsulation: ViewEncapsulation.None, imports: [AnimatableDirective, FormErrorComponent, FormWarningComponent, ProvideColorDirective], host: {
26833
26901
  class: 'et-form-support',
26834
26902
  '[style.block-size.px]': 'support.supportHeight()',
26903
+ '[attr.data-can-animate]': 'support.supportCanAnimate() || null',
26835
26904
  }, template: "<div class=\"et-form-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"support.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-support-content et-form-support-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"support.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-support-content et-form-support-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"support.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-support-content et-form-support-hint\"\n etAnimatable\n >\n <ng-content />\n </div>\n }\n</div>\n" }]
26836
26905
  }], ctorParameters: () => [], propDecorators: { errorContent: [{ type: i0.ViewChild, args: ['errorContent', { isSignal: true }] }], warningContent: [{ type: i0.ViewChild, args: ['warningContent', { isSignal: true }] }], hintContent: [{ type: i0.ViewChild, args: ['hintContent', { isSignal: true }] }], errorAnimatable: [{ type: i0.ViewChild, args: ['errorAnimatable', { isSignal: true }] }], warningAnimatable: [{ type: i0.ViewChild, args: ['warningAnimatable', { isSignal: true }] }], hintAnimatable: [{ type: i0.ViewChild, args: ['hintAnimatable', { isSignal: true }] }] } });
26837
26906
 
@@ -27573,7 +27642,7 @@ class FormFieldComponent {
27573
27642
  this.formFieldDir.activate();
27574
27643
  }
27575
27644
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27576
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: FormFieldComponent, isStandalone: true, selector: "et-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, labelMode: { classPropertyName: "labelMode", publicName: "labelMode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, busy: { classPropertyName: "busy", publicName: "busy", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "formFieldDir.isHidden() ? \"none\" : null", "attr.data-can-animate": "canAnimate.state() || null", "attr.data-control-type": "formFieldDir.controlType()", "attr.data-error": "support.displaysError() || null", "attr.data-warning": "support.displaysWarning() || null", "attr.aria-busy": "isBusy() ? \"true\" : null", "attr.data-busy": "isBusy() || null", "attr.data-expanded": "formFieldDir.usesTextFieldShell() && formFieldDir.expanded() ? \"\" : null", "attr.data-focused": "formFieldDir.usesTextFieldShell() && formFieldDir.focused() ? \"\" : null", "attr.data-readonly": "formFieldDir.usesTextFieldShell() && formFieldDir.isReadonly() ? \"\" : null", "attr.data-disabled": "formFieldDir.usesTextFieldShell() && formFieldDir.isDisabled() ? \"\" : null", "attr.data-appearance": "formFieldDir.usesTextFieldShell() ? appearance() : null", "attr.data-fill": "formFieldDir.usesTextFieldShell() ? fill() : null", "attr.data-label-floated": "hasFloatingTextLabel() && formFieldDir.shouldFloatLabel() ? \"\" : null", "attr.data-has-label": "formFieldDir.registeredLabel() ? \"\" : null", "attr.data-label-mode": "formFieldDir.usesTextFieldShell() ? labelMode() : null", "attr.data-size": "formFieldDir.usesTextFieldShell() ? size() : null", "attr.data-text-shell": "formFieldDir.usesTextFieldShell() || null", "style.--_et-form-field-prefix-offset": "prefixOffset()" }, classAttribute: "et-form-field" }, providers: [provideFormSupport()], queries: [{ propertyName: "description", first: true, predicate: DescriptionComponent, isSignal: true }], viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "warningContent", first: true, predicate: ["warningContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "counterContent", first: true, predicate: ["counterContent"], descendants: true, isSignal: true }, { propertyName: "controlFrame", first: true, predicate: ["controlFrame"], descendants: true, isSignal: true }, { propertyName: "prefixEl", first: true, predicate: ["prefixEl"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "warningAnimatable", first: true, predicate: ["warningAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: FormFieldDirective }, { directive: i1.ProvideColorDirective, inputs: ["etProvideColor", "color"] }, { directive: i1.ProvideSurfaceDirective, inputs: ["etProvideSurface", "surface"] }, { directive: i1.ColorInteractiveHasFocusDirective }], ngImport: i0, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div [style.block-size.px]=\"support.supportHeight()\" class=\"et-form-field-support\" etColorInteractiveExclude>\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip;block-size:0}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field[data-can-animate] .et-form-field-support{transition:block-size var(--et-form-field-support-duration) ease}et-form-field[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}}\n"], dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "directive", type: ColorInteractiveExcludeDirective, selector: "[etColorInteractiveExclude]" }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "component", type: FormWarningComponent, selector: "et-form-warning", inputs: ["warning"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
27645
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: FormFieldComponent, isStandalone: true, selector: "et-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, labelMode: { classPropertyName: "labelMode", publicName: "labelMode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, busy: { classPropertyName: "busy", publicName: "busy", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "formFieldDir.isHidden() ? \"none\" : null", "attr.data-can-animate": "canAnimate.state() || null", "attr.data-control-type": "formFieldDir.controlType()", "attr.data-error": "support.displaysError() || null", "attr.data-warning": "support.displaysWarning() || null", "attr.aria-busy": "isBusy() ? \"true\" : null", "attr.data-busy": "isBusy() || null", "attr.data-expanded": "formFieldDir.usesTextFieldShell() && formFieldDir.expanded() ? \"\" : null", "attr.data-focused": "formFieldDir.usesTextFieldShell() && formFieldDir.focused() ? \"\" : null", "attr.data-readonly": "formFieldDir.usesTextFieldShell() && formFieldDir.isReadonly() ? \"\" : null", "attr.data-disabled": "formFieldDir.usesTextFieldShell() && formFieldDir.isDisabled() ? \"\" : null", "attr.data-appearance": "formFieldDir.usesTextFieldShell() ? appearance() : null", "attr.data-fill": "formFieldDir.usesTextFieldShell() ? fill() : null", "attr.data-label-floated": "hasFloatingTextLabel() && formFieldDir.shouldFloatLabel() ? \"\" : null", "attr.data-has-label": "formFieldDir.registeredLabel() ? \"\" : null", "attr.data-label-mode": "formFieldDir.usesTextFieldShell() ? labelMode() : null", "attr.data-size": "formFieldDir.usesTextFieldShell() ? size() : null", "attr.data-text-shell": "formFieldDir.usesTextFieldShell() || null", "style.--_et-form-field-prefix-offset": "prefixOffset()" }, classAttribute: "et-form-field" }, providers: [provideFormSupport()], queries: [{ propertyName: "description", first: true, predicate: DescriptionComponent, isSignal: true }], viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "warningContent", first: true, predicate: ["warningContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "counterContent", first: true, predicate: ["counterContent"], descendants: true, isSignal: true }, { propertyName: "controlFrame", first: true, predicate: ["controlFrame"], descendants: true, isSignal: true }, { propertyName: "prefixEl", first: true, predicate: ["prefixEl"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "warningAnimatable", first: true, predicate: ["warningAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: FormFieldDirective }, { directive: i1.ProvideColorDirective, inputs: ["etProvideColor", "color"] }, { directive: i1.ProvideSurfaceDirective, inputs: ["etProvideSurface", "surface"] }, { directive: i1.ColorInteractiveHasFocusDirective }], ngImport: i0, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div\n [style.block-size.px]=\"support.supportHeight()\"\n [attr.data-can-animate]=\"support.supportCanAnimate() || null\"\n class=\"et-form-field-support\"\n etColorInteractiveExclude\n >\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-support[data-can-animate]{transition:block-size var(--et-form-field-support-duration) ease}et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}}\n"], dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "directive", type: ColorInteractiveExcludeDirective, selector: "[etColorInteractiveExclude]" }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "component", type: FormWarningComponent, selector: "et-form-warning", inputs: ["warning"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
27577
27646
  }
27578
27647
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormFieldComponent, decorators: [{
27579
27648
  type: Component,
@@ -27613,7 +27682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
27613
27682
  '[attr.data-size]': 'formFieldDir.usesTextFieldShell() ? size() : null',
27614
27683
  '[attr.data-text-shell]': 'formFieldDir.usesTextFieldShell() || null',
27615
27684
  '[style.--_et-form-field-prefix-offset]': 'prefixOffset()',
27616
- }, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div [style.block-size.px]=\"support.supportHeight()\" class=\"et-form-field-support\" etColorInteractiveExclude>\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip;block-size:0}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field[data-can-animate] .et-form-field-support{transition:block-size var(--et-form-field-support-duration) ease}et-form-field[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}}\n"] }]
27685
+ }, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div\n [style.block-size.px]=\"support.supportHeight()\"\n [attr.data-can-animate]=\"support.supportCanAnimate() || null\"\n class=\"et-form-field-support\"\n etColorInteractiveExclude\n >\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-support[data-can-animate]{transition:block-size var(--et-form-field-support-duration) ease}et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}}\n"] }]
27617
27686
  }], ctorParameters: () => [], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], labelMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelMode", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], busy: [{ type: i0.Input, args: [{ isSignal: true, alias: "busy", required: false }] }], errorContent: [{ type: i0.ViewChild, args: ['errorContent', { isSignal: true }] }], warningContent: [{ type: i0.ViewChild, args: ['warningContent', { isSignal: true }] }], hintContent: [{ type: i0.ViewChild, args: ['hintContent', { isSignal: true }] }], counterContent: [{ type: i0.ViewChild, args: ['counterContent', { isSignal: true }] }], controlFrame: [{ type: i0.ViewChild, args: ['controlFrame', { isSignal: true }] }], prefixEl: [{ type: i0.ViewChild, args: ['prefixEl', { isSignal: true }] }], errorAnimatable: [{ type: i0.ViewChild, args: ['errorAnimatable', { isSignal: true }] }], warningAnimatable: [{ type: i0.ViewChild, args: ['warningAnimatable', { isSignal: true }] }], hintAnimatable: [{ type: i0.ViewChild, args: ['hintAnimatable', { isSignal: true }] }], description: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DescriptionComponent), { ...{ descendants: false }, isSignal: true }] }] } });
27618
27687
 
27619
27688
  const INPUT_MASK_HOST = new InjectionToken('INPUT_MASK_HOST');
@@ -27687,6 +27756,7 @@ class InputDirective extends TextFieldControlDirective {
27687
27756
  value: this.displayValue,
27688
27757
  placeholder: this.effectivePlaceholder,
27689
27758
  type: this.type,
27759
+ attributes: () => ({ autocomplete: this.autocomplete() || null }),
27690
27760
  skip: () => this.nativeSyncSuppressed,
27691
27761
  });
27692
27762
  }
@@ -27862,16 +27932,45 @@ class NumberInputDirective extends TextFieldControlDirective {
27862
27932
  this.nativeControl.set(hostElement);
27863
27933
  this.focusTarget.set(hostElement);
27864
27934
  this.mirrorOntoNativeHost(hostElement, {
27865
- value: () => `${this.displayValue()}`,
27866
27935
  placeholder: this.effectivePlaceholder,
27867
27936
  attributes: () => ({
27868
27937
  min: this.min()?.toString() ?? null,
27869
27938
  max: this.max()?.toString() ?? null,
27870
27939
  step: this.step()?.toString() ?? null,
27871
27940
  inputmode: this.inputMode(),
27941
+ autocomplete: this.autocomplete() || null,
27872
27942
  }),
27873
27943
  });
27874
27944
  }
27945
+ effect(() => {
27946
+ const element = this.nativeControl();
27947
+ this.displayValue();
27948
+ if (element)
27949
+ untracked(() => this.writeNativeTextUnlessInSync(element));
27950
+ });
27951
+ effect(() => {
27952
+ if (this.touched())
27953
+ return;
27954
+ untracked(() => this.clearParseError());
27955
+ });
27956
+ }
27957
+ /**
27958
+ * @internal Rewrites the native text in the model's own form - `2.0` becomes `2` - once the user
27959
+ * leaves the input. Text that is not a number stays, so the parse error can name it.
27960
+ */
27961
+ normalizeNativeText() {
27962
+ const element = this.nativeControl();
27963
+ if (!element || this.mixed() || element.validity.badInput)
27964
+ return;
27965
+ const canonical = `${this.displayValue()}`;
27966
+ if (element.value !== canonical)
27967
+ element.value = canonical;
27968
+ }
27969
+ handleNativeBlur(event) {
27970
+ if (event.target !== this.focusTarget())
27971
+ return;
27972
+ super.handleNativeBlur(event);
27973
+ this.normalizeNativeText();
27875
27974
  }
27876
27975
  /**
27877
27976
  * Steps the value by `step` (an empty or mixed value starts from `0`), clamped to `min`/`max`.
@@ -27978,6 +28077,28 @@ class NumberInputDirective extends TextFieldControlDirective {
27978
28077
  this.value.set(Number.isNaN(parsed) ? null : parsed);
27979
28078
  this.parseError.set(inputElement.validity.badInput);
27980
28079
  }
28080
+ /** Writing on every keystroke would turn `2.0` into `2`, eat the `-` of `-0.5` and move the caret. */
28081
+ writeNativeTextUnlessInSync(element) {
28082
+ if (this.nativeTextMatchesModel(element))
28083
+ return;
28084
+ element.value = `${this.displayValue()}`;
28085
+ }
28086
+ nativeTextMatchesModel(element) {
28087
+ if (this.mixed())
28088
+ return element.value === '';
28089
+ const value = this.value();
28090
+ if (value === null)
28091
+ return element.value === '' || element.validity.badInput;
28092
+ return element.value !== '' && element.valueAsNumber === value;
28093
+ }
28094
+ clearParseError() {
28095
+ if (!this.parseError())
28096
+ return;
28097
+ const element = this.nativeControl();
28098
+ if (element)
28099
+ element.value = `${this.displayValue()}`;
28100
+ this.parseError.set(false);
28101
+ }
27981
28102
  exceedsDecimals(text) {
27982
28103
  const decimals = this.decimals();
27983
28104
  if (decimals === null)
@@ -28103,6 +28224,8 @@ class PasswordInputDirective extends TextFieldControlDirective {
28103
28224
  this.mirrorOntoNativeHost(hostElement, {
28104
28225
  value: this.displayValue,
28105
28226
  placeholder: this.effectivePlaceholder,
28227
+ type: this.inputType,
28228
+ attributes: () => ({ autocomplete: this.autocomplete() || null }),
28106
28229
  });
28107
28230
  }
28108
28231
  }
@@ -30010,79 +30133,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
30010
30133
  type: Directive
30011
30134
  }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
30012
30135
 
30013
- /**
30014
- * Strictly parses `value` against a date-fns format string. Returns `null` for
30015
- * empty input, leftover characters, or anything date-fns considers invalid.
30016
- */
30017
- const parseDateValue = (value, options) => {
30018
- const trimmed = value.trim();
30019
- if (!trimmed) {
30020
- return null;
30021
- }
30022
- const locale = options.locale ?? undefined;
30023
- const timeZone = options.timeZone ?? null;
30024
- const parsed = parse(trimmed, options.format, options.referenceDate ?? new Date(), {
30025
- locale,
30026
- in: timeZone === null ? undefined : tz(timeZone),
30027
- });
30028
- if (!isValid(parsed)) {
30029
- return null;
30030
- }
30031
- return timeZone === null ? parsed : new Date(parsed.getTime());
30032
- };
30033
- /** Formats a `Date` with a date-fns format string. Invalid dates yield `null`. */
30034
- const formatDateValue = (date, options) => {
30035
- if (!isValid(date)) {
30036
- return null;
30037
- }
30038
- const locale = options.locale;
30039
- return format(date, options.format, locale ? { locale } : undefined);
30040
- };
30041
-
30042
- /** The `displayFormat` a precision implies, when the consumer has not named one. */
30043
- const displayFormatForPrecision = (precision, locale) => {
30044
- if (precision === 'day') {
30045
- return 'P';
30046
- }
30047
- if (precision === 'year') {
30048
- return 'yyyy';
30049
- }
30050
- return monthYearFormat(locale?.formatLong?.date({ width: 'short' }) ?? 'MM/dd/yyyy');
30051
- };
30052
- const monthYearFormat = (shortDatePattern) => {
30053
- const stripped = shortDatePattern.replace(/(?:[^a-zA-Z']+d+|d+[^a-zA-Z']+)/, '');
30054
- if (stripped === shortDatePattern || /d/.test(stripped)) {
30055
- return 'MM/yyyy';
30056
- }
30057
- return widenYearToken(stripped);
30058
- };
30059
- /** `y` / `yy` / `yyy` → `yyyy`, so the pattern is fixed-width and a mask can be derived from it. */
30060
- const widenYearToken = (pattern) => pattern.replace(/y+/, 'yyyy');
30061
-
30062
- const EXAMPLE_DATE = /* @__PURE__ */ new Date(2026, 6, 16, 21, 30, 0);
30063
- /**
30064
- * Dev mode only: warns once per control when a non-empty wire value does not parse against the
30065
- * `valueFormat` in effect, since the field then renders blank. Call in an injection context.
30066
- */
30067
- const warnOnUnparsedValue = (options) => {
30068
- if (!ngDevMode)
30069
- return;
30070
- let warned = false;
30071
- effect(() => {
30072
- if (warned)
30073
- return;
30074
- const miss = options.readings().find((reading) => !!reading.value?.trim() && reading.parsed === null);
30075
- if (!miss)
30076
- return;
30077
- warned = true;
30078
- const format = options.format();
30079
- const example = formatDateValue(EXAMPLE_DATE, { format, locale: options.locale() });
30080
- console.warn(`[${options.selector}] The value "${miss.value}" does not match the valueFormat "${format}", so the field ` +
30081
- `renders blank. A matching value looks like "${example}". Set valueFormat on the control or ` +
30082
- `${options.formatProvider}() for the app.`);
30083
- });
30084
- };
30085
-
30086
30136
  /** date-fns' own pre-pass: the `P`/`p` locale formats are expanded before the format is tokenized. */
30087
30137
  const LONG_FORMAT_PATTERN = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
30088
30138
  /** date-fns' formatting tokenizer. */
@@ -30157,13 +30207,15 @@ const kindOf = (token) => {
30157
30207
  // `t`/`T` are whole epoch timestamps, and an unknown letter is date-fns' problem
30158
30208
  return /[a-zA-Z]/.test(first) ? 'unsplittable' : 'literal';
30159
30209
  };
30210
+ /** The format's date-fns tokens, with the `P`/`p` locale formats expanded. */
30211
+ const formatTokens = (format, locale) => expandLongFormats(format, locale ?? enUS).match(TOKEN_PATTERN) ?? [];
30160
30212
  /**
30161
30213
  * Splits a combined date & time format into the span carrying the time and the date format around
30162
30214
  * it. `null` when the format has no time half, no date half, or interleaves the two.
30163
30215
  */
30164
30216
  const splitDateTimeFormat = (format, locale) => {
30165
- const tokens = expandLongFormats(format, locale ?? enUS).match(TOKEN_PATTERN);
30166
- if (tokens === null) {
30217
+ const tokens = formatTokens(format, locale);
30218
+ if (tokens.length === 0) {
30167
30219
  return null;
30168
30220
  }
30169
30221
  const kinds = tokens.map(kindOf);
@@ -30182,6 +30234,88 @@ const splitDateTimeFormat = (format, locale) => {
30182
30234
  };
30183
30235
  };
30184
30236
 
30237
+ // date-fns' `y`/`yyyy` parsers take one to four digits as the literal year, so `1.2.26` would read as 0026
30238
+ const isShortYear = (parsed, { format, locale }) => {
30239
+ if (parsed.getFullYear() >= 1000) {
30240
+ return false;
30241
+ }
30242
+ const yearTokens = formatTokens(format, locale ?? null).filter((token) => token[0] === 'y');
30243
+ return yearTokens.length > 0 && !yearTokens.includes('yy');
30244
+ };
30245
+ /**
30246
+ * Strictly parses `value` against a date-fns format string. Returns `null` for
30247
+ * empty input, leftover characters, a year of fewer than four digits where the format
30248
+ * asks for a full one, or anything date-fns considers invalid.
30249
+ */
30250
+ const parseDateValue = (value, options) => {
30251
+ const trimmed = value.trim();
30252
+ if (!trimmed) {
30253
+ return null;
30254
+ }
30255
+ const locale = options.locale ?? undefined;
30256
+ const timeZone = options.timeZone ?? null;
30257
+ const parsed = parse(trimmed, options.format, options.referenceDate ?? new Date(), {
30258
+ locale,
30259
+ in: timeZone === null ? undefined : tz(timeZone),
30260
+ });
30261
+ if (!isValid(parsed) || isShortYear(parsed, options)) {
30262
+ return null;
30263
+ }
30264
+ return timeZone === null ? parsed : new Date(parsed.getTime());
30265
+ };
30266
+ /** Formats a `Date` with a date-fns format string. Invalid dates yield `null`. */
30267
+ const formatDateValue = (date, options) => {
30268
+ if (!isValid(date)) {
30269
+ return null;
30270
+ }
30271
+ const locale = options.locale;
30272
+ return format(date, options.format, locale ? { locale } : undefined);
30273
+ };
30274
+
30275
+ /** The `displayFormat` a precision implies, when the consumer has not named one. */
30276
+ const displayFormatForPrecision = (precision, locale) => {
30277
+ if (precision === 'day') {
30278
+ return 'P';
30279
+ }
30280
+ if (precision === 'year') {
30281
+ return 'yyyy';
30282
+ }
30283
+ return monthYearFormat(locale?.formatLong?.date({ width: 'short' }) ?? 'MM/dd/yyyy');
30284
+ };
30285
+ const monthYearFormat = (shortDatePattern) => {
30286
+ const stripped = shortDatePattern.replace(/(?:[^a-zA-Z']+d+|d+[^a-zA-Z']+)/, '');
30287
+ if (stripped === shortDatePattern || /d/.test(stripped)) {
30288
+ return 'MM/yyyy';
30289
+ }
30290
+ return widenYearToken(stripped);
30291
+ };
30292
+ /** `y` / `yy` / `yyy` → `yyyy`, so the pattern is fixed-width and a mask can be derived from it. */
30293
+ const widenYearToken = (pattern) => pattern.replace(/y+/, 'yyyy');
30294
+
30295
+ const EXAMPLE_DATE = /* @__PURE__ */ new Date(2026, 6, 16, 21, 30, 0);
30296
+ /**
30297
+ * Dev mode only: warns once per control when a non-empty wire value does not parse against the
30298
+ * `valueFormat` in effect, since the field then renders blank. Call in an injection context.
30299
+ */
30300
+ const warnOnUnparsedValue = (options) => {
30301
+ if (!ngDevMode)
30302
+ return;
30303
+ let warned = false;
30304
+ effect(() => {
30305
+ if (warned)
30306
+ return;
30307
+ const miss = options.readings().find((reading) => !!reading.value?.trim() && reading.parsed === null);
30308
+ if (!miss)
30309
+ return;
30310
+ warned = true;
30311
+ const format = options.format();
30312
+ const example = formatDateValue(EXAMPLE_DATE, { format, locale: options.locale() });
30313
+ console.warn(`[${options.selector}] The value "${miss.value}" does not match the valueFormat "${format}", so the field ` +
30314
+ `renders blank. A matching value looks like "${example}". Set valueFormat on the control or ` +
30315
+ `${options.formatProvider}() for the app.`);
30316
+ });
30317
+ };
30318
+
30185
30319
  /** The day of `day` carrying the time of day of `time`. */
30186
30320
  const withTimeOfDay = (day, time) => setSeconds(setMinutes(setHours(startOfDay(day), time.getHours()), time.getMinutes()), time.getSeconds());
30187
30321
 
@@ -31155,11 +31289,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
31155
31289
  }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], startPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "startPlaceholder", required: false }] }], endPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "endPlaceholder", required: false }] }], startAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAriaLabel", required: false }] }], endAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endAriaLabel", required: false }] }] } });
31156
31290
 
31157
31291
  /** The preset state a range input shares with its styled component. Call in an injection context. */
31158
- const createDateRangePresets = ({ host, presets, labels, normalize }) => {
31292
+ const createDateRangePresets = ({ host, presets, labels, firstDayOfWeek, normalize, }) => {
31159
31293
  const resolveInstants = (preset) => {
31160
31294
  const timeZone = host.effectiveTimeZone();
31161
31295
  const now = timeZone === null ? new Date() : zonedProxy(new Date(), timeZone);
31162
- const range = preset.resolve(now, { locale: host.effectiveLocale() });
31296
+ const locale = host.effectiveLocale();
31297
+ const range = preset.resolve(now, {
31298
+ locale,
31299
+ weekStartsOn: firstDayOfWeek() ?? locale?.options?.weekStartsOn ?? 1,
31300
+ });
31163
31301
  return {
31164
31302
  start: reinterpretInZone(normalize(range.start), timeZone),
31165
31303
  end: reinterpretInZone(normalize(range.end), timeZone),
@@ -31292,6 +31430,7 @@ class DateRangeInputDirective extends DateRangePickerInputDirective {
31292
31430
  host: this,
31293
31431
  presets: this.presets,
31294
31432
  labels: this.dateTimeLabels,
31433
+ firstDayOfWeek: this.firstDayOfWeek,
31295
31434
  normalize: (date) => startOfCalendarUnit(date, this.precision()),
31296
31435
  });
31297
31436
  /** The format in effect: this instance's `displayFormat`, else the one `precision` implies. */
@@ -31514,7 +31653,10 @@ const dayRange = (start, end) => ({
31514
31653
  start: startOfDay(start),
31515
31654
  end: endOfDayMinute(end),
31516
31655
  });
31517
- const weekOptions = ({ locale }) => (locale ? { locale } : undefined);
31656
+ const weekOptions = ({ locale, weekStartsOn }) => ({
31657
+ locale: locale ?? undefined,
31658
+ weekStartsOn: weekStartsOn ?? locale?.options?.weekStartsOn ?? 1,
31659
+ });
31518
31660
  const createPreset = ({ defaultLabel, resolve, options }) => ({
31519
31661
  label: options.label ?? defaultLabel,
31520
31662
  resolve,
@@ -31539,7 +31681,7 @@ const nextDaysPreset = (count, options = {}) => createPreset({
31539
31681
  resolve: (now) => dayRange(addDays(now, 1), addDays(now, Math.max(1, count))),
31540
31682
  options,
31541
31683
  });
31542
- /** The current week, starting on the locale's first day of the week. */
31684
+ /** The current week, starting on the first day of the control's calendar rows. */
31543
31685
  const thisWeekPreset = (options = {}) => createPreset({
31544
31686
  defaultLabel: (labels) => labels.presetThisWeek,
31545
31687
  resolve: (now, context) => dayRange(startOfWeek(now, weekOptions(context)), endOfWeek(now, weekOptions(context))),
@@ -31579,6 +31721,14 @@ const DATE_TIME_INPUT_ERROR_CODES = {
31579
31721
  };
31580
31722
 
31581
31723
  const secondsOfDay$1 = (date) => date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();
31724
+ /**
31725
+ * The start of `date`'s day, or of the same weekday a week earlier when the runtime's clocks change on it,
31726
+ * so every wall-clock time exists on the returned day.
31727
+ */
31728
+ const clockSafeDay = (date) => {
31729
+ const day = startOfDay(date);
31730
+ return day.getTimezoneOffset() === endOfDay(day).getTimezoneOffset() ? day : subWeeks(day, 1);
31731
+ };
31582
31732
  const setTimeOfDay = (day, candidate) => setSeconds(setMinutes(setHours(day, candidate.hour), candidate.minute), candidate.second);
31583
31733
  const isTimeSelectable = (candidate, options) => {
31584
31734
  const { min, max, filter, day } = options;
@@ -31772,6 +31922,8 @@ class TimePickerDirective {
31772
31922
  this.defaultFormat = injectTimeFormat();
31773
31923
  this.defaultLocale = injectDateLocale();
31774
31924
  this.hostElement = injectHostElement();
31925
+ /** Blocks every change: a press, a drag and the keys leave the time alone. */
31926
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
31775
31927
  /** Whether the ring holds one time (`value`) or a range (`rangeValue`). */
31776
31928
  this.mode = input('single', /* @ts-ignore */
31777
31929
  ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
@@ -31849,9 +32001,11 @@ class TimePickerDirective {
31849
32001
  return spec.hourCycle === 12 ? `h:mm${spec.showSeconds ? ':ss' : ''} a` : `HH:mm${spec.showSeconds ? ':ss' : ''}`;
31850
32002
  }, /* @ts-ignore */
31851
32003
  ...(ngDevMode ? [{ debugName: "sideFormat" }] : /* istanbul ignore next */ []));
31852
- this.startRingDay = computed(() => startOfDay(this.ringValue('start') ?? this.now()).getTime(), /* @ts-ignore */
32004
+ this.emptyRingDay = computed(() => clockSafeDay(this.now()), /* @ts-ignore */
32005
+ ...(ngDevMode ? [{ debugName: "emptyRingDay" }] : /* istanbul ignore next */ []));
32006
+ this.startRingDay = computed(() => startOfDay(this.ringValue('start') ?? this.emptyRingDay()).getTime(), /* @ts-ignore */
31853
32007
  ...(ngDevMode ? [{ debugName: "startRingDay" }] : /* istanbul ignore next */ []));
31854
- this.endRingDay = computed(() => startOfDay(this.ringValue('end') ?? this.now()).getTime(), /* @ts-ignore */
32008
+ this.endRingDay = computed(() => startOfDay(this.ringValue('end') ?? this.emptyRingDay()).getTime(), /* @ts-ignore */
31855
32009
  ...(ngDevMode ? [{ debugName: "endRingDay" }] : /* istanbul ignore next */ []));
31856
32010
  this.sameDayRange = computed(() => {
31857
32011
  const days = this.rangeDays();
@@ -31898,11 +32052,11 @@ class TimePickerDirective {
31898
32052
  * range hands the active side on to the end. Returns whether it handed on.
31899
32053
  */
31900
32054
  commitRingMinute(side, minute) {
31901
- if (!isStopOpen(this.ringStops()[side], minute)) {
32055
+ if (this.disabled() || !isStopOpen(this.ringStops()[side], minute)) {
31902
32056
  return false;
31903
32057
  }
31904
32058
  const current = this.ringValue(side);
31905
- const next = setMilliseconds(setTimeOfDay(current ?? startOfDay(this.now()), {
32059
+ const next = setMilliseconds(setTimeOfDay(current ?? this.emptyRingDay(), {
31906
32060
  hour: Math.floor(minute / 60),
31907
32061
  minute: minute % 60,
31908
32062
  second: 0,
@@ -31941,7 +32095,7 @@ class TimePickerDirective {
31941
32095
  return createTimeRingStops(this.minuteStep(), other === null ? isOpen : (minute) => isOpen(minute) && (side === 'end' ? minute >= other : minute <= other));
31942
32096
  }
31943
32097
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimePickerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
31944
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: TimePickerDirective, isStandalone: true, selector: "[etTimePicker]", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, timeFilter: { classPropertyName: "timeFilter", publicName: "timeFilter", isSignal: true, isRequired: false, transformFunction: null }, startLabel: { classPropertyName: "startLabel", publicName: "startLabel", isSignal: true, isRequired: false, transformFunction: null }, endLabel: { classPropertyName: "endLabel", publicName: "endLabel", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, rangeValue: { classPropertyName: "rangeValue", publicName: "rangeValue", isSignal: true, isRequired: false, transformFunction: null }, activeSide: { classPropertyName: "activeSide", publicName: "activeSide", isSignal: true, isRequired: false, transformFunction: null }, day: { classPropertyName: "day", publicName: "day", isSignal: true, isRequired: false, transformFunction: null }, rangeDays: { classPropertyName: "rangeDays", publicName: "rangeDays", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", rangeValue: "rangeValueChange", activeSide: "activeSideChange", timeSelect: "timeSelect", rangeHandOff: "rangeHandOff" }, host: { listeners: { "focusin": "refreshNow($event)" } }, exportAs: ["etTimePicker"], ngImport: i0 }); }
32098
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: TimePickerDirective, isStandalone: true, selector: "[etTimePicker]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, timeFilter: { classPropertyName: "timeFilter", publicName: "timeFilter", isSignal: true, isRequired: false, transformFunction: null }, startLabel: { classPropertyName: "startLabel", publicName: "startLabel", isSignal: true, isRequired: false, transformFunction: null }, endLabel: { classPropertyName: "endLabel", publicName: "endLabel", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, rangeValue: { classPropertyName: "rangeValue", publicName: "rangeValue", isSignal: true, isRequired: false, transformFunction: null }, activeSide: { classPropertyName: "activeSide", publicName: "activeSide", isSignal: true, isRequired: false, transformFunction: null }, day: { classPropertyName: "day", publicName: "day", isSignal: true, isRequired: false, transformFunction: null }, rangeDays: { classPropertyName: "rangeDays", publicName: "rangeDays", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", rangeValue: "rangeValueChange", activeSide: "activeSideChange", timeSelect: "timeSelect", rangeHandOff: "rangeHandOff" }, host: { listeners: { "focusin": "refreshNow($event)" } }, exportAs: ["etTimePicker"], ngImport: i0 }); }
31945
32099
  }
31946
32100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimePickerDirective, decorators: [{
31947
32101
  type: Directive,
@@ -31952,7 +32106,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
31952
32106
  '(focusin)': 'refreshNow($event)',
31953
32107
  },
31954
32108
  }]
31955
- }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], timeFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeFilter", required: false }] }], startLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startLabel", required: false }] }], endLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endLabel", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], rangeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "rangeValue", required: false }] }, { type: i0.Output, args: ["rangeValueChange"] }], activeSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeSide", required: false }] }, { type: i0.Output, args: ["activeSideChange"] }], day: [{ type: i0.Input, args: [{ isSignal: true, alias: "day", required: false }] }], rangeDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "rangeDays", required: false }] }], timeSelect: [{ type: i0.Output, args: ["timeSelect"] }], rangeHandOff: [{ type: i0.Output, args: ["rangeHandOff"] }] } });
32109
+ }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], timeFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeFilter", required: false }] }], startLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startLabel", required: false }] }], endLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endLabel", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], rangeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "rangeValue", required: false }] }, { type: i0.Output, args: ["rangeValueChange"] }], activeSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeSide", required: false }] }, { type: i0.Output, args: ["activeSideChange"] }], day: [{ type: i0.Input, args: [{ isSignal: true, alias: "day", required: false }] }], rangeDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "rangeDays", required: false }] }], timeSelect: [{ type: i0.Output, args: ["timeSelect"] }], rangeHandOff: [{ type: i0.Output, args: ["rangeHandOff"] }] } });
31956
32110
 
31957
32111
  // codes 3020-3029 (inside the shared date & time inputs block 3000-3099)
31958
32112
  const TIME_PICKER_ERROR_CODES = {
@@ -32011,7 +32165,7 @@ class TimePickerRingDirective {
32011
32165
  }
32012
32166
  handlePointerDown(event) {
32013
32167
  const picker = this.picker;
32014
- if (event.button !== 0 || this.draggingSide() !== null) {
32168
+ if (picker.disabled() || event.button !== 0 || this.draggingSide() !== null) {
32015
32169
  return;
32016
32170
  }
32017
32171
  const pressMinute = this.minuteAt({ x: event.clientX, y: event.clientY }, { ignoreCentre: true });
@@ -32223,7 +32377,7 @@ class TimePickerRingHandleDirective {
32223
32377
  }
32224
32378
  }
32225
32379
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimePickerRingHandleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
32226
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: TimePickerRingHandleDirective, isStandalone: true, selector: "[etTimePickerRingHandle]", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "slider", "tabindex": "0", "aria-valuemin": "0", "aria-valuemax": "1439" }, listeners: { "keydown": "handleKeydown($event)", "focus": "handleFocus()", "blur": "pointerFocused.set(false)" }, properties: { "attr.aria-valuenow": "minute()", "attr.aria-valuetext": "valueText()", "attr.aria-label": "resolvedLabel()", "attr.data-side": "side()", "attr.data-empty": "minute() === null || null", "attr.data-active": "active() || null", "attr.data-dragging": "dragging() || null", "attr.data-pointer-focused": "pointerFocused() || null" } }, exportAs: ["etTimePickerRingHandle"], ngImport: i0 }); }
32380
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: TimePickerRingHandleDirective, isStandalone: true, selector: "[etTimePickerRingHandle]", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "slider", "aria-valuemin": "0", "aria-valuemax": "1439" }, listeners: { "keydown": "handleKeydown($event)", "focus": "handleFocus()", "blur": "pointerFocused.set(false)" }, properties: { "attr.tabindex": "picker.disabled() ? -1 : 0", "attr.aria-disabled": "picker.disabled() || null", "attr.data-disabled": "picker.disabled() || null", "attr.aria-valuenow": "minute()", "attr.aria-valuetext": "valueText()", "attr.aria-label": "resolvedLabel()", "attr.data-side": "side()", "attr.data-empty": "minute() === null || null", "attr.data-active": "active() || null", "attr.data-dragging": "dragging() || null", "attr.data-pointer-focused": "pointerFocused() || null" } }, exportAs: ["etTimePickerRingHandle"], ngImport: i0 }); }
32227
32381
  }
32228
32382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimePickerRingHandleDirective, decorators: [{
32229
32383
  type: Directive,
@@ -32232,7 +32386,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
32232
32386
  exportAs: 'etTimePickerRingHandle',
32233
32387
  host: {
32234
32388
  role: 'slider',
32235
- tabindex: '0',
32389
+ '[attr.tabindex]': 'picker.disabled() ? -1 : 0',
32390
+ '[attr.aria-disabled]': 'picker.disabled() || null',
32391
+ '[attr.data-disabled]': 'picker.disabled() || null',
32236
32392
  'aria-valuemin': '0',
32237
32393
  'aria-valuemax': '1439',
32238
32394
  '[attr.aria-valuenow]': 'minute()',
@@ -32387,7 +32543,7 @@ class TimePickerComponent {
32387
32543
  return minutes === 0 ? hoursText : `${hoursText} ${minutesText}`;
32388
32544
  }
32389
32545
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
32390
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TimePickerComponent, isStandalone: true, selector: "et-time-picker", host: { properties: { "attr.data-mode": "timePicker.mode()" }, classAttribute: "et-time-picker" }, viewQueries: [{ propertyName: "ring", first: true, predicate: TimePickerRingDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: TimePickerDirective, inputs: ["mode", "mode", "format", "format", "locale", "locale", "minuteStep", "minuteStep", "min", "min", "max", "max", "timeFilter", "timeFilter", "startLabel", "startLabel", "endLabel", "endLabel", "value", "value", "rangeValue", "rangeValue", "activeSide", "activeSide", "day", "day", "rangeDays", "rangeDays"], outputs: ["valueChange", "valueChange", "rangeValueChange", "rangeValueChange", "activeSideChange", "activeSideChange", "timeSelect", "timeSelect", "rangeHandOff", "rangeHandOff"] }], ngImport: i0, template: "@let readoutState = readout();\n\n<div class=\"et-time-picker-ring\" etTimePickerRing>\n <svg class=\"et-time-picker-ring-graphic\" aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 280 280\">\n @let trackState = track();\n\n @if (trackState.allBlocked) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-blocked\" />\n }\n @for (path of trackState.blocked; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-blocked\" />\n }\n @if (trackState.full) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-track\" />\n }\n @for (path of trackState.open; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-track\" />\n }\n @if (arc(); as arcPath) {\n <path [attr.d]=\"arcPath\" class=\"et-time-picker-arc\" />\n }\n\n <g class=\"et-time-picker-ticks\">\n @for (tick of ticks; track tick.hour) {\n <line [attr.x1]=\"tick.x1\" [attr.y1]=\"tick.y1\" [attr.x2]=\"tick.x2\" [attr.y2]=\"tick.y2\" />\n }\n </g>\n\n <g class=\"et-time-picker-labels\">\n @for (label of hourLabels(); track label.hour) {\n <text [attr.x]=\"label.x\" [attr.y]=\"label.y\">{{ label.text }}</text>\n }\n </g>\n\n @if (twelveHour()) {\n <path\n [attr.transform]=\"'translate(' + MOON.x + ' ' + MOON.y + ')'\"\n class=\"et-time-picker-mark\"\n d=\"M8.5 0.8 A6 6 0 1 0 11.2 8.6 A4.6 4.6 0 0 1 8.5 0.8 Z\"\n />\n <g class=\"et-time-picker-mark\">\n <circle [attr.cx]=\"sun.x\" [attr.cy]=\"sun.y\" r=\"3.2\" />\n @for (ray of sunRays; track ray.index) {\n <line [attr.x1]=\"ray.x1\" [attr.y1]=\"ray.y1\" [attr.x2]=\"ray.x2\" [attr.y2]=\"ray.y2\" />\n }\n </g>\n }\n\n <text\n [attr.x]=\"CENTER\"\n [attr.y]=\"readoutState.note === null ? CENTER : CENTER - (readoutState.kind === 'duration' ? 2 : 4)\"\n [attr.data-kind]=\"readoutState.kind\"\n [attr.data-long]=\"readoutState.main.length > 5 || null\"\n [attr.data-longer]=\"readoutState.main.length > 8 || null\"\n class=\"et-time-picker-readout\"\n >\n {{ readoutState.main }}\n </text>\n @if (readoutState.note !== null) {\n <text [attr.x]=\"CENTER\" [attr.y]=\"CENTER + 20\" class=\"et-time-picker-note\">{{ readoutState.note }}</text>\n }\n </svg>\n\n <div\n #startHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(startHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"start\"\n ></div>\n\n @if (timePicker.mode() === 'range') {\n <div\n #endHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(endHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"end\"\n ></div>\n }\n</div>\n", styles: ["@layer components{@property --et-time-picker-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 280px;}@property --et-time-picker-handle-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}.et-time-picker{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none}.et-time-picker .et-time-picker-ring{position:relative;flex:none;inline-size:var(--et-time-picker-ring-size);block-size:var(--et-time-picker-ring-size);-webkit-tap-highlight-color:transparent}.et-time-picker .et-time-picker-ring-graphic{display:block;inline-size:100%;block-size:100%;overflow:visible;font-family:inherit}.et-time-picker .et-time-picker-track,.et-time-picker .et-time-picker-arc{fill:none;stroke-width:28;stroke-linecap:butt}.et-time-picker .et-time-picker-track{stroke:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent)}.et-time-picker .et-time-picker-arc{stroke:var(--et-theme-color-primary-solid, currentColor);stroke-linecap:round;opacity:.45}.et-time-picker .et-time-picker-blocked{fill:none;stroke:var(--et-surface-color-subtle-solid, currentColor);stroke-width:1;stroke-dasharray:2 5}.et-time-picker .et-time-picker-ticks line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1}.et-time-picker .et-time-picker-labels text{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-mark{fill:var(--et-surface-color-muted-solid, currentColor)}.et-time-picker .et-time-picker-mark line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1.2;stroke-linecap:round}.et-time-picker .et-time-picker-readout{fill:var(--et-surface-color-solid, currentColor);font-size:28px;font-weight:500;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-readout:where([data-long]){font-size:22px}.et-time-picker .et-time-picker-readout:where([data-longer]){font-size:16px}.et-time-picker .et-time-picker-readout:where([data-kind=duration]){font-size:20px}.et-time-picker .et-time-picker-note{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central}.et-time-picker .et-time-picker-handle{position:absolute;inset-block-start:50%;inset-inline-start:50%;box-sizing:border-box;inline-size:var(--et-time-picker-handle-size);block-size:var(--et-time-picker-handle-size);margin-block-start:calc(var(--et-time-picker-handle-size) / -2);margin-inline-start:calc(var(--et-time-picker-handle-size) / -2);border:2px solid var(--et-theme-color-primary-solid, currentColor);border-radius:50%;background:var(--et-surface-background-solid, Canvas);transform:rotate(var(--_et-time-picker-handle-angle, 0deg)) translateY(calc(var(--et-time-picker-ring-size) * -.4)) rotate(calc(var(--_et-time-picker-handle-angle, 0deg) * -1));cursor:grab;outline:none;touch-action:none}.et-time-picker .et-time-picker-handle:where([data-empty]){opacity:0;pointer-events:none}.et-time-picker .et-time-picker-handle:where([data-dragging]){cursor:grabbing}.et-time-picker .et-time-picker-handle:focus-visible:not([data-pointer-focused]){outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px}.et-time-picker:where([data-mode=single]) .et-time-picker-handle,.et-time-picker .et-time-picker-handle:where([data-active]){border:3px solid var(--et-surface-background-solid, Canvas);background:var(--et-theme-color-primary-solid, currentColor)}.et-time-picker:where([data-mode=single]) .et-time-picker-handle{box-shadow:0 0 0 calc(var(--et-time-picker-handle-size) * .35) color-mix(in srgb,var(--et-theme-color-primary-solid, currentColor) 22%,transparent)}}\n"], dependencies: [{ kind: "directive", type: TimePickerRingDirective, selector: "[etTimePickerRing]", exportAs: ["etTimePickerRing"] }, { kind: "directive", type: TimePickerRingHandleDirective, selector: "[etTimePickerRingHandle]", inputs: ["side", "label"], exportAs: ["etTimePickerRingHandle"] }], encapsulation: i0.ViewEncapsulation.None }); }
32546
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TimePickerComponent, isStandalone: true, selector: "et-time-picker", host: { properties: { "attr.data-mode": "timePicker.mode()", "attr.data-disabled": "timePicker.disabled() || null" }, classAttribute: "et-time-picker" }, viewQueries: [{ propertyName: "ring", first: true, predicate: TimePickerRingDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: TimePickerDirective, inputs: ["mode", "mode", "format", "format", "locale", "locale", "minuteStep", "minuteStep", "min", "min", "max", "max", "timeFilter", "timeFilter", "startLabel", "startLabel", "endLabel", "endLabel", "value", "value", "rangeValue", "rangeValue", "activeSide", "activeSide", "day", "day", "rangeDays", "rangeDays", "disabled", "disabled"], outputs: ["valueChange", "valueChange", "rangeValueChange", "rangeValueChange", "activeSideChange", "activeSideChange", "timeSelect", "timeSelect", "rangeHandOff", "rangeHandOff"] }], ngImport: i0, template: "@let readoutState = readout();\n\n<div class=\"et-time-picker-ring\" etTimePickerRing>\n <svg class=\"et-time-picker-ring-graphic\" aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 280 280\">\n @let trackState = track();\n\n @if (trackState.allBlocked) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-blocked\" />\n }\n @for (path of trackState.blocked; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-blocked\" />\n }\n @if (trackState.full) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-track\" />\n }\n @for (path of trackState.open; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-track\" />\n }\n @if (arc(); as arcPath) {\n <path [attr.d]=\"arcPath\" class=\"et-time-picker-arc\" />\n }\n\n <g class=\"et-time-picker-ticks\">\n @for (tick of ticks; track tick.hour) {\n <line [attr.x1]=\"tick.x1\" [attr.y1]=\"tick.y1\" [attr.x2]=\"tick.x2\" [attr.y2]=\"tick.y2\" />\n }\n </g>\n\n <g class=\"et-time-picker-labels\">\n @for (label of hourLabels(); track label.hour) {\n <text [attr.x]=\"label.x\" [attr.y]=\"label.y\">{{ label.text }}</text>\n }\n </g>\n\n @if (twelveHour()) {\n <path\n [attr.transform]=\"'translate(' + MOON.x + ' ' + MOON.y + ')'\"\n class=\"et-time-picker-mark\"\n d=\"M8.5 0.8 A6 6 0 1 0 11.2 8.6 A4.6 4.6 0 0 1 8.5 0.8 Z\"\n />\n <g class=\"et-time-picker-mark\">\n <circle [attr.cx]=\"sun.x\" [attr.cy]=\"sun.y\" r=\"3.2\" />\n @for (ray of sunRays; track ray.index) {\n <line [attr.x1]=\"ray.x1\" [attr.y1]=\"ray.y1\" [attr.x2]=\"ray.x2\" [attr.y2]=\"ray.y2\" />\n }\n </g>\n }\n\n <text\n [attr.x]=\"CENTER\"\n [attr.y]=\"readoutState.note === null ? CENTER : CENTER - (readoutState.kind === 'duration' ? 2 : 4)\"\n [attr.data-kind]=\"readoutState.kind\"\n [attr.data-long]=\"readoutState.main.length > 5 || null\"\n [attr.data-longer]=\"readoutState.main.length > 8 || null\"\n class=\"et-time-picker-readout\"\n >\n {{ readoutState.main }}\n </text>\n @if (readoutState.note !== null) {\n <text [attr.x]=\"CENTER\" [attr.y]=\"CENTER + 20\" class=\"et-time-picker-note\">{{ readoutState.note }}</text>\n }\n </svg>\n\n <div\n #startHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(startHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"start\"\n ></div>\n\n @if (timePicker.mode() === 'range') {\n <div\n #endHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(endHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"end\"\n ></div>\n }\n</div>\n", styles: ["@layer components{@property --et-time-picker-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 280px;}@property --et-time-picker-handle-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}.et-time-picker{display:inline-flex;vertical-align:top;flex-direction:column;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;transition:opacity .12s ease}.et-time-picker .et-time-picker-ring{position:relative;flex:none;inline-size:var(--et-time-picker-ring-size);block-size:var(--et-time-picker-ring-size);-webkit-tap-highlight-color:transparent}.et-time-picker .et-time-picker-ring-graphic{display:block;inline-size:100%;block-size:100%;overflow:visible;font-family:inherit}.et-time-picker .et-time-picker-track,.et-time-picker .et-time-picker-arc{fill:none;stroke-width:28;stroke-linecap:butt}.et-time-picker .et-time-picker-track{stroke:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent)}.et-time-picker .et-time-picker-arc{stroke:var(--et-theme-color-primary-solid, currentColor);stroke-linecap:round;opacity:.45}.et-time-picker .et-time-picker-track,.et-time-picker .et-time-picker-arc{cursor:pointer}.et-time-picker .et-time-picker-blocked{fill:none;stroke:var(--et-surface-color-subtle-solid, currentColor);stroke-width:1;stroke-dasharray:2 5}.et-time-picker .et-time-picker-ticks line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1}.et-time-picker .et-time-picker-labels text{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-mark{fill:var(--et-surface-color-muted-solid, currentColor)}.et-time-picker .et-time-picker-mark line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1.2;stroke-linecap:round}.et-time-picker .et-time-picker-readout{fill:var(--et-surface-color-solid, currentColor);font-size:28px;font-weight:500;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-readout:where([data-long]){font-size:22px}.et-time-picker .et-time-picker-readout:where([data-longer]){font-size:16px}.et-time-picker .et-time-picker-readout:where([data-kind=duration]){font-size:20px}.et-time-picker .et-time-picker-note{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central}.et-time-picker .et-time-picker-handle{position:absolute;inset-block-start:50%;inset-inline-start:50%;box-sizing:border-box;inline-size:var(--et-time-picker-handle-size);block-size:var(--et-time-picker-handle-size);margin-block-start:calc(var(--et-time-picker-handle-size) / -2);margin-inline-start:calc(var(--et-time-picker-handle-size) / -2);border:2px solid var(--et-theme-color-primary-solid, currentColor);border-radius:50%;background:var(--et-surface-background-solid, Canvas);transform:rotate(var(--_et-time-picker-handle-angle, 0deg)) translateY(calc(var(--et-time-picker-ring-size) * -.4)) rotate(calc(var(--_et-time-picker-handle-angle, 0deg) * -1));--_et-time-picker-halo-shadow: 0 0 0 calc(var(--et-time-picker-handle-size) * var(--_et-time-picker-halo)) color-mix( in srgb, var(--et-theme-color-primary-solid, currentColor) var(--_et-time-picker-halo-opacity, 16%), transparent );box-shadow:var(--_et-time-picker-halo-shadow, none);transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease;cursor:grab;outline:none;touch-action:none}.et-time-picker .et-time-picker-handle:where([data-empty]){opacity:0;pointer-events:none}.et-time-picker .et-time-picker-handle:where([data-dragging]){cursor:grabbing}.et-time-picker .et-time-picker-handle:hover:not([data-disabled],[data-dragging]){--_et-time-picker-halo: .3}.et-time-picker .et-time-picker-handle[data-dragging]:not([data-disabled]){--_et-time-picker-halo: .5;--_et-time-picker-halo-opacity: 28%}.et-time-picker .et-time-picker-handle:focus-visible:not([data-pointer-focused]){outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px}.et-time-picker:where([data-mode=single]) .et-time-picker-handle,.et-time-picker .et-time-picker-handle:where([data-active]){border:3px solid var(--et-surface-background-solid, Canvas);background:var(--et-theme-color-primary-solid, currentColor)}.et-time-picker:where([data-mode=single]) .et-time-picker-handle{--_et-time-picker-halo: .35;--_et-time-picker-halo-opacity: 22%}.et-time-picker[data-mode=range] .et-time-picker-handle:hover:not([data-disabled],[data-dragging],[data-active]){background:color-mix(in srgb,var(--et-theme-color-primary-solid, currentColor) 16%,var(--et-surface-background-solid, Canvas))}.et-time-picker[data-mode=single] .et-time-picker-handle:hover:not([data-disabled],[data-dragging]){--_et-time-picker-halo: .5;--_et-time-picker-halo-opacity: 28%}.et-time-picker[data-mode=single] .et-time-picker-handle[data-dragging]:not([data-disabled]){--_et-time-picker-halo: .65;--_et-time-picker-halo-opacity: 32%}.et-time-picker:where([data-disabled]){opacity:.4}.et-time-picker:where([data-disabled]) .et-time-picker-track,.et-time-picker:where([data-disabled]) .et-time-picker-arc,.et-time-picker:where([data-disabled]) .et-time-picker-handle{cursor:not-allowed}@media(prefers-reduced-motion:reduce){.et-time-picker,.et-time-picker .et-time-picker-handle{transition:none}}}\n"], dependencies: [{ kind: "directive", type: TimePickerRingDirective, selector: "[etTimePickerRing]", exportAs: ["etTimePickerRing"] }, { kind: "directive", type: TimePickerRingHandleDirective, selector: "[etTimePickerRingHandle]", inputs: ["side", "label"], exportAs: ["etTimePickerRingHandle"] }], encapsulation: i0.ViewEncapsulation.None }); }
32391
32547
  }
32392
32548
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimePickerComponent, decorators: [{
32393
32549
  type: Component,
@@ -32409,13 +32565,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
32409
32565
  'activeSide',
32410
32566
  'day',
32411
32567
  'rangeDays',
32568
+ 'disabled',
32412
32569
  ],
32413
32570
  outputs: ['valueChange', 'rangeValueChange', 'activeSideChange', 'timeSelect', 'rangeHandOff'],
32414
32571
  },
32415
32572
  ], host: {
32416
32573
  class: 'et-time-picker',
32417
32574
  '[attr.data-mode]': 'timePicker.mode()',
32418
- }, template: "@let readoutState = readout();\n\n<div class=\"et-time-picker-ring\" etTimePickerRing>\n <svg class=\"et-time-picker-ring-graphic\" aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 280 280\">\n @let trackState = track();\n\n @if (trackState.allBlocked) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-blocked\" />\n }\n @for (path of trackState.blocked; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-blocked\" />\n }\n @if (trackState.full) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-track\" />\n }\n @for (path of trackState.open; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-track\" />\n }\n @if (arc(); as arcPath) {\n <path [attr.d]=\"arcPath\" class=\"et-time-picker-arc\" />\n }\n\n <g class=\"et-time-picker-ticks\">\n @for (tick of ticks; track tick.hour) {\n <line [attr.x1]=\"tick.x1\" [attr.y1]=\"tick.y1\" [attr.x2]=\"tick.x2\" [attr.y2]=\"tick.y2\" />\n }\n </g>\n\n <g class=\"et-time-picker-labels\">\n @for (label of hourLabels(); track label.hour) {\n <text [attr.x]=\"label.x\" [attr.y]=\"label.y\">{{ label.text }}</text>\n }\n </g>\n\n @if (twelveHour()) {\n <path\n [attr.transform]=\"'translate(' + MOON.x + ' ' + MOON.y + ')'\"\n class=\"et-time-picker-mark\"\n d=\"M8.5 0.8 A6 6 0 1 0 11.2 8.6 A4.6 4.6 0 0 1 8.5 0.8 Z\"\n />\n <g class=\"et-time-picker-mark\">\n <circle [attr.cx]=\"sun.x\" [attr.cy]=\"sun.y\" r=\"3.2\" />\n @for (ray of sunRays; track ray.index) {\n <line [attr.x1]=\"ray.x1\" [attr.y1]=\"ray.y1\" [attr.x2]=\"ray.x2\" [attr.y2]=\"ray.y2\" />\n }\n </g>\n }\n\n <text\n [attr.x]=\"CENTER\"\n [attr.y]=\"readoutState.note === null ? CENTER : CENTER - (readoutState.kind === 'duration' ? 2 : 4)\"\n [attr.data-kind]=\"readoutState.kind\"\n [attr.data-long]=\"readoutState.main.length > 5 || null\"\n [attr.data-longer]=\"readoutState.main.length > 8 || null\"\n class=\"et-time-picker-readout\"\n >\n {{ readoutState.main }}\n </text>\n @if (readoutState.note !== null) {\n <text [attr.x]=\"CENTER\" [attr.y]=\"CENTER + 20\" class=\"et-time-picker-note\">{{ readoutState.note }}</text>\n }\n </svg>\n\n <div\n #startHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(startHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"start\"\n ></div>\n\n @if (timePicker.mode() === 'range') {\n <div\n #endHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(endHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"end\"\n ></div>\n }\n</div>\n", styles: ["@layer components{@property --et-time-picker-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 280px;}@property --et-time-picker-handle-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}.et-time-picker{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none}.et-time-picker .et-time-picker-ring{position:relative;flex:none;inline-size:var(--et-time-picker-ring-size);block-size:var(--et-time-picker-ring-size);-webkit-tap-highlight-color:transparent}.et-time-picker .et-time-picker-ring-graphic{display:block;inline-size:100%;block-size:100%;overflow:visible;font-family:inherit}.et-time-picker .et-time-picker-track,.et-time-picker .et-time-picker-arc{fill:none;stroke-width:28;stroke-linecap:butt}.et-time-picker .et-time-picker-track{stroke:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent)}.et-time-picker .et-time-picker-arc{stroke:var(--et-theme-color-primary-solid, currentColor);stroke-linecap:round;opacity:.45}.et-time-picker .et-time-picker-blocked{fill:none;stroke:var(--et-surface-color-subtle-solid, currentColor);stroke-width:1;stroke-dasharray:2 5}.et-time-picker .et-time-picker-ticks line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1}.et-time-picker .et-time-picker-labels text{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-mark{fill:var(--et-surface-color-muted-solid, currentColor)}.et-time-picker .et-time-picker-mark line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1.2;stroke-linecap:round}.et-time-picker .et-time-picker-readout{fill:var(--et-surface-color-solid, currentColor);font-size:28px;font-weight:500;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-readout:where([data-long]){font-size:22px}.et-time-picker .et-time-picker-readout:where([data-longer]){font-size:16px}.et-time-picker .et-time-picker-readout:where([data-kind=duration]){font-size:20px}.et-time-picker .et-time-picker-note{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central}.et-time-picker .et-time-picker-handle{position:absolute;inset-block-start:50%;inset-inline-start:50%;box-sizing:border-box;inline-size:var(--et-time-picker-handle-size);block-size:var(--et-time-picker-handle-size);margin-block-start:calc(var(--et-time-picker-handle-size) / -2);margin-inline-start:calc(var(--et-time-picker-handle-size) / -2);border:2px solid var(--et-theme-color-primary-solid, currentColor);border-radius:50%;background:var(--et-surface-background-solid, Canvas);transform:rotate(var(--_et-time-picker-handle-angle, 0deg)) translateY(calc(var(--et-time-picker-ring-size) * -.4)) rotate(calc(var(--_et-time-picker-handle-angle, 0deg) * -1));cursor:grab;outline:none;touch-action:none}.et-time-picker .et-time-picker-handle:where([data-empty]){opacity:0;pointer-events:none}.et-time-picker .et-time-picker-handle:where([data-dragging]){cursor:grabbing}.et-time-picker .et-time-picker-handle:focus-visible:not([data-pointer-focused]){outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px}.et-time-picker:where([data-mode=single]) .et-time-picker-handle,.et-time-picker .et-time-picker-handle:where([data-active]){border:3px solid var(--et-surface-background-solid, Canvas);background:var(--et-theme-color-primary-solid, currentColor)}.et-time-picker:where([data-mode=single]) .et-time-picker-handle{box-shadow:0 0 0 calc(var(--et-time-picker-handle-size) * .35) color-mix(in srgb,var(--et-theme-color-primary-solid, currentColor) 22%,transparent)}}\n"] }]
32575
+ '[attr.data-disabled]': 'timePicker.disabled() || null',
32576
+ }, template: "@let readoutState = readout();\n\n<div class=\"et-time-picker-ring\" etTimePickerRing>\n <svg class=\"et-time-picker-ring-graphic\" aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 280 280\">\n @let trackState = track();\n\n @if (trackState.allBlocked) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-blocked\" />\n }\n @for (path of trackState.blocked; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-blocked\" />\n }\n @if (trackState.full) {\n <circle [attr.cx]=\"CENTER\" [attr.cy]=\"CENTER\" [attr.r]=\"RADIUS\" class=\"et-time-picker-track\" />\n }\n @for (path of trackState.open; track $index) {\n <path [attr.d]=\"path\" class=\"et-time-picker-track\" />\n }\n @if (arc(); as arcPath) {\n <path [attr.d]=\"arcPath\" class=\"et-time-picker-arc\" />\n }\n\n <g class=\"et-time-picker-ticks\">\n @for (tick of ticks; track tick.hour) {\n <line [attr.x1]=\"tick.x1\" [attr.y1]=\"tick.y1\" [attr.x2]=\"tick.x2\" [attr.y2]=\"tick.y2\" />\n }\n </g>\n\n <g class=\"et-time-picker-labels\">\n @for (label of hourLabels(); track label.hour) {\n <text [attr.x]=\"label.x\" [attr.y]=\"label.y\">{{ label.text }}</text>\n }\n </g>\n\n @if (twelveHour()) {\n <path\n [attr.transform]=\"'translate(' + MOON.x + ' ' + MOON.y + ')'\"\n class=\"et-time-picker-mark\"\n d=\"M8.5 0.8 A6 6 0 1 0 11.2 8.6 A4.6 4.6 0 0 1 8.5 0.8 Z\"\n />\n <g class=\"et-time-picker-mark\">\n <circle [attr.cx]=\"sun.x\" [attr.cy]=\"sun.y\" r=\"3.2\" />\n @for (ray of sunRays; track ray.index) {\n <line [attr.x1]=\"ray.x1\" [attr.y1]=\"ray.y1\" [attr.x2]=\"ray.x2\" [attr.y2]=\"ray.y2\" />\n }\n </g>\n }\n\n <text\n [attr.x]=\"CENTER\"\n [attr.y]=\"readoutState.note === null ? CENTER : CENTER - (readoutState.kind === 'duration' ? 2 : 4)\"\n [attr.data-kind]=\"readoutState.kind\"\n [attr.data-long]=\"readoutState.main.length > 5 || null\"\n [attr.data-longer]=\"readoutState.main.length > 8 || null\"\n class=\"et-time-picker-readout\"\n >\n {{ readoutState.main }}\n </text>\n @if (readoutState.note !== null) {\n <text [attr.x]=\"CENTER\" [attr.y]=\"CENTER + 20\" class=\"et-time-picker-note\">{{ readoutState.note }}</text>\n }\n </svg>\n\n <div\n #startHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(startHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"start\"\n ></div>\n\n @if (timePicker.mode() === 'range') {\n <div\n #endHandle=\"etTimePickerRingHandle\"\n [style.--_et-time-picker-handle-angle]=\"(endHandle.angle() ?? 0) + 'deg'\"\n class=\"et-time-picker-handle\"\n etTimePickerRingHandle\n side=\"end\"\n ></div>\n }\n</div>\n", styles: ["@layer components{@property --et-time-picker-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 280px;}@property --et-time-picker-handle-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}.et-time-picker{display:inline-flex;vertical-align:top;flex-direction:column;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;transition:opacity .12s ease}.et-time-picker .et-time-picker-ring{position:relative;flex:none;inline-size:var(--et-time-picker-ring-size);block-size:var(--et-time-picker-ring-size);-webkit-tap-highlight-color:transparent}.et-time-picker .et-time-picker-ring-graphic{display:block;inline-size:100%;block-size:100%;overflow:visible;font-family:inherit}.et-time-picker .et-time-picker-track,.et-time-picker .et-time-picker-arc{fill:none;stroke-width:28;stroke-linecap:butt}.et-time-picker .et-time-picker-track{stroke:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent)}.et-time-picker .et-time-picker-arc{stroke:var(--et-theme-color-primary-solid, currentColor);stroke-linecap:round;opacity:.45}.et-time-picker .et-time-picker-track,.et-time-picker .et-time-picker-arc{cursor:pointer}.et-time-picker .et-time-picker-blocked{fill:none;stroke:var(--et-surface-color-subtle-solid, currentColor);stroke-width:1;stroke-dasharray:2 5}.et-time-picker .et-time-picker-ticks line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1}.et-time-picker .et-time-picker-labels text{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-mark{fill:var(--et-surface-color-muted-solid, currentColor)}.et-time-picker .et-time-picker-mark line{stroke:var(--et-surface-color-muted-solid, currentColor);stroke-width:1.2;stroke-linecap:round}.et-time-picker .et-time-picker-readout{fill:var(--et-surface-color-solid, currentColor);font-size:28px;font-weight:500;text-anchor:middle;dominant-baseline:central;font-variant-numeric:tabular-nums}.et-time-picker .et-time-picker-readout:where([data-long]){font-size:22px}.et-time-picker .et-time-picker-readout:where([data-longer]){font-size:16px}.et-time-picker .et-time-picker-readout:where([data-kind=duration]){font-size:20px}.et-time-picker .et-time-picker-note{fill:var(--et-surface-color-muted-solid, currentColor);font-size:11px;text-anchor:middle;dominant-baseline:central}.et-time-picker .et-time-picker-handle{position:absolute;inset-block-start:50%;inset-inline-start:50%;box-sizing:border-box;inline-size:var(--et-time-picker-handle-size);block-size:var(--et-time-picker-handle-size);margin-block-start:calc(var(--et-time-picker-handle-size) / -2);margin-inline-start:calc(var(--et-time-picker-handle-size) / -2);border:2px solid var(--et-theme-color-primary-solid, currentColor);border-radius:50%;background:var(--et-surface-background-solid, Canvas);transform:rotate(var(--_et-time-picker-handle-angle, 0deg)) translateY(calc(var(--et-time-picker-ring-size) * -.4)) rotate(calc(var(--_et-time-picker-handle-angle, 0deg) * -1));--_et-time-picker-halo-shadow: 0 0 0 calc(var(--et-time-picker-handle-size) * var(--_et-time-picker-halo)) color-mix( in srgb, var(--et-theme-color-primary-solid, currentColor) var(--_et-time-picker-halo-opacity, 16%), transparent );box-shadow:var(--_et-time-picker-halo-shadow, none);transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease;cursor:grab;outline:none;touch-action:none}.et-time-picker .et-time-picker-handle:where([data-empty]){opacity:0;pointer-events:none}.et-time-picker .et-time-picker-handle:where([data-dragging]){cursor:grabbing}.et-time-picker .et-time-picker-handle:hover:not([data-disabled],[data-dragging]){--_et-time-picker-halo: .3}.et-time-picker .et-time-picker-handle[data-dragging]:not([data-disabled]){--_et-time-picker-halo: .5;--_et-time-picker-halo-opacity: 28%}.et-time-picker .et-time-picker-handle:focus-visible:not([data-pointer-focused]){outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px}.et-time-picker:where([data-mode=single]) .et-time-picker-handle,.et-time-picker .et-time-picker-handle:where([data-active]){border:3px solid var(--et-surface-background-solid, Canvas);background:var(--et-theme-color-primary-solid, currentColor)}.et-time-picker:where([data-mode=single]) .et-time-picker-handle{--_et-time-picker-halo: .35;--_et-time-picker-halo-opacity: 22%}.et-time-picker[data-mode=range] .et-time-picker-handle:hover:not([data-disabled],[data-dragging],[data-active]){background:color-mix(in srgb,var(--et-theme-color-primary-solid, currentColor) 16%,var(--et-surface-background-solid, Canvas))}.et-time-picker[data-mode=single] .et-time-picker-handle:hover:not([data-disabled],[data-dragging]){--_et-time-picker-halo: .5;--_et-time-picker-halo-opacity: 28%}.et-time-picker[data-mode=single] .et-time-picker-handle[data-dragging]:not([data-disabled]){--_et-time-picker-halo: .65;--_et-time-picker-halo-opacity: 32%}.et-time-picker:where([data-disabled]){opacity:.4}.et-time-picker:where([data-disabled]) .et-time-picker-track,.et-time-picker:where([data-disabled]) .et-time-picker-arc,.et-time-picker:where([data-disabled]) .et-time-picker-handle{cursor:not-allowed}@media(prefers-reduced-motion:reduce){.et-time-picker,.et-time-picker .et-time-picker-handle{transition:none}}}\n"] }]
32419
32577
  }], propDecorators: { ring: [{ type: i0.ViewChild, args: [i0.forwardRef(() => TimePickerRingDirective), { isSignal: true }] }] } });
32420
32578
 
32421
32579
  const TIME_PICKER_IMPORTS = [
@@ -33262,10 +33420,7 @@ const createPickerPanes = (order, pickerOpen) => {
33262
33420
  * The day time-only values are read on: today, or the same weekday a week earlier when the
33263
33421
  * runtime's clocks change today, so every wall-clock time exists on it.
33264
33422
  */
33265
- const timeReferenceDay = () => {
33266
- const today = startOfDay(new Date());
33267
- return today.getTimezoneOffset() === endOfDay(today).getTimezoneOffset() ? today : subWeeks(today, 1);
33268
- };
33423
+ const timeReferenceDay = () => clockSafeDay(new Date());
33269
33424
  const MERIDIEM_PATTERN = /\s*([ap])\.?\s*(?:m\.?)?$/i;
33270
33425
  const SEPARATED_PATTERN = /^(\d{1,2})(?:[:.\s](\d{1,2})(?:[:.\s](\d{1,2}))?)?$/;
33271
33426
  const COMPACT_PATTERN = /^\d{3,6}$/;
@@ -33774,7 +33929,7 @@ class DateTimeInputComponent {
33774
33929
  this.dateTimeInput.focus(options);
33775
33930
  }
33776
33931
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: DateTimeInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33777
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: DateTimeInputComponent, isStandalone: true, selector: "et-date-time-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, dateTabLabel: { classPropertyName: "dateTabLabel", publicName: "dateTabLabel", isSignal: true, isRequired: false, transformFunction: null }, timeTabLabel: { classPropertyName: "timeTabLabel", publicName: "timeTabLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-date-time-input" }, providers: [provideIcons(CALENDAR_ICON, TIMES_ICON)], hostDirectives: [{ directive: DateTimeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "timeZone", "timeZone", "timeZoneLabel", "timeZoneLabel", "locale", "locale", "mask", "mask", "minDate", "minDate", "maxDate", "maxDate", "dateFilter", "dateFilter", "startAt", "startAt", "startView", "startView", "dateClass", "dateClass", "weekNumbers", "weekNumbers", "firstDayOfWeek", "firstDayOfWeek", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [etInputMask]=\"dateTimeInput.maskPattern()\"\n class=\"et-date-time-input-field\"\n etDateTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"dateTimeInput.localReadingId()\" class=\"et-date-time-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-time-input-panel\">\n <div class=\"et-date-time-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"date\">{{ resolvedDateTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"time\">{{ resolvedTimeTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [value]=\"dateTimeInput.pickerDate()\"\n [min]=\"dateTimeInput.pickerMinDate()\"\n [max]=\"dateTimeInput.pickerMaxDate()\"\n [dateFilter]=\"dateTimeInput.dateFilter()\"\n [startAt]=\"dateTimeInput.startAt()\"\n [startView]=\"dateTimeInput.startView()\"\n [dateClass]=\"dateTimeInput.dateClass()\"\n [weekNumbers]=\"dateTimeInput.weekNumbers()\"\n [firstDayOfWeek]=\"dateTimeInput.firstDayOfWeek()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n (valueChange)=\"handleDateSelect($event)\"\n />\n <div class=\"et-date-time-input-panel-time-pane\">\n <et-time-picker\n [value]=\"dateTimeInput.pickerTime()\"\n [day]=\"dateTimeInput.pickerDate()\"\n [format]=\"dateTimeInput.effectiveDisplayFormat()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"dateTimeInput.minTime()\"\n [max]=\"dateTimeInput.maxTime()\"\n [timeFilter]=\"dateTimeInput.timeFilter()\"\n (valueChange)=\"dateTimeInput.selectTime($event)\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-input{display:grid;grid-template-columns:minmax(0,1fr);align-content:center;flex:1;min-inline-size:0;color:inherit}et-date-time-input .et-date-time-input-field{min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-date-time-input .et-date-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-date-time-input .et-date-time-input-field:disabled{cursor:not-allowed}et-date-time-input .et-date-time-input-local-reading{font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-input .et-date-time-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-date-time-input[data-mixed] .et-date-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-date-time-input-panel .et-date-time-input-panel-tabs{display:none}.et-date-time-input-panel .et-date-time-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:stretch;display:flex}.et-date-time-input-panel .et-time-picker{align-items:center;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-time-picker{border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=date]>.et-date-time-input-panel-time-pane{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=time]>et-calendar{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=forward][data-active-pane=time]>.et-date-time-input-panel-time-pane{animation:et-date-time-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=backward][data-active-pane=date]>et-calendar{animation:et-date-time-input-pane-in-backward .2s ease}@keyframes et-date-time-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-input-panel-panes>et-calendar,.et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{animation:none}}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: CalendarComponent, selector: "et-calendar", inputs: ["weekNumbers", "previousMonthLabel", "nextMonthLabel"] }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: DateTimeInputFieldDirective, selector: "input[etDateTimeInputField]", exportAs: ["etDateTimeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "directive", type: DateTimePickerPanesDirective, selector: "[etDateTimePickerPanes]" }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
33932
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: DateTimeInputComponent, isStandalone: true, selector: "et-date-time-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, dateTabLabel: { classPropertyName: "dateTabLabel", publicName: "dateTabLabel", isSignal: true, isRequired: false, transformFunction: null }, timeTabLabel: { classPropertyName: "timeTabLabel", publicName: "timeTabLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-date-time-input" }, providers: [provideIcons(CALENDAR_ICON, TIMES_ICON)], hostDirectives: [{ directive: DateTimeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "timeZone", "timeZone", "timeZoneLabel", "timeZoneLabel", "locale", "locale", "mask", "mask", "minDate", "minDate", "maxDate", "maxDate", "dateFilter", "dateFilter", "startAt", "startAt", "startView", "startView", "dateClass", "dateClass", "weekNumbers", "weekNumbers", "firstDayOfWeek", "firstDayOfWeek", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [etInputMask]=\"dateTimeInput.maskPattern()\"\n class=\"et-date-time-input-field\"\n etDateTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"dateTimeInput.localReadingId()\" class=\"et-date-time-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-time-input-panel\">\n <div class=\"et-date-time-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"date\">{{ resolvedDateTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"time\">{{ resolvedTimeTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [value]=\"dateTimeInput.pickerDate()\"\n [min]=\"dateTimeInput.pickerMinDate()\"\n [max]=\"dateTimeInput.pickerMaxDate()\"\n [dateFilter]=\"dateTimeInput.dateFilter()\"\n [startAt]=\"dateTimeInput.startAt()\"\n [startView]=\"dateTimeInput.startView()\"\n [dateClass]=\"dateTimeInput.dateClass()\"\n [weekNumbers]=\"dateTimeInput.weekNumbers()\"\n [firstDayOfWeek]=\"dateTimeInput.firstDayOfWeek()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n (valueChange)=\"handleDateSelect($event)\"\n />\n <div class=\"et-date-time-input-panel-time-pane\">\n <et-time-picker\n [value]=\"dateTimeInput.pickerTime()\"\n [disabled]=\"dateTimeInput.disabled()\"\n [day]=\"dateTimeInput.pickerDate()\"\n [format]=\"dateTimeInput.effectiveDisplayFormat()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"dateTimeInput.minTime()\"\n [max]=\"dateTimeInput.maxTime()\"\n [timeFilter]=\"dateTimeInput.timeFilter()\"\n (valueChange)=\"dateTimeInput.selectTime($event)\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-input{display:grid;grid-template-columns:minmax(0,1fr);align-content:center;flex:1;min-inline-size:0;color:inherit}et-date-time-input .et-date-time-input-field{min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-date-time-input .et-date-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-date-time-input .et-date-time-input-field:disabled{cursor:not-allowed}et-date-time-input .et-date-time-input-local-reading{font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-input .et-date-time-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-date-time-input[data-mixed] .et-date-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-date-time-input-panel .et-date-time-input-panel-tabs{display:none}.et-date-time-input-panel .et-date-time-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:stretch;display:flex}.et-date-time-input-panel .et-time-picker{align-items:center;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-time-picker{border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=date]>.et-date-time-input-panel-time-pane{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=time]>et-calendar{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=forward][data-active-pane=time]>.et-date-time-input-panel-time-pane{animation:et-date-time-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=backward][data-active-pane=date]>et-calendar{animation:et-date-time-input-pane-in-backward .2s ease}@keyframes et-date-time-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-input-panel-panes>et-calendar,.et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{animation:none}}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: CalendarComponent, selector: "et-calendar", inputs: ["weekNumbers", "previousMonthLabel", "nextMonthLabel"] }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: DateTimeInputFieldDirective, selector: "input[etDateTimeInputField]", exportAs: ["etDateTimeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "directive", type: DateTimePickerPanesDirective, selector: "[etDateTimePickerPanes]" }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
33778
33933
  }
33779
33934
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: DateTimeInputComponent, decorators: [{
33780
33935
  type: Component,
@@ -33832,7 +33987,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
33832
33987
  },
33833
33988
  ], host: {
33834
33989
  class: 'et-date-time-input',
33835
- }, template: "<input\n [etInputMask]=\"dateTimeInput.maskPattern()\"\n class=\"et-date-time-input-field\"\n etDateTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"dateTimeInput.localReadingId()\" class=\"et-date-time-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-time-input-panel\">\n <div class=\"et-date-time-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"date\">{{ resolvedDateTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"time\">{{ resolvedTimeTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [value]=\"dateTimeInput.pickerDate()\"\n [min]=\"dateTimeInput.pickerMinDate()\"\n [max]=\"dateTimeInput.pickerMaxDate()\"\n [dateFilter]=\"dateTimeInput.dateFilter()\"\n [startAt]=\"dateTimeInput.startAt()\"\n [startView]=\"dateTimeInput.startView()\"\n [dateClass]=\"dateTimeInput.dateClass()\"\n [weekNumbers]=\"dateTimeInput.weekNumbers()\"\n [firstDayOfWeek]=\"dateTimeInput.firstDayOfWeek()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n (valueChange)=\"handleDateSelect($event)\"\n />\n <div class=\"et-date-time-input-panel-time-pane\">\n <et-time-picker\n [value]=\"dateTimeInput.pickerTime()\"\n [day]=\"dateTimeInput.pickerDate()\"\n [format]=\"dateTimeInput.effectiveDisplayFormat()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"dateTimeInput.minTime()\"\n [max]=\"dateTimeInput.maxTime()\"\n [timeFilter]=\"dateTimeInput.timeFilter()\"\n (valueChange)=\"dateTimeInput.selectTime($event)\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-input{display:grid;grid-template-columns:minmax(0,1fr);align-content:center;flex:1;min-inline-size:0;color:inherit}et-date-time-input .et-date-time-input-field{min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-date-time-input .et-date-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-date-time-input .et-date-time-input-field:disabled{cursor:not-allowed}et-date-time-input .et-date-time-input-local-reading{font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-input .et-date-time-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-date-time-input[data-mixed] .et-date-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-date-time-input-panel .et-date-time-input-panel-tabs{display:none}.et-date-time-input-panel .et-date-time-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:stretch;display:flex}.et-date-time-input-panel .et-time-picker{align-items:center;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-time-picker{border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=date]>.et-date-time-input-panel-time-pane{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=time]>et-calendar{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=forward][data-active-pane=time]>.et-date-time-input-panel-time-pane{animation:et-date-time-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=backward][data-active-pane=date]>et-calendar{animation:et-date-time-input-pane-in-backward .2s ease}@keyframes et-date-time-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-input-panel-panes>et-calendar,.et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{animation:none}}}\n"] }]
33990
+ }, template: "<input\n [etInputMask]=\"dateTimeInput.maskPattern()\"\n class=\"et-date-time-input-field\"\n etDateTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"dateTimeInput.localReadingId()\" class=\"et-date-time-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-time-input-panel\">\n <div class=\"et-date-time-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"date\">{{ resolvedDateTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"time\">{{ resolvedTimeTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [value]=\"dateTimeInput.pickerDate()\"\n [min]=\"dateTimeInput.pickerMinDate()\"\n [max]=\"dateTimeInput.pickerMaxDate()\"\n [dateFilter]=\"dateTimeInput.dateFilter()\"\n [startAt]=\"dateTimeInput.startAt()\"\n [startView]=\"dateTimeInput.startView()\"\n [dateClass]=\"dateTimeInput.dateClass()\"\n [weekNumbers]=\"dateTimeInput.weekNumbers()\"\n [firstDayOfWeek]=\"dateTimeInput.firstDayOfWeek()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n (valueChange)=\"handleDateSelect($event)\"\n />\n <div class=\"et-date-time-input-panel-time-pane\">\n <et-time-picker\n [value]=\"dateTimeInput.pickerTime()\"\n [disabled]=\"dateTimeInput.disabled()\"\n [day]=\"dateTimeInput.pickerDate()\"\n [format]=\"dateTimeInput.effectiveDisplayFormat()\"\n [locale]=\"dateTimeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"dateTimeInput.minTime()\"\n [max]=\"dateTimeInput.maxTime()\"\n [timeFilter]=\"dateTimeInput.timeFilter()\"\n (valueChange)=\"dateTimeInput.selectTime($event)\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-input{display:grid;grid-template-columns:minmax(0,1fr);align-content:center;flex:1;min-inline-size:0;color:inherit}et-date-time-input .et-date-time-input-field{min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-date-time-input .et-date-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-date-time-input .et-date-time-input-field:disabled{cursor:not-allowed}et-date-time-input .et-date-time-input-local-reading{font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-input .et-date-time-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-date-time-input[data-mixed] .et-date-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-date-time-input-panel .et-date-time-input-panel-tabs{display:none}.et-date-time-input-panel .et-date-time-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:stretch;display:flex}.et-date-time-input-panel .et-time-picker{align-items:center;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-time-pane{align-self:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-time-picker{border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=date]>.et-date-time-input-panel-time-pane{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-active-pane=time]>et-calendar{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=forward][data-active-pane=time]>.et-date-time-input-panel-time-pane{animation:et-date-time-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-input-panel .et-date-time-input-panel-panes[data-nav=backward][data-active-pane=date]>et-calendar{animation:et-date-time-input-pane-in-backward .2s ease}@keyframes et-date-time-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-input-panel-panes>et-calendar,.et-date-time-input-panel-panes>.et-date-time-input-panel-time-pane{animation:none}}}\n"] }]
33836
33991
  }], propDecorators: { pickerTriggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickerTriggerLabel", required: false }] }], dialogLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogLabel", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], dateTabLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateTabLabel", required: false }] }], timeTabLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeTabLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }] } });
33837
33992
 
33838
33993
  const DATE_TIME_INPUT_IMPORTS = [
@@ -33948,6 +34103,7 @@ class DateTimeRangeInputDirective extends DateRangePickerInputDirective {
33948
34103
  host: this,
33949
34104
  presets: this.presets,
33950
34105
  labels: this.dateTimeLabels,
34106
+ firstDayOfWeek: this.firstDayOfWeek,
33951
34107
  normalize: (date) => date,
33952
34108
  });
33953
34109
  /** The two days the picker calendar highlights - committed, else picked with no time yet. */
@@ -34203,7 +34359,7 @@ class DateTimeRangeInputComponent {
34203
34359
  this.rangeInput.focus(options);
34204
34360
  }
34205
34361
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: DateTimeRangeInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34206
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: DateTimeRangeInputComponent, isStandalone: true, selector: "et-date-time-range-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, datesTabLabel: { classPropertyName: "datesTabLabel", publicName: "datesTabLabel", isSignal: true, isRequired: false, transformFunction: null }, timesTabLabel: { classPropertyName: "timesTabLabel", publicName: "timesTabLabel", isSignal: true, isRequired: false, transformFunction: null }, startTimeLabel: { classPropertyName: "startTimeLabel", publicName: "startTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, endTimeLabel: { classPropertyName: "endTimeLabel", publicName: "endTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "rangeInput.ariaLabel() || null", "attr.aria-labelledby": "rangeInput.labelId()" }, classAttribute: "et-date-time-range-input" }, providers: [provideIcons(CALENDAR_ICON, TIMES_ICON)], hostDirectives: [{ directive: DateTimeRangeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "startPlaceholder", "startPlaceholder", "endPlaceholder", "endPlaceholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "timeZone", "timeZone", "timeZoneLabel", "timeZoneLabel", "locale", "locale", "mask", "mask", "minDate", "minDate", "maxDate", "maxDate", "dateFilter", "dateFilter", "startAt", "startAt", "startView", "startView", "dateClass", "dateClass", "weekNumbers", "weekNumbers", "firstDayOfWeek", "firstDayOfWeek", "presets", "presets", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "startAriaLabel", "startAriaLabel", "endAriaLabel", "endAriaLabel", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-date-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"rangeInput.localReadingId()\" class=\"et-date-time-range-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-range-presets-layout\">\n @if (rangeInput.presetList.options().length > 0) {\n <et-date-range-presets\n [options]=\"rangeInput.presetList.options()\"\n (presetSelect)=\"rangeInput.selectPreset($event)\"\n />\n }\n\n <div class=\"et-date-time-range-input-panel\">\n <div class=\"et-date-time-range-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"dates\">{{ resolvedDatesTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"times\">{{ resolvedTimesTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-range-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [rangeValue]=\"rangeInput.pickerDateRange()\"\n [min]=\"rangeInput.pickerMinDate()\"\n [max]=\"rangeInput.pickerMaxDate()\"\n [dateFilter]=\"rangeInput.dateFilter()\"\n [startAt]=\"rangeInput.startAt()\"\n [startView]=\"rangeInput.startView()\"\n [dateClass]=\"rangeInput.dateClass()\"\n [weekNumbers]=\"rangeInput.weekNumbers()\"\n [firstDayOfWeek]=\"rangeInput.firstDayOfWeek()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n (rangeValueChange)=\"handleRangeSelect($event)\"\n mode=\"range\"\n />\n\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.pickerTimeRange()\"\n [rangeDays]=\"rangeInput.pickerDateRange()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-range-input{--et-range-input-stack-threshold: 22em;container:et-date-time-range-input / inline-size}et-date-time-range-input .et-date-time-range-input-local-reading{flex-basis:100%;font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-range-input .et-date-time-range-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}@container et-date-time-range-input (inline-size < 22em){et-date-time-range-input .et-date-time-range-input-field{flex-basis:100%}et-date-time-range-input .et-date-time-range-input-separator{display:none}}.et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:none}.et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-range-input-panel>.et-date-time-range-input-panel-panes>et-time-picker{align-self:stretch;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-time-picker{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel et-time-picker{align-self:center;border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=times]>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=dates]>et-time-picker{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=forward][data-active-pane=times]>et-time-picker{animation:et-date-time-range-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=backward][data-active-pane=dates]>et-calendar{animation:et-date-time-range-input-pane-in-backward .2s ease}@keyframes et-date-time-range-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-range-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-range-input-panel-panes>et-calendar,.et-date-time-range-input-panel-panes>et-time-picker{animation:none}}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: CalendarComponent, selector: "et-calendar", inputs: ["weekNumbers", "previousMonthLabel", "nextMonthLabel"] }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: DateTimeRangeInputFieldDirective, selector: "input[etDateTimeRangeInputField]", exportAs: ["etDateTimeRangeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "component", type: DateRangePresetsComponent, selector: "et-date-range-presets", inputs: ["options"], outputs: ["presetSelect"] }, { kind: "directive", type: DateTimePickerPanesDirective, selector: "[etDateTimePickerPanes]" }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
34362
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: DateTimeRangeInputComponent, isStandalone: true, selector: "et-date-time-range-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, datesTabLabel: { classPropertyName: "datesTabLabel", publicName: "datesTabLabel", isSignal: true, isRequired: false, transformFunction: null }, timesTabLabel: { classPropertyName: "timesTabLabel", publicName: "timesTabLabel", isSignal: true, isRequired: false, transformFunction: null }, startTimeLabel: { classPropertyName: "startTimeLabel", publicName: "startTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, endTimeLabel: { classPropertyName: "endTimeLabel", publicName: "endTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "rangeInput.ariaLabel() || null", "attr.aria-labelledby": "rangeInput.labelId()" }, classAttribute: "et-date-time-range-input" }, providers: [provideIcons(CALENDAR_ICON, TIMES_ICON)], hostDirectives: [{ directive: DateTimeRangeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "startPlaceholder", "startPlaceholder", "endPlaceholder", "endPlaceholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "timeZone", "timeZone", "timeZoneLabel", "timeZoneLabel", "locale", "locale", "mask", "mask", "minDate", "minDate", "maxDate", "maxDate", "dateFilter", "dateFilter", "startAt", "startAt", "startView", "startView", "dateClass", "dateClass", "weekNumbers", "weekNumbers", "firstDayOfWeek", "firstDayOfWeek", "presets", "presets", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "startAriaLabel", "startAriaLabel", "endAriaLabel", "endAriaLabel", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-date-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"rangeInput.localReadingId()\" class=\"et-date-time-range-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-range-presets-layout\">\n @if (rangeInput.presetList.options().length > 0) {\n <et-date-range-presets\n [options]=\"rangeInput.presetList.options()\"\n (presetSelect)=\"rangeInput.selectPreset($event)\"\n />\n }\n\n <div class=\"et-date-time-range-input-panel\">\n <div class=\"et-date-time-range-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"dates\">{{ resolvedDatesTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"times\">{{ resolvedTimesTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-range-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [rangeValue]=\"rangeInput.pickerDateRange()\"\n [min]=\"rangeInput.pickerMinDate()\"\n [max]=\"rangeInput.pickerMaxDate()\"\n [dateFilter]=\"rangeInput.dateFilter()\"\n [startAt]=\"rangeInput.startAt()\"\n [startView]=\"rangeInput.startView()\"\n [dateClass]=\"rangeInput.dateClass()\"\n [weekNumbers]=\"rangeInput.weekNumbers()\"\n [firstDayOfWeek]=\"rangeInput.firstDayOfWeek()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n (rangeValueChange)=\"handleRangeSelect($event)\"\n mode=\"range\"\n />\n\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.pickerTimeRange()\"\n [disabled]=\"rangeInput.disabled()\"\n [rangeDays]=\"rangeInput.pickerDateRange()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-range-input{--et-range-input-stack-threshold: 22em;container:et-date-time-range-input / inline-size}et-date-time-range-input .et-date-time-range-input-local-reading{flex-basis:100%;font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-range-input .et-date-time-range-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}@container et-date-time-range-input (inline-size < 22em){et-date-time-range-input .et-date-time-range-input-field{flex-basis:100%}et-date-time-range-input .et-date-time-range-input-separator{display:none}}.et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:none}.et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-range-input-panel>.et-date-time-range-input-panel-panes>et-time-picker{align-self:stretch;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-time-picker{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel et-time-picker{align-self:center;border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=times]>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=dates]>et-time-picker{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=forward][data-active-pane=times]>et-time-picker{animation:et-date-time-range-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=backward][data-active-pane=dates]>et-calendar{animation:et-date-time-range-input-pane-in-backward .2s ease}@keyframes et-date-time-range-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-range-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-range-input-panel-panes>et-calendar,.et-date-time-range-input-panel-panes>et-time-picker{animation:none}}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: CalendarComponent, selector: "et-calendar", inputs: ["weekNumbers", "previousMonthLabel", "nextMonthLabel"] }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: DateTimeRangeInputFieldDirective, selector: "input[etDateTimeRangeInputField]", exportAs: ["etDateTimeRangeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "component", type: DateRangePresetsComponent, selector: "et-date-range-presets", inputs: ["options"], outputs: ["presetSelect"] }, { kind: "directive", type: DateTimePickerPanesDirective, selector: "[etDateTimePickerPanes]" }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
34207
34363
  }
34208
34364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: DateTimeRangeInputComponent, decorators: [{
34209
34365
  type: Component,
@@ -34269,7 +34425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
34269
34425
  role: 'group',
34270
34426
  '[attr.aria-label]': 'rangeInput.ariaLabel() || null',
34271
34427
  '[attr.aria-labelledby]': 'rangeInput.labelId()',
34272
- }, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-date-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"rangeInput.localReadingId()\" class=\"et-date-time-range-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-range-presets-layout\">\n @if (rangeInput.presetList.options().length > 0) {\n <et-date-range-presets\n [options]=\"rangeInput.presetList.options()\"\n (presetSelect)=\"rangeInput.selectPreset($event)\"\n />\n }\n\n <div class=\"et-date-time-range-input-panel\">\n <div class=\"et-date-time-range-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"dates\">{{ resolvedDatesTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"times\">{{ resolvedTimesTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-range-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [rangeValue]=\"rangeInput.pickerDateRange()\"\n [min]=\"rangeInput.pickerMinDate()\"\n [max]=\"rangeInput.pickerMaxDate()\"\n [dateFilter]=\"rangeInput.dateFilter()\"\n [startAt]=\"rangeInput.startAt()\"\n [startView]=\"rangeInput.startView()\"\n [dateClass]=\"rangeInput.dateClass()\"\n [weekNumbers]=\"rangeInput.weekNumbers()\"\n [firstDayOfWeek]=\"rangeInput.firstDayOfWeek()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n (rangeValueChange)=\"handleRangeSelect($event)\"\n mode=\"range\"\n />\n\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.pickerTimeRange()\"\n [rangeDays]=\"rangeInput.pickerDateRange()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-range-input{--et-range-input-stack-threshold: 22em;container:et-date-time-range-input / inline-size}et-date-time-range-input .et-date-time-range-input-local-reading{flex-basis:100%;font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-range-input .et-date-time-range-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}@container et-date-time-range-input (inline-size < 22em){et-date-time-range-input .et-date-time-range-input-field{flex-basis:100%}et-date-time-range-input .et-date-time-range-input-separator{display:none}}.et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:none}.et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-range-input-panel>.et-date-time-range-input-panel-panes>et-time-picker{align-self:stretch;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-time-picker{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel et-time-picker{align-self:center;border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=times]>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=dates]>et-time-picker{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=forward][data-active-pane=times]>et-time-picker{animation:et-date-time-range-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=backward][data-active-pane=dates]>et-calendar{animation:et-date-time-range-input-pane-in-backward .2s ease}@keyframes et-date-time-range-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-range-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-range-input-panel-panes>et-calendar,.et-date-time-range-input-panel-panes>et-time-picker{animation:none}}}\n"] }]
34428
+ }, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-date-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-date-time-range-input-field\"\n etDateTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n@if (localReadingText(); as reading) {\n <span [id]=\"rangeInput.localReadingId()\" class=\"et-date-time-range-input-local-reading\">{{ reading }}</span>\n}\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-calendar\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <div class=\"et-date-range-presets-layout\">\n @if (rangeInput.presetList.options().length > 0) {\n <et-date-range-presets\n [options]=\"rangeInput.presetList.options()\"\n (presetSelect)=\"rangeInput.selectPreset($event)\"\n />\n }\n\n <div class=\"et-date-time-range-input-panel\">\n <div class=\"et-date-time-range-input-panel-tabs\">\n <et-segmented-button-group\n [value]=\"panes.active()\"\n [aria-label]=\"dateTimeLabels().paneSwitch\"\n (valueChange)=\"panes.select($event)\"\n >\n <et-segmented-button value=\"dates\">{{ resolvedDatesTabLabel() }}</et-segmented-button>\n <et-segmented-button value=\"times\">{{ resolvedTimesTabLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n </div>\n\n <div\n [attr.data-active-pane]=\"panes.active()\"\n [attr.data-nav]=\"panes.nav()\"\n class=\"et-date-time-range-input-panel-panes\"\n etDateTimePickerPanes\n >\n <et-calendar\n [rangeValue]=\"rangeInput.pickerDateRange()\"\n [min]=\"rangeInput.pickerMinDate()\"\n [max]=\"rangeInput.pickerMaxDate()\"\n [dateFilter]=\"rangeInput.dateFilter()\"\n [startAt]=\"rangeInput.startAt()\"\n [startView]=\"rangeInput.startView()\"\n [dateClass]=\"rangeInput.dateClass()\"\n [weekNumbers]=\"rangeInput.weekNumbers()\"\n [firstDayOfWeek]=\"rangeInput.firstDayOfWeek()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n (rangeValueChange)=\"handleRangeSelect($event)\"\n mode=\"range\"\n />\n\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.pickerTimeRange()\"\n [disabled]=\"rangeInput.disabled()\"\n [rangeDays]=\"rangeInput.pickerDateRange()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </div>\n </div>\n </div>\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-date-time-range-input{--et-range-input-stack-threshold: 22em;container:et-date-time-range-input / inline-size}et-date-time-range-input .et-date-time-range-input-local-reading{flex-basis:100%;font-size:var(--et-form-field-hint-font-size);line-height:1.3;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field[data-disabled] et-date-time-range-input .et-date-time-range-input-local-reading{color:var(--et-surface-interaction-disabled-solid, currentColor)}@container et-date-time-range-input (inline-size < 22em){et-date-time-range-input .et-date-time-range-input-field{flex-basis:100%}et-date-time-range-input .et-date-time-range-input-separator{display:none}}.et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:none}.et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:flex;align-items:start;gap:12px}.et-date-time-range-input-panel>.et-date-time-range-input-panel-panes>et-time-picker{align-self:stretch;border-inline-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .08));padding-inline-start:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs{display:block;margin-block-end:12px}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs .et-segmented-button-group-buttons{display:flex;align-self:stretch}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-tabs et-segmented-button{flex:1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes{display:grid;justify-content:center;justify-items:center;align-items:center}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes>et-time-picker{grid-area:1 / 1}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel et-time-picker{align-self:center;border-inline-start:none;padding-inline-start:0}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=times]>et-calendar,.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-active-pane=dates]>et-time-picker{visibility:hidden}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=forward][data-active-pane=times]>et-time-picker{animation:et-date-time-range-input-pane-in-forward .2s ease}.et-overlay.et-date-picker-sheet .et-date-time-range-input-panel .et-date-time-range-input-panel-panes[data-nav=backward][data-active-pane=dates]>et-calendar{animation:et-date-time-range-input-pane-in-backward .2s ease}@keyframes et-date-time-range-input-pane-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-date-time-range-input-pane-in-backward{0%{opacity:0;transform:translate(-14px)}}@media(prefers-reduced-motion:reduce){.et-date-time-range-input-panel-panes>et-calendar,.et-date-time-range-input-panel-panes>et-time-picker{animation:none}}}\n"] }]
34273
34429
  }], ctorParameters: () => [], propDecorators: { pickerTriggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickerTriggerLabel", required: false }] }], dialogLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogLabel", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], datesTabLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "datesTabLabel", required: false }] }], timesTabLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "timesTabLabel", required: false }] }], startTimeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startTimeLabel", required: false }] }], endTimeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endTimeLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }] } });
34274
34430
 
34275
34431
  const DATE_TIME_RANGE_INPUT_IMPORTS = [
@@ -34345,22 +34501,23 @@ const dateTimeRangeOrder = (path, options = {}) => rangeOrder({
34345
34501
  */
34346
34502
  const timeRangeOrder = (path, options = {}) => rangeOrder({ path, valueFormat: options.valueFormat ?? inject(TIME_FORMAT), options });
34347
34503
  const resolveBound = (bound, ctx) => typeof bound === 'function' ? bound(ctx) : (bound ?? null);
34348
- const bounds = ({ path, sidesOf, valueFormat, options, unit, label }) => {
34504
+ const bounds = ({ path, sidesOf, valueFormat, options, unit, onZoneCalendar, label }) => {
34349
34505
  const labels = injectDateTimeLabels();
34350
34506
  const locale = inject(DATE_LOCALE);
34351
34507
  const timeZone = knownTimeZone(options.timeZone);
34352
34508
  const formatBound = (bound) => formatInZone(bound, { format: label, locale, timeZone }) ?? '';
34509
+ const unitOf = (date) => unit(onZoneCalendar && timeZone !== null ? zonedProxy(date, timeZone) : date).getTime();
34353
34510
  validate(path, (ctx) => {
34354
34511
  const sides = sidesOf(ctx.value())
34355
34512
  .map((side) => parseSide(side, { valueFormat, timeZone }))
34356
34513
  .filter((side) => side !== null)
34357
- .map((side) => unit(side).getTime());
34514
+ .map(unitOf);
34358
34515
  const min = resolveBound(options.min, ctx);
34359
34516
  const max = resolveBound(options.max, ctx);
34360
- if (min !== null && sides.some((side) => side < unit(min).getTime())) {
34517
+ if (min !== null && sides.some((side) => side < unitOf(min))) {
34361
34518
  return { kind: 'rangeMin', min, message: options.message ?? labels().rangeMin(formatBound(min)) };
34362
34519
  }
34363
- if (max !== null && sides.some((side) => side > unit(max).getTime())) {
34520
+ if (max !== null && sides.some((side) => side > unitOf(max))) {
34364
34521
  return { kind: 'rangeMax', max, message: options.message ?? labels().rangeMax(formatBound(max)) };
34365
34522
  }
34366
34523
  return undefined;
@@ -34386,8 +34543,9 @@ const dateRangeBounds = (path, options) => {
34386
34543
  rangeBounds({
34387
34544
  path,
34388
34545
  valueFormat: options.valueFormat ?? inject(DATE_FORMAT),
34389
- options,
34546
+ options: withControlTimeZone(options),
34390
34547
  unit: (date) => startOfCalendarUnit(date, precision),
34548
+ onZoneCalendar: true,
34391
34549
  label: displayFormatForPrecision(precision, inject(DATE_LOCALE)),
34392
34550
  });
34393
34551
  };
@@ -34428,8 +34586,9 @@ const dateBounds = (path, options = {}) => {
34428
34586
  path,
34429
34587
  sidesOf: (value) => [value],
34430
34588
  valueFormat: options.valueFormat ?? inject(DATE_FORMAT),
34431
- options,
34589
+ options: withControlTimeZone(options),
34432
34590
  unit: (date) => startOfCalendarUnit(date, precision),
34591
+ onZoneCalendar: true,
34433
34592
  label: displayFormatForPrecision(precision, inject(DATE_LOCALE)),
34434
34593
  });
34435
34594
  };
@@ -35149,7 +35308,7 @@ class TimeInputComponent {
35149
35308
  this.timeInput.focus(options);
35150
35309
  }
35151
35310
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimeInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35152
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TimeInputComponent, isStandalone: true, selector: "et-time-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-time-input" }, providers: [provideIcons(CLOCK_ICON, TIMES_ICON)], hostDirectives: [{ directive: TimeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "locale", "locale", "mask", "mask", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [etInputMask]=\"timeInput.maskPattern()\"\n class=\"et-time-input-field\"\n etTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [value]=\"timeInput.time()\"\n [format]=\"timeInput.effectiveDisplayFormat()\"\n [locale]=\"timeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"timeInput.minTime()\"\n [max]=\"timeInput.maxTime()\"\n [timeFilter]=\"timeInput.timeFilter()\"\n (valueChange)=\"timeInput.selectTime($event)\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-input{display:flex;align-items:center;flex:1;min-inline-size:0;color:inherit}et-time-input .et-time-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-time-input .et-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-time-input .et-time-input-field:disabled{cursor:not-allowed}et-time-input[data-mixed] .et-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: TimeInputFieldDirective, selector: "input[etTimeInputField]", exportAs: ["etTimeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
35311
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TimeInputComponent, isStandalone: true, selector: "et-time-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-time-input" }, providers: [provideIcons(CLOCK_ICON, TIMES_ICON)], hostDirectives: [{ directive: TimeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "locale", "locale", "mask", "mask", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [etInputMask]=\"timeInput.maskPattern()\"\n class=\"et-time-input-field\"\n etTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [value]=\"timeInput.time()\"\n [disabled]=\"timeInput.disabled()\"\n [format]=\"timeInput.effectiveDisplayFormat()\"\n [locale]=\"timeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"timeInput.minTime()\"\n [max]=\"timeInput.maxTime()\"\n [timeFilter]=\"timeInput.timeFilter()\"\n (valueChange)=\"timeInput.selectTime($event)\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-input{display:flex;align-items:center;flex:1;min-inline-size:0;color:inherit}et-time-input .et-time-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-time-input .et-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-time-input .et-time-input-field:disabled{cursor:not-allowed}et-time-input[data-mixed] .et-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: TimeInputFieldDirective, selector: "input[etTimeInputField]", exportAs: ["etTimeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
35153
35312
  }
35154
35313
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimeInputComponent, decorators: [{
35155
35314
  type: Component,
@@ -35193,7 +35352,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
35193
35352
  },
35194
35353
  ], host: {
35195
35354
  class: 'et-time-input',
35196
- }, template: "<input\n [etInputMask]=\"timeInput.maskPattern()\"\n class=\"et-time-input-field\"\n etTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [value]=\"timeInput.time()\"\n [format]=\"timeInput.effectiveDisplayFormat()\"\n [locale]=\"timeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"timeInput.minTime()\"\n [max]=\"timeInput.maxTime()\"\n [timeFilter]=\"timeInput.timeFilter()\"\n (valueChange)=\"timeInput.selectTime($event)\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-input{display:flex;align-items:center;flex:1;min-inline-size:0;color:inherit}et-time-input .et-time-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-time-input .et-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-time-input .et-time-input-field:disabled{cursor:not-allowed}et-time-input[data-mixed] .et-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"] }]
35355
+ }, template: "<input\n [etInputMask]=\"timeInput.maskPattern()\"\n class=\"et-time-input-field\"\n etTimeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [value]=\"timeInput.time()\"\n [disabled]=\"timeInput.disabled()\"\n [format]=\"timeInput.effectiveDisplayFormat()\"\n [locale]=\"timeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"timeInput.minTime()\"\n [max]=\"timeInput.maxTime()\"\n [timeFilter]=\"timeInput.timeFilter()\"\n (valueChange)=\"timeInput.selectTime($event)\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-input{display:flex;align-items:center;flex:1;min-inline-size:0;color:inherit}et-time-input .et-time-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-time-input .et-time-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-time-input .et-time-input-field:disabled{cursor:not-allowed}et-time-input[data-mixed] .et-time-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"] }]
35197
35356
  }], propDecorators: { pickerTriggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickerTriggerLabel", required: false }] }], dialogLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogLabel", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }] } });
35198
35357
 
35199
35358
  const TIME_INPUT_IMPORTS = [
@@ -35369,7 +35528,7 @@ class TimeRangeInputComponent {
35369
35528
  this.rangeInput.focus(options);
35370
35529
  }
35371
35530
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimeRangeInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35372
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TimeRangeInputComponent, isStandalone: true, selector: "et-time-range-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, startTimeLabel: { classPropertyName: "startTimeLabel", publicName: "startTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, endTimeLabel: { classPropertyName: "endTimeLabel", publicName: "endTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "rangeInput.ariaLabel() || null", "attr.aria-labelledby": "rangeInput.labelId()" }, classAttribute: "et-time-range-input" }, providers: [provideIcons(CLOCK_ICON, TIMES_ICON)], hostDirectives: [{ directive: TimeRangeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "startPlaceholder", "startPlaceholder", "endPlaceholder", "endPlaceholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "locale", "locale", "mask", "mask", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "startAriaLabel", "startAriaLabel", "endAriaLabel", "endAriaLabel", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.calendarRange()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-range-input{--et-range-input-stack-threshold: 11em;container:et-time-range-input / inline-size}@container et-time-range-input (inline-size < 11em){et-time-range-input .et-time-range-input-field{flex-basis:100%}et-time-range-input .et-time-range-input-separator{display:none}}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: TimeRangeInputFieldDirective, selector: "input[etTimeRangeInputField]", exportAs: ["etTimeRangeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
35531
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TimeRangeInputComponent, isStandalone: true, selector: "et-time-range-input", inputs: { pickerTriggerLabel: { classPropertyName: "pickerTriggerLabel", publicName: "pickerTriggerLabel", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, startTimeLabel: { classPropertyName: "startTimeLabel", publicName: "startTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, endTimeLabel: { classPropertyName: "endTimeLabel", publicName: "endTimeLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "rangeInput.ariaLabel() || null", "attr.aria-labelledby": "rangeInput.labelId()" }, classAttribute: "et-time-range-input" }, providers: [provideIcons(CLOCK_ICON, TIMES_ICON)], hostDirectives: [{ directive: TimeRangeInputDirective, inputs: ["value", "value", "mixed", "mixed", "mixedLabel", "mixedLabel", "touched", "touched", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "startPlaceholder", "startPlaceholder", "endPlaceholder", "endPlaceholder", "parseErrorMessage", "parseErrorMessage", "valueFormat", "valueFormat", "displayFormat", "displayFormat", "locale", "locale", "mask", "mask", "minTime", "minTime", "maxTime", "maxTime", "timeFilter", "timeFilter", "pickerOpen", "pickerOpen", "startAriaLabel", "startAriaLabel", "endAriaLabel", "endAriaLabel", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "pickerOpenChange", "pickerOpenChange"] }], ngImport: i0, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.calendarRange()\"\n [disabled]=\"rangeInput.disabled()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-range-input{--et-range-input-stack-threshold: 11em;container:et-time-range-input / inline-size}@container et-time-range-input (inline-size < 11em){et-time-range-input .et-time-range-input-field{flex-basis:100%}et-time-range-input .et-time-range-input-separator{display:none}}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: TimePickerComponent, selector: "et-time-picker" }, { kind: "directive", type: TimeRangeInputFieldDirective, selector: "input[etTimeRangeInputField]", exportAs: ["etTimeRangeInputField"] }, { kind: "directive", type: DatePickerSurfaceDirective, selector: "ng-template[etDatePickerSurface]", exportAs: ["etDatePickerSurface"] }, { kind: "directive", type: DatePickerTriggerDirective, selector: "button[etDatePickerTrigger]", exportAs: ["etDatePickerTrigger"] }, { kind: "component", type: DatePickerPanelComponent, selector: "et-date-picker-panel", inputs: ["dialogLabel"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: InputMaskDirective, selector: "[etInputMask]", inputs: ["etInputMask", "maskValueMode", "placeholderChar"], exportAs: ["etInputMask"] }], encapsulation: i0.ViewEncapsulation.None }); }
35373
35532
  }
35374
35533
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TimeRangeInputComponent, decorators: [{
35375
35534
  type: Component,
@@ -35419,7 +35578,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
35419
35578
  role: 'group',
35420
35579
  '[attr.aria-label]': 'rangeInput.ariaLabel() || null',
35421
35580
  '[attr.aria-labelledby]': 'rangeInput.labelId()',
35422
- }, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.calendarRange()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-range-input{--et-range-input-stack-threshold: 11em;container:et-time-range-input / inline-size}@container et-time-range-input (inline-size < 11em){et-time-range-input .et-time-range-input-field{flex-basis:100%}et-time-range-input .et-time-range-input-separator{display:none}}}\n"] }]
35581
+ }, template: "<input\n [attr.aria-label]=\"resolvedStartAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"start\"\n/>\n\n<span class=\"et-time-range-input-separator\" aria-hidden=\"true\">\u2013</span>\n\n<input\n [attr.aria-label]=\"resolvedEndAriaLabel()\"\n [etInputMask]=\"rangeInput.maskPattern()\"\n class=\"et-time-range-input-field\"\n etTimeRangeInputField\n maskValueMode=\"masked\"\n placeholderChar=\"_\"\n side=\"end\"\n/>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- mousedown is prevented so the field keeps focus: its blur would unmount this\n button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button [attr.aria-label]=\"resolvedPickerTriggerLabel()\" class=\"et-input-picker-trigger\" etDatePickerTrigger>\n <i etIcon=\"et-clock\"></i>\n </button>\n</ng-template>\n\n<ng-template etDatePickerSurface>\n <et-date-picker-panel [dialogLabel]=\"resolvedDialogLabel()\">\n <et-time-picker\n [(activeSide)]=\"rangeInput.pickerActiveSide\"\n [rangeValue]=\"rangeInput.calendarRange()\"\n [disabled]=\"rangeInput.disabled()\"\n [format]=\"rangeInput.effectiveDisplayFormat()\"\n [locale]=\"rangeInput.effectiveLocale()\"\n [minuteStep]=\"minuteStep()\"\n [min]=\"rangeInput.minTime()\"\n [max]=\"rangeInput.maxTime()\"\n [timeFilter]=\"rangeInput.timeFilter()\"\n [startLabel]=\"startTimeLabel()\"\n [endLabel]=\"endTimeLabel()\"\n (timeSelect)=\"rangeInput.selectTime($event.side, $event.time)\"\n (rangeHandOff)=\"rangeInput.focusSideFromPicker($event)\"\n mode=\"range\"\n />\n </et-date-picker-panel>\n</ng-template>\n", styles: ["@layer components{et-time-range-input{--et-range-input-stack-threshold: 11em;container:et-time-range-input / inline-size}@container et-time-range-input (inline-size < 11em){et-time-range-input .et-time-range-input-field{flex-basis:100%}et-time-range-input .et-time-range-input-separator{display:none}}}\n"] }]
35423
35582
  }], ctorParameters: () => [], propDecorators: { pickerTriggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickerTriggerLabel", required: false }] }], dialogLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogLabel", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], startTimeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startTimeLabel", required: false }] }], endTimeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endTimeLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }] } });
35424
35583
 
35425
35584
  const TIME_RANGE_INPUT_IMPORTS = [
@@ -35647,7 +35806,9 @@ const DROPZONE_FILE_CONSTRAINTS = /* @__PURE__ */ createManagedMetadataKey((_sta
35647
35806
  constraints: data,
35648
35807
  rejections: signal([]),
35649
35808
  labels: signal(DEFAULT_DROPZONE_LABELS),
35809
+ effectiveConstraints: signal(undefined),
35650
35810
  }));
35811
+ /** @internal */
35651
35812
  const rejectionMessage = (rejection, context) => {
35652
35813
  const name = rejection.file.name;
35653
35814
  const { constraints, labels } = context;
@@ -35692,7 +35853,7 @@ const dropzoneFiles = (path, constraints) => {
35692
35853
  return channel.rejections().map((rejection) => ({
35693
35854
  kind: DROPZONE_FILES_ERROR_KIND,
35694
35855
  message: currentConstraints?.message?.(rejection) ??
35695
- rejectionMessage(rejection, { constraints: currentConstraints, labels }),
35856
+ rejectionMessage(rejection, { constraints: channel.effectiveConstraints() ?? currentConstraints, labels }),
35696
35857
  }));
35697
35858
  });
35698
35859
  };
@@ -35791,6 +35952,10 @@ class DropzoneDirective extends FieldStateControlDirective {
35791
35952
  return state?.metadata(DROPZONE_FILE_CONSTRAINTS) ?? null;
35792
35953
  }, /* @ts-ignore */
35793
35954
  ...(ngDevMode ? [{ debugName: "fileValidation" }] : /* istanbul ignore next */ []));
35955
+ /** The rejections no bound `dropzoneFiles()` rule turns into field errors - the dropzone reports these itself. */
35956
+ this.unhandledRejections = computed(() => (this.fileValidation() ? [] : this.lastRejections()), /* @ts-ignore */
35957
+ ...(ngDevMode ? [{ debugName: "unhandledRejections" }] : /* istanbul ignore next */ []));
35958
+ /** @internal */
35794
35959
  this.fileConstraints = computed(() => {
35795
35960
  const schema = this.fileValidation()?.constraints();
35796
35961
  return {
@@ -35835,6 +36000,11 @@ class DropzoneDirective extends FieldStateControlDirective {
35835
36000
  const labels = this.dropzoneLabels();
35836
36001
  untracked(() => channel?.labels.set(labels));
35837
36002
  });
36003
+ effect(() => {
36004
+ const channel = this.fileValidation();
36005
+ const constraints = this.fileConstraints();
36006
+ untracked(() => channel?.effectiveConstraints.set(constraints));
36007
+ });
35838
36008
  effect(() => {
35839
36009
  const incoming = this.value();
35840
36010
  untracked(() => this.reconcileValue(incoming));
@@ -36219,6 +36389,11 @@ class DropzoneComponent {
36219
36389
  messages.push(this.uploadErrorMessage()?.(entry) ?? this.defaultUploadErrorMessage(entry));
36220
36390
  }
36221
36391
  }
36392
+ const labels = this.resolvedLabels();
36393
+ const constraints = this.dropzoneDir.fileConstraints();
36394
+ for (const rejection of this.dropzoneDir.unhandledRejections()) {
36395
+ messages.push(rejectionMessage(rejection, { constraints, labels }));
36396
+ }
36222
36397
  return messages;
36223
36398
  }, /* @ts-ignore */
36224
36399
  ...(ngDevMode ? [{ debugName: "internalErrorMessages" }] : /* istanbul ignore next */ []));
@@ -36699,22 +36874,25 @@ class CounterComponent {
36699
36874
  * The limit to count towards. Wins over the schema's `maxLength()` - use it for a control whose
36700
36875
  * length isn't schema-validated, or to count towards a softer limit than the one that validates.
36701
36876
  */
36702
- this.max = input(undefined, /* @ts-ignore */
36703
- ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
36877
+ this.max = input(undefined, { ...(ngDevMode ? { debugName: "max" } : /* istanbul ignore next */ {}), transform: optionalNumberAttribute$1 });
36704
36878
  /** Measures the control's value. Override for a value type the default can't count. */
36705
36879
  this.lengthOf = input(defaultLengthOf, /* @ts-ignore */
36706
36880
  ...(ngDevMode ? [{ debugName: "lengthOf" }] : /* istanbul ignore next */ []));
36707
36881
  /** The limit actually in effect: the explicit `[max]`, else the bound field's `maxLength()`. */
36708
36882
  this.resolvedMax = computed(() => this.max() ?? this.formField?.controlMaxLength(), /* @ts-ignore */
36709
36883
  ...(ngDevMode ? [{ debugName: "resolvedMax" }] : /* istanbul ignore next */ []));
36710
- /** The current length of the control's value. */
36711
- this.current = computed(() => this.lengthOf()(this.formField?.controlValue() ?? null), /* @ts-ignore */
36884
+ this.controlMixed = computed(() => this.formField?.registeredControl()?.mixed?.() ?? false, /* @ts-ignore */
36885
+ ...(ngDevMode ? [{ debugName: "controlMixed" }] : /* istanbul ignore next */ []));
36886
+ /** The current length of the control's value - `0` while mixed, so the hidden raw value never shows. */
36887
+ this.current = computed(() => (this.controlMixed() ? 0 : this.lengthOf()(this.formField?.controlValue() ?? null)), /* @ts-ignore */
36712
36888
  ...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
36713
36889
  /**
36714
36890
  * Whether the value is past the limit. With a schema `maxLength()` this is the control's own
36715
36891
  * validation error.
36716
36892
  */
36717
36893
  this.isOverLimit = computed(() => {
36894
+ if (this.controlMixed())
36895
+ return false;
36718
36896
  const explicitMax = this.max();
36719
36897
  if (explicitMax !== undefined) {
36720
36898
  return this.current() > explicitMax;
@@ -36908,7 +37086,7 @@ class NumberInputComponent {
36908
37086
  .subscribe();
36909
37087
  }
36910
37088
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36911
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: NumberInputComponent, isStandalone: true, selector: "et-number-input", inputs: { stepper: { classPropertyName: "stepper", publicName: "stepper", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "numberInputDir.activate()" }, properties: { "attr.data-stepper": "stepper() || null" }, classAttribute: "et-number-input" }, providers: [provideIcons(MINUS_ICON, PLUS_ICON)], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true, isSignal: true }], hostDirectives: [{ directive: NumberInputDirective, inputs: ["min", "min", "max", "max", "step", "step", "decimals", "decimals", "parseErrorMessage", "parseErrorMessage", "placeholder", "placeholder", "autocomplete", "autocomplete", "textAlign", "textAlign", "value", "value", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<input\n #nativeInput\n [value]=\"numberInputDir.displayValue()\"\n [disabled]=\"numberInputDir.disabled()\"\n [readOnly]=\"numberInputDir.readonly()\"\n [required]=\"numberInputDir.required()\"\n [placeholder]=\"numberInputDir.effectivePlaceholder()\"\n [attr.autocomplete]=\"numberInputDir.autocomplete() || null\"\n [attr.min]=\"numberInputDir.min() ?? null\"\n [attr.max]=\"numberInputDir.max() ?? null\"\n [attr.step]=\"numberInputDir.step() ?? null\"\n [attr.inputmode]=\"numberInputDir.inputMode()\"\n [attr.name]=\"numberInputDir.name() || null\"\n [attr.aria-invalid]=\"numberInputDir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"numberInputDir.describedBy() || null\"\n [attr.aria-label]=\"numberInputDir.ariaLabel() || null\"\n [attr.aria-labelledby]=\"numberInputDir.labelId() || null\"\n [attr.data-text-align]=\"numberInputDir.textAlign()\"\n (focus)=\"numberInputDir.focused.set(true)\"\n (blur)=\"numberInputDir.focused.set(false); numberInputDir.touched.set(true)\"\n class=\"et-number-input-native\"\n type=\"number\"\n/>\n\n@if (stepper()) {\n <div class=\"et-number-input-stepper\">\n <button\n [attr.aria-label]=\"resolvedDecrementLabel()\"\n [disabled]=\"!numberInputDir.canStepDown()\"\n (pointerdown)=\"startStepRepeat($event, -1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-minus\"></i>\n </button>\n <button\n [attr.aria-label]=\"resolvedIncrementLabel()\"\n [disabled]=\"!numberInputDir.canStepUp()\"\n (pointerdown)=\"startStepRepeat($event, 1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-plus\"></i>\n </button>\n </div>\n}\n", styles: ["@layer components{html.et-number-input-scrubbing,html.et-number-input-scrubbing *{cursor:ew-resize!important}@property --et-number-input-stepper-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}et-number-input{display:block;flex:1;min-inline-size:0;color:inherit}et-number-input[data-stepper]{display:flex;align-items:center;gap:8px}et-number-input .et-number-input-stepper{display:flex;align-items:center;gap:2px;flex:none}et-number-input .et-number-input-stepper-button{display:flex;align-items:center;justify-content:center;flex:none;inline-size:calc(var(--et-number-input-stepper-size) + 8px);block-size:calc(var(--et-number-input-stepper-size) + 8px);padding:0;border:none;border-radius:4px;background:transparent;color:var(--et-surface-color-muted-solid, currentColor);cursor:pointer;outline:none;touch-action:none}@media(pointer:fine){et-number-input .et-number-input-stepper-button{cursor:ew-resize}}et-number-input .et-number-input-stepper-button .et-icon{inline-size:var(--et-number-input-stepper-size);block-size:var(--et-number-input-stepper-size)}@media(hover:hover){et-number-input .et-number-input-stepper-button:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}et-number-input .et-number-input-stepper-button:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 20%,transparent)}et-number-input .et-number-input-stepper-button:disabled{cursor:default;background:transparent;color:inherit;opacity:.4}et-number-input .et-number-input-native{display:block;inline-size:100%;border:none;outline:none;background:transparent;font:inherit;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);padding:0;min-width:0;appearance:textfield}et-number-input .et-number-input-native::-webkit-outer-spin-button,et-number-input .et-number-input-native::-webkit-inner-spin-button{appearance:none;margin:0}et-number-input .et-number-input-native:not(:focus){overflow:hidden;text-overflow:ellipsis}et-number-input .et-number-input-native::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-number-input .et-number-input-native[data-text-align=start]{text-align:start}et-number-input .et-number-input-native[data-text-align=center]{text-align:center}et-number-input .et-number-input-native[data-text-align=end]{text-align:end}et-number-input[data-mixed] .et-number-input-native::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"], dependencies: [{ kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
37089
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: NumberInputComponent, isStandalone: true, selector: "et-number-input", inputs: { stepper: { classPropertyName: "stepper", publicName: "stepper", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "numberInputDir.activate()" }, properties: { "attr.data-stepper": "stepper() || null" }, classAttribute: "et-number-input" }, providers: [provideIcons(MINUS_ICON, PLUS_ICON)], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true, isSignal: true }], hostDirectives: [{ directive: NumberInputDirective, inputs: ["min", "min", "max", "max", "step", "step", "decimals", "decimals", "parseErrorMessage", "parseErrorMessage", "placeholder", "placeholder", "autocomplete", "autocomplete", "textAlign", "textAlign", "value", "value", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<input\n #nativeInput\n [disabled]=\"numberInputDir.disabled()\"\n [readOnly]=\"numberInputDir.readonly()\"\n [required]=\"numberInputDir.required()\"\n [placeholder]=\"numberInputDir.effectivePlaceholder()\"\n [attr.autocomplete]=\"numberInputDir.autocomplete() || null\"\n [attr.min]=\"numberInputDir.min() ?? null\"\n [attr.max]=\"numberInputDir.max() ?? null\"\n [attr.step]=\"numberInputDir.step() ?? null\"\n [attr.inputmode]=\"numberInputDir.inputMode()\"\n [attr.name]=\"numberInputDir.name() || null\"\n [attr.aria-invalid]=\"numberInputDir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"numberInputDir.describedBy() || null\"\n [attr.aria-label]=\"numberInputDir.ariaLabel() || null\"\n [attr.aria-labelledby]=\"numberInputDir.labelId() || null\"\n [attr.data-text-align]=\"numberInputDir.textAlign()\"\n (focus)=\"numberInputDir.focused.set(true)\"\n (blur)=\"numberInputDir.focused.set(false); numberInputDir.touched.set(true); numberInputDir.normalizeNativeText()\"\n class=\"et-number-input-native\"\n type=\"number\"\n/>\n\n@if (stepper()) {\n <div class=\"et-number-input-stepper\">\n <button\n [attr.aria-label]=\"resolvedDecrementLabel()\"\n [disabled]=\"!numberInputDir.canStepDown()\"\n (pointerdown)=\"startStepRepeat($event, -1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-minus\"></i>\n </button>\n <button\n [attr.aria-label]=\"resolvedIncrementLabel()\"\n [disabled]=\"!numberInputDir.canStepUp()\"\n (pointerdown)=\"startStepRepeat($event, 1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-plus\"></i>\n </button>\n </div>\n}\n", styles: ["@layer components{html.et-number-input-scrubbing,html.et-number-input-scrubbing *{cursor:ew-resize!important}@property --et-number-input-stepper-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}et-number-input{display:block;flex:1;min-inline-size:0;color:inherit}et-number-input[data-stepper]{display:flex;align-items:center;gap:8px}et-number-input .et-number-input-stepper{display:flex;align-items:center;gap:2px;flex:none}et-number-input .et-number-input-stepper-button{display:flex;align-items:center;justify-content:center;flex:none;inline-size:calc(var(--et-number-input-stepper-size) + 8px);block-size:calc(var(--et-number-input-stepper-size) + 8px);padding:0;border:none;border-radius:4px;background:transparent;color:var(--et-surface-color-muted-solid, currentColor);cursor:pointer;outline:none;touch-action:none}@media(pointer:fine){et-number-input .et-number-input-stepper-button{cursor:ew-resize}}et-number-input .et-number-input-stepper-button .et-icon{inline-size:var(--et-number-input-stepper-size);block-size:var(--et-number-input-stepper-size)}@media(hover:hover){et-number-input .et-number-input-stepper-button:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}et-number-input .et-number-input-stepper-button:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 20%,transparent)}et-number-input .et-number-input-stepper-button:disabled{cursor:default;background:transparent;color:inherit;opacity:.4}et-number-input .et-number-input-native{display:block;inline-size:100%;border:none;outline:none;background:transparent;font:inherit;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);padding:0;min-width:0;appearance:textfield}et-number-input .et-number-input-native::-webkit-outer-spin-button,et-number-input .et-number-input-native::-webkit-inner-spin-button{appearance:none;margin:0}et-number-input .et-number-input-native:not(:focus){overflow:hidden;text-overflow:ellipsis}et-number-input .et-number-input-native::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-number-input .et-number-input-native[data-text-align=start]{text-align:start}et-number-input .et-number-input-native[data-text-align=center]{text-align:center}et-number-input .et-number-input-native[data-text-align=end]{text-align:end}et-number-input[data-mixed] .et-number-input-native::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"], dependencies: [{ kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
36912
37090
  }
36913
37091
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NumberInputComponent, decorators: [{
36914
37092
  type: Component,
@@ -36934,7 +37112,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
36934
37112
  class: 'et-number-input',
36935
37113
  '[attr.data-stepper]': 'stepper() || null',
36936
37114
  '(click)': 'numberInputDir.activate()',
36937
- }, template: "<input\n #nativeInput\n [value]=\"numberInputDir.displayValue()\"\n [disabled]=\"numberInputDir.disabled()\"\n [readOnly]=\"numberInputDir.readonly()\"\n [required]=\"numberInputDir.required()\"\n [placeholder]=\"numberInputDir.effectivePlaceholder()\"\n [attr.autocomplete]=\"numberInputDir.autocomplete() || null\"\n [attr.min]=\"numberInputDir.min() ?? null\"\n [attr.max]=\"numberInputDir.max() ?? null\"\n [attr.step]=\"numberInputDir.step() ?? null\"\n [attr.inputmode]=\"numberInputDir.inputMode()\"\n [attr.name]=\"numberInputDir.name() || null\"\n [attr.aria-invalid]=\"numberInputDir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"numberInputDir.describedBy() || null\"\n [attr.aria-label]=\"numberInputDir.ariaLabel() || null\"\n [attr.aria-labelledby]=\"numberInputDir.labelId() || null\"\n [attr.data-text-align]=\"numberInputDir.textAlign()\"\n (focus)=\"numberInputDir.focused.set(true)\"\n (blur)=\"numberInputDir.focused.set(false); numberInputDir.touched.set(true)\"\n class=\"et-number-input-native\"\n type=\"number\"\n/>\n\n@if (stepper()) {\n <div class=\"et-number-input-stepper\">\n <button\n [attr.aria-label]=\"resolvedDecrementLabel()\"\n [disabled]=\"!numberInputDir.canStepDown()\"\n (pointerdown)=\"startStepRepeat($event, -1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-minus\"></i>\n </button>\n <button\n [attr.aria-label]=\"resolvedIncrementLabel()\"\n [disabled]=\"!numberInputDir.canStepUp()\"\n (pointerdown)=\"startStepRepeat($event, 1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-plus\"></i>\n </button>\n </div>\n}\n", styles: ["@layer components{html.et-number-input-scrubbing,html.et-number-input-scrubbing *{cursor:ew-resize!important}@property --et-number-input-stepper-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}et-number-input{display:block;flex:1;min-inline-size:0;color:inherit}et-number-input[data-stepper]{display:flex;align-items:center;gap:8px}et-number-input .et-number-input-stepper{display:flex;align-items:center;gap:2px;flex:none}et-number-input .et-number-input-stepper-button{display:flex;align-items:center;justify-content:center;flex:none;inline-size:calc(var(--et-number-input-stepper-size) + 8px);block-size:calc(var(--et-number-input-stepper-size) + 8px);padding:0;border:none;border-radius:4px;background:transparent;color:var(--et-surface-color-muted-solid, currentColor);cursor:pointer;outline:none;touch-action:none}@media(pointer:fine){et-number-input .et-number-input-stepper-button{cursor:ew-resize}}et-number-input .et-number-input-stepper-button .et-icon{inline-size:var(--et-number-input-stepper-size);block-size:var(--et-number-input-stepper-size)}@media(hover:hover){et-number-input .et-number-input-stepper-button:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}et-number-input .et-number-input-stepper-button:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 20%,transparent)}et-number-input .et-number-input-stepper-button:disabled{cursor:default;background:transparent;color:inherit;opacity:.4}et-number-input .et-number-input-native{display:block;inline-size:100%;border:none;outline:none;background:transparent;font:inherit;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);padding:0;min-width:0;appearance:textfield}et-number-input .et-number-input-native::-webkit-outer-spin-button,et-number-input .et-number-input-native::-webkit-inner-spin-button{appearance:none;margin:0}et-number-input .et-number-input-native:not(:focus){overflow:hidden;text-overflow:ellipsis}et-number-input .et-number-input-native::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-number-input .et-number-input-native[data-text-align=start]{text-align:start}et-number-input .et-number-input-native[data-text-align=center]{text-align:center}et-number-input .et-number-input-native[data-text-align=end]{text-align:end}et-number-input[data-mixed] .et-number-input-native::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"] }]
37115
+ }, template: "<input\n #nativeInput\n [disabled]=\"numberInputDir.disabled()\"\n [readOnly]=\"numberInputDir.readonly()\"\n [required]=\"numberInputDir.required()\"\n [placeholder]=\"numberInputDir.effectivePlaceholder()\"\n [attr.autocomplete]=\"numberInputDir.autocomplete() || null\"\n [attr.min]=\"numberInputDir.min() ?? null\"\n [attr.max]=\"numberInputDir.max() ?? null\"\n [attr.step]=\"numberInputDir.step() ?? null\"\n [attr.inputmode]=\"numberInputDir.inputMode()\"\n [attr.name]=\"numberInputDir.name() || null\"\n [attr.aria-invalid]=\"numberInputDir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"numberInputDir.describedBy() || null\"\n [attr.aria-label]=\"numberInputDir.ariaLabel() || null\"\n [attr.aria-labelledby]=\"numberInputDir.labelId() || null\"\n [attr.data-text-align]=\"numberInputDir.textAlign()\"\n (focus)=\"numberInputDir.focused.set(true)\"\n (blur)=\"numberInputDir.focused.set(false); numberInputDir.touched.set(true); numberInputDir.normalizeNativeText()\"\n class=\"et-number-input-native\"\n type=\"number\"\n/>\n\n@if (stepper()) {\n <div class=\"et-number-input-stepper\">\n <button\n [attr.aria-label]=\"resolvedDecrementLabel()\"\n [disabled]=\"!numberInputDir.canStepDown()\"\n (pointerdown)=\"startStepRepeat($event, -1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-minus\"></i>\n </button>\n <button\n [attr.aria-label]=\"resolvedIncrementLabel()\"\n [disabled]=\"!numberInputDir.canStepUp()\"\n (pointerdown)=\"startStepRepeat($event, 1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-plus\"></i>\n </button>\n </div>\n}\n", styles: ["@layer components{html.et-number-input-scrubbing,html.et-number-input-scrubbing *{cursor:ew-resize!important}@property --et-number-input-stepper-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}et-number-input{display:block;flex:1;min-inline-size:0;color:inherit}et-number-input[data-stepper]{display:flex;align-items:center;gap:8px}et-number-input .et-number-input-stepper{display:flex;align-items:center;gap:2px;flex:none}et-number-input .et-number-input-stepper-button{display:flex;align-items:center;justify-content:center;flex:none;inline-size:calc(var(--et-number-input-stepper-size) + 8px);block-size:calc(var(--et-number-input-stepper-size) + 8px);padding:0;border:none;border-radius:4px;background:transparent;color:var(--et-surface-color-muted-solid, currentColor);cursor:pointer;outline:none;touch-action:none}@media(pointer:fine){et-number-input .et-number-input-stepper-button{cursor:ew-resize}}et-number-input .et-number-input-stepper-button .et-icon{inline-size:var(--et-number-input-stepper-size);block-size:var(--et-number-input-stepper-size)}@media(hover:hover){et-number-input .et-number-input-stepper-button:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}et-number-input .et-number-input-stepper-button:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 20%,transparent)}et-number-input .et-number-input-stepper-button:disabled{cursor:default;background:transparent;color:inherit;opacity:.4}et-number-input .et-number-input-native{display:block;inline-size:100%;border:none;outline:none;background:transparent;font:inherit;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);padding:0;min-width:0;appearance:textfield}et-number-input .et-number-input-native::-webkit-outer-spin-button,et-number-input .et-number-input-native::-webkit-inner-spin-button{appearance:none;margin:0}et-number-input .et-number-input-native:not(:focus){overflow:hidden;text-overflow:ellipsis}et-number-input .et-number-input-native::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-number-input .et-number-input-native[data-text-align=start]{text-align:start}et-number-input .et-number-input-native[data-text-align=center]{text-align:center}et-number-input .et-number-input-native[data-text-align=end]{text-align:end}et-number-input[data-mixed] .et-number-input-native::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"] }]
36938
37116
  }], ctorParameters: () => [], propDecorators: { stepper: [{ type: i0.Input, args: [{ isSignal: true, alias: "stepper", required: false }] }], incrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "incrementLabel", required: false }] }], decrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "decrementLabel", required: false }] }], nativeInput: [{ type: i0.ViewChild, args: ['nativeInput', { isSignal: true }] }] } });
36939
37117
 
36940
37118
  class PasswordInputComponent {
@@ -37198,7 +37376,8 @@ const findLanguagesError = (languages) => {
37198
37376
  * ```
37199
37377
  */
37200
37378
  const requiredLanguages = (path, { codes, message }) => validate(path, ({ value }) => {
37201
- const missing = (typeof codes === 'function' ? codes() : codes).filter((code) => (value()[code] ?? '').trim().length === 0);
37379
+ const record = value() ?? {};
37380
+ const missing = (typeof codes === 'function' ? codes() : codes).filter((code) => (record[code] ?? '').trim().length === 0);
37202
37381
  if (missing.length === 0)
37203
37382
  return undefined;
37204
37383
  const text = typeof message === 'function' ? message(missing) : (message ?? `Missing translations: ${missing.join(', ')}`);
@@ -39278,6 +39457,31 @@ const HTML_ATTRIBUTE = /(\s+)([^\s/>=]+)((?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?
39278
39457
  const renameStyleAttribute = (attribute, ...[space, name, value]) => name?.toLowerCase() === 'style' ? `${space}${INERT_STYLE_ATTRIBUTE}${value}` : attribute;
39279
39458
  const renameStyleAttributes = (html) => html.replace(HTML_START_TAG, (tag) => tag.replace(HTML_ATTRIBUTE, renameStyleAttribute));
39280
39459
  const restoreStyleAttributes = (html) => html.replaceAll(` ${INERT_STYLE_ATTRIBUTE}="`, ' style="');
39460
+ const stripPastedAlignment = (body, renderer) => {
39461
+ // eslint-disable-next-line ethlete/no-dom-query -- parsed clipboard document, not the editor's DOM
39462
+ for (const el of body.querySelectorAll(`[${INERT_STYLE_ATTRIBUTE}], [class*="${ALIGN_CLASS_PREFIX}"]`)) {
39463
+ renderer.removeAttribute(el, INERT_STYLE_ATTRIBUTE);
39464
+ for (const name of [...el.classList]) {
39465
+ if (name.startsWith(ALIGN_CLASS_PREFIX))
39466
+ renderer.removeClass(el, name);
39467
+ }
39468
+ }
39469
+ };
39470
+ const takeTextBeforeCaret = (editable, text) => {
39471
+ if (!editable?.range.collapsed)
39472
+ return null;
39473
+ const { startContainer: node, startOffset: end } = editable.range;
39474
+ if (node.nodeType !== Node.TEXT_NODE || !node.data.slice(0, end).endsWith(text))
39475
+ return null;
39476
+ const start = end - text.length;
39477
+ node.deleteData(start, text.length);
39478
+ editable.selection.collapse(node, start);
39479
+ return () => {
39480
+ node.insertData(start, text);
39481
+ editable.selection.collapse(node, end);
39482
+ };
39483
+ };
39484
+ const AUTOFORMAT_CHARS = ' *_~`';
39281
39485
  const collectTextNodes = (root) => {
39282
39486
  const walker = root.ownerDocument.createTreeWalker(root, NodeFilter.SHOW_TEXT);
39283
39487
  const nodes = [];
@@ -39503,7 +39707,7 @@ class RichTextEditorDirective extends FieldStateControlDirective {
39503
39707
  const markdown = this.value() ?? '';
39504
39708
  if (markdown === this.lastEmittedMarkdown)
39505
39709
  return;
39506
- this.renderExternalValue(markdown);
39710
+ untracked(() => this.renderExternalValue(markdown));
39507
39711
  });
39508
39712
  }
39509
39713
  /**
@@ -39583,9 +39787,15 @@ class RichTextEditorDirective extends FieldStateControlDirective {
39583
39787
  }
39584
39788
  /** @internal Restarts the history: an outside write is a new document, so undo must not reach back into the previous one's states. */
39585
39789
  renderExternalValue(markdown = this.value() ?? '') {
39790
+ const root = this.editorDom.root();
39791
+ const caret = root && root.ownerDocument.activeElement === root ? this.editorDom.readSelectionOffsets() : null;
39586
39792
  if (!this.writeValueToDom(markdown))
39587
39793
  return;
39588
39794
  this.history.reset(markdown);
39795
+ this.pendingMarks.set(null);
39796
+ if (caret)
39797
+ this.editorDom.restoreSelectionOffsets(caret);
39798
+ this.refreshActiveMarks();
39589
39799
  }
39590
39800
  refreshActiveMarks() {
39591
39801
  const pending = this.pendingMarks();
@@ -39771,6 +39981,8 @@ class RichTextEditorDirective extends FieldStateControlDirective {
39771
39981
  const body = new DOMParser().parseFromString(renameStyleAttributes(html), 'text/html').body;
39772
39982
  // eslint-disable-next-line ethlete/no-dom-query -- clipboard HTML (e.g. from Word) embeds <style> blocks whose CSS text would survive the tag-strip as plain text
39773
39983
  body.querySelectorAll('style, script, noscript, meta, link, title').forEach((junk) => junk.remove());
39984
+ if (!this.toolDefs.has(RICH_TEXT_EDITOR_TOOLS.ALIGN))
39985
+ stripPastedAlignment(body, this.renderer);
39774
39986
  if (this.editorDom.markStates()?.codeBlock)
39775
39987
  return this.pasteIntoCodeBlock(clipboardPlainText(body));
39776
39988
  const codec = this.tokenCodec();
@@ -39851,7 +40063,11 @@ class RichTextEditorDirective extends FieldStateControlDirective {
39851
40063
  }
39852
40064
  listenToEditable(element) {
39853
40065
  const listeners = [
39854
- this.renderer.listen(element, 'input', () => this.syncFromDom()),
40066
+ this.renderer.listen(element, 'input', (event) => {
40067
+ if (!event.isComposing)
40068
+ this.syncFromDom();
40069
+ }),
40070
+ this.renderer.listen(element, 'compositionend', (event) => this.finishComposition(event.data)),
39855
40071
  this.renderer.listen(element, 'beforeinput', (event) => this.interceptBeforeInput(event)),
39856
40072
  this.renderer.listen(element, 'keydown', (event) => this.interceptKeydown(event)),
39857
40073
  this.renderer.listen(element, 'paste', (event) => this.interceptPaste(event)),
@@ -39868,6 +40084,9 @@ class RichTextEditorDirective extends FieldStateControlDirective {
39868
40084
  return () => listeners.forEach((off) => off());
39869
40085
  }
39870
40086
  interceptKeydown(event) {
40087
+ // The keystrokes of an IME composition (Safari reports its commit as Enter) belong to the IME.
40088
+ if (event.isComposing || event.keyCode === 229)
40089
+ return;
39871
40090
  // History first, and always prevented: the native contenteditable undo stack must never run,
39872
40091
  // since paste normalization and autoformat rewrite the DOM behind its back and it would restore
39873
40092
  // a state the value model never had. Ctrl/Cmd+Z undoes, Ctrl+Y and Ctrl/Cmd+Shift+Z redo.
@@ -40017,6 +40236,7 @@ class RichTextEditorDirective extends FieldStateControlDirective {
40017
40236
  this.redo();
40018
40237
  break;
40019
40238
  case 'insertText':
40239
+ case 'insertFromComposition':
40020
40240
  if (event.data !== null && this.handleAutoformat(event.data)) {
40021
40241
  event.preventDefault();
40022
40242
  break;
@@ -40027,6 +40247,23 @@ class RichTextEditorDirective extends FieldStateControlDirective {
40027
40247
  break;
40028
40248
  }
40029
40249
  }
40250
+ finishComposition(data) {
40251
+ if (!this.canEdit())
40252
+ return;
40253
+ const pending = this.pendingMarks();
40254
+ if (pending !== null && data && takeTextBeforeCaret(this.editorDom.getSelection(), data)) {
40255
+ this.pendingMarks.set(null);
40256
+ this.runCommand(() => this.editorDom.insertInlineText(data, pending));
40257
+ return;
40258
+ }
40259
+ const last = data.at(-1);
40260
+ const restore = last && AUTOFORMAT_CHARS.includes(last) && takeTextBeforeCaret(this.editorDom.getSelection(), last);
40261
+ if (restore && last && this.handleAutoformat(last))
40262
+ return;
40263
+ if (restore)
40264
+ restore();
40265
+ this.syncFromDom();
40266
+ }
40030
40267
  warnAboutMissingTools() {
40031
40268
  const warned = new Set();
40032
40269
  effect(() => {
@@ -40825,6 +41062,8 @@ class RichTextEditorTriggersDirective {
40825
41062
  this.openOrReposition();
40826
41063
  }
40827
41064
  interceptPopupKeys(event) {
41065
+ if (event.isComposing || event.keyCode === 229)
41066
+ return;
40828
41067
  if (event.key === 'Backspace' && this.deletePrecedingChip()) {
40829
41068
  event.preventDefault();
40830
41069
  event.stopPropagation();
@@ -41443,7 +41682,9 @@ class MenuDirective {
41443
41682
  if (this.parent?.openSubmenu() === this) {
41444
41683
  this.parent.openSubmenu.set(null);
41445
41684
  }
41446
- this.overlayRef()?.close();
41685
+ const overlayRef = this.overlayRef();
41686
+ this.overlayRef.set(null);
41687
+ overlayRef?.close();
41447
41688
  });
41448
41689
  if (ngDevMode) {
41449
41690
  afterNextRender(() => {
@@ -41596,7 +41837,8 @@ class MenuDirective {
41596
41837
  case 'ArrowLeft': {
41597
41838
  const opensSubmenu = (event.key === 'ArrowRight') !== this.isRtl();
41598
41839
  if (opensSubmenu) {
41599
- const submenu = this.activeItem()?.submenu ?? null;
41840
+ const activeItem = this.activeItem();
41841
+ const submenu = activeItem && !activeItem.isDisabled() ? activeItem.submenu : null;
41600
41842
  if (submenu) {
41601
41843
  event.preventDefault();
41602
41844
  submenu.show({ source: 'keyboard' });
@@ -41627,13 +41869,23 @@ class MenuDirective {
41627
41869
  if (searchFocused) {
41628
41870
  return;
41629
41871
  }
41872
+ if (event.key === ' ' && !search && this.typeahead.isRunning()) {
41873
+ const match = this.findTypeaheadMatch(this.typeahead.append(event.key));
41874
+ event.preventDefault();
41875
+ if (match) {
41876
+ this.setActiveItem(match);
41877
+ }
41878
+ return;
41879
+ }
41630
41880
  const item = this.activeItem();
41631
41881
  if (!item) {
41632
41882
  return;
41633
41883
  }
41634
41884
  event.preventDefault();
41635
41885
  if (item.submenu) {
41636
- item.submenu.show({ source: 'keyboard' });
41886
+ if (!item.isDisabled()) {
41887
+ item.submenu.show({ source: 'keyboard' });
41888
+ }
41637
41889
  }
41638
41890
  else {
41639
41891
  item.activateFromKeyboard(event.key === 'Enter' ? 'keyboard-enter' : 'keyboard-space');
@@ -41768,22 +42020,25 @@ class MenuDirective {
41768
42020
  return;
41769
42021
  }
41770
42022
  const current = this.activeItem();
41771
- const index = current ? items.indexOf(current) : -1;
41772
- if (index === -1) {
42023
+ const sorted = this.sortedItems();
42024
+ const position = current ? sorted.indexOf(current) : -1;
42025
+ if (position === -1) {
41773
42026
  this.setActiveToEdge(delta === 1 ? 'first' : 'last');
41774
42027
  return;
41775
42028
  }
41776
- const nextIndex = index + delta;
41777
- if (search && (nextIndex < 0 || nextIndex >= items.length)) {
42029
+ let next;
42030
+ for (let index = position + delta; index >= 0 && index < sorted.length && !next; index += delta) {
42031
+ next = sorted[index]?.isDisabled() ? undefined : sorted[index];
42032
+ }
42033
+ if (!next && search) {
41778
42034
  this.activeItem.set(null);
41779
42035
  search.focus();
41780
42036
  return;
41781
42037
  }
41782
- if (!this.loop() && (nextIndex < 0 || nextIndex >= items.length)) {
42038
+ if (!next && !this.loop()) {
41783
42039
  return;
41784
42040
  }
41785
- const wrappedIndex = (nextIndex + items.length) % items.length;
41786
- const next = items[wrappedIndex];
42041
+ next ??= delta === 1 ? items[0] : items.at(-1);
41787
42042
  if (next) {
41788
42043
  this.setActiveItem(next);
41789
42044
  }
@@ -41833,6 +42088,15 @@ class MenuDirective {
41833
42088
  };
41834
42089
  const overlayRef = this.overlayManager.open(OverlayTemplateHostComponent, config);
41835
42090
  this.overlayRef.set(overlayRef);
42091
+ overlayRef
42092
+ .beforeClosed()
42093
+ .pipe(take(1), tap(() => {
42094
+ if (this.overlayRef() === overlayRef && this.open()) {
42095
+ this.openSubmenu()?.hide();
42096
+ this.open.set(false);
42097
+ }
42098
+ }), takeUntilDestroyed(this.destroyRef))
42099
+ .subscribe();
41836
42100
  if (this.isRoot) {
41837
42101
  this.attachRootInteractionListeners();
41838
42102
  }
@@ -42270,7 +42534,7 @@ class MenuItemDirective {
42270
42534
  return -1;
42271
42535
  }
42272
42536
  const active = owner.activeItem();
42273
- if (active) {
42537
+ if (active && !active.isDisabled()) {
42274
42538
  return active === this ? 0 : -1;
42275
42539
  }
42276
42540
  return owner.enabledItems()[0] === this ? 0 : -1;
@@ -47380,6 +47644,34 @@ const createVirtualWindow = (config) => {
47380
47644
  const containerDimensions = signalElementDimensions(config.container);
47381
47645
  const viewportSize = computed(() => containerDimensions().client?.height ?? 0, /* @ts-ignore */
47382
47646
  ...(ngDevMode ? [{ debugName: "viewportSize" }] : /* istanbul ignore next */ []));
47647
+ const extras = computed(() => [...(config.extraItemHeights?.() ?? new Map())]
47648
+ .filter(([, height]) => height > 0)
47649
+ .sort(([a], [b]) => a - b), /* @ts-ignore */
47650
+ ...(ngDevMode ? [{ debugName: "extras" }] : /* istanbul ignore next */ []));
47651
+ const totalExtra = computed(() => extras().reduce((sum, [, height]) => sum + height, 0), /* @ts-ignore */
47652
+ ...(ngDevMode ? [{ debugName: "totalExtra" }] : /* istanbul ignore next */ []));
47653
+ const extraBefore = (index) => {
47654
+ let sum = 0;
47655
+ for (const [extraIndex, height] of extras()) {
47656
+ if (extraIndex >= index)
47657
+ break;
47658
+ sum += height;
47659
+ }
47660
+ return sum;
47661
+ };
47662
+ const topOf = (index) => index * itemHeight() + extraBefore(index);
47663
+ // `floor` finds the item an offset falls on, `ceil` the end of the range an edge at that offset closes.
47664
+ const indexAt = (offset, round) => {
47665
+ const height = itemHeight();
47666
+ let before = 0;
47667
+ for (const [extraIndex, extra] of extras()) {
47668
+ if (offset < extraIndex * height + before + height + extra) {
47669
+ return Math.min(round((offset - before) / height), round === Math.ceil ? extraIndex + 1 : extraIndex);
47670
+ }
47671
+ before += extra;
47672
+ }
47673
+ return round((offset - before) / height);
47674
+ };
47383
47675
  // a scroll request that arrived before the container existed (e.g. scrolling the selected
47384
47676
  // option into view while the panel is still mounting) - replayed once it does
47385
47677
  let pendingScrollIndex = null;
@@ -47389,10 +47681,9 @@ const createVirtualWindow = (config) => {
47389
47681
  pendingScrollIndex = index;
47390
47682
  return;
47391
47683
  }
47392
- const height = itemHeight();
47393
47684
  const viewport = viewportSize() || FALLBACK_VIEWPORT_SIZE;
47394
- const rowTop = index * height;
47395
- const rowBottom = rowTop + height;
47685
+ const rowTop = topOf(index);
47686
+ const rowBottom = rowTop + itemHeight();
47396
47687
  const current = container.scrollTop;
47397
47688
  let next = current;
47398
47689
  if (rowTop < current) {
@@ -47429,21 +47720,20 @@ const createVirtualWindow = (config) => {
47429
47720
  if (!count || !config.container()) {
47430
47721
  return { start: 0, end: count };
47431
47722
  }
47432
- const height = itemHeight();
47433
47723
  const viewport = viewportSize() || FALLBACK_VIEWPORT_SIZE;
47434
47724
  const offset = scrollOffset();
47435
47725
  // clamp into the item range: when the count shrinks while scrolled far down (filtering a
47436
47726
  // long list), the stale offset would otherwise start past the end - the browser's own
47437
47727
  // clamp-scroll event arrives a frame later, but the window must never be empty until then
47438
47728
  const rows = overscan();
47439
- const start = Math.min(Math.max(0, Math.floor(offset / height) - rows), Math.max(0, count - 1));
47440
- const end = Math.min(count, Math.max(Math.ceil((offset + viewport) / height) + rows, start + 1));
47729
+ const start = Math.min(Math.max(0, indexAt(offset, Math.floor) - rows), Math.max(0, count - 1));
47730
+ const end = Math.min(count, Math.max(indexAt(offset + viewport, Math.ceil) + rows, start + 1));
47441
47731
  return { start, end };
47442
47732
  }, /* @ts-ignore */
47443
47733
  ...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
47444
- const paddingTop = computed(() => range().start * itemHeight(), /* @ts-ignore */
47734
+ const paddingTop = computed(() => topOf(range().start), /* @ts-ignore */
47445
47735
  ...(ngDevMode ? [{ debugName: "paddingTop" }] : /* istanbul ignore next */ []));
47446
- const paddingBottom = computed(() => Math.max(0, (config.itemCount() - range().end) * itemHeight()), /* @ts-ignore */
47736
+ const paddingBottom = computed(() => Math.max(0, config.itemCount() * itemHeight() + totalExtra() - topOf(range().end)), /* @ts-ignore */
47447
47737
  ...(ngDevMode ? [{ debugName: "paddingBottom" }] : /* istanbul ignore next */ []));
47448
47738
  const measureItem = (element) => {
47449
47739
  const height = element.offsetHeight;
@@ -47546,6 +47836,12 @@ class SelectDirective extends FieldStateControlDirective {
47546
47836
  */
47547
47837
  this.valueKey = input(null, /* @ts-ignore */
47548
47838
  ...(ngDevMode ? [{ debugName: "valueKey" }] : /* istanbul ignore next */ []));
47839
+ /**
47840
+ * Labels a value no loaded option carries (e.g. a stored id whose option is on a page not yet
47841
+ * fetched): the trigger text in single mode, the chip label in multi mode.
47842
+ */
47843
+ this.displayWith = input(null, /* @ts-ignore */
47844
+ ...(ngDevMode ? [{ debugName: "displayWith" }] : /* istanbul ignore next */ []));
47549
47845
  this.filterModeInput = input(SELECT_FILTER_MODES.INTERNAL, { ...(ngDevMode ? { debugName: "filterModeInput" } : /* istanbul ignore next */ {}), alias: 'filterMode' });
47550
47846
  /** Enter with a search query that matches no option commits the raw query string as the value. */
47551
47847
  this.allowCustomValues = input(false, { ...(ngDevMode ? { debugName: "allowCustomValues" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -47959,11 +48255,13 @@ class SelectDirective extends FieldStateControlDirective {
47959
48255
  const items = this.sortedItems();
47960
48256
  const cache = this.labelCache();
47961
48257
  const valuesMatch = this.valuesMatch();
48258
+ const displayWith = this.displayWith();
47962
48259
  return values.map((entryValue) => {
47963
48260
  const item = items.find((candidate) => valuesMatch(candidate.value(), entryValue)) ?? null;
47964
48261
  const label = item?.label() ||
47965
48262
  this.findCachedLabel(cache, entryValue) ||
47966
- (typeof entryValue === 'string' ? entryValue : null);
48263
+ displayWith?.(entryValue) ||
48264
+ (typeof entryValue === 'string' && entryValue !== '' ? entryValue : null);
47967
48265
  return { value: entryValue, label, item };
47968
48266
  });
47969
48267
  }, /* @ts-ignore */
@@ -48339,7 +48637,7 @@ class SelectDirective extends FieldStateControlDirective {
48339
48637
  }
48340
48638
  /** @internal A rendered virtual row attaches its element to its item while it is windowed in. */
48341
48639
  attachVirtualOptionElement(item, element) {
48342
- const entry = this.dataItemRegistry.get(item.value());
48640
+ const entry = this.dataItemRegistry.get(this.valueIdentity()(item.value()));
48343
48641
  if (!entry || entry.item !== item) {
48344
48642
  return;
48345
48643
  }
@@ -48352,7 +48650,7 @@ class SelectDirective extends FieldStateControlDirective {
48352
48650
  }
48353
48651
  /** @internal */
48354
48652
  detachVirtualOptionElement(item, element) {
48355
- const entry = this.dataItemRegistry.get(item.value());
48653
+ const entry = this.dataItemRegistry.get(this.valueIdentity()(item.value()));
48356
48654
  if (!entry || entry.item !== item || entry.element() !== element) {
48357
48655
  return;
48358
48656
  }
@@ -48553,7 +48851,7 @@ class SelectDirective extends FieldStateControlDirective {
48553
48851
  return;
48554
48852
  }
48555
48853
  default: {
48556
- if (event.key.length !== 1 || searchFocused || this.multiple()) {
48854
+ if (event.key.length !== 1 || searchFocused || this.multiple() || this.pickOnly()) {
48557
48855
  return;
48558
48856
  }
48559
48857
  const match = this.findTypeaheadMatch(event.key, this.selectedItems()[0] ?? null);
@@ -48585,6 +48883,10 @@ class SelectDirective extends FieldStateControlDirective {
48585
48883
  if (value === null) {
48586
48884
  return false;
48587
48885
  }
48886
+ const matchingOption = this.findOptionByLabel(value);
48887
+ if (matchingOption) {
48888
+ return this.commitMatchingOption(matchingOption);
48889
+ }
48588
48890
  this.labelCache.update((cache) => new Map(cache).set(value, value));
48589
48891
  if (this.multiple()) {
48590
48892
  const current = this.value();
@@ -48602,6 +48904,37 @@ class SelectDirective extends FieldStateControlDirective {
48602
48904
  }
48603
48905
  return true;
48604
48906
  }
48907
+ findOptionByLabel(label) {
48908
+ const lowered = label.toLowerCase();
48909
+ return this.visibleItems().find((item) => !item.custom?.() && !item.disabled() && item.label().toLowerCase() === lowered);
48910
+ }
48911
+ commitMatchingOption(item) {
48912
+ if (this.mixed()) {
48913
+ const committed = this.commitMixedOption(item);
48914
+ if (committed && this.multiple()) {
48915
+ this.registeredSearch()?.clear();
48916
+ }
48917
+ return committed;
48918
+ }
48919
+ if (!this.multiple()) {
48920
+ this.pickSingleOption(item);
48921
+ return true;
48922
+ }
48923
+ const current = this.value();
48924
+ const values = Array.isArray(current) ? current : [];
48925
+ const itemValue = item.value();
48926
+ if (this.includesValue(values, itemValue)) {
48927
+ return false;
48928
+ }
48929
+ if (this.pickOnly()) {
48930
+ this.pickOption.emit(itemValue);
48931
+ }
48932
+ else {
48933
+ this.writeValue([...values, itemValue]);
48934
+ }
48935
+ this.registeredSearch()?.clear();
48936
+ return true;
48937
+ }
48605
48938
  commitOptionWhileClosed(item) {
48606
48939
  if (this.disabled() || this.readonly() || item.disabled()) {
48607
48940
  return;
@@ -48610,6 +48943,9 @@ class SelectDirective extends FieldStateControlDirective {
48610
48943
  this.commitMixedOption(item);
48611
48944
  return;
48612
48945
  }
48946
+ if (this.selectedItems()[0] === item) {
48947
+ return;
48948
+ }
48613
48949
  this.pickSingleOption(item);
48614
48950
  }
48615
48951
  findTypeaheadMatch(character, from) {
@@ -48740,7 +49076,7 @@ class SelectDirective extends FieldStateControlDirective {
48740
49076
  this.hide();
48741
49077
  }
48742
49078
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
48743
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: SelectDirective, isStandalone: true, selector: "[etSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mixed: { classPropertyName: "mixed", publicName: "mixed", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, mixedLabel: { classPropertyName: "mixedLabel", publicName: "mixedLabel", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, pending: { classPropertyName: "pending", publicName: "pending", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, valueKey: { classPropertyName: "valueKey", publicName: "valueKey", isSignal: true, isRequired: false, transformFunction: null }, filterModeInput: { classPropertyName: "filterModeInput", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, allowCustomValues: { classPropertyName: "allowCustomValues", publicName: "allowCustomValues", isSignal: true, isRequired: false, transformFunction: null }, separators: { classPropertyName: "separators", publicName: "separators", isSignal: true, isRequired: false, transformFunction: null }, normalizeValue: { classPropertyName: "normalizeValue", publicName: "normalizeValue", isSignal: true, isRequired: false, transformFunction: null }, commitCustomValueOnClose: { classPropertyName: "commitCustomValueOnClose", publicName: "commitCustomValueOnClose", isSignal: true, isRequired: false, transformFunction: null }, maxSelection: { classPropertyName: "maxSelection", publicName: "maxSelection", isSignal: true, isRequired: false, transformFunction: null }, allowAddNew: { classPropertyName: "allowAddNew", publicName: "allowAddNew", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadErrorInput: { classPropertyName: "loadErrorInput", publicName: "loadError", isSignal: true, isRequired: false, transformFunction: null }, hasMoreItemsInput: { classPropertyName: "hasMoreItemsInput", publicName: "hasMoreItems", isSignal: true, isRequired: false, transformFunction: null }, mirrorPanelWidth: { classPropertyName: "mirrorPanelWidth", publicName: "mirrorPanelWidth", isSignal: true, isRequired: false, transformFunction: null }, pickOnly: { classPropertyName: "pickOnly", publicName: "pickOnly", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", mixed: "mixedChange", touched: "touchedChange", open: "openChange", touch: "touch", queryChange: "queryChange", loadMore: "loadMore", addNew: "addNew", pickOption: "pickOption", afterOpen: "afterOpen", afterClose: "afterClose" }, host: { properties: { "attr.data-select-open": "open() || null", "attr.data-mixed": "mixed() || null" } }, exportAs: ["etSelect"], usesInheritance: true, ngImport: i0 }); }
49079
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: SelectDirective, isStandalone: true, selector: "[etSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mixed: { classPropertyName: "mixed", publicName: "mixed", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, mixedLabel: { classPropertyName: "mixedLabel", publicName: "mixedLabel", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, pending: { classPropertyName: "pending", publicName: "pending", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, valueKey: { classPropertyName: "valueKey", publicName: "valueKey", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null }, filterModeInput: { classPropertyName: "filterModeInput", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, allowCustomValues: { classPropertyName: "allowCustomValues", publicName: "allowCustomValues", isSignal: true, isRequired: false, transformFunction: null }, separators: { classPropertyName: "separators", publicName: "separators", isSignal: true, isRequired: false, transformFunction: null }, normalizeValue: { classPropertyName: "normalizeValue", publicName: "normalizeValue", isSignal: true, isRequired: false, transformFunction: null }, commitCustomValueOnClose: { classPropertyName: "commitCustomValueOnClose", publicName: "commitCustomValueOnClose", isSignal: true, isRequired: false, transformFunction: null }, maxSelection: { classPropertyName: "maxSelection", publicName: "maxSelection", isSignal: true, isRequired: false, transformFunction: null }, allowAddNew: { classPropertyName: "allowAddNew", publicName: "allowAddNew", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadErrorInput: { classPropertyName: "loadErrorInput", publicName: "loadError", isSignal: true, isRequired: false, transformFunction: null }, hasMoreItemsInput: { classPropertyName: "hasMoreItemsInput", publicName: "hasMoreItems", isSignal: true, isRequired: false, transformFunction: null }, mirrorPanelWidth: { classPropertyName: "mirrorPanelWidth", publicName: "mirrorPanelWidth", isSignal: true, isRequired: false, transformFunction: null }, pickOnly: { classPropertyName: "pickOnly", publicName: "pickOnly", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", mixed: "mixedChange", touched: "touchedChange", open: "openChange", touch: "touch", queryChange: "queryChange", loadMore: "loadMore", addNew: "addNew", pickOption: "pickOption", afterOpen: "afterOpen", afterClose: "afterClose" }, host: { properties: { "attr.data-select-open": "open() || null", "attr.data-mixed": "mixed() || null" } }, exportAs: ["etSelect"], usesInheritance: true, ngImport: i0 }); }
48744
49080
  }
48745
49081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectDirective, decorators: [{
48746
49082
  type: Directive,
@@ -48752,7 +49088,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
48752
49088
  '[attr.data-mixed]': 'mixed() || null',
48753
49089
  },
48754
49090
  }]
48755
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], mixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixed", required: false }] }, { type: i0.Output, args: ["mixedChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], mixedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixedLabel", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], pending: [{ type: i0.Input, args: [{ isSignal: true, alias: "pending", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], valueKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueKey", required: false }] }], filterModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMode", required: false }] }], allowCustomValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCustomValues", required: false }] }], separators: [{ type: i0.Input, args: [{ isSignal: true, alias: "separators", required: false }] }], normalizeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "normalizeValue", required: false }] }], commitCustomValueOnClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "commitCustomValueOnClose", required: false }] }], maxSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelection", required: false }] }], allowAddNew: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowAddNew", required: false }] }], loadingInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadErrorInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadError", required: false }] }], hasMoreItemsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMoreItems", required: false }] }], mirrorPanelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorPanelWidth", required: false }] }], pickOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickOnly", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], touch: [{ type: i0.Output, args: ["touch"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], addNew: [{ type: i0.Output, args: ["addNew"] }], pickOption: [{ type: i0.Output, args: ["pickOption"] }], afterOpen: [{ type: i0.Output, args: ["afterOpen"] }], afterClose: [{ type: i0.Output, args: ["afterClose"] }] } });
49091
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], mixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixed", required: false }] }, { type: i0.Output, args: ["mixedChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], mixedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixedLabel", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], pending: [{ type: i0.Input, args: [{ isSignal: true, alias: "pending", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], valueKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueKey", required: false }] }], displayWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayWith", required: false }] }], filterModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMode", required: false }] }], allowCustomValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCustomValues", required: false }] }], separators: [{ type: i0.Input, args: [{ isSignal: true, alias: "separators", required: false }] }], normalizeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "normalizeValue", required: false }] }], commitCustomValueOnClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "commitCustomValueOnClose", required: false }] }], maxSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelection", required: false }] }], allowAddNew: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowAddNew", required: false }] }], loadingInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadErrorInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadError", required: false }] }], hasMoreItemsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMoreItems", required: false }] }], mirrorPanelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorPanelWidth", required: false }] }], pickOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickOnly", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], touch: [{ type: i0.Output, args: ["touch"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], addNew: [{ type: i0.Output, args: ["addNew"] }], pickOption: [{ type: i0.Output, args: ["pickOption"] }], afterOpen: [{ type: i0.Output, args: ["afterOpen"] }], afterClose: [{ type: i0.Output, args: ["afterClose"] }] } });
48756
49092
 
48757
49093
  /**
48758
49094
  * The "Select all" row of a multi select (`selectAll`). Place it first inside the listbox; it takes
@@ -49420,8 +49756,11 @@ class SelectSearchDirective {
49420
49756
  }
49421
49757
  event.preventDefault();
49422
49758
  this.clear();
49423
- for (const part of parts) {
49424
- select.commitCustomValue(part);
49759
+ const refused = parts.filter((part) => part.trim() && !select.commitCustomValue(part));
49760
+ const pending = refused.map((part) => part.trim()).join(' ');
49761
+ if (pending) {
49762
+ this.query.set(pending);
49763
+ select.queryChange.emit(pending);
49425
49764
  }
49426
49765
  }
49427
49766
  handleFocus() {
@@ -49932,10 +50271,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
49932
50271
 
49933
50272
  class SelectOptionComponent {
49934
50273
  constructor() {
50274
+ this.option = inject(SelectOptionDirective);
49935
50275
  mountSelectOptionStyles();
49936
50276
  }
49937
50277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
49938
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: SelectOptionComponent, isStandalone: true, selector: "et-select-option", host: { classAttribute: "et-select-option" }, providers: [provideIcons(CHECK_ICON, PLUS_ICON)], hostDirectives: [{ directive: SelectOptionDirective, inputs: ["value", "value", "label", "label", "disabled", "disabled", "customValueOption", "customValueOption"] }], ngImport: i0, template: "<span class=\"et-select-option-label\">\n <ng-content />\n</span>\n\n<span class=\"et-select-option-check\">\n <i etIcon=\"et-check\"></i>\n</span>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
50278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: SelectOptionComponent, isStandalone: true, selector: "et-select-option", host: { classAttribute: "et-select-option" }, providers: [provideIcons(CHECK_ICON, PLUS_ICON)], hostDirectives: [{ directive: SelectOptionDirective, inputs: ["value", "value", "label", "label", "disabled", "disabled", "customValueOption", "customValueOption"] }], ngImport: i0, template: "<span class=\"et-select-option-label\">\n <ng-content>{{ option.labelInput() }}</ng-content>\n</span>\n\n<span class=\"et-select-option-check\">\n <i etIcon=\"et-check\"></i>\n</span>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
49939
50279
  }
49940
50280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectOptionComponent, decorators: [{
49941
50281
  type: Component,
@@ -49946,7 +50286,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
49946
50286
  },
49947
50287
  ], host: {
49948
50288
  class: 'et-select-option',
49949
- }, template: "<span class=\"et-select-option-label\">\n <ng-content />\n</span>\n\n<span class=\"et-select-option-check\">\n <i etIcon=\"et-check\"></i>\n</span>\n" }]
50289
+ }, template: "<span class=\"et-select-option-label\">\n <ng-content>{{ option.labelInput() }}</ng-content>\n</span>\n\n<span class=\"et-select-option-check\">\n <i etIcon=\"et-check\"></i>\n</span>\n" }]
49950
50290
  }], ctorParameters: () => [] });
49951
50291
 
49952
50292
  /**
@@ -50402,7 +50742,7 @@ class SelectComponent {
50402
50742
  return () => injector.get(SelectDirective).focus({ preventScroll: true });
50403
50743
  },
50404
50744
  },
50405
- ], hostDirectives: [{ directive: SelectDirective, inputs: ["value", "value", "mixed", "mixed", "touched", "touched", "open", "open", "multiple", "multiple", "placeholder", "placeholder", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "options", "options", "compareWith", "compareWith", "valueKey", "valueKey", "filterMode", "filterMode", "allowCustomValues", "allowCustomValues", "separators", "separators", "normalizeValue", "normalizeValue", "commitCustomValueOnClose", "commitCustomValueOnClose", "maxSelection", "maxSelection", "allowAddNew", "allowAddNew", "loading", "loading", "loadError", "loadError", "hasMoreItems", "hasMoreItems", "pickOnly", "pickOnly", "selectAll", "selectAll", "mirrorPanelWidth", "mirrorPanelWidth", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "openChange", "openChange", "queryChange", "queryChange", "loadMore", "loadMore", "addNew", "addNew", "pickOption", "pickOption", "afterOpen", "afterOpen", "afterClose", "afterClose"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"!select.hasValue() || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"], dependencies: [{ kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "component", type: SelectAllOptionComponent, selector: "et-select-all-option" }, { kind: "component", type: SelectVirtualOptionComponent, selector: "et-select-virtual-option" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ChipComponent, selector: "et-chip" }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: SemanticThemesDirective, selector: "[etSemanticThemes]", exportAs: ["etSemanticThemes"] }], encapsulation: i0.ViewEncapsulation.None }); }
50745
+ ], hostDirectives: [{ directive: SelectDirective, inputs: ["value", "value", "mixed", "mixed", "touched", "touched", "open", "open", "multiple", "multiple", "placeholder", "placeholder", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "options", "options", "compareWith", "compareWith", "valueKey", "valueKey", "displayWith", "displayWith", "filterMode", "filterMode", "allowCustomValues", "allowCustomValues", "separators", "separators", "normalizeValue", "normalizeValue", "commitCustomValueOnClose", "commitCustomValueOnClose", "maxSelection", "maxSelection", "allowAddNew", "allowAddNew", "loading", "loading", "loadError", "loadError", "hasMoreItems", "hasMoreItems", "pickOnly", "pickOnly", "selectAll", "selectAll", "mirrorPanelWidth", "mirrorPanelWidth", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "openChange", "openChange", "queryChange", "queryChange", "loadMore", "loadMore", "addNew", "addNew", "pickOption", "pickOption", "afterOpen", "afterOpen", "afterClose", "afterClose"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"select.displayValue() === null || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;min-block-size:1lh;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"], dependencies: [{ kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "component", type: SelectAllOptionComponent, selector: "et-select-all-option" }, { kind: "component", type: SelectVirtualOptionComponent, selector: "et-select-virtual-option" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ChipComponent, selector: "et-chip" }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: SemanticThemesDirective, selector: "[etSemanticThemes]", exportAs: ["etSemanticThemes"] }], encapsulation: i0.ViewEncapsulation.None }); }
50406
50746
  }
50407
50747
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectComponent, decorators: [{
50408
50748
  type: Component,
@@ -50452,6 +50792,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
50452
50792
  'options',
50453
50793
  'compareWith',
50454
50794
  'valueKey',
50795
+ 'displayWith',
50455
50796
  'filterMode',
50456
50797
  'allowCustomValues',
50457
50798
  'separators',
@@ -50485,7 +50826,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
50485
50826
  ColorInteractiveDirective,
50486
50827
  ], host: {
50487
50828
  class: 'et-select',
50488
- }, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"!select.hasValue() || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"] }]
50829
+ }, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"select.displayValue() === null || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;min-block-size:1lh;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"] }]
50489
50830
  }], ctorParameters: () => [], propDecorators: { loadMoreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadMoreLabel", required: false }] }], addNewLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "addNewLabel", required: false }] }], createLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "createLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }] } });
50490
50831
 
50491
50832
  const SELECT_IMPORTS = [
@@ -50584,7 +50925,7 @@ class PhoneInputComponent {
50584
50925
  this.phone.focus(options);
50585
50926
  }
50586
50927
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
50587
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PhoneInputComponent, isStandalone: true, selector: "et-phone-input", inputs: { countryLabel: { classPropertyName: "countryLabel", publicName: "countryLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-phone-input" }, providers: [provideIcons(TIMES_ICON)], hostDirectives: [{ directive: PhoneInputDirective, inputs: ["value", "value", "placeholder", "placeholder", "defaultCountry", "defaultCountry", "preferredCountries", "preferredCountries", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<div\n [aria-labelledby]=\"countryLabelId\"\n [value]=\"phone.country()\"\n [readonly]=\"phone.readonly()\"\n (valueChange)=\"handleCountryChange($event)\"\n class=\"et-phone-input-country\"\n mirrorPanelWidth=\"false\"\n etFormFieldBarrier\n etSelect\n>\n <span [id]=\"countryLabelId\" hidden>{{ resolvedCountryLabel() }}</span>\n <button [disabled]=\"phone.disabled()\" class=\"et-phone-input-country-trigger\" etSelectTrigger type=\"button\">\n <span class=\"et-phone-input-country-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template [ngTemplateOutlet]=\"flagTemplate.templateRef\" [ngTemplateOutletContext]=\"activeFlagContext()\" />\n } @else {\n {{ activeFlag() }}\n }\n </span>\n <span class=\"et-visually-hidden et-phone-input-country-name\">{{ activeCountryName() }}</span>\n <span class=\"et-phone-input-dial-code\">+{{ phone.dialCode() }}</span>\n </button>\n\n <ng-template etSelectSurface let-select>\n <et-select-panel class=\"et-phone-input-country-panel\">\n <div class=\"et-select-panel-search\">\n <input [placeholder]=\"phoneInputLabels().searchCountries\" etSelectSearch />\n </div>\n\n <!-- the label carries the dial code too, so searching by \"+49\" / \"49\" works -->\n @for (country of countries(); track country.iso2) {\n <et-select-option [label]=\"country.name + ' +' + country.dialCode\" [value]=\"country.iso2\">\n <span class=\"et-phone-input-option-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"flagTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: country }\"\n />\n } @else {\n {{ country.flag }}\n }\n </span>\n <span class=\"et-phone-input-option-name\">{{ country.name }}</span>\n <span class=\"et-phone-input-option-dial\">+{{ country.dialCode }}</span>\n </et-select-option>\n }\n\n @if (!select.visibleItems().length) {\n <div class=\"et-select-state et-select-state--empty\">{{ phoneInputLabels().noCountries }}</div>\n }\n </et-select-panel>\n </ng-template>\n</div>\n\n<input class=\"et-phone-input-field\" etPhoneInputField />\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear by erasing the text.\n mousedown is prevented so the field keeps focus (its blur would unmount this\n button before the click could land) -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n</ng-template>\n", styles: ["@layer components{et-phone-input{display:flex;align-items:center;gap:8px;flex:1;min-inline-size:0;color:inherit}et-phone-input .et-phone-input-country-trigger{display:flex;align-items:center;gap:4px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;margin:0;cursor:pointer;appearance:none;white-space:nowrap}et-phone-input .et-phone-input-country-trigger:disabled{cursor:not-allowed}et-phone-input .et-phone-input-country-trigger:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px;border-radius:4px}et-phone-input[data-readonly] .et-phone-input-country-trigger{cursor:default}et-phone-input .et-phone-input-country-flag{display:inline-flex;align-items:center}et-phone-input .et-phone-input-dial-code{color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-phone-input .et-phone-input-field:disabled{cursor:not-allowed}et-phone-input[data-mixed] .et-phone-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-phone-input-country-panel{inline-size:min(320px,calc(100vw - 24px))}.et-phone-input-country-panel .et-select-option-label{display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);flex:1;min-inline-size:0}.et-phone-input-option-flag{flex:none;display:inline-flex;align-items:center;justify-content:center}.et-phone-input-option-name{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-phone-input-option-dial{flex:none;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}.et-phone-input-country-flag :is(img,svg),.et-phone-input-option-flag :is(img,svg){display:block;inline-size:20px;block-size:auto}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "directive", type: FormFieldBarrierDirective, selector: "[etFormFieldBarrier]" }, { kind: "directive", type: SelectDirective, selector: "[etSelect]", inputs: ["value", "mixed", "touched", "open", "multiple", "disabled", "readonly", "invalid", "errors", "required", "name", "placeholder", "mixedLabel", "maxLength", "pending", "options", "compareWith", "valueKey", "filterMode", "allowCustomValues", "separators", "normalizeValue", "commitCustomValueOnClose", "maxSelection", "allowAddNew", "loading", "loadError", "hasMoreItems", "mirrorPanelWidth", "pickOnly", "selectAll"], outputs: ["valueChange", "mixedChange", "touchedChange", "openChange", "touch", "queryChange", "loadMore", "addNew", "pickOption", "afterOpen", "afterClose"], exportAs: ["etSelect"] }, { kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "directive", type: SelectSearchDirective, selector: "input[etSelectSearch]", inputs: ["query"], outputs: ["queryChange"], exportAs: ["etSelectSearch"] }, { kind: "directive", type: PhoneInputFieldDirective, selector: "input[etPhoneInputField]", exportAs: ["etPhoneInputField"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
50928
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PhoneInputComponent, isStandalone: true, selector: "et-phone-input", inputs: { countryLabel: { classPropertyName: "countryLabel", publicName: "countryLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-phone-input" }, providers: [provideIcons(TIMES_ICON)], hostDirectives: [{ directive: PhoneInputDirective, inputs: ["value", "value", "placeholder", "placeholder", "defaultCountry", "defaultCountry", "preferredCountries", "preferredCountries", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<div\n [aria-labelledby]=\"countryLabelId\"\n [value]=\"phone.country()\"\n [readonly]=\"phone.readonly()\"\n (valueChange)=\"handleCountryChange($event)\"\n class=\"et-phone-input-country\"\n mirrorPanelWidth=\"false\"\n etFormFieldBarrier\n etSelect\n>\n <span [id]=\"countryLabelId\" hidden>{{ resolvedCountryLabel() }}</span>\n <button [disabled]=\"phone.disabled()\" class=\"et-phone-input-country-trigger\" etSelectTrigger type=\"button\">\n <span class=\"et-phone-input-country-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template [ngTemplateOutlet]=\"flagTemplate.templateRef\" [ngTemplateOutletContext]=\"activeFlagContext()\" />\n } @else {\n {{ activeFlag() }}\n }\n </span>\n <span class=\"et-visually-hidden et-phone-input-country-name\">{{ activeCountryName() }}</span>\n <span class=\"et-phone-input-dial-code\">+{{ phone.dialCode() }}</span>\n </button>\n\n <ng-template etSelectSurface let-select>\n <et-select-panel class=\"et-phone-input-country-panel\">\n <div class=\"et-select-panel-search\">\n <input [placeholder]=\"phoneInputLabels().searchCountries\" etSelectSearch />\n </div>\n\n <!-- the label carries the dial code too, so searching by \"+49\" / \"49\" works -->\n @for (country of countries(); track country.iso2) {\n <et-select-option [label]=\"country.name + ' +' + country.dialCode\" [value]=\"country.iso2\">\n <span class=\"et-phone-input-option-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"flagTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: country }\"\n />\n } @else {\n {{ country.flag }}\n }\n </span>\n <span class=\"et-phone-input-option-name\">{{ country.name }}</span>\n <span class=\"et-phone-input-option-dial\">+{{ country.dialCode }}</span>\n </et-select-option>\n }\n\n @if (!select.visibleItems().length) {\n <div class=\"et-select-state et-select-state--empty\">{{ phoneInputLabels().noCountries }}</div>\n }\n </et-select-panel>\n </ng-template>\n</div>\n\n<input class=\"et-phone-input-field\" etPhoneInputField />\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear by erasing the text.\n mousedown is prevented so the field keeps focus (its blur would unmount this\n button before the click could land) -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n</ng-template>\n", styles: ["@layer components{et-phone-input{display:flex;align-items:center;gap:8px;flex:1;min-inline-size:0;color:inherit}et-phone-input .et-phone-input-country-trigger{display:flex;align-items:center;gap:4px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;margin:0;cursor:pointer;appearance:none;white-space:nowrap}et-phone-input .et-phone-input-country-trigger:disabled{cursor:not-allowed}et-phone-input .et-phone-input-country-trigger:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px;border-radius:4px}et-phone-input[data-readonly] .et-phone-input-country-trigger{cursor:default}et-phone-input .et-phone-input-country-flag{display:inline-flex;align-items:center}et-phone-input .et-phone-input-dial-code{color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-phone-input .et-phone-input-field:disabled{cursor:not-allowed}et-phone-input[data-mixed] .et-phone-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-phone-input-country-panel{inline-size:min(320px,calc(100vw - 24px))}.et-phone-input-country-panel .et-select-option-label{display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);flex:1;min-inline-size:0}.et-phone-input-option-flag{flex:none;display:inline-flex;align-items:center;justify-content:center}.et-phone-input-option-name{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-phone-input-option-dial{flex:none;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}.et-phone-input-country-flag :is(img,svg),.et-phone-input-option-flag :is(img,svg){display:block;inline-size:20px;block-size:auto}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "directive", type: FormFieldBarrierDirective, selector: "[etFormFieldBarrier]" }, { kind: "directive", type: SelectDirective, selector: "[etSelect]", inputs: ["value", "mixed", "touched", "open", "multiple", "disabled", "readonly", "invalid", "errors", "required", "name", "placeholder", "mixedLabel", "maxLength", "pending", "options", "compareWith", "valueKey", "displayWith", "filterMode", "allowCustomValues", "separators", "normalizeValue", "commitCustomValueOnClose", "maxSelection", "allowAddNew", "loading", "loadError", "hasMoreItems", "mirrorPanelWidth", "pickOnly", "selectAll"], outputs: ["valueChange", "mixedChange", "touchedChange", "openChange", "touch", "queryChange", "loadMore", "addNew", "pickOption", "afterOpen", "afterClose"], exportAs: ["etSelect"] }, { kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "directive", type: SelectSearchDirective, selector: "input[etSelectSearch]", inputs: ["query"], outputs: ["queryChange"], exportAs: ["etSelectSearch"] }, { kind: "directive", type: PhoneInputFieldDirective, selector: "input[etPhoneInputField]", exportAs: ["etPhoneInputField"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
50588
50929
  }
50589
50930
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PhoneInputComponent, decorators: [{
50590
50931
  type: Component,
@@ -51604,7 +51945,8 @@ class RangeSliderDirective extends FieldStateControlDirective {
51604
51945
  const min = this.effectiveMin();
51605
51946
  return [min, min];
51606
51947
  }
51607
- const snapped = this.value().map((end) => this.snapValue(end));
51948
+ const range = this.value() ?? [this.effectiveMin(), this.effectiveMax()];
51949
+ const snapped = range.map((end) => this.snapValue(end));
51608
51950
  return [Math.min(...snapped), Math.max(...snapped)];
51609
51951
  }, /* @ts-ignore */
51610
51952
  ...(ngDevMode ? [{ debugName: "thumbValues" }] : /* istanbul ignore next */ []));
@@ -52489,6 +52831,8 @@ const defaultNormalizeValue = (raw) => {
52489
52831
  const trimmed = raw.trim();
52490
52832
  return trimmed.length ? trimmed : null;
52491
52833
  };
52834
+ // a form model can hold `null` for a `string[]` field (a JSON `null` from an API)
52835
+ const tagsOf = (value) => value ?? [];
52492
52836
  class TagInputDirective extends TextShellControlDirective {
52493
52837
  constructor() {
52494
52838
  super(...arguments);
@@ -52523,7 +52867,7 @@ class TagInputDirective extends TextShellControlDirective {
52523
52867
  this.maxSelection = input(undefined, /* @ts-ignore */
52524
52868
  ...(ngDevMode ? [{ debugName: "maxSelection" }] : /* istanbul ignore next */ []));
52525
52869
  /** The raw value normalized to the tags the control currently shows. Mixed has no effective tags. */
52526
- this.effectiveValues = computed(() => (this.mixed() ? [] : this.value()), /* @ts-ignore */
52870
+ this.effectiveValues = computed(() => (this.mixed() ? [] : tagsOf(this.value())), /* @ts-ignore */
52527
52871
  ...(ngDevMode ? [{ debugName: "effectiveValues" }] : /* istanbul ignore next */ []));
52528
52872
  this.hasValue = computed(() => this.mixed() || this.effectiveValues().length > 0, /* @ts-ignore */
52529
52873
  ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
@@ -52596,7 +52940,7 @@ class TagInputDirective extends TextShellControlDirective {
52596
52940
  if (!this.interactive() || this.mixed()) {
52597
52941
  return;
52598
52942
  }
52599
- const current = this.value();
52943
+ const current = tagsOf(this.value());
52600
52944
  // a no-op removal must not write: `filter` always allocates, so the model would notify with
52601
52945
  // an equal-but-new array and dirty the bound form field on a keystroke that changed nothing
52602
52946
  if (index < 0 || index >= current.length) {
@@ -54129,6 +54473,8 @@ class GridDirective {
54129
54473
  .join(', ')}. Configured breakpoints are ${known.map((name) => `"${name}"`).join(', ')}.`, state);
54130
54474
  }
54131
54475
  }
54476
+ for (const id of this.leavingIds())
54477
+ this.cancelLeave(id);
54132
54478
  const items = state.items.map((item) => ({
54133
54479
  id: item.id,
54134
54480
  type: item.type,
@@ -56774,8 +57120,21 @@ const runNotificationPromise = ({ content, open, injector, ...options }) => {
56774
57120
  const resolved = typeof source === 'function' ? source(result) : source;
56775
57121
  ref.replaceConfig({ ...toNotificationContent(resolved), status });
56776
57122
  };
57123
+ const cancel = () => {
57124
+ if (isReplacedByLaterOpen())
57125
+ return;
57126
+ ref.dismiss();
57127
+ };
56777
57128
  if (isQuery$1(work)) {
56778
- followQuery({ query: work, ref, settle, updateProgress, followProgress: loading.progress !== undefined, injector });
57129
+ followQuery({
57130
+ query: work,
57131
+ ref,
57132
+ settle,
57133
+ cancel,
57134
+ updateProgress,
57135
+ followProgress: loading.progress !== undefined,
57136
+ injector,
57137
+ });
56779
57138
  }
56780
57139
  else if (isObservable(work)) {
56781
57140
  let lastValue;
@@ -56807,18 +57166,39 @@ const runNotificationPromise = ({ content, open, injector, ...options }) => {
56807
57166
  * `QueryErrorResponse`, everything else an `unknown`), not to pick different code paths.
56808
57167
  */
56809
57168
  const createNotificationPromiseFn = (deps) => ((work, content) => runNotificationPromise({ ...deps, work, content }));
56810
- const followQuery = ({ query, ref, settle, updateProgress, followProgress, injector, }) => {
57169
+ const followQuery = ({ query, ref, settle, cancel, updateProgress, followProgress, injector, }) => {
56811
57170
  let effectRef = null;
56812
57171
  let hasSettled = false;
56813
57172
  const stopFollowing = () => {
56814
57173
  effectRef?.destroy();
56815
57174
  effectRef = null;
56816
57175
  };
57176
+ let hasSeenLoading = false;
57177
+ let eventBeforeLoading = null;
57178
+ const markLoading = () => {
57179
+ hasSeenLoading = true;
57180
+ eventBeforeLoading = untracked(() => query.latestHttpEvent());
57181
+ };
57182
+ // Read before the effect's first run, which an abort can beat.
57183
+ if (untracked(() => query.executionState())?.type === 'loading')
57184
+ markLoading();
56817
57185
  effectRef = effect(() => {
56818
57186
  const state = query.executionState();
56819
- if (!state || hasSettled)
57187
+ if (hasSettled)
56820
57188
  return;
57189
+ if (!state) {
57190
+ if (!hasSeenLoading)
57191
+ return;
57192
+ hasSettled = true;
57193
+ untracked(() => {
57194
+ cancel();
57195
+ stopFollowing();
57196
+ });
57197
+ return;
57198
+ }
56821
57199
  if (state.type === 'loading') {
57200
+ if (!hasSeenLoading)
57201
+ markLoading();
56822
57202
  const percentage = state.loading.progress?.percentage;
56823
57203
  if (followProgress && percentage !== undefined) {
56824
57204
  untracked(() => updateProgress(percentage));
@@ -56827,7 +57207,14 @@ const followQuery = ({ query, ref, settle, updateProgress, followProgress, injec
56827
57207
  }
56828
57208
  hasSettled = true;
56829
57209
  untracked(() => {
56830
- if (state.type === 'success') {
57210
+ const latestEvent = query.latestHttpEvent();
57211
+ // An aborted re-execution falls back to the previous round's response, which reads as a success.
57212
+ if (state.type === 'success' &&
57213
+ hasSeenLoading &&
57214
+ (latestEvent === eventBeforeLoading || latestEvent?.type !== HttpEventType.Response)) {
57215
+ cancel();
57216
+ }
57217
+ else if (state.type === 'success') {
56831
57218
  settle('success', state.response);
56832
57219
  }
56833
57220
  else {
@@ -59410,6 +59797,75 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
59410
59797
  args: [{ selector: 'et-scheduler-appointment-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{.et-scheduler-appointment{display:flex;align-items:center;gap:6px;padding:2px 6px;border:none;border-radius:4px;background:color-mix(in srgb,var(--et-theme-color-primary-solid) 14%,transparent);color:var(--et-theme-color-ink-solid);font:inherit;font-size:12px;text-align:start;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}@media(hover:hover){.et-scheduler-appointment:hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid) 22%,transparent)}}.et-scheduler-appointment:focus-visible{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:1px}.et-scheduler-appointment:where([data-selected]){background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}.et-scheduler-appointment:where([data-draggable]){cursor:grab;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.et-scheduler-appointment:where([data-dragging]){box-shadow:var(--et-scheduler-appointment-drag-shadow, 0 2px 8px rgb(var(--et-shadow-color-rgb, 0 0 0) / .25));cursor:grabbing}.et-scheduler-appointment-title{overflow:hidden;font-weight:600;min-inline-size:0;flex:1;text-overflow:ellipsis;white-space:nowrap}.et-scheduler-appointment-dot{flex-shrink:0;inline-size:6px;block-size:6px;border-radius:999px;background:var(--et-theme-color-primary-solid)}:where(.et-scheduler-appointment,.et-scheduler-time-grid-block):where([data-selected]) .et-scheduler-appointment-dot{background:var(--et-theme-color-on-primary)}.et-scheduler-appointment-time-range{flex-shrink:0;font-variant-numeric:tabular-nums;white-space:nowrap}.et-scheduler-appointment-location{display:flex;flex-shrink:0;align-items:center;gap:3px;max-inline-size:40%}.et-scheduler-appointment-location-icon{flex-shrink:0;inline-size:10px;block-size:10px}.et-scheduler-appointment-location-text{overflow:hidden;min-inline-size:0;text-overflow:ellipsis;white-space:nowrap}.et-scheduler-appointment-chain-count{display:flex;flex-shrink:0;align-items:center;gap:2px;font-variant-numeric:tabular-nums}.et-scheduler-appointment-chain-count-icon{inline-size:8px;block-size:8px;transform:rotate(90deg)}}\n"] }]
59411
59798
  }] });
59412
59799
 
59800
+ /**
59801
+ * The time-range piece of an appointment badge, stamped by `etSchedulerBadgeTimeRange`. Renders
59802
+ * nothing for an all-day appointment, which has no meaningful start/end time to show.
59803
+ *
59804
+ * @internal
59805
+ */
59806
+ class SchedulerBadgeTimeRangeComponent {
59807
+ constructor() {
59808
+ this.scheduler = inject(SchedulerDirective, { optional: true });
59809
+ this.node = input.required(/* @ts-ignore */
59810
+ ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
59811
+ this.range = computed(() => {
59812
+ const appointment = this.node().appointment;
59813
+ if (appointment.allDay) {
59814
+ return null;
59815
+ }
59816
+ const locale = this.scheduler?.effectiveLocale();
59817
+ const options = locale ? { locale } : undefined;
59818
+ return `${format(appointment.start, 'p', options)}–${format(appointment.end, 'p', options)}`;
59819
+ }, /* @ts-ignore */
59820
+ ...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
59821
+ }
59822
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59823
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerBadgeTimeRangeComponent, isStandalone: true, selector: "et-scheduler-badge-time-range", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
59824
+ @if (range(); as range) {
59825
+ <span class="et-scheduler-appointment-time-range">{{ range }}</span>
59826
+ }
59827
+ `, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
59828
+ }
59829
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, decorators: [{
59830
+ type: Component,
59831
+ args: [{
59832
+ selector: 'et-scheduler-badge-time-range',
59833
+ template: `
59834
+ @if (range(); as range) {
59835
+ <span class="et-scheduler-appointment-time-range">{{ range }}</span>
59836
+ }
59837
+ `,
59838
+ encapsulation: ViewEncapsulation.None,
59839
+ }]
59840
+ }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
59841
+
59842
+ /**
59843
+ * The title piece of an appointment badge, stamped by `etSchedulerBadgeTitle`.
59844
+ *
59845
+ * @internal
59846
+ */
59847
+ class SchedulerBadgeTitleComponent {
59848
+ constructor() {
59849
+ this.node = input.required(/* @ts-ignore */
59850
+ ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
59851
+ }
59852
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59853
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: SchedulerBadgeTitleComponent, isStandalone: true, selector: "et-scheduler-badge-title", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
59854
+ }
59855
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, decorators: [{
59856
+ type: Component,
59857
+ args: [{
59858
+ selector: 'et-scheduler-badge-title',
59859
+ template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`,
59860
+ encapsulation: ViewEncapsulation.None,
59861
+ }]
59862
+ }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
59863
+
59864
+ const SCHEDULER_FALLBACK_BADGE_ADORNMENTS = [
59865
+ { component: SchedulerBadgeTitleComponent, order: 0 },
59866
+ { component: SchedulerBadgeTimeRangeComponent, order: 10 },
59867
+ ];
59868
+
59413
59869
  /** The default agenda list: one section per visible day, appointments as full-width badges indented by chain depth. */
59414
59870
  class SchedulerAgendaViewComponent {
59415
59871
  constructor() {
@@ -59432,7 +59888,7 @@ class SchedulerAgendaViewComponent {
59432
59888
  injectStyleManager().mount(SchedulerAppointmentStylesComponent);
59433
59889
  }
59434
59890
  badgeAdornments() {
59435
- return this.featureHost?.badgeAdornments() ?? [];
59891
+ return this.featureHost?.badgeAdornments() ?? SCHEDULER_FALLBACK_BADGE_ADORNMENTS;
59436
59892
  }
59437
59893
  weekdayLabel(date) {
59438
59894
  const locale = this.scheduler?.effectiveLocale();
@@ -59713,48 +60169,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
59713
60169
  }]
59714
60170
  }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerBadgeLocation", required: false }] }] } });
59715
60171
 
59716
- /**
59717
- * The time-range piece of an appointment badge, stamped by `etSchedulerBadgeTimeRange`. Renders
59718
- * nothing for an all-day appointment, which has no meaningful start/end time to show.
59719
- *
59720
- * @internal
59721
- */
59722
- class SchedulerBadgeTimeRangeComponent {
59723
- constructor() {
59724
- this.scheduler = inject(SchedulerDirective, { optional: true });
59725
- this.node = input.required(/* @ts-ignore */
59726
- ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
59727
- this.range = computed(() => {
59728
- const appointment = this.node().appointment;
59729
- if (appointment.allDay) {
59730
- return null;
59731
- }
59732
- const locale = this.scheduler?.effectiveLocale();
59733
- const options = locale ? { locale } : undefined;
59734
- return `${format(appointment.start, 'p', options)}–${format(appointment.end, 'p', options)}`;
59735
- }, /* @ts-ignore */
59736
- ...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
59737
- }
59738
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59739
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerBadgeTimeRangeComponent, isStandalone: true, selector: "et-scheduler-badge-time-range", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
59740
- @if (range(); as range) {
59741
- <span class="et-scheduler-appointment-time-range">{{ range }}</span>
59742
- }
59743
- `, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
59744
- }
59745
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, decorators: [{
59746
- type: Component,
59747
- args: [{
59748
- selector: 'et-scheduler-badge-time-range',
59749
- template: `
59750
- @if (range(); as range) {
59751
- <span class="et-scheduler-appointment-time-range">{{ range }}</span>
59752
- }
59753
- `,
59754
- encapsulation: ViewEncapsulation.None,
59755
- }]
59756
- }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
59757
-
59758
60172
  /**
59759
60173
  * Built-in badge adornment: the appointment's `start`–`end` time, hidden for an all-day
59760
60174
  * appointment. One of the default pieces `<et-scheduler>` bundles - see `registerBadgeAdornment`.
@@ -59785,28 +60199,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
59785
60199
  }]
59786
60200
  }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerBadgeTimeRange", required: false }] }] } });
59787
60201
 
59788
- /**
59789
- * The title piece of an appointment badge, stamped by `etSchedulerBadgeTitle`.
59790
- *
59791
- * @internal
59792
- */
59793
- class SchedulerBadgeTitleComponent {
59794
- constructor() {
59795
- this.node = input.required(/* @ts-ignore */
59796
- ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
59797
- }
59798
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59799
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: SchedulerBadgeTitleComponent, isStandalone: true, selector: "et-scheduler-badge-title", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
59800
- }
59801
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, decorators: [{
59802
- type: Component,
59803
- args: [{
59804
- selector: 'et-scheduler-badge-title',
59805
- template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`,
59806
- encapsulation: ViewEncapsulation.None,
59807
- }]
59808
- }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
59809
-
59810
60202
  /**
59811
60203
  * Built-in badge adornment: the appointment's title. One of the default pieces `<et-scheduler>`
59812
60204
  * bundles - see `registerBadgeAdornment`.
@@ -60802,7 +61194,7 @@ class SchedulerMonthViewComponent {
60802
61194
  injectStyleManager().mount(SchedulerAppointmentStylesComponent);
60803
61195
  }
60804
61196
  badgeAdornments() {
60805
- return this.featureHost?.badgeAdornments() ?? [];
61197
+ return this.featureHost?.badgeAdornments() ?? SCHEDULER_FALLBACK_BADGE_ADORNMENTS;
60806
61198
  }
60807
61199
  weekdays() {
60808
61200
  return this.scheduler?.weekdays() ?? [];
@@ -61154,7 +61546,7 @@ class SchedulerTimeGridViewComponent {
61154
61546
  });
61155
61547
  }
61156
61548
  badgeAdornments() {
61157
- return this.featureHost?.badgeAdornments() ?? [];
61549
+ return this.featureHost?.badgeAdornments() ?? SCHEDULER_FALLBACK_BADGE_ADORNMENTS;
61158
61550
  }
61159
61551
  weekdayLabel(date) {
61160
61552
  const locale = this.scheduler?.effectiveLocale();
@@ -61483,10 +61875,15 @@ class SchedulerComponent {
61483
61875
  */
61484
61876
  this.headless = inject(SchedulerDirective);
61485
61877
  this.elementRef = inject(ElementRef);
61878
+ /** Every appointment the scheduler knows about - not pre-filtered to the visible range. */
61879
+ this.appointments = input([], /* @ts-ignore */
61880
+ ...(ngDevMode ? [{ debugName: "appointments" }] : /* istanbul ignore next */ []));
61486
61881
  /** Emits the edited or newly-added appointment once the edit surface saves. */
61487
61882
  this.appointmentSave = output();
61488
61883
  /** Emits every id to remove once the edit surface deletes a chain. */
61489
61884
  this.appointmentsDelete = output();
61885
+ /** Emits when a move or resize lands an appointment somewhere else - see `SchedulerDirective.appointmentReschedule`. */
61886
+ this.appointmentReschedule = outputFromObservable(outputToObservable(this.headless.appointmentReschedule));
61490
61887
  this.dimensions = signalHostElementDimensions();
61491
61888
  this.isNarrow = computed(() => (this.dimensions().client?.width ?? Infinity) < NARROW_CONTAINER_WIDTH, /* @ts-ignore */
61492
61889
  ...(ngDevMode ? [{ debugName: "isNarrow" }] : /* istanbul ignore next */ []));
@@ -61579,7 +61976,7 @@ class SchedulerComponent {
61579
61976
  get selectedAppointment() {
61580
61977
  return this.headless.selectedAppointment;
61581
61978
  }
61582
- appointments() {
61979
+ visibleAppointments() {
61583
61980
  return this.headless.visibleAppointments();
61584
61981
  }
61585
61982
  registerBadgeAdornment(adornment) {
@@ -61684,10 +62081,10 @@ class SchedulerComponent {
61684
62081
  }
61685
62082
  }
61686
62083
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
61687
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerComponent, isStandalone: true, selector: "et-scheduler", outputs: { appointmentSave: "appointmentSave", appointmentsDelete: "appointmentsDelete" }, host: { classAttribute: "et-scheduler" }, providers: [
62084
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerComponent, isStandalone: true, selector: "et-scheduler", inputs: { appointments: { classPropertyName: "appointments", publicName: "appointments", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { appointmentSave: "appointmentSave", appointmentsDelete: "appointmentsDelete", appointmentReschedule: "appointmentReschedule" }, host: { classAttribute: "et-scheduler" }, providers: [
61688
62085
  provideIcons(CALENDAR_ICON, CHEVRON_ICON, PLUS_ICON),
61689
62086
  { provide: SCHEDULER_FEATURE_HOST, useExisting: SchedulerComponent },
61690
- ], hostDirectives: [{ directive: SchedulerDirective, inputs: ["appointments", "appointments", "view", "view", "focusedDate", "focusedDate", "selectedAppointmentId", "selectedAppointmentId", "locale", "locale", "firstDayOfWeek", "firstDayOfWeek", "agendaDays", "agendaDays", "businessHours", "businessHours", "nowIndicator", "nowIndicator"], outputs: ["viewChange", "viewChange", "focusedDateChange", "focusedDateChange", "selectedAppointmentIdChange", "selectedAppointmentIdChange", "appointmentReschedule", "appointmentReschedule"] }, { directive: SchedulerBadgeColorDotDirective, inputs: ["etSchedulerBadgeColorDot", "etSchedulerBadgeColorDot"] }, { directive: SchedulerBadgeTitleDirective, inputs: ["etSchedulerBadgeTitle", "etSchedulerBadgeTitle"] }, { directive: SchedulerBadgeTimeRangeDirective, inputs: ["etSchedulerBadgeTimeRange", "etSchedulerBadgeTimeRange"] }, { directive: SchedulerBadgeLocationDirective, inputs: ["etSchedulerBadgeLocation", "etSchedulerBadgeLocation"] }, { directive: SchedulerBadgeChainCountDirective, inputs: ["etSchedulerBadgeChainCount", "etSchedulerBadgeChainCount"] }, { directive: SchedulerActionAddAppointmentDirective, inputs: ["etSchedulerActionAddAppointment", "etSchedulerActionAddAppointment"] }, { directive: SchedulerSwipeNavigationDirective, inputs: ["etSchedulerSwipeNavigation", "etSchedulerSwipeNavigation"] }, { directive: SchedulerAppointmentDragDirective, inputs: ["etSchedulerAppointmentDrag", "etSchedulerAppointmentDrag"] }], ngImport: i0, template: "<div class=\"et-scheduler-header\">\n <button\n [attr.aria-label]=\"todayLabel()\"\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n <i etIcon=\"et-calendar\" aria-hidden=\"true\"></i>\n <span class=\"et-scheduler-today-button-label\">{{ todayLabel() }}</span>\n </button>\n\n @if (isNarrow()) {\n <div class=\"et-scheduler-toolbar-fabs\" etFloatingAction>\n <div etFloatingActionAnchor>\n <div class=\"et-scheduler-toolbar-fab-stack\" etFloatingActionTrigger>\n @for (action of toolbarActions(); track $index) {\n @if (action.icon; as icon) {\n <button\n [attr.aria-label]=\"action.label()\"\n (click)=\"action.run()\"\n class=\"et-scheduler-toolbar-action\"\n et-fab\n type=\"button\"\n >\n <i [etIcon]=\"icon\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-fab expanded type=\"button\">\n {{ action.label() }}\n </button>\n }\n }\n </div>\n </div>\n </div>\n } @else {\n @for (action of toolbarActions(); track $index) {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-button size=\"sm\" type=\"button\">\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n }\n\n <div class=\"et-scheduler-nav-buttons\">\n <button\n [attr.aria-label]=\"previousLabel()\"\n (click)=\"headless.previous()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--previous\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n\n <button\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"headless.next()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--next\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n </div>\n\n <span class=\"et-scheduler-header-label\">{{ headerLabel() }}</span>\n\n <div class=\"et-scheduler-header-spacer\"></div>\n\n <et-segmented-button-group\n [value]=\"headless.view()\"\n (valueChange)=\"setView($event)\"\n class=\"et-scheduler-view-switch\"\n size=\"sm\"\n variant=\"tabs\"\n >\n <et-label class=\"et-visually-hidden et-scheduler-view-switch-label\">{{ switchViewLabel() }}</et-label>\n\n <et-segmented-button value=\"month\">{{ monthViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"week\">{{ weekViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"day\">{{ dayViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"agenda\">{{ agendaViewLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n</div>\n\n<div class=\"et-scheduler-body\">\n @switch (headless.view()) {\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @case ('month') {\n <et-scheduler-month-view [attr.aria-label]=\"headerLabel()\" />\n }\n @default {\n <et-scheduler-time-grid-view [attr.aria-label]=\"headerLabel()\" />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{container-type:inline-size;container-name:et-scheduler;display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.et-scheduler-view-switch{flex-basis:100%}.et-scheduler-toolbar-fab-stack{display:flex;gap:8px}@container et-scheduler not (min-inline-size: 480px){.et-scheduler .et-scheduler-today-button{--et-button-padding: 0;inline-size:3.1rem;block-size:3.1rem;border-radius:9999px}.et-scheduler .et-scheduler-today-button-label{display:none}}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}.et-scheduler .et-scheduler-today-button .et-button-icon{display:none}}.et-scheduler-nav-buttons{display:flex;gap:2px}.et-scheduler-nav-button--previous .et-icon{rotate:-90deg}.et-scheduler-nav-button--next .et-icon{rotate:90deg}.et-scheduler-header-label{flex:1 1 auto;min-inline-size:0;overflow:hidden;font-size:15px;font-weight:600;color:var(--et-surface-color-solid);white-space:nowrap;text-overflow:ellipsis}.et-scheduler-header-spacer{display:none;flex:1}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "[et-button]", inputs: ["variant", "size", "iconAlignment"] }, { kind: "component", type: FabComponent, selector: "[et-fab]", inputs: ["variant", "size", "expanded", "iconAlignment"] }, { kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: FloatingActionDirective, selector: "[etFloatingAction]", inputs: ["disabled"], exportAs: ["etFloatingAction"] }, { kind: "directive", type: FloatingActionAnchorDirective, selector: "[etFloatingActionAnchor]", exportAs: ["etFloatingActionAnchor"] }, { kind: "directive", type: FloatingActionTriggerDirective, selector: "[etFloatingActionTrigger]", exportAs: ["etFloatingActionTrigger"] }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "component", type: SchedulerAgendaViewComponent, selector: "et-scheduler-agenda-view" }, { kind: "component", type: SchedulerMonthViewComponent, selector: "et-scheduler-month-view" }, { kind: "component", type: SchedulerTimeGridViewComponent, selector: "et-scheduler-time-grid-view" }], encapsulation: i0.ViewEncapsulation.None }); }
62087
+ ], hostDirectives: [{ directive: SchedulerDirective, inputs: ["appointments", "appointments", "view", "view", "focusedDate", "focusedDate", "selectedAppointmentId", "selectedAppointmentId", "locale", "locale", "firstDayOfWeek", "firstDayOfWeek", "agendaDays", "agendaDays", "businessHours", "businessHours", "nowIndicator", "nowIndicator"], outputs: ["viewChange", "viewChange", "focusedDateChange", "focusedDateChange", "selectedAppointmentIdChange", "selectedAppointmentIdChange"] }, { directive: SchedulerBadgeColorDotDirective, inputs: ["etSchedulerBadgeColorDot", "etSchedulerBadgeColorDot"] }, { directive: SchedulerBadgeTitleDirective, inputs: ["etSchedulerBadgeTitle", "etSchedulerBadgeTitle"] }, { directive: SchedulerBadgeTimeRangeDirective, inputs: ["etSchedulerBadgeTimeRange", "etSchedulerBadgeTimeRange"] }, { directive: SchedulerBadgeLocationDirective, inputs: ["etSchedulerBadgeLocation", "etSchedulerBadgeLocation"] }, { directive: SchedulerBadgeChainCountDirective, inputs: ["etSchedulerBadgeChainCount", "etSchedulerBadgeChainCount"] }, { directive: SchedulerActionAddAppointmentDirective, inputs: ["etSchedulerActionAddAppointment", "etSchedulerActionAddAppointment"] }, { directive: SchedulerSwipeNavigationDirective, inputs: ["etSchedulerSwipeNavigation", "etSchedulerSwipeNavigation"] }, { directive: SchedulerAppointmentDragDirective, inputs: ["etSchedulerAppointmentDrag", "etSchedulerAppointmentDrag"] }], ngImport: i0, template: "<div class=\"et-scheduler-header\">\n <button\n [attr.aria-label]=\"todayLabel()\"\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n <i etIcon=\"et-calendar\" aria-hidden=\"true\"></i>\n <span class=\"et-scheduler-today-button-label\">{{ todayLabel() }}</span>\n </button>\n\n @if (isNarrow()) {\n <div class=\"et-scheduler-toolbar-fabs\" etFloatingAction>\n <div etFloatingActionAnchor>\n <div class=\"et-scheduler-toolbar-fab-stack\" etFloatingActionTrigger>\n @for (action of toolbarActions(); track $index) {\n @if (action.icon; as icon) {\n <button\n [attr.aria-label]=\"action.label()\"\n (click)=\"action.run()\"\n class=\"et-scheduler-toolbar-action\"\n et-fab\n type=\"button\"\n >\n <i [etIcon]=\"icon\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-fab expanded type=\"button\">\n {{ action.label() }}\n </button>\n }\n }\n </div>\n </div>\n </div>\n } @else {\n @for (action of toolbarActions(); track $index) {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-button size=\"sm\" type=\"button\">\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n }\n\n <div class=\"et-scheduler-nav-buttons\">\n <button\n [attr.aria-label]=\"previousLabel()\"\n (click)=\"headless.previous()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--previous\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n\n <button\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"headless.next()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--next\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n </div>\n\n <span class=\"et-scheduler-header-label\">{{ headerLabel() }}</span>\n\n <div class=\"et-scheduler-header-spacer\"></div>\n\n <et-segmented-button-group\n [value]=\"headless.view()\"\n (valueChange)=\"setView($event)\"\n class=\"et-scheduler-view-switch\"\n size=\"sm\"\n variant=\"tabs\"\n >\n <et-label class=\"et-visually-hidden et-scheduler-view-switch-label\">{{ switchViewLabel() }}</et-label>\n\n <et-segmented-button value=\"month\">{{ monthViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"week\">{{ weekViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"day\">{{ dayViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"agenda\">{{ agendaViewLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n</div>\n\n<div class=\"et-scheduler-body\">\n @switch (headless.view()) {\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @case ('month') {\n <et-scheduler-month-view [attr.aria-label]=\"headerLabel()\" />\n }\n @default {\n <et-scheduler-time-grid-view [attr.aria-label]=\"headerLabel()\" />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{container-type:inline-size;container-name:et-scheduler;display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.et-scheduler-view-switch{flex-basis:100%}.et-scheduler-toolbar-fab-stack{display:flex;gap:8px}@container et-scheduler not (min-inline-size: 480px){.et-scheduler .et-scheduler-today-button{--et-button-padding: 0;inline-size:3.1rem;block-size:3.1rem;border-radius:9999px}.et-scheduler .et-scheduler-today-button-label{display:none}}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}.et-scheduler .et-scheduler-today-button .et-button-icon{display:none}}.et-scheduler-nav-buttons{display:flex;gap:2px}.et-scheduler-nav-button--previous .et-icon{rotate:-90deg}.et-scheduler-nav-button--next .et-icon{rotate:90deg}.et-scheduler-header-label{flex:1 1 auto;min-inline-size:0;overflow:hidden;font-size:15px;font-weight:600;color:var(--et-surface-color-solid);white-space:nowrap;text-overflow:ellipsis}.et-scheduler-header-spacer{display:none;flex:1}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "[et-button]", inputs: ["variant", "size", "iconAlignment"] }, { kind: "component", type: FabComponent, selector: "[et-fab]", inputs: ["variant", "size", "expanded", "iconAlignment"] }, { kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: FloatingActionDirective, selector: "[etFloatingAction]", inputs: ["disabled"], exportAs: ["etFloatingAction"] }, { kind: "directive", type: FloatingActionAnchorDirective, selector: "[etFloatingActionAnchor]", exportAs: ["etFloatingActionAnchor"] }, { kind: "directive", type: FloatingActionTriggerDirective, selector: "[etFloatingActionTrigger]", exportAs: ["etFloatingActionTrigger"] }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "component", type: SchedulerAgendaViewComponent, selector: "et-scheduler-agenda-view" }, { kind: "component", type: SchedulerMonthViewComponent, selector: "et-scheduler-month-view" }, { kind: "component", type: SchedulerTimeGridViewComponent, selector: "et-scheduler-time-grid-view" }], encapsulation: i0.ViewEncapsulation.None }); }
61691
62088
  }
61692
62089
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerComponent, decorators: [{
61693
62090
  type: Component,
@@ -61717,7 +62114,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
61717
62114
  'businessHours',
61718
62115
  'nowIndicator',
61719
62116
  ],
61720
- outputs: ['viewChange', 'focusedDateChange', 'selectedAppointmentIdChange', 'appointmentReschedule'],
62117
+ outputs: ['viewChange', 'focusedDateChange', 'selectedAppointmentIdChange'],
61721
62118
  },
61722
62119
  { directive: SchedulerBadgeColorDotDirective, inputs: ['etSchedulerBadgeColorDot'] },
61723
62120
  { directive: SchedulerBadgeTitleDirective, inputs: ['etSchedulerBadgeTitle'] },
@@ -61730,7 +62127,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
61730
62127
  ], host: {
61731
62128
  class: 'et-scheduler',
61732
62129
  }, template: "<div class=\"et-scheduler-header\">\n <button\n [attr.aria-label]=\"todayLabel()\"\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n <i etIcon=\"et-calendar\" aria-hidden=\"true\"></i>\n <span class=\"et-scheduler-today-button-label\">{{ todayLabel() }}</span>\n </button>\n\n @if (isNarrow()) {\n <div class=\"et-scheduler-toolbar-fabs\" etFloatingAction>\n <div etFloatingActionAnchor>\n <div class=\"et-scheduler-toolbar-fab-stack\" etFloatingActionTrigger>\n @for (action of toolbarActions(); track $index) {\n @if (action.icon; as icon) {\n <button\n [attr.aria-label]=\"action.label()\"\n (click)=\"action.run()\"\n class=\"et-scheduler-toolbar-action\"\n et-fab\n type=\"button\"\n >\n <i [etIcon]=\"icon\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-fab expanded type=\"button\">\n {{ action.label() }}\n </button>\n }\n }\n </div>\n </div>\n </div>\n } @else {\n @for (action of toolbarActions(); track $index) {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-button size=\"sm\" type=\"button\">\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n }\n\n <div class=\"et-scheduler-nav-buttons\">\n <button\n [attr.aria-label]=\"previousLabel()\"\n (click)=\"headless.previous()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--previous\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n\n <button\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"headless.next()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--next\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n </div>\n\n <span class=\"et-scheduler-header-label\">{{ headerLabel() }}</span>\n\n <div class=\"et-scheduler-header-spacer\"></div>\n\n <et-segmented-button-group\n [value]=\"headless.view()\"\n (valueChange)=\"setView($event)\"\n class=\"et-scheduler-view-switch\"\n size=\"sm\"\n variant=\"tabs\"\n >\n <et-label class=\"et-visually-hidden et-scheduler-view-switch-label\">{{ switchViewLabel() }}</et-label>\n\n <et-segmented-button value=\"month\">{{ monthViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"week\">{{ weekViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"day\">{{ dayViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"agenda\">{{ agendaViewLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n</div>\n\n<div class=\"et-scheduler-body\">\n @switch (headless.view()) {\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @case ('month') {\n <et-scheduler-month-view [attr.aria-label]=\"headerLabel()\" />\n }\n @default {\n <et-scheduler-time-grid-view [attr.aria-label]=\"headerLabel()\" />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{container-type:inline-size;container-name:et-scheduler;display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.et-scheduler-view-switch{flex-basis:100%}.et-scheduler-toolbar-fab-stack{display:flex;gap:8px}@container et-scheduler not (min-inline-size: 480px){.et-scheduler .et-scheduler-today-button{--et-button-padding: 0;inline-size:3.1rem;block-size:3.1rem;border-radius:9999px}.et-scheduler .et-scheduler-today-button-label{display:none}}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}.et-scheduler .et-scheduler-today-button .et-button-icon{display:none}}.et-scheduler-nav-buttons{display:flex;gap:2px}.et-scheduler-nav-button--previous .et-icon{rotate:-90deg}.et-scheduler-nav-button--next .et-icon{rotate:90deg}.et-scheduler-header-label{flex:1 1 auto;min-inline-size:0;overflow:hidden;font-size:15px;font-weight:600;color:var(--et-surface-color-solid);white-space:nowrap;text-overflow:ellipsis}.et-scheduler-header-spacer{display:none;flex:1}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"] }]
61733
- }], ctorParameters: () => [], propDecorators: { appointmentSave: [{ type: i0.Output, args: ["appointmentSave"] }], appointmentsDelete: [{ type: i0.Output, args: ["appointmentsDelete"] }] } });
62130
+ }], ctorParameters: () => [], propDecorators: { appointments: [{ type: i0.Input, args: [{ isSignal: true, alias: "appointments", required: false }] }], appointmentSave: [{ type: i0.Output, args: ["appointmentSave"] }], appointmentsDelete: [{ type: i0.Output, args: ["appointmentsDelete"] }], appointmentReschedule: [{ type: i0.Output, args: ["appointmentReschedule"] }] } });
61734
62131
 
61735
62132
  const SCHEDULER_IMPORTS = [
61736
62133
  SchedulerDirective,
@@ -67396,6 +67793,8 @@ const TABLE_ERROR_CODES = {
67396
67793
  MISSING_COLUMN_FEATURE: 3512,
67397
67794
  /** A CSV export read an object, list or function from a column that has no `exportValue`. */
67398
67795
  UNSERIALIZABLE_EXPORT_VALUE: 3513,
67796
+ /** Client sorting read an object, list or function from a sortable column that has no `sortValue`. */
67797
+ UNSORTABLE_COLUMN_VALUE: 3514,
67399
67798
  };
67400
67799
 
67401
67800
  // What tells Excel the file is UTF-8; see `bom`.
@@ -67995,6 +68394,17 @@ const isMissing = (value) => value === null ||
67995
68394
  value === undefined ||
67996
68395
  (typeof value === 'number' && Number.isNaN(value)) ||
67997
68396
  (value instanceof Date && Number.isNaN(value.getTime()));
68397
+ const isSortValue = (value) => value === null ||
68398
+ value === undefined ||
68399
+ value instanceof Date ||
68400
+ typeof value === 'string' ||
68401
+ typeof value === 'number' ||
68402
+ typeof value === 'boolean';
68403
+ const assertSortValue = (value, key) => {
68404
+ if (isSortValue(value))
68405
+ return;
68406
+ throw new RuntimeError(TABLE_ERROR_CODES.UNSORTABLE_COLUMN_VALUE, `[et-table] Sorting read a ${Array.isArray(value) ? 'list' : typeof value} from the "${key}" column's value, which cannot be compared. Add \`sortValue\` to the column.`);
68407
+ };
67998
68408
  const compare = (a, b) => {
67999
68409
  if (isMissing(a) && isMissing(b))
68000
68410
  return 0;
@@ -68015,7 +68425,8 @@ const compare = (a, b) => {
68015
68425
  * `value` accessor). Stable, multi-key, pure and tree-shakable - the base table
68016
68426
  * doesn't apply it unless in client sort mode; import it directly for custom flows.
68017
68427
  * Server-side callers ignore this and let the backend sort instead. Nullish values,
68018
- * `NaN` and invalid dates always sink to the bottom, regardless of direction.
68428
+ * `NaN` and invalid dates always sink to the bottom, regardless of direction. In dev mode, a column
68429
+ * without `sortValue` whose `value` returns an object, list or function throws `ET3514`.
68019
68430
  */
68020
68431
  const sortRows = ({ rows, sort, columns }) => {
68021
68432
  if (!sort.length)
@@ -68028,6 +68439,10 @@ const sortRows = ({ rows, sort, columns }) => {
68028
68439
  const accessor = column.sortValue ?? column.value;
68029
68440
  const valueA = accessor(rowA);
68030
68441
  const valueB = accessor(rowB);
68442
+ if (isDevMode$1() && !column.sortValue) {
68443
+ assertSortValue(valueA, key);
68444
+ assertSortValue(valueB, key);
68445
+ }
68031
68446
  if (isMissing(valueA) || isMissing(valueB)) {
68032
68447
  const nullCmp = compare(valueA, valueB);
68033
68448
  if (nullCmp !== 0)
@@ -69154,6 +69569,44 @@ class TableComponent {
69154
69569
  return { start: window.paddingStart(), end: window.paddingEnd() };
69155
69570
  }, /* @ts-ignore */
69156
69571
  ...(ngDevMode ? [{ debugName: "spacers" }] : /* istanbul ignore next */ []));
69572
+ this.openDetailIndices = computed(() => {
69573
+ const detail = this.rowDetail();
69574
+ if (!detail || !this.rowWindow())
69575
+ return [];
69576
+ const indices = [];
69577
+ this.rows().forEach((row, index) => {
69578
+ if (detail.isOpen(row))
69579
+ indices.push(index);
69580
+ });
69581
+ return indices;
69582
+ }, /* @ts-ignore */
69583
+ ...(ngDevMode ? [{ debugName: "openDetailIndices" }] : /* istanbul ignore next */ []));
69584
+ this.measuredDetailHeights = signal(new Map(), /* @ts-ignore */
69585
+ ...(ngDevMode ? [{ debugName: "measuredDetailHeights" }] : /* istanbul ignore next */ []));
69586
+ this.openDetailHeights = computed(() => {
69587
+ const open = this.openDetailIndices();
69588
+ if (!open.length)
69589
+ return new Map();
69590
+ const measured = this.measuredDetailHeights();
69591
+ const rows = this.rows();
69592
+ const fallback = measured.size
69593
+ ? [...measured.values()].reduce((sum, height) => sum + height, 0) / measured.size
69594
+ : 0;
69595
+ return new Map(open.map((index) => [index, measured.get(this.rowIdentity(rows[index])) ?? fallback]));
69596
+ }, /* @ts-ignore */
69597
+ ...(ngDevMode ? [{ debugName: "openDetailHeights" }] : /* istanbul ignore next */ []));
69598
+ this.headerRowCount = computed(() => this.headerRows().length + 1, /* @ts-ignore */
69599
+ ...(ngDevMode ? [{ debugName: "headerRowCount" }] : /* istanbul ignore next */ []));
69600
+ /**
69601
+ * The full row count a windowed table announces through `aria-rowcount` - header rows, every body row,
69602
+ * every open detail row and the footer row - or `null` while every row is in the DOM anyway.
69603
+ */
69604
+ this.ariaRowCount = computed(() => {
69605
+ if (!this.spacers())
69606
+ return null;
69607
+ return this.headerRowCount() + this.rows().length + this.openDetailIndices().length + (this.hasFooter() ? 1 : 0);
69608
+ }, /* @ts-ignore */
69609
+ ...(ngDevMode ? [{ debugName: "ariaRowCount" }] : /* istanbul ignore next */ []));
69157
69610
  this.bodyRows = computed(() => {
69158
69611
  const pinning = this.columnPinning();
69159
69612
  const templates = this.columnTemplates().cell;
@@ -69172,6 +69625,7 @@ class TableComponent {
69172
69625
  const rendered = this.renderedRows();
69173
69626
  // A footer row separates itself with this rule, and an end spacer stands in for rows still below.
69174
69627
  const endsWithRows = !this.hasFooter() && !this.spacers()?.end;
69628
+ const announcesIndex = this.ariaRowCount() !== null;
69175
69629
  return rendered.map((row, index) => {
69176
69630
  const key = this.rowIdentity(row);
69177
69631
  const link = rowLink?.(row) ?? null;
@@ -69192,6 +69646,7 @@ class TableComponent {
69192
69646
  stripe: (indexOffset + index) % 2 === 1,
69193
69647
  last: endsWithRows && index === rendered.length - 1,
69194
69648
  detail: detail?.isOpen(row) ? detail : null,
69649
+ ariaRowIndex: announcesIndex ? this.ariaRowIndexOf(indexOffset + index) : null,
69195
69650
  leads,
69196
69651
  trails,
69197
69652
  cells: columns.map((column) => {
@@ -69220,6 +69675,8 @@ class TableComponent {
69220
69675
  });
69221
69676
  }, /* @ts-ignore */
69222
69677
  ...(ngDevMode ? [{ debugName: "bodyRows" }] : /* istanbul ignore next */ []));
69678
+ this.detailAriaRowIndices = computed(() => new Map(this.bodyRows().flatMap((vm) => (vm.detail && vm.ariaRowIndex ? [[vm.row, vm.ariaRowIndex + 1]] : []))), /* @ts-ignore */
69679
+ ...(ngDevMode ? [{ debugName: "detailAriaRowIndices" }] : /* istanbul ignore next */ []));
69223
69680
  /**
69224
69681
  * The keys of the currently hidden columns, in declared order. Nothing in the table's own chrome
69225
69682
  * shows a hidden column - the column menu's "Hide column" takes one away and has no way back - so
@@ -69339,6 +69796,21 @@ class TableComponent {
69339
69796
  afterNextRender({ read: () => this.syncScrollState() }, { injector: this.injector });
69340
69797
  });
69341
69798
  }
69799
+ /** The `aria-rowindex` of an open row's detail row, or `null` while every row is in the DOM. Part of the feature contract. */
69800
+ detailAriaRowIndex(row) {
69801
+ return this.detailAriaRowIndices().get(row) ?? null;
69802
+ }
69803
+ /** Record a detail row's rendered height. Part of the feature contract. */
69804
+ setDetailRowHeight(row, height) {
69805
+ const key = this.rowIdentity(row);
69806
+ if (this.measuredDetailHeights().get(key) === height)
69807
+ return;
69808
+ this.measuredDetailHeights.update((heights) => new Map(heights).set(key, height));
69809
+ }
69810
+ /** The height each open detail row adds, by absolute row index. Part of the feature contract. */
69811
+ detailRowHeights() {
69812
+ return this.openDetailHeights();
69813
+ }
69342
69814
  syncScrollState() {
69343
69815
  const element = this.scrollElement();
69344
69816
  // `scrollLeft` counts down from 0 in RTL, so compare distances rather than raw offsets.
@@ -69698,10 +70170,16 @@ class TableComponent {
69698
70170
  /**
69699
70171
  * Set a column's sort direction outright, or clear it with `null` - what a column menu's explicit
69700
70172
  * "Sort ascending / descending / Clear" entries need, where {@link toggleSort}'s cycle would make
69701
- * the result depend on the column's current state. Layers like a plain header activation does.
70173
+ * the result depend on the column's current state. Layers like a plain header activation does;
70174
+ * clearing drops only this column's entry from a layered sort.
69702
70175
  */
69703
70176
  setSort(key, direction) {
69704
- this.applySort(this.nextSort({ key, direction, additive: false }));
70177
+ if (direction) {
70178
+ this.applySort(this.nextSort({ key, direction, additive: false }));
70179
+ }
70180
+ else if (this.sort().some((entry) => entry.key === key)) {
70181
+ this.applySort(this.sort().filter((entry) => entry.key !== key));
70182
+ }
69705
70183
  }
69706
70184
  activateSortHeader(key, event) {
69707
70185
  if (event instanceof KeyboardEvent)
@@ -69975,6 +70453,19 @@ class TableComponent {
69975
70453
  return next;
69976
70454
  });
69977
70455
  }
70456
+ ariaRowIndexOf(index) {
70457
+ const open = this.openDetailIndices();
70458
+ let low = 0;
70459
+ let high = open.length;
70460
+ while (low < high) {
70461
+ const mid = (low + high) >> 1;
70462
+ if ((open[mid] ?? Infinity) < index)
70463
+ low = mid + 1;
70464
+ else
70465
+ high = mid;
70466
+ }
70467
+ return this.headerRowCount() + index + low + 1;
70468
+ }
69978
70469
  // Must stay a same-tick write on the header grid. A requestAnimationFrame hop defers it past the
69979
70470
  // paint the body already moved in, so the header trails a whole frame; and the property inherits,
69980
70471
  // so writing it on the host recalculates style for every row cell, which only the header reads.
@@ -70075,10 +70566,10 @@ class TableComponent {
70075
70566
  return false;
70076
70567
  }
70077
70568
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
70078
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableComponent, isStandalone: true, selector: "et-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, rowsSource: { classPropertyName: "rowsSource", publicName: "rowsSource", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, errorTemplate: { classPropertyName: "errorTemplate", publicName: "errorTemplate", isSignal: true, isRequired: false, transformFunction: null }, cellState: { classPropertyName: "cellState", publicName: "cellState", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, sortMode: { classPropertyName: "sortMode", publicName: "sortMode", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, filterMode: { classPropertyName: "filterMode", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, quickFilter: { classPropertyName: "quickFilter", publicName: "quickFilter", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowInteractive: { classPropertyName: "rowInteractive", publicName: "rowInteractive", isSignal: true, isRequired: false, transformFunction: null }, rowLink: { classPropertyName: "rowLink", publicName: "rowLink", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", filters: "filtersChange", rowClick: "rowClick" }, host: { listeners: { "scroll": "syncScrollState()" }, properties: { "attr.data-appearance": "appearance()", "attr.data-density": "density()", "attr.aria-busy": "resolvedLoading() ? \"true\" : null", "attr.role": "pageStickyHeader() ? tableRole() : null", "class.et-table-host--scrolled-block-start": "blockScrollShadows().blockStart", "class.et-table-host--scrolled-block-end": "blockScrollShadows().blockEnd", "class.et-table-host--scrolled-inline-start": "scrollFades().start", "class.et-table-host--scrolled-inline-end": "scrollFades().end", "class.et-table-host--header-adornments": "headerAdornments().length > 0", "style.--_et-table-viewport-inline-size.px": "viewportInlineSize()" }, classAttribute: "et-table-host" }, providers: [
70569
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableComponent, isStandalone: true, selector: "et-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, rowsSource: { classPropertyName: "rowsSource", publicName: "rowsSource", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, errorTemplate: { classPropertyName: "errorTemplate", publicName: "errorTemplate", isSignal: true, isRequired: false, transformFunction: null }, cellState: { classPropertyName: "cellState", publicName: "cellState", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, sortMode: { classPropertyName: "sortMode", publicName: "sortMode", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, filterMode: { classPropertyName: "filterMode", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, quickFilter: { classPropertyName: "quickFilter", publicName: "quickFilter", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowInteractive: { classPropertyName: "rowInteractive", publicName: "rowInteractive", isSignal: true, isRequired: false, transformFunction: null }, rowLink: { classPropertyName: "rowLink", publicName: "rowLink", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", filters: "filtersChange", rowClick: "rowClick" }, host: { listeners: { "scroll": "syncScrollState()" }, properties: { "attr.data-appearance": "appearance()", "attr.data-density": "density()", "attr.aria-busy": "resolvedLoading() ? \"true\" : null", "attr.role": "pageStickyHeader() ? tableRole() : null", "attr.aria-rowcount": "pageStickyHeader() ? ariaRowCount() : null", "class.et-table-host--scrolled-block-start": "blockScrollShadows().blockStart", "class.et-table-host--scrolled-block-end": "blockScrollShadows().blockEnd", "class.et-table-host--scrolled-inline-start": "scrollFades().start", "class.et-table-host--scrolled-inline-end": "scrollFades().end", "class.et-table-host--header-adornments": "headerAdornments().length > 0", "style.--_et-table-viewport-inline-size.px": "viewportInlineSize()" }, classAttribute: "et-table-host" }, providers: [
70079
70570
  { provide: TABLE_FEATURE_HOST, useExisting: TableComponent },
70080
70571
  provideIcons(ARROW_UP_ICON, TRIANGLE_EXCLAMATION_ICON),
70081
- ], queries: [{ propertyName: "footerSlot", first: true, predicate: TableFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true, isSignal: true }, { propertyName: "headerGridRef", first: true, predicate: ["headerGrid"], descendants: true, isSignal: true }, { propertyName: "scrollerRef", first: true, predicate: ["scroller"], descendants: true, isSignal: true }, { propertyName: "headerCells", predicate: ["headerCell"], descendants: true, isSignal: true }, { propertyName: "bodyCells", predicate: ["bodyCell"], descendants: true, isSignal: true }, { propertyName: "gridCells", predicate: ["gridCell"], descendants: true, isSignal: true }, { propertyName: "leadHeaderCells", predicate: ["leadHeaderCell"], descendants: true, isSignal: true }, { propertyName: "trailHeaderCells", predicate: ["trailHeaderCell"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div #grid [style.grid-template-columns]=\"templateColumns()\" [attr.role]=\"tableRole()\" class=\"et-table\">\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: TableCardSurfaceDirective, selector: "[etTableCardSurface]", inputs: ["etTableCardSurface"] }], encapsulation: i0.ViewEncapsulation.None }); }
70572
+ ], queries: [{ propertyName: "footerSlot", first: true, predicate: TableFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true, isSignal: true }, { propertyName: "headerGridRef", first: true, predicate: ["headerGrid"], descendants: true, isSignal: true }, { propertyName: "scrollerRef", first: true, predicate: ["scroller"], descendants: true, isSignal: true }, { propertyName: "headerCells", predicate: ["headerCell"], descendants: true, isSignal: true }, { propertyName: "bodyCells", predicate: ["bodyCell"], descendants: true, isSignal: true }, { propertyName: "gridCells", predicate: ["gridCell"], descendants: true, isSignal: true }, { propertyName: "leadHeaderCells", predicate: ["leadHeaderCell"], descendants: true, isSignal: true }, { propertyName: "trailHeaderCells", predicate: ["trailHeaderCell"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div [attr.aria-rowindex]=\"ariaRowCount() === null ? null : headerRowCount()\" class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n [attr.aria-rowindex]=\"rowVm.ariaRowIndex\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div [attr.aria-rowindex]=\"ariaRowCount()\" class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div\n #grid\n [style.grid-template-columns]=\"templateColumns()\"\n [attr.role]=\"tableRole()\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n class=\"et-table\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: TableCardSurfaceDirective, selector: "[etTableCardSurface]", inputs: ["etTableCardSurface"] }], encapsulation: i0.ViewEncapsulation.None }); }
70082
70573
  }
70083
70574
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableComponent, decorators: [{
70084
70575
  type: Component,
@@ -70091,6 +70582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
70091
70582
  '[attr.data-density]': 'density()',
70092
70583
  '[attr.aria-busy]': 'resolvedLoading() ? "true" : null',
70093
70584
  '[attr.role]': 'pageStickyHeader() ? tableRole() : null',
70585
+ '[attr.aria-rowcount]': 'pageStickyHeader() ? ariaRowCount() : null',
70094
70586
  '[class.et-table-host--scrolled-block-start]': 'blockScrollShadows().blockStart',
70095
70587
  '[class.et-table-host--scrolled-block-end]': 'blockScrollShadows().blockEnd',
70096
70588
  '[class.et-table-host--scrolled-inline-start]': 'scrollFades().start',
@@ -70098,7 +70590,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
70098
70590
  '[class.et-table-host--header-adornments]': 'headerAdornments().length > 0',
70099
70591
  '[style.--_et-table-viewport-inline-size.px]': 'viewportInlineSize()',
70100
70592
  '(scroll)': 'syncScrollState()',
70101
- }, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div #grid [style.grid-template-columns]=\"templateColumns()\" [attr.role]=\"tableRole()\" class=\"et-table\">\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"] }]
70593
+ }, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div [attr.aria-rowindex]=\"ariaRowCount() === null ? null : headerRowCount()\" class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n [attr.aria-rowindex]=\"rowVm.ariaRowIndex\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div [attr.aria-rowindex]=\"ariaRowCount()\" class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div\n #grid\n [style.grid-template-columns]=\"templateColumns()\"\n [attr.role]=\"tableRole()\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n class=\"et-table\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"] }]
70102
70594
  }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], rowsSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsSource", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], errorTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorTemplate", required: false }] }], cellState: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellState", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], multiSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSort", required: false }] }], sortMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortMode", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], filterMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMode", required: false }] }], quickFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilter", required: false }] }], expandedRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedRowTemplate", required: false }] }], rowInteractive: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowInteractive", required: false }] }], rowLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowLink", required: false }] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], footerSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TableFooterDirective), { isSignal: true }] }], gridRef: [{ type: i0.ViewChild, args: ['grid', { isSignal: true }] }], headerGridRef: [{ type: i0.ViewChild, args: ['headerGrid', { isSignal: true }] }], scrollerRef: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }], headerCells: [{ type: i0.ViewChildren, args: ['headerCell', { isSignal: true }] }], bodyCells: [{ type: i0.ViewChildren, args: ['bodyCell', { isSignal: true }] }], gridCells: [{ type: i0.ViewChildren, args: ['gridCell', { isSignal: true }] }], leadHeaderCells: [{ type: i0.ViewChildren, args: ['leadHeaderCell', { isSignal: true }] }], trailHeaderCells: [{ type: i0.ViewChildren, args: ['trailHeaderCell', { isSignal: true }] }] } });
70103
70595
 
70104
70596
  /**
@@ -70554,6 +71046,9 @@ class TableColumnMenuDirective {
70554
71046
  return (this.config().hideColumn ?? true) && this.table.visibleColumnsMeta().length > 1;
70555
71047
  }
70556
71048
  hide(column) {
71049
+ this.table.setSort(column.key, null);
71050
+ if (this.table.filterValuesFor(column.key).length)
71051
+ this.table.setFilterValues(column.key, []);
70557
71052
  this.table.setColumnVisible(column.key, false);
70558
71053
  }
70559
71054
  canPin() {
@@ -71175,9 +71670,16 @@ class TableRowDetailComponent {
71175
71670
  ...(ngDevMode ? [{ debugName: "row" }] : /* istanbul ignore next */ []));
71176
71671
  this.animated = computed(() => this.expansion.animates(this.row()), /* @ts-ignore */
71177
71672
  ...(ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []));
71673
+ this.dimensions = signalHostElementDimensions();
71674
+ effect(() => {
71675
+ const height = this.dimensions().offset?.height;
71676
+ const row = this.row();
71677
+ if (height !== undefined)
71678
+ untracked(() => this.table.setDetailRowHeight(row, height));
71679
+ });
71178
71680
  }
71179
71681
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableRowDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
71180
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: TableRowDetailComponent, isStandalone: true, selector: "et-table-row-detail", inputs: { row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "row" }, properties: { "animate.enter": "animated() ? 'et-table-detail--enter' : ''", "animate.leave": "animated() ? 'et-table-detail--leave' : ''" }, classAttribute: "et-table-detail-row" }, ngImport: i0, template: `
71682
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: TableRowDetailComponent, isStandalone: true, selector: "et-table-row-detail", inputs: { row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "row" }, properties: { "attr.aria-rowindex": "table.detailAriaRowIndex(row())", "animate.enter": "animated() ? 'et-table-detail--enter' : ''", "animate.leave": "animated() ? 'et-table-detail--leave' : ''" }, classAttribute: "et-table-detail-row" }, ngImport: i0, template: `
71181
71683
  <!-- The clip window the animating track squeezes to nothing, and the body that carries the padding.
71182
71684
  Two elements on purpose - see table-detail-styles.component.css. -->
71183
71685
  <div [attr.role]="table.cellRole()" class="et-table-detail-cell">
@@ -71205,13 +71707,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
71205
71707
  host: {
71206
71708
  class: 'et-table-detail-row',
71207
71709
  role: 'row',
71710
+ '[attr.aria-rowindex]': 'table.detailAriaRowIndex(row())',
71208
71711
  // Animated only for the row the user just toggled - a re-mount from paging/sorting must not replay
71209
71712
  // the reveal (see TableRowExpansionDirective.animates).
71210
71713
  '[animate.enter]': "animated() ? 'et-table-detail--enter' : ''",
71211
71714
  '[animate.leave]': "animated() ? 'et-table-detail--leave' : ''",
71212
71715
  },
71213
71716
  }]
71214
- }], propDecorators: { row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: true }] }] } });
71717
+ }], ctorParameters: () => [], propDecorators: { row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: true }] }] } });
71215
71718
 
71216
71719
  /** Covers the 0.18s detail-row enter/leave animations in the CSS - see {@link TableRowExpansionDirective.animates}. */
71217
71720
  const DETAIL_ANIMATION_MS = 200;
@@ -73496,6 +73999,7 @@ class TableVirtualScrollDirective {
73496
73999
  itemCount: computed(() => this.table.rows().length),
73497
74000
  estimateItemHeight: computed(() => this.config().estimateRowHeight ?? 48),
73498
74001
  overscan: computed(() => this.config().overscan ?? 6),
74002
+ extraItemHeights: computed(() => this.table.detailRowHeights()),
73499
74003
  });
73500
74004
  injectStyleManager().mount(TableVirtualScrollStylesComponent);
73501
74005
  this.table.registerRowWindow({
@@ -74411,9 +74915,17 @@ class TabGroupDirective {
74411
74915
  this.sessionMemoryKey = input(null, /* @ts-ignore */
74412
74916
  ...(ngDevMode ? [{ debugName: "sessionMemoryKey" }] : /* istanbul ignore next */ []));
74413
74917
  this.sessionMemoryAvailable = canUseSessionMemory();
74414
- /** @internal */
74415
- this.panels = signal([], /* @ts-ignore */
74416
- ...(ngDevMode ? [{ debugName: "panels" }] : /* istanbul ignore next */ []));
74918
+ this.registeredPanels = signal([], /* @ts-ignore */
74919
+ ...(ngDevMode ? [{ debugName: "registeredPanels" }] : /* istanbul ignore next */ []));
74920
+ this.childMutations = signalElementMutations(inject(ElementRef), {
74921
+ childList: true,
74922
+ subtree: true,
74923
+ });
74924
+ /** @internal The panels in DOM order, which a keyed `@for` can change without re-registering any. */
74925
+ this.panels = computed(() => {
74926
+ this.childMutations();
74927
+ return sortByDomOrder(this.registeredPanels(), (panel) => panel.hostElement);
74928
+ }, { ...(ngDevMode ? { debugName: "panels" } : /* istanbul ignore next */ {}), equal: isSameOrder$1 });
74417
74929
  /** @internal Set by composing components (e.g. et-tab-group) that render panel content themselves instead of registering [etTabPanel] directives. */
74418
74930
  this.managesPanelsInternally = signal(false, /* @ts-ignore */
74419
74931
  ...(ngDevMode ? [{ debugName: "managesPanelsInternally" }] : /* istanbul ignore next */ []));
@@ -74496,18 +75008,19 @@ class TabGroupDirective {
74496
75008
  }
74497
75009
  /** @internal */
74498
75010
  registerPanel(panel) {
74499
- this.panels.update((list) => [...list, panel]);
75011
+ this.registeredPanels.update((list) => [...list, panel]);
74500
75012
  }
74501
75013
  /** @internal */
74502
75014
  unregisterPanel(panel) {
74503
- this.panels.update((list) => list.filter((p) => p !== panel));
75015
+ this.registeredPanels.update((list) => list.filter((p) => p !== panel));
74504
75016
  }
74505
75017
  resolveSelectedIndex(index) {
74506
75018
  const triggers = this.tabBar.triggers();
74507
75019
  if (triggers.length === 0) {
74508
75020
  return null;
74509
75021
  }
74510
- const clampedIndex = Math.min(Math.max(index, 0), triggers.length - 1);
75022
+ const wholeIndex = Number.isFinite(index) ? Math.trunc(index) : 0;
75023
+ const clampedIndex = Math.min(Math.max(wholeIndex, 0), triggers.length - 1);
74511
75024
  const selectedTrigger = triggers[clampedIndex];
74512
75025
  if (selectedTrigger && !selectedTrigger.disabled()) {
74513
75026
  return clampedIndex;
@@ -74554,6 +75067,7 @@ let nextPanelId = 0;
74554
75067
  class TabPanelDirective {
74555
75068
  constructor() {
74556
75069
  this.tabGroup = inject(TAB_GROUP_TOKEN, { optional: true });
75070
+ /** @internal */
74557
75071
  this.hostElement = injectHostElement();
74558
75072
  this.triggerId = input(null, /* @ts-ignore */
74559
75073
  ...(ngDevMode ? [{ debugName: "triggerId" }] : /* istanbul ignore next */ []));
@@ -75878,11 +76392,11 @@ const provideUnsavedChangesAlertDialog = () => provideUnsavedChangesConfirm(() =
75878
76392
 
75879
76393
  // Generated from package.json by tools/scripts/generate-version.js - do not edit.
75880
76394
  /** The version of `@ethlete/components` this build was cut from. */
75881
- const COMPONENTS_VERSION = '1.0.0-next.67';
76395
+ const COMPONENTS_VERSION = '1.0.0-next.69';
75882
76396
 
75883
76397
  /**
75884
76398
  * Generated bundle index. Do not edit.
75885
76399
  */
75886
76400
 
75887
- export { ACCESSIBLE_NAME_INPUTS, ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, ALERT_DIALOG_LABELS, ALIGN_CENTER_ICON, ALIGN_JUSTIFY_ICON, ALIGN_LEFT_ICON, ALIGN_RIGHT_ICON, ARROWS_LEFT_RIGHT_ICON, ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, ARROW_UP_ICON, AVATAR_IMPORTS, AVATAR_LABELS, AVATAR_SHAPES, AVATAR_SIZES, AccessibleNameControlDirective, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, AvatarComponent, AvatarGroupComponent, BADGE_ICON_ALIGNMENTS, BADGE_IMPORTS, BADGE_SIZES, BADGE_VARIANTS, BANNER_IMPORTS, BANNER_LABELS, BANNER_TYPES, BOLD_ICON, BRACKET_CARD_CONTEXT, BRACKET_DEFAULTS, BRACKET_DEFAULT_CARDS, BRACKET_DENSITY, BRACKET_DENSITY_PRESETS, BRACKET_IMPORTS, BRACKET_LABELS, BRACKET_PARTICIPANTS_IMPORTS, BRACKET_PICK_CARD_IMPORTS, BRACKET_PICK_CARD_NOTE_TONE, BRACKET_ROUNDS_LIST_IMPORTS, BRACKET_ROUND_HEADER_ALIGN, BRACKET_SKELETON_IMPORTS, BREADCRUMB_COLLAPSE_IMPORTS, BREADCRUMB_COLLAPSE_TOKEN, BREADCRUMB_ERROR_CODES, BREADCRUMB_IMPORTS, BREADCRUMB_LABELS, BREADCRUMB_SEGMENT_TOKEN, BREADCRUMB_SEO_IMPORTS, BREADCRUMB_TOKEN, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BadgeComponent, BannerComponent, BarChartComponent, BarChartDirective, BarChartPlotDirective, BracketComponent, BracketDefaultContinueComponent, BracketDefaultFinalMatchComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketParticipantsComponent, BracketPickCardComponent, BracketRoundsListComponent, BracketSkeletonComponent, BracketSkeletonContinueComponent, BracketSkeletonFinalMatchComponent, BracketSkeletonMatchComponent, BracketSkeletonRoundHeaderComponent, BrandLoaderComponent, BreadcrumbCollapseDirective, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbOverflowComponent, BreadcrumbSegmentDirective, BreadcrumbSeoDirective, BreadcrumbSeparatorDirective, ButtonColorDirective, ButtonComponent, ButtonDirective, ButtonStylesDirective, CALENDAR_ERROR_CODES, CALENDAR_ICON, CALENDAR_IMPORTS, CALENDAR_LABELS, CARD_IMPORTS, CARD_VARIANTS, CAROUSEL_AUTOPLAY_TOKEN, CAROUSEL_ERROR_CODES, CAROUSEL_IMPORTS, CAROUSEL_LABELS, CAROUSEL_SLIDE_ALIGNMENTS, CAROUSEL_TOKEN, CAROUSEL_TRANSITIONS, CAROUSEL_TRANSITION_DRIVERS, CASCADER_ERROR_CODES, CASCADER_IMPORTS, CASCADER_LABELS, CASCADER_SELECTABLE_LEVELS, CHART_ERROR_CODES, CHART_IMPORTS, CHART_LABELS, CHART_PLOT_HOST, CHECKBOX_GROUP_IMPORTS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHIP_REMOVE_FOCUS_FALLBACK, CHIP_REMOVE_TAB_STOP, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CIRCLE_CHECK_ICON, CIRCLE_INFO_ICON, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_BLOCK_ICON, CODE_ICON, COLOR_INPUT_ERROR_CODES, COLOR_INPUT_IMPORTS, COLOR_INPUT_LABELS, COLOR_INPUT_TOKEN, COLOR_NOTATIONS, COLOR_NOTATION_ORDER, COMMAND_PALETTE_ERROR_CODES, COMMAND_PALETTE_IMPORTS, COMMAND_PALETTE_LABELS, COMMAND_PALETTE_OVERLAY, COMMAND_PALETTE_REGISTRY, COMMAND_PALETTE_TOKEN, COMPONENTS_VERSION, COPY_BUTTON_IMPORTS, COPY_BUTTON_LABELS, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CalendarHeaderDirective, CardComponent, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, ChartPlotDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxGroupSelectAllComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, ColorPickerAreaDirective, ColorPickerChannelDirective, ColorPickerPanelComponent, ColorPickerSurfaceDirective, ColorPickerTriggerDirective, CommandPaletteComponent, CommandPaletteDirective, CommandPaletteItemComponent, CommandPaletteSearchDirective, CommandPaletteShortcutDirective, ControlSuffixDirective, CopyButtonDirective, CounterComponent, DAILYMOTION_PLAYER_TOKEN, DATE_FORMAT, DATE_INPUT_ERROR_CODES, DATE_INPUT_IMPORTS, DATE_LOCALE, DATE_PICKER_HOST, DATE_RANGE_INPUT_ERROR_CODES, DATE_RANGE_INPUT_IMPORTS, DATE_TIME_FORMAT, DATE_TIME_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_LABELS, DATE_TIME_RANGE_INPUT_ERROR_CODES, DATE_TIME_RANGE_INPUT_IMPORTS, DEFAULT_ALERT_DIALOG_LABELS, DEFAULT_AVATAR_LABELS, DEFAULT_BANNER_LABELS, DEFAULT_BRACKET_LABELS, DEFAULT_BREADCRUMB_LABELS, DEFAULT_BREAKPOINTS, DEFAULT_CALENDAR_LABELS, DEFAULT_CALENDAR_RANGE_STRATEGY, DEFAULT_CAROUSEL_LABELS, DEFAULT_CASCADER_LABELS, DEFAULT_CHART_LABELS, DEFAULT_CHIP_LABELS, DEFAULT_COLOR_INPUT_LABELS, DEFAULT_COMMAND_PALETTE_LABELS, DEFAULT_COPY_BUTTON_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_DROPZONE_MAX_PREVIEW_FILE_SIZE, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_DEFAULTS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_LABELS, DEFAULT_KBD_LABELS, DEFAULT_LOADER_LABELS, DEFAULT_MATCH_CARD_START_TIME_FORMAT, DEFAULT_MATCH_LABELS, DEFAULT_NOTIFICATION_LABELS, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_NOTIFICATION_STATUS_ICONS, DEFAULT_PAGINATION_LABELS, DEFAULT_PHONE_INPUT_LABELS, DEFAULT_PROGRESS_STEP_LABELS, DEFAULT_QUERY_ERROR_LABELS, DEFAULT_RICH_TEXT_EDITOR_LABELS, DEFAULT_RICH_TEXT_EDITOR_TOOLS, DEFAULT_SCHEDULER_LABELS, DEFAULT_SELECT_LABELS, DEFAULT_SLIDER_LABELS, DEFAULT_STANDINGS_LABELS, DEFAULT_STAT_TILE_LABELS, DEFAULT_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DEFAULT_TREE_LABELS, DEFAULT_UNSAVED_CHANGES_LABELS, DESCRIPTION_IMPORTS, DESCRIPTION_LIST_IMPORTS, DESCRIPTION_LIST_VARIANTS, DIVIDER_IMPORTS, DROPZONE_ENTRY_STATUSES, DROPZONE_ERROR_CODES, DROPZONE_FILES_ERROR_KIND, DROPZONE_FILE_CONSTRAINTS, DROPZONE_FILE_REJECTION_REASONS, DROPZONE_IMPORTS, DROPZONE_LABELS, DURATION_INPUT_ERROR_CODES, DURATION_INPUT_IMPORTS, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DateInputComponent, DateInputDirective, DateInputFieldDirective, DatePickerPanelComponent, DatePickerSurfaceDirective, DatePickerTriggerDirective, DateRangeInputComponent, DateRangeInputDirective, DateRangeInputFieldDirective, DateTimeInputComponent, DateTimeInputDirective, DateTimeInputFieldDirective, DateTimeRangeInputComponent, DateTimeRangeInputDirective, DateTimeRangeInputFieldDirective, DescriptionComponent, DescriptionListComponent, DividerComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, EMPTY_STATE_IMPORTS, ET_BUILT_IN_ICON_NAMES, EYEDROPPER_ICON, EYE_ICON, EYE_SLASH_ICON, EmptyStateComponent, FACEBOOK_PLAYER_TOKEN, FIELD_WARNINGS, FIELD_WARNING_KIND, FILE_ICON, FILTER_ICON, FILTER_OVERLAY_ERROR_CODES, FILTER_OVERLAY_IMPORTS, FILTER_OVERLAY_LABELS, FILTER_OVERLAY_TOKEN, FLOATING_ACTION_ERROR_CODES, FLOATING_ACTION_IMPORTS, FLOATING_ACTION_STATES, FLOATING_ACTION_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_ERROR_MESSAGE_RESOLVER, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABELS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FORM_IMPORTS, FORM_WARNING_MESSAGE_RESOLVER, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormDirective, FormErrorComponent, FormFieldBarrierDirective, FormFieldComponent, FormFieldDirective, FormWarningComponent, GERMAN_COMMAND_PALETTE_LABELS, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_QUERY_ERROR_LABELS, GRID_2X2_ICON, GRID_DEBUG_IMPORTS, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemToolbarComponent, GridResizeDirective, HEADING_1_ICON, HEADING_2_ICON, HEADING_3_ICON, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, ICON_OVERRIDES_TOKEN, IMAGE_ICON, INHERIT_COLOR, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS$1 as INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KBD_IMPORTS, KBD_LABELS, KBD_PLATFORM, KICK_PLAYER_TOKEN, KbdComponent, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINE_CHART_ERROR_CODES, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_IMPORTS, LOADER_LABELS, LOCATION_ICON, LOCK_ICON, LabelDirective, LineChartComponent, LineChartDirective, LineChartSliceDirective, MASKED_INPUT_ERROR_CODES, MASKED_INPUT_IMPORTS, MASK_VALUE_MODES, MASONRY_ERROR_CODES, MASONRY_IMPORTS, MASONRY_TOKEN, MATCH_CARD_IMPORTS, MATCH_CARD_SIZES, MATCH_CARD_TOKEN, MATCH_ERROR_CODES, MATCH_LABELS, MATCH_PARTICIPANT_IMPORTS, MENU_ERROR_CODES, MENU_IMPORTS, MENU_ITEM_VARIANTS, MENU_SEARCH_IMPORTS, MENU_SELECTION_GROUP_MULTIPLE, MENU_SELECTION_GROUP_TOKEN, MENU_SELECTION_ITEM_KIND, MINUS_ICON, MULTI_LANGUAGE_RICH_TEXT_EDITOR_ERROR_CODES, MULTI_LANGUAGE_RICH_TEXT_EDITOR_IMPORTS, MasonryDirective, MasonryItemDirective, MatchCardComponent, MatchCardDirective, MatchCardGameScoresDirective, MatchCardMetaDirective, MatchCardScoreDirective, MatchParticipantComponent, MatchScoreComponent, MenuCheckboxGroupComponent, MenuCheckboxItemComponent, MenuComponent, MenuContextTriggerDirective, MenuDirective, MenuGroupLabelComponent, MenuItemComponent, MenuItemDirective, MenuItemShortcutComponent, MenuItemSubmenuIconComponent, MenuPanelDirective, MenuRadioGroupComponent, MenuRadioItemComponent, MenuSearchDirective, MenuSelectionGroupDirective, MenuSelectionItemDirective, MenuSeparatorComponent, MenuSurfaceDirective, MenuTriggerDirective, MultiLanguageRichTextEditorComponent, MultiLanguageRichTextEditorDirective, MultiLanguageRichTextEditorLanguageToolComponent, NAV_TABS_TOKEN, NAV_TAB_IMPORTS, NOTIFICATION_ACTION_SLOTS, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_LABELS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STACK_OVERLAY_LAYER, NOTIFICATION_STATUS, NO_STREAM_PLAYER_CAPABILITIES, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, NavTabLinkStylesComponent, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, NotificationSwipeToDismissDirective, NumberInputComponent, NumberInputDirective, OTP_INPUT_IMPORTS, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HAS_BACKDROP, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_NAV_TAB_IMPORTS, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OtpInputComponent, OtpInputDirective, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayNavTabLinkComponent, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGE_SIZE_SELECT_IMPORTS, PAGINATION_IMPORTS, PAGINATION_LABELS, PAGINATION_SIZES, PARAGRAPH_ICON, PASSWORD_INPUT_IMPORTS, PAUSE_ICON, PENCIL_ICON, PHONE_COUNTRIES, PHONE_INPUT_ERROR_CODES, PHONE_INPUT_IMPORTS, PHONE_INPUT_LABELS, PICTURE_IMPORTS, PICTURE_STATES, PIE_CHART_ERROR_CODES, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PROGRESS_STEPS_IMPORTS, PROGRESS_STEPS_ORIENTATIONS, PROGRESS_STEP_LABELS, PROGRESS_STEP_STATES, PageSizeSelectComponent, PagedQueryTriggerDirective, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PieChartComponent, PieChartDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, ProgressStepComponent, ProgressStepsComponent, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QUOTE_ICON, QueryButtonDirective, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_GROUP_IMPORTS, RADIO_VARIANTS, RATING_ERROR_CODES, RATING_IMPORTS, REDO_ICON, RICH_TEXT_EDITOR_FLOATING_TOOLBAR, RICH_TEXT_EDITOR_HEADING_OPTIONS, RICH_TEXT_EDITOR_IMPORTS, RICH_TEXT_EDITOR_INLINE_TOOLS, RICH_TEXT_EDITOR_LABELS, RICH_TEXT_EDITOR_LANGUAGE_TOOL, RICH_TEXT_EDITOR_LINK_EDITOR, RICH_TEXT_EDITOR_TOKEN_CODEC, RICH_TEXT_EDITOR_TOKEN_PALETTE_IMPORTS, RICH_TEXT_EDITOR_TOOL, RICH_TEXT_EDITOR_TOOLS, RICH_TEXT_EDITOR_TOOL_BUTTONS, RICH_TEXT_EDITOR_TRIGGERS_IMPORTS, ROTATE_RIGHT_ICON, RadioComponent, RadioGroupComponent, RangeSliderComponent, RangeSliderDirective, RatingComponent, RatingDirective, RatingIconDirective, RichTextEditorAlignToolComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, RichTextEditorFloatingToolbarDirective, RichTextEditorHeadingToolComponent, RichTextEditorImageEditorComponent, RichTextEditorImageToolComponent, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, RichTextViewerComponent, SANKEY_CHART_ERROR_CODES, SCHEDULER_EDIT_SURFACE_IMPORTS, SCHEDULER_ERROR_CODES, SCHEDULER_FEATURE_HOST, SCHEDULER_IMPORTS, SCHEDULER_LABELS, SCROLLABLE_DARKEN_IMPORTS, SCROLLABLE_DRAG_IMPORTS, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SCROLLABLE_NAVIGATION_IMPORTS, SCROLLBAR_ERROR_CODES, SCROLLBAR_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SEGMENTED_BUTTON_IMPORTS, SELECTION_CARD_CONTROL_POSITIONS, SELECTION_LIST_ERROR_CODES, SELECTION_LIST_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SELECT_ERROR_CODES, SELECT_FILTER_MODES, SELECT_IMPORTS, SELECT_LABELS, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_MARK_VALUE_ATTRIBUTE, SLIDER_TOKEN, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STANDINGS_ERROR_CODES, STANDINGS_IMPORTS, STANDINGS_LABELS, STANDINGS_PICK_IMPORTS, STAR_ICON, STAT_TILE_IMPORTS, STAT_TILE_LABELS, STREAM_ALL_IMPORTS, STREAM_CONSENT_TOKEN, STREAM_DAILYMOTION_IMPORTS, STREAM_DEFAULT_COMPONENTS, STREAM_ERROR_CODES, STREAM_FACEBOOK_IMPORTS, STREAM_IMPORTS, STREAM_KICK_IMPORTS, STREAM_LABELS, STREAM_PIP_IMPORTS, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_SOOP_IMPORTS, STREAM_TIKTOK_IMPORTS, STREAM_TWITCH_IMPORTS, STREAM_USER_CONSENT_PROVIDER_TOKEN, STREAM_VIMEO_IMPORTS, STREAM_YOUTUBE_IMPORTS, STRIKETHROUGH_ICON, SUPPORT_CONTENT_STATE, SUPPORT_TRANSITION_DIRECTION, SWITCH_IMPORTS, SankeyChartComponent, SankeyChartDirective, SankeyChartMarkDirective, SchedulerActionAddAppointmentDirective, SchedulerAgendaDirective, SchedulerAgendaViewComponent, SchedulerAppointmentDragDirective, SchedulerBadgeChainCountComponent, SchedulerBadgeChainCountDirective, SchedulerBadgeColorDotComponent, SchedulerBadgeColorDotDirective, SchedulerBadgeLocationComponent, SchedulerBadgeLocationDirective, SchedulerBadgeTimeRangeComponent, SchedulerBadgeTimeRangeDirective, SchedulerBadgeTitleComponent, SchedulerBadgeTitleDirective, SchedulerComponent, SchedulerDirective, SchedulerEditAddSubAppointmentItemComponent, SchedulerEditColorComponent, SchedulerEditDeleteItemComponent, SchedulerEditDescriptionComponent, SchedulerEditLocationComponent, SchedulerEditSurfaceActionsComponent, SchedulerEditSurfaceBreadcrumbComponent, SchedulerEditSurfaceChildrenComponent, SchedulerEditSurfaceComponent, SchedulerEditSurfaceDirective, SchedulerEditSurfaceFieldsComponent, SchedulerEditSurfaceFooterComponent, SchedulerEditSurfaceHeaderComponent, SchedulerEditTimeRangeComponent, SchedulerEditTitleComponent, SchedulerMonthDirective, SchedulerMonthViewComponent, SchedulerSwipeNavigationDirective, SchedulerTimeGridDirective, SchedulerTimeGridViewComponent, ScrollableActiveChildDirective, ScrollableButtonsComponent, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksComponent, ScrollableNavigationComponent, ScrollableNavigationDirective, ScrollableSnapDirective, ScrollbarComponent, ScrollbarDirective, ScrollbarThumbDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectAllOptionComponent, SelectAllOptionDirective, SelectComponent, SelectDirective, SelectEmptyDirective, SelectErrorDirective, SelectListboxDirective, SelectLoadingDirective, SelectOptionComponent, SelectOptionDirective, SelectOptionGroupComponent, SelectOptionGroupDirective, SelectOptionTemplateDirective, SelectOptionsDirective, SelectPanelComponent, SelectSearchDirective, SelectSurfaceDirective, SelectTriggerDirective, SelectValueDirective, SelectViewportDirective, SelectVirtualOptionComponent, SelectVirtualOptionDirective, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SkeletonComponent, SkeletonItemComponent, SkeletonTextComponent, SliderComponent, SliderDirective, SliderThumbDirective, SliderThumbLabelDirective, SliderTrackDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, SplitButtonActionDirective, SplitButtonComponent, SplitButtonDirective, SplitButtonTriggerDirective, StandingsComponent, StandingsDirective, StandingsPickComponent, StandingsPickDirective, StandingsPickMarkDirective, StatTileComponent, StatTileSparklineComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TABLE_CELL_ERROR_TOOLTIP_IMPORTS, TABLE_COLUMN_CHOOSER_IMPORTS, TABLE_COLUMN_MENU_IMPORTS, TABLE_CSV_EXPORT_IMPORTS, TABLE_DRAG_SCROLL_IMPORTS, TABLE_ERROR_CODES, TABLE_FEATURE_HOST, TABLE_FILTER_IMPORTS, TABLE_GROUP_HEADERS_IMPORTS, TABLE_ICON, TABLE_IMPORTS, TABLE_INLINE_EDIT_IMPORTS, TABLE_KEYBOARD_NAV_IMPORTS, TABLE_LABELS, TABLE_PAGE_STICKY_HEADER_IMPORTS, TABLE_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_ROW_EXPANSION_IMPORTS, TABLE_ROW_ROUTER_LINK_IMPORTS, TABLE_SELECTION_IMPORTS, TABLE_SKELETON_IMPORTS, TABLE_STATE_PERSISTENCE_IMPORTS, TABLE_STICKY_COLUMNS_IMPORTS, TABLE_VIRTUAL_SCROLL_IMPORTS, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_IMPORTS, TAB_PANEL_TOKEN, TAB_SIZES, TAG_INPUT_ERROR_CODES, TAG_INPUT_IMPORTS, TEXTAREA_IMPORTS, TEXTAREA_RESIZE_MODES, TEXT_ALIGNS, TEXT_FIELD_CONTROL_INPUTS, THUMBTACK_ICON, TIKTOK_PLAYER_TOKEN, TIMELINE_IMPORTS, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TIME_RANGE_INPUT_ERROR_CODES, TIME_RANGE_INPUT_IMPORTS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLBAR_IMPORTS, TOOLBAR_ORIENTATIONS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRASH_ICON, TREE_ERROR_CODES, TREE_IMPORTS, TREE_LABELS, TREE_LEVEL_STATUSES, TREE_MARKERS, TREE_SELECTION_MODES, TRIANGLE_EXCLAMATION_ICON, TROPHY_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCardSurfaceDirective, TableCellDirective, TableCellEditDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableCsvExportDirective, TableDetailStylesComponent, TableDragScrollDirective, TableDragScrollStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableGroupHeaderRowComponent, TableGroupHeadersDirective, TableHeaderCellDirective, TableInlineEditDirective, TableInlineEditStylesComponent, TableKeyboardNavDirective, TablePageStickyHeaderDirective, TablePageStickyHeaderStylesComponent, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableRowBoxStylesComponent, TableRowDetailComponent, TableRowExpansionDirective, TableRowRouterLinkDirective, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableSkeletonDirective, TableSkeletonRowsComponent, TableStatePersistenceDirective, TableStickyColumnsDirective, TableStickyColumnsStylesComponent, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerComponent, TimePickerDirective, TimePickerRingDirective, TimePickerRingHandleDirective, TimeRangeInputComponent, TimeRangeInputDirective, TimeRangeInputFieldDirective, TimelineComponent, TimelineItemComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, ToolbarComponent, ToolbarDirective, TooltipComponent, TooltipDirective, TreeComponent, TreeDirective, TreeMarkerComponent, TreeNodeDefDirective, TreeNodeDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNDO_ICON, UNSAVED_CHANGES_LABELS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WCAG_CONTRAST_RATIOS, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, bottomSheetOverlayStrategy, bracketFitsWidth, bracketNaturalWidth, buildAnchoredRuntimePositionStrategy, canHaveChildren, canonicalKbdKey, cascaderFromQuery, centeredOverlayStrategy, clearLeavingSupportStateOnExit, colorContrast, commandPaletteLabelsForLocale, countDescendants, createAlertDialogOpener, createAnchoredPanelController, createCardMask, createCommandPaletteOpener, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createFixedLengthRangeStrategy, createGridAdapter, createIbanMask, createNormalizedBracketMatch, createNotificationPromiseFn, createNotificationRef, createOverlayOpener, createOverlaySingleSlot, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createSchedulerRegistry, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableRowsState, createTableStateStorage, createV2DropzoneUpload, createWeekRangeStrategy, dateBounds, dateRangeBounds, dateRangeOrder, dateTimeBounds, dateTimeRangeBounds, dateTimeRangeOrder, defaultCompareWith$1 as defaultCompareWith, defaultDropzoneRejectionMessage, defaultSankeyChartLinkKeyHint, defineOverlay, defineQueryParamOverlay, describeBracketSlot, deserializeGridLayout, deserializeTableState, detectKbdPlatform, dialogOverlayStrategy, disposeDropzoneEntry, doubleEliminationBracketLayout, dropzoneFiles, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, filterValues, findNextRelevantHtmlElement, focusFirstInvalidField, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateRoundTypeFromEthleteRoundType, generateTournamentModeFromEthleteRounds, getClosestOverlay, getColorContrastRatio, getOriginCoordinatesAndDimensions, hexColor, hitsInteractiveElement, iconRegistryKey, injectAlertDialogLabels, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectAvatarLabels, injectBannerLabels, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBracketLabels, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChartLabels, injectChipLabels, injectColorInputLabels, injectCommandPalette, injectCommandPaletteLabels, injectCommandPaletteRegistry, injectCopyButtonLabels, injectDateFormat, injectDateLocale, injectDateTimeFormat, injectDateTimeLabels, injectDateTimeZone, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldDefaults, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectKbdLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectMatchLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectProgressStepLabels, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSchedulerEditSurface, injectSchedulerEditSurfaceOpener, injectSchedulerFeatureHost, injectSchedulerLabels, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStandingsLabels, injectStatTileLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamPlayerSlot, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableCsvExport, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, injectTreeLabels, injectUnsavedChangesLabels, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isRestorableTableState, isTargetInsideOverlayTree, isTouchEvent, kbdKeyLabel, kbdKeyName, lastDaysPreset, lastMonthPreset, lastWeekPreset, leftSheetOverlayStrategy, legacyQueryErrorSource, mapGridLayout, matchCountryByDialCode, matchParticipantDisplayName, matchedDialPrefix, matchesKbdChord, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, mergeTableCsvExportOptions, mirroredDoubleEliminationBracketLayout, mirroredSingleEliminationBracketLayout, missingStreamSourceError, mountNavTabLinkStyles, nextDaysPreset, normalizeEthleteBracketMatch, normalizeEthleteGroupRanking, normalizeEthleteMatch, normalizeEthleteMatchStatus, normalizeEthleteMedia, normalizeEthleteParticipant, normalizeEthletePlacement, normalizePictureSizes, normalizePictureSource, numberInputStepMultiplierFrom, overlayResult, paginate, parseKbdKeys, phoneCountryFlag, phoneCountryName, provideAlertDialogLabels, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideAvatarLabels, provideBannerLabels, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBracketLabels, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChartLabels, provideChipLabels, provideColorInputLabels, provideCommandPaletteLabels, provideCommandPaletteRegistry, provideCopyButtonLabels, provideDateFormat, provideDateLocale, provideDateTimeFormat, provideDateTimeLabels, provideDateTimeZone, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldDefaults, provideFormFieldLabels, provideFormSupport, provideFormWarningMessageResolver, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideKbdLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideMatchLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideProgressStepLabels, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorAutoformat, provideRichTextEditorBlockquoteTool, provideRichTextEditorCodeBlockTool, provideRichTextEditorDefaultTools, provideRichTextEditorFloatingToolbar, provideRichTextEditorHeadingTool, provideRichTextEditorImageTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorLinkEditor, provideRichTextEditorLinkTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTool, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSchedulerEditSurface, provideSchedulerLabels, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStandingsLabels, provideStatTileLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPip, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, provideTreeLabels, provideUnsavedChangesAlertDialog, provideUnsavedChangesLabels, queryButtonSourceFromV2Query, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, quickFilterRows, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerCommands, registerSingleton, requiredLanguages, resolveBracketLayout, resolveClosestOverlay, resolveFilterOverlaySubmitButton, resolveNormalizedMatchSideState, resolveNotificationStatusIcon, resolveOverlayHasBackdrop, resolveTableCsvRows, rgbColor, richTextEditorToolLabel, rightSheetOverlayStrategy, schedulerFeatureConfig, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, singleEliminationBracketLayout, sortRows, startOfCalendarUnit, stripTrunkZero, supportPresentationIncludesState, swissBracketLayout, tableCsvRowsFromPages, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, tableToCsv, thisMonthPreset, thisWeekPreset, thisYearPreset, timeBounds, timeRangeBounds, timeRangeOrder, toFieldWarnings, toGridPosition, toNotificationContent, toPictureDimension, todayPreset, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, warn, wireFormSupport, withPictureBaseUrl, yesterdayPreset };
76401
+ export { ACCESSIBLE_NAME_INPUTS, ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, ALERT_DIALOG_LABELS, ALIGN_CENTER_ICON, ALIGN_JUSTIFY_ICON, ALIGN_LEFT_ICON, ALIGN_RIGHT_ICON, ARROWS_LEFT_RIGHT_ICON, ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, ARROW_UP_ICON, AVATAR_IMPORTS, AVATAR_LABELS, AVATAR_SHAPES, AVATAR_SIZES, AccessibleNameControlDirective, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, AvatarComponent, AvatarGroupComponent, BADGE_ICON_ALIGNMENTS, BADGE_IMPORTS, BADGE_SIZES, BADGE_VARIANTS, BANNER_IMPORTS, BANNER_LABELS, BANNER_TYPES, BOLD_ICON, BRACKET_CARD_CONTEXT, BRACKET_DEFAULTS, BRACKET_DEFAULT_CARDS, BRACKET_DENSITY, BRACKET_DENSITY_PRESETS, BRACKET_IMPORTS, BRACKET_LABELS, BRACKET_PARTICIPANTS_IMPORTS, BRACKET_PICK_CARD_IMPORTS, BRACKET_PICK_CARD_NOTE_TONE, BRACKET_ROUNDS_LIST_IMPORTS, BRACKET_ROUND_HEADER_ALIGN, BRACKET_SKELETON_IMPORTS, BREADCRUMB_COLLAPSE_IMPORTS, BREADCRUMB_COLLAPSE_TOKEN, BREADCRUMB_ERROR_CODES, BREADCRUMB_IMPORTS, BREADCRUMB_LABELS, BREADCRUMB_SEGMENT_TOKEN, BREADCRUMB_SEO_IMPORTS, BREADCRUMB_TOKEN, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BadgeComponent, BannerComponent, BarChartComponent, BarChartDirective, BarChartPlotDirective, BracketComponent, BracketDefaultContinueComponent, BracketDefaultFinalMatchComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketParticipantsComponent, BracketPickCardComponent, BracketRoundsListComponent, BracketSkeletonComponent, BracketSkeletonContinueComponent, BracketSkeletonFinalMatchComponent, BracketSkeletonMatchComponent, BracketSkeletonRoundHeaderComponent, BrandLoaderComponent, BreadcrumbCollapseDirective, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbOverflowComponent, BreadcrumbSegmentDirective, BreadcrumbSeoDirective, BreadcrumbSeparatorDirective, ButtonColorDirective, ButtonComponent, ButtonDirective, ButtonStylesDirective, CALENDAR_ERROR_CODES, CALENDAR_ICON, CALENDAR_IMPORTS, CALENDAR_LABELS, CARD_IMPORTS, CARD_VARIANTS, CAROUSEL_AUTOPLAY_TOKEN, CAROUSEL_ERROR_CODES, CAROUSEL_IMPORTS, CAROUSEL_LABELS, CAROUSEL_SLIDE_ALIGNMENTS, CAROUSEL_TOKEN, CAROUSEL_TRANSITIONS, CAROUSEL_TRANSITION_DRIVERS, CASCADER_ERROR_CODES, CASCADER_IMPORTS, CASCADER_LABELS, CASCADER_SELECTABLE_LEVELS, CHART_ERROR_CODES, CHART_IMPORTS, CHART_LABELS, CHART_PLOT_HOST, CHECKBOX_GROUP_IMPORTS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHIP_REMOVE_FOCUS_FALLBACK, CHIP_REMOVE_TAB_STOP, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CIRCLE_CHECK_ICON, CIRCLE_INFO_ICON, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_BLOCK_ICON, CODE_ICON, COLOR_INPUT_ERROR_CODES, COLOR_INPUT_IMPORTS, COLOR_INPUT_LABELS, COLOR_INPUT_TOKEN, COLOR_NOTATIONS, COLOR_NOTATION_ORDER, COMMAND_PALETTE_ERROR_CODES, COMMAND_PALETTE_IMPORTS, COMMAND_PALETTE_LABELS, COMMAND_PALETTE_OVERLAY, COMMAND_PALETTE_REGISTRY, COMMAND_PALETTE_TOKEN, COMPONENTS_VERSION, COPY_BUTTON_IMPORTS, COPY_BUTTON_LABELS, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CalendarHeaderDirective, CardComponent, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, ChartPlotDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxGroupSelectAllComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, ColorPickerAreaDirective, ColorPickerChannelDirective, ColorPickerPanelComponent, ColorPickerSurfaceDirective, ColorPickerTriggerDirective, CommandPaletteComponent, CommandPaletteDirective, CommandPaletteItemComponent, CommandPaletteSearchDirective, CommandPaletteShortcutDirective, ControlSuffixDirective, CopyButtonDirective, CounterComponent, DAILYMOTION_PLAYER_TOKEN, DATE_FORMAT, DATE_INPUT_ERROR_CODES, DATE_INPUT_IMPORTS, DATE_LOCALE, DATE_PICKER_HOST, DATE_RANGE_INPUT_ERROR_CODES, DATE_RANGE_INPUT_IMPORTS, DATE_TIME_FORMAT, DATE_TIME_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_LABELS, DATE_TIME_RANGE_INPUT_ERROR_CODES, DATE_TIME_RANGE_INPUT_IMPORTS, DEFAULT_ALERT_DIALOG_LABELS, DEFAULT_AVATAR_LABELS, DEFAULT_BANNER_LABELS, DEFAULT_BRACKET_LABELS, DEFAULT_BREADCRUMB_LABELS, DEFAULT_BREAKPOINTS, DEFAULT_CALENDAR_LABELS, DEFAULT_CALENDAR_RANGE_STRATEGY, DEFAULT_CAROUSEL_LABELS, DEFAULT_CASCADER_LABELS, DEFAULT_CHART_LABELS, DEFAULT_CHIP_LABELS, DEFAULT_COLOR_INPUT_LABELS, DEFAULT_COMMAND_PALETTE_LABELS, DEFAULT_COPY_BUTTON_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_DROPZONE_MAX_PREVIEW_FILE_SIZE, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_DEFAULTS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_LABELS, DEFAULT_KBD_LABELS, DEFAULT_LOADER_LABELS, DEFAULT_MATCH_CARD_START_TIME_FORMAT, DEFAULT_MATCH_LABELS, DEFAULT_NOTIFICATION_LABELS, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_NOTIFICATION_STATUS_ICONS, DEFAULT_PAGINATION_LABELS, DEFAULT_PHONE_INPUT_LABELS, DEFAULT_PROGRESS_STEP_LABELS, DEFAULT_QUERY_ERROR_LABELS, DEFAULT_RICH_TEXT_EDITOR_LABELS, DEFAULT_RICH_TEXT_EDITOR_TOOLS, DEFAULT_SCHEDULER_LABELS, DEFAULT_SELECT_LABELS, DEFAULT_SLIDER_LABELS, DEFAULT_STANDINGS_LABELS, DEFAULT_STAT_TILE_LABELS, DEFAULT_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DEFAULT_TREE_LABELS, DEFAULT_UNSAVED_CHANGES_LABELS, DESCRIPTION_IMPORTS, DESCRIPTION_LIST_IMPORTS, DESCRIPTION_LIST_VARIANTS, DIVIDER_IMPORTS, DROPZONE_ENTRY_STATUSES, DROPZONE_ERROR_CODES, DROPZONE_FILES_ERROR_KIND, DROPZONE_FILE_CONSTRAINTS, DROPZONE_FILE_REJECTION_REASONS, DROPZONE_IMPORTS, DROPZONE_LABELS, DURATION_INPUT_ERROR_CODES, DURATION_INPUT_IMPORTS, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DateInputComponent, DateInputDirective, DateInputFieldDirective, DatePickerPanelComponent, DatePickerSurfaceDirective, DatePickerTriggerDirective, DateRangeInputComponent, DateRangeInputDirective, DateRangeInputFieldDirective, DateTimeInputComponent, DateTimeInputDirective, DateTimeInputFieldDirective, DateTimeRangeInputComponent, DateTimeRangeInputDirective, DateTimeRangeInputFieldDirective, DescriptionComponent, DescriptionListComponent, DividerComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, EMPTY_STATE_IMPORTS, ET_BUILT_IN_ICON_NAMES, EYEDROPPER_ICON, EYE_ICON, EYE_SLASH_ICON, EmptyStateComponent, FACEBOOK_PLAYER_TOKEN, FIELD_WARNINGS, FIELD_WARNING_KIND, FILE_ICON, FILTER_ICON, FILTER_OVERLAY_ERROR_CODES, FILTER_OVERLAY_IMPORTS, FILTER_OVERLAY_LABELS, FILTER_OVERLAY_TOKEN, FLOATING_ACTION_ERROR_CODES, FLOATING_ACTION_IMPORTS, FLOATING_ACTION_STATES, FLOATING_ACTION_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_ERROR_MESSAGE_RESOLVER, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABELS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FORM_IMPORTS, FORM_WARNING_MESSAGE_RESOLVER, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormDirective, FormErrorComponent, FormFieldBarrierDirective, FormFieldComponent, FormFieldDirective, FormWarningComponent, GERMAN_COMMAND_PALETTE_LABELS, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_QUERY_ERROR_LABELS, GRID_2X2_ICON, GRID_DEBUG_IMPORTS, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemToolbarComponent, GridResizeDirective, HEADING_1_ICON, HEADING_2_ICON, HEADING_3_ICON, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, ICON_OVERRIDES_TOKEN, IMAGE_ICON, INHERIT_COLOR, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS$1 as INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KBD_IMPORTS, KBD_LABELS, KBD_PLATFORM, KICK_PLAYER_TOKEN, KbdComponent, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINE_CHART_ERROR_CODES, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_IMPORTS, LOADER_LABELS, LOCATION_ICON, LOCK_ICON, LabelDirective, LineChartComponent, LineChartDirective, LineChartSliceDirective, MASKED_INPUT_ERROR_CODES, MASKED_INPUT_IMPORTS, MASK_VALUE_MODES, MASONRY_ERROR_CODES, MASONRY_IMPORTS, MASONRY_TOKEN, MATCH_CARD_IMPORTS, MATCH_CARD_SIZES, MATCH_CARD_TOKEN, MATCH_ERROR_CODES, MATCH_LABELS, MATCH_PARTICIPANT_IMPORTS, MENU_ERROR_CODES, MENU_IMPORTS, MENU_ITEM_VARIANTS, MENU_SEARCH_IMPORTS, MENU_SELECTION_GROUP_MULTIPLE, MENU_SELECTION_GROUP_TOKEN, MENU_SELECTION_ITEM_KIND, MINUS_ICON, MULTI_LANGUAGE_RICH_TEXT_EDITOR_ERROR_CODES, MULTI_LANGUAGE_RICH_TEXT_EDITOR_IMPORTS, MasonryDirective, MasonryItemDirective, MatchCardComponent, MatchCardDirective, MatchCardGameScoresDirective, MatchCardMetaDirective, MatchCardScoreDirective, MatchParticipantComponent, MatchScoreComponent, MenuCheckboxGroupComponent, MenuCheckboxItemComponent, MenuComponent, MenuContextTriggerDirective, MenuDirective, MenuGroupLabelComponent, MenuItemComponent, MenuItemDirective, MenuItemShortcutComponent, MenuItemSubmenuIconComponent, MenuPanelDirective, MenuRadioGroupComponent, MenuRadioItemComponent, MenuSearchDirective, MenuSelectionGroupDirective, MenuSelectionItemDirective, MenuSeparatorComponent, MenuSurfaceDirective, MenuTriggerDirective, MultiLanguageRichTextEditorComponent, MultiLanguageRichTextEditorDirective, MultiLanguageRichTextEditorLanguageToolComponent, NAV_TABS_TOKEN, NAV_TAB_IMPORTS, NOTIFICATION_ACTION_SLOTS, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_LABELS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STACK_OVERLAY_LAYER, NOTIFICATION_STATUS, NO_STREAM_PLAYER_CAPABILITIES, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, NavTabLinkStylesComponent, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, NotificationSwipeToDismissDirective, NumberInputComponent, NumberInputDirective, OTP_INPUT_IMPORTS, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HAS_BACKDROP, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_NAV_TAB_IMPORTS, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OtpInputComponent, OtpInputDirective, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayNavTabLinkComponent, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGE_SIZE_SELECT_IMPORTS, PAGINATION_IMPORTS, PAGINATION_LABELS, PAGINATION_SIZES, PARAGRAPH_ICON, PASSWORD_INPUT_IMPORTS, PAUSE_ICON, PENCIL_ICON, PHONE_COUNTRIES, PHONE_INPUT_ERROR_CODES, PHONE_INPUT_IMPORTS, PHONE_INPUT_LABELS, PICTURE_IMPORTS, PICTURE_STATES, PIE_CHART_ERROR_CODES, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PROGRESS_STEPS_IMPORTS, PROGRESS_STEPS_ORIENTATIONS, PROGRESS_STEP_LABELS, PROGRESS_STEP_STATES, PageSizeSelectComponent, PagedQueryTriggerDirective, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PieChartComponent, PieChartDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, ProgressStepComponent, ProgressStepsComponent, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QUOTE_ICON, QueryButtonDirective, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_GROUP_IMPORTS, RADIO_VARIANTS, RATING_ERROR_CODES, RATING_IMPORTS, REDO_ICON, RICH_TEXT_EDITOR_FLOATING_TOOLBAR, RICH_TEXT_EDITOR_HEADING_OPTIONS, RICH_TEXT_EDITOR_IMPORTS, RICH_TEXT_EDITOR_INLINE_TOOLS, RICH_TEXT_EDITOR_LABELS, RICH_TEXT_EDITOR_LANGUAGE_TOOL, RICH_TEXT_EDITOR_LINK_EDITOR, RICH_TEXT_EDITOR_TOKEN_CODEC, RICH_TEXT_EDITOR_TOKEN_PALETTE_IMPORTS, RICH_TEXT_EDITOR_TOOL, RICH_TEXT_EDITOR_TOOLS, RICH_TEXT_EDITOR_TOOL_BUTTONS, RICH_TEXT_EDITOR_TRIGGERS_IMPORTS, ROTATE_RIGHT_ICON, RadioComponent, RadioGroupComponent, RangeSliderComponent, RangeSliderDirective, RatingComponent, RatingDirective, RatingIconDirective, RichTextEditorAlignToolComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, RichTextEditorFloatingToolbarDirective, RichTextEditorHeadingToolComponent, RichTextEditorImageEditorComponent, RichTextEditorImageToolComponent, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, RichTextViewerComponent, SANKEY_CHART_ERROR_CODES, SCHEDULER_EDIT_SURFACE_IMPORTS, SCHEDULER_ERROR_CODES, SCHEDULER_FEATURE_HOST, SCHEDULER_IMPORTS, SCHEDULER_LABELS, SCROLLABLE_DARKEN_IMPORTS, SCROLLABLE_DRAG_IMPORTS, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SCROLLABLE_NAVIGATION_IMPORTS, SCROLLBAR_ERROR_CODES, SCROLLBAR_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SEGMENTED_BUTTON_IMPORTS, SELECTION_CARD_CONTROL_POSITIONS, SELECTION_LIST_ERROR_CODES, SELECTION_LIST_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SELECT_ERROR_CODES, SELECT_FILTER_MODES, SELECT_IMPORTS, SELECT_LABELS, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_MARK_VALUE_ATTRIBUTE, SLIDER_TOKEN, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STANDINGS_ERROR_CODES, STANDINGS_IMPORTS, STANDINGS_LABELS, STANDINGS_PICK_IMPORTS, STAR_ICON, STAT_TILE_IMPORTS, STAT_TILE_LABELS, STREAM_ALL_IMPORTS, STREAM_CONSENT_TOKEN, STREAM_DAILYMOTION_IMPORTS, STREAM_DEFAULT_COMPONENTS, STREAM_ERROR_CODES, STREAM_FACEBOOK_IMPORTS, STREAM_IMPORTS, STREAM_KICK_IMPORTS, STREAM_LABELS, STREAM_PIP_IMPORTS, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_SOOP_IMPORTS, STREAM_TIKTOK_IMPORTS, STREAM_TWITCH_IMPORTS, STREAM_USER_CONSENT_PROVIDER_TOKEN, STREAM_VIMEO_IMPORTS, STREAM_YOUTUBE_IMPORTS, STRIKETHROUGH_ICON, SUPPORT_CONTENT_STATE, SUPPORT_TRANSITION_DIRECTION, SWITCH_IMPORTS, SankeyChartComponent, SankeyChartDirective, SankeyChartMarkDirective, SchedulerActionAddAppointmentDirective, SchedulerAgendaDirective, SchedulerAgendaViewComponent, SchedulerAppointmentDragDirective, SchedulerBadgeChainCountComponent, SchedulerBadgeChainCountDirective, SchedulerBadgeColorDotComponent, SchedulerBadgeColorDotDirective, SchedulerBadgeLocationComponent, SchedulerBadgeLocationDirective, SchedulerBadgeTimeRangeComponent, SchedulerBadgeTimeRangeDirective, SchedulerBadgeTitleComponent, SchedulerBadgeTitleDirective, SchedulerComponent, SchedulerDirective, SchedulerEditAddSubAppointmentItemComponent, SchedulerEditColorComponent, SchedulerEditDeleteItemComponent, SchedulerEditDescriptionComponent, SchedulerEditLocationComponent, SchedulerEditSurfaceActionsComponent, SchedulerEditSurfaceBreadcrumbComponent, SchedulerEditSurfaceChildrenComponent, SchedulerEditSurfaceComponent, SchedulerEditSurfaceDirective, SchedulerEditSurfaceFieldsComponent, SchedulerEditSurfaceFooterComponent, SchedulerEditSurfaceHeaderComponent, SchedulerEditTimeRangeComponent, SchedulerEditTitleComponent, SchedulerMonthDirective, SchedulerMonthViewComponent, SchedulerSwipeNavigationDirective, SchedulerTimeGridDirective, SchedulerTimeGridViewComponent, ScrollableActiveChildDirective, ScrollableButtonsComponent, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksComponent, ScrollableNavigationComponent, ScrollableNavigationDirective, ScrollableSnapDirective, ScrollbarComponent, ScrollbarDirective, ScrollbarThumbDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectAllOptionComponent, SelectAllOptionDirective, SelectComponent, SelectDirective, SelectEmptyDirective, SelectErrorDirective, SelectListboxDirective, SelectLoadingDirective, SelectOptionComponent, SelectOptionDirective, SelectOptionGroupComponent, SelectOptionGroupDirective, SelectOptionTemplateDirective, SelectOptionsDirective, SelectPanelComponent, SelectSearchDirective, SelectSurfaceDirective, SelectTriggerDirective, SelectValueDirective, SelectViewportDirective, SelectVirtualOptionComponent, SelectVirtualOptionDirective, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SkeletonComponent, SkeletonItemComponent, SkeletonTextComponent, SliderComponent, SliderDirective, SliderThumbDirective, SliderThumbLabelDirective, SliderTrackDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, SplitButtonActionDirective, SplitButtonComponent, SplitButtonDirective, SplitButtonTriggerDirective, StandingsComponent, StandingsDirective, StandingsPickComponent, StandingsPickDirective, StandingsPickMarkDirective, StatTileComponent, StatTileSparklineComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TABLE_CELL_ERROR_TOOLTIP_IMPORTS, TABLE_COLUMN_CHOOSER_IMPORTS, TABLE_COLUMN_MENU_IMPORTS, TABLE_CSV_EXPORT_IMPORTS, TABLE_DRAG_SCROLL_IMPORTS, TABLE_ERROR_CODES, TABLE_FEATURE_HOST, TABLE_FILTER_IMPORTS, TABLE_GROUP_HEADERS_IMPORTS, TABLE_ICON, TABLE_IMPORTS, TABLE_INLINE_EDIT_IMPORTS, TABLE_KEYBOARD_NAV_IMPORTS, TABLE_LABELS, TABLE_PAGE_STICKY_HEADER_IMPORTS, TABLE_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_ROW_EXPANSION_IMPORTS, TABLE_ROW_ROUTER_LINK_IMPORTS, TABLE_SELECTION_IMPORTS, TABLE_SKELETON_IMPORTS, TABLE_STATE_PERSISTENCE_IMPORTS, TABLE_STICKY_COLUMNS_IMPORTS, TABLE_VIRTUAL_SCROLL_IMPORTS, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_IMPORTS, TAB_PANEL_TOKEN, TAB_SIZES, TAG_INPUT_ERROR_CODES, TAG_INPUT_IMPORTS, TEXTAREA_IMPORTS, TEXTAREA_RESIZE_MODES, TEXT_ALIGNS, TEXT_FIELD_CONTROL_INPUTS, THUMBTACK_ICON, TIKTOK_PLAYER_TOKEN, TIMELINE_IMPORTS, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TIME_RANGE_INPUT_ERROR_CODES, TIME_RANGE_INPUT_IMPORTS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLBAR_IMPORTS, TOOLBAR_ORIENTATIONS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRASH_ICON, TREE_ERROR_CODES, TREE_IMPORTS, TREE_LABELS, TREE_LEVEL_STATUSES, TREE_MARKERS, TREE_SELECTION_MODES, TRIANGLE_EXCLAMATION_ICON, TROPHY_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCardSurfaceDirective, TableCellDirective, TableCellEditDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableCsvExportDirective, TableDetailStylesComponent, TableDragScrollDirective, TableDragScrollStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableGroupHeaderRowComponent, TableGroupHeadersDirective, TableHeaderCellDirective, TableInlineEditDirective, TableInlineEditStylesComponent, TableKeyboardNavDirective, TablePageStickyHeaderDirective, TablePageStickyHeaderStylesComponent, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableRowBoxStylesComponent, TableRowDetailComponent, TableRowExpansionDirective, TableRowRouterLinkDirective, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableSkeletonDirective, TableSkeletonRowsComponent, TableStatePersistenceDirective, TableStickyColumnsDirective, TableStickyColumnsStylesComponent, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerComponent, TimePickerDirective, TimePickerRingDirective, TimePickerRingHandleDirective, TimeRangeInputComponent, TimeRangeInputDirective, TimeRangeInputFieldDirective, TimelineComponent, TimelineItemComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, ToolbarComponent, ToolbarDirective, TooltipComponent, TooltipDirective, TreeComponent, TreeDirective, TreeMarkerComponent, TreeNodeDefDirective, TreeNodeDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNDO_ICON, UNSAVED_CHANGES_LABELS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WCAG_CONTRAST_RATIOS, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, bottomSheetOverlayStrategy, bracketFitsWidth, bracketNaturalWidth, buildAnchoredRuntimePositionStrategy, canHaveChildren, canonicalKbdKey, cascaderFromQuery, centeredOverlayStrategy, clearLeavingSupportStateOnExit, colorContrast, commandPaletteLabelsForLocale, countDescendants, createAlertDialogOpener, createAnchoredPanelController, createCardMask, createCommandPaletteOpener, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createFixedLengthRangeStrategy, createGridAdapter, createIbanMask, createNormalizedBracketMatch, createNotificationPromiseFn, createNotificationRef, createOverlayOpener, createOverlaySingleSlot, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createSchedulerRegistry, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableRowsState, createTableStateStorage, createV2DropzoneUpload, createWeekRangeStrategy, dateBounds, dateRangeBounds, dateRangeOrder, dateTimeBounds, dateTimeRangeBounds, dateTimeRangeOrder, defaultCompareWith$1 as defaultCompareWith, defaultDropzoneRejectionMessage, defaultSankeyChartLinkKeyHint, defineOverlay, defineQueryParamOverlay, describeBracketSlot, deserializeGridLayout, deserializeTableState, detectKbdPlatform, dialogOverlayStrategy, disposeDropzoneEntry, doubleEliminationBracketLayout, dropzoneFiles, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, filterValues, findNextRelevantHtmlElement, focusFirstInvalidField, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateRoundTypeFromEthleteRoundType, generateTournamentModeFromEthleteRounds, getClosestOverlay, getColorContrastRatio, getOriginCoordinatesAndDimensions, hexColor, hitsInteractiveElement, iconRegistryKey, injectAlertDialogLabels, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectAvatarLabels, injectBannerLabels, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBracketLabels, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChartLabels, injectChipLabels, injectColorInputLabels, injectCommandPalette, injectCommandPaletteLabels, injectCommandPaletteRegistry, injectCopyButtonLabels, injectDateFormat, injectDateLocale, injectDateTimeFormat, injectDateTimeLabels, injectDateTimeZone, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldDefaults, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectKbdLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectMatchLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectProgressStepLabels, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSchedulerEditSurface, injectSchedulerEditSurfaceOpener, injectSchedulerFeatureHost, injectSchedulerLabels, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStandingsLabels, injectStatTileLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamPlayerSlot, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableCsvExport, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, injectTreeLabels, injectUnsavedChangesLabels, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isRestorableTableState, isTargetInsideOverlayTree, isTouchEvent, kbdKeyLabel, kbdKeyName, lastDaysPreset, lastMonthPreset, lastWeekPreset, leftSheetOverlayStrategy, legacyQueryErrorSource, mapGridLayout, matchCountryByDialCode, matchParticipantDisplayName, matchedDialPrefix, matchesKbdChord, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, mergeTableCsvExportOptions, mirroredDoubleEliminationBracketLayout, mirroredSingleEliminationBracketLayout, missingStreamSourceError, mountNavTabLinkStyles, nextDaysPreset, normalizeEthleteBracketMatch, normalizeEthleteGroupRanking, normalizeEthleteMatch, normalizeEthleteMatchStatus, normalizeEthleteMedia, normalizeEthleteParticipant, normalizeEthletePlacement, normalizePictureSizes, normalizePictureSource, numberInputStepMultiplierFrom, overlayResult, paginate, parseKbdKeys, phoneCountryFlag, phoneCountryName, provideAlertDialogLabels, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideAvatarLabels, provideBannerLabels, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBracketLabels, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChartLabels, provideChipLabels, provideColorInputLabels, provideCommandPaletteLabels, provideCommandPaletteRegistry, provideCopyButtonLabels, provideDateFormat, provideDateLocale, provideDateTimeFormat, provideDateTimeLabels, provideDateTimeZone, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldDefaults, provideFormFieldLabels, provideFormSupport, provideFormWarningMessageResolver, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideKbdLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideMatchLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideProgressStepLabels, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorAutoformat, provideRichTextEditorBlockquoteTool, provideRichTextEditorCodeBlockTool, provideRichTextEditorDefaultTools, provideRichTextEditorFloatingToolbar, provideRichTextEditorHeadingTool, provideRichTextEditorImageTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorLinkEditor, provideRichTextEditorLinkTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTool, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSchedulerEditSurface, provideSchedulerLabels, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStandingsLabels, provideStatTileLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPip, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, provideTreeLabels, provideUnsavedChangesAlertDialog, provideUnsavedChangesLabels, queryButtonSourceFromV2Query, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, quickFilterRows, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerCommands, registerSingleton, rejectionMessage, requiredLanguages, resolveBracketLayout, resolveClosestOverlay, resolveFilterOverlaySubmitButton, resolveNormalizedMatchSideState, resolveNotificationStatusIcon, resolveOverlayHasBackdrop, resolveTableCsvRows, rgbColor, richTextEditorToolLabel, rightSheetOverlayStrategy, schedulerFeatureConfig, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, singleEliminationBracketLayout, sortRows, startOfCalendarUnit, stripTrunkZero, supportPresentationIncludesState, swissBracketLayout, tableCsvRowsFromPages, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, tableToCsv, thisMonthPreset, thisWeekPreset, thisYearPreset, timeBounds, timeRangeBounds, timeRangeOrder, toFieldWarnings, toGridPosition, toNotificationContent, toPictureDimension, todayPreset, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, warn, wireFormSupport, withPictureBaseUrl, yesterdayPreset };
75888
76402
  //# sourceMappingURL=ethlete-components.mjs.map