@ethlete/components 1.0.0-next.37 → 1.0.0-next.39

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.
@@ -4,9 +4,9 @@ import * as i1 from '@ethlete/core';
4
4
  import { injectHostElement, RuntimeError, createComponentId, ProvideColorDirective, defineLabels, toProvideFn, toInjectFn, toToken, injectStyleManager, SurfaceInteractiveDirective, createCanAnimateSignal, ColorInteractiveDirective, injectSuccessTheme, injectWarningTheme, injectErrorTheme, injectLocale, defineStaticRootProvider, inferMimeType, injectColorThemes, injectRenderer, ProvideSurfaceDirective, COLOR_PROVIDER, SURFACE_PROVIDER, injectSurfaceThemes, injectSurfaceThemesPrefix, injectSurfaceContextTracker, injectBoundaryElement, ANIMATED_LIFECYCLE_TOKEN, resolveAppRootColorProvider, resolveSurfaceByElevation, createCssSurfaceName, provideBoundaryElement, AnimatedLifecycleDirective, injectBreakpointObserver, isHTMLElement, equal, animationDebugLog, defineRootProvider, injectOverlayRuntime, anchoredOverlayPosition, enableAnchoredOverlayPositionExtras, randomId, forceReflow, nextFrame, elementCanScroll, matchesReducedMotion, createSwipeTracker, ScrollObserverDirective, signalElementScrollState, ScrollObserverStartDirective, ScrollObserverEndDirective, applyHostListener, injectQueryParam, createUnsavedChangesTracker, createDocumentElementSignal, defineProvider, fromNextFrame, injectRoute, AnimatedIfDirective, signalElementDimensions, applyInitialFocus, syncSignal, AutoSurfaceDirective, setInputSignal, injectTemplateRef, signalHostElementScrollState, applyStructuredDataBinding, typedBreakpointTransform, signalElementChildren, signalElementIntersection, signalHostAttributes, signalHostClasses, signalHostStyles, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, signalClasses, useCursorDragScroll, signalStyles, getScrollSnapTarget, injectPrefersReducedMotion, injectIsDocumentVisible, signalHostElementIntersection, clamp as clamp$1, copyToClipboard, injectAnimatedBlockSize, injectObserveBreakpoint, AnimatableDirective, ColorInteractiveContainerDirective, ColorInteractiveExcludeDirective, createFlipAnimation, createFlipAnimationGroup, ColorInteractiveHasFocusDirective, htmlToMarkdown, markdownToHtml, injectHasTouchInput, signalHostElementDimensions, DragHandleDirective, ResizeHandlesComponent, numberBreakpointTransform, applyLinkBinding, applyHeadTitleBinding, injectViewportSize, injectFocusVisibleTracker, getFocusableElements, dragGestureFrom, injectRouterEvent, canUseSessionMemory, createAutoSessionMemoryKey, createSessionMemory } from '@ethlete/core';
5
5
  import { NgTemplateOutlet, NgComponentOutlet, Location, DOCUMENT as DOCUMENT$1, isPlatformBrowser } from '@angular/common';
6
6
  import { DomSanitizer } from '@angular/platform-browser';
7
- import { format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, setYear, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, parse, isValid, setSeconds, setMinutes, setHours, setMilliseconds, endOfDay, eachDayOfInterval } from 'date-fns';
7
+ import { format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, setYear, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, parse, isValid, setSeconds, setMinutes, setHours, setMilliseconds, endOfDay, eachDayOfInterval, addHours } from 'date-fns';
8
8
  import { takeUntilDestroyed, toObservable, toSignal, outputFromObservable, outputToObservable, rxResource } from '@angular/core/rxjs-interop';
9
- import { Subject, take, tap, timer, takeUntil, fromEvent, filter, combineLatest, switchMap, map, distinctUntilChanged, EMPTY, debounceTime, merge, defer, finalize, of, isObservable, from, catchError, firstValueFrom, concat, scan, interval, animationFrameScheduler, EmptyError, exhaustMap, Observable, shareReplay, defaultIfEmpty, expand, toArray } from 'rxjs';
9
+ import { Subject, take, tap, timer, takeUntil, fromEvent, filter, combineLatest, switchMap, map, distinctUntilChanged, EMPTY, debounceTime, merge, defer, finalize, of, isObservable, from, catchError, firstValueFrom, concat, scan, interval, animationFrameScheduler, EmptyError, exhaustMap, Observable, shareReplay, defaultIfEmpty, expand, toArray, mergeMap } from 'rxjs';
10
10
  import * as i1$1 from '@angular/router';
11
11
  import { Router, RouterLink, RouterLinkActive, NavigationEnd } from '@angular/router';
12
12
  import { withArgs, queryStateSignal, isQueryStateSuccess, isQueryStateFailure, isQueryStateLoading, executeUntilSettled, extractQuery, queryComputed, detectPaginationShape, isDateShapedLeaf, collectLeafPaths, QUERY_DEVTOOLS_FAULT_STATUSES, clearQueryDevtoolsFaults, setQueryDevtoolsFault, queryDevtoolsEntries, queryDevtoolsFaults, EMPTY_QUERY_DEVTOOLS_FAULT, isQueryDevtoolsFaultArmed, measureQueryDevtoolsPayload, createQueryErrorResponse, sumQueryDevtoolsStats, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleEn, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToTitleDe, queryErrorMessages } from '@ethlete/query';
@@ -1108,6 +1108,7 @@ const ET_BUILT_IN_ICON_NAMES = [
1108
1108
  'et-strikethrough',
1109
1109
  'et-table',
1110
1110
  'et-times',
1111
+ 'et-trash',
1111
1112
  'et-triangle-exclamation',
1112
1113
  'et-trophy',
1113
1114
  'et-underline',
@@ -1535,6 +1536,29 @@ const TIMES_ICON = {
1535
1536
  `,
1536
1537
  };
1537
1538
 
1539
+ const TRASH_ICON = {
1540
+ name: 'et-trash',
1541
+ data: `
1542
+ <svg
1543
+ width="100%"
1544
+ height="100%"
1545
+ xmlns="http://www.w3.org/2000/svg"
1546
+ viewBox="0 0 24 24"
1547
+ fill="none"
1548
+ stroke="currentColor"
1549
+ stroke-width="1.8"
1550
+ stroke-linecap="round"
1551
+ stroke-linejoin="round"
1552
+ >
1553
+ <path d="M4 7h16" />
1554
+ <path d="M9 7V4.5A1.5 1.5 0 0 1 10.5 3h3A1.5 1.5 0 0 1 15 4.5V7" />
1555
+ <path d="M6 7l1 13a2 2 0 0 0 2 1.9h6a2 2 0 0 0 2-1.9l1-13" />
1556
+ <path d="M10 11v6" />
1557
+ <path d="M14 11v6" />
1558
+ </svg>
1559
+ `,
1560
+ };
1561
+
1538
1562
  // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
1539
1563
  const TRIANGLE_EXCLAMATION_ICON = {
1540
1564
  name: 'et-triangle-exclamation',
@@ -8488,11 +8512,6 @@ const swissBracketLayout = (options = {}) => ({
8488
8512
  styles: [BracketSwissStylesComponent],
8489
8513
  });
8490
8514
 
8491
- // TODO(bracket): curate the public surface once the default cards are built - `./core` and
8492
- // `./linked` currently re-export internal engine builders (createBracket, relations, base
8493
- // map/round/match builders) alongside the public data types. Narrow to the types consumers
8494
- // actually need (data source, round/match/participant, swiss group, enums) at that point.
8495
-
8496
8515
  class FabComponent {
8497
8516
  constructor() {
8498
8517
  this.buttonDir = inject(ButtonDirective);
@@ -9626,6 +9645,7 @@ const buildAnchoredRuntimePositionStrategy = (options = {}) => (origin) => {
9626
9645
  viewportPadding: options.viewportPadding,
9627
9646
  shift: options.shift,
9628
9647
  autoResize: options.autoResize,
9648
+ minAvailableSpace: options.minAvailableSpace,
9629
9649
  autoHide: options.autoHide,
9630
9650
  autoCloseIfReferenceHidden: options.autoCloseIfReferenceHidden,
9631
9651
  mirrorWidth: options.mirrorWidth,
@@ -9825,7 +9845,7 @@ const injectAnchoredDialogStrategy = /* @__PURE__ */ toInjectFn(ANCHORED_DIALOG_
9825
9845
  const anchoredDialogOverlayStrategy = (options = {}) => {
9826
9846
  return () => {
9827
9847
  const strategyProvider = injectAnchoredDialogStrategy();
9828
- const { placement, fallbackPlacements, offset, arrowPadding, viewportPadding, shift, autoResize, autoHide, autoCloseIfReferenceHidden, mirrorWidth, positionStrategy, ...breakpointConfig } = options;
9848
+ const { placement, fallbackPlacements, offset, arrowPadding, viewportPadding, shift, autoResize, minAvailableSpace, autoHide, autoCloseIfReferenceHidden, mirrorWidth, positionStrategy, ...breakpointConfig } = options;
9829
9849
  const config = {
9830
9850
  ...breakpointConfig,
9831
9851
  positionStrategy: positionStrategy ??
@@ -9837,6 +9857,7 @@ const anchoredDialogOverlayStrategy = (options = {}) => {
9837
9857
  viewportPadding,
9838
9858
  shift: shift ?? DEFAULT_ANCHORED_DIALOG_POSITION.shift,
9839
9859
  autoResize: autoResize ?? DEFAULT_ANCHORED_DIALOG_POSITION.autoResize,
9860
+ minAvailableSpace,
9840
9861
  autoHide,
9841
9862
  autoCloseIfReferenceHidden,
9842
9863
  mirrorWidth,
@@ -11159,6 +11180,8 @@ class OverlayDirective {
11159
11180
  this.viewportPadding = input(8, /* @ts-ignore */
11160
11181
  ...(ngDevMode ? [{ debugName: "viewportPadding" }] : /* istanbul ignore next */ []));
11161
11182
  this.autoResize = input(false, { ...(ngDevMode ? { debugName: "autoResize" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
11183
+ this.minAvailableSpace = input(undefined, /* @ts-ignore */
11184
+ ...(ngDevMode ? [{ debugName: "minAvailableSpace" }] : /* istanbul ignore next */ []));
11162
11185
  this.shift = input(true, { ...(ngDevMode ? { debugName: "shift" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
11163
11186
  this.autoHide = input(false, { ...(ngDevMode ? { debugName: "autoHide" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
11164
11187
  this.autoCloseIfReferenceHidden = input(false, { ...(ngDevMode ? { debugName: "autoCloseIfReferenceHidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -11287,6 +11310,7 @@ class OverlayDirective {
11287
11310
  offset: this.offset(),
11288
11311
  viewportPadding: this.viewportPadding(),
11289
11312
  autoResize: this.autoResize(),
11313
+ minAvailableSpace: this.minAvailableSpace(),
11290
11314
  shift: this.shift(),
11291
11315
  autoHide: this.autoHide(),
11292
11316
  autoCloseIfReferenceHidden: this.autoCloseIfReferenceHidden(),
@@ -11311,7 +11335,7 @@ class OverlayDirective {
11311
11335
  .subscribe();
11312
11336
  }
11313
11337
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: OverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
11314
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: OverlayDirective, isStandalone: true, selector: "[etOverlay]", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disableClose: { classPropertyName: "disableClose", publicName: "disableClose", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, restoreFocus: { classPropertyName: "restoreFocus", publicName: "restoreFocus", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsidePointer: { classPropertyName: "closeOnOutsidePointer", publicName: "closeOnOutsidePointer", isSignal: true, isRequired: false, transformFunction: null }, hostClass: { classPropertyName: "hostClass", publicName: "hostClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, fallbackPlacements: { classPropertyName: "fallbackPlacements", publicName: "fallbackPlacements", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, viewportPadding: { classPropertyName: "viewportPadding", publicName: "viewportPadding", isSignal: true, isRequired: false, transformFunction: null }, autoResize: { classPropertyName: "autoResize", publicName: "autoResize", isSignal: true, isRequired: false, transformFunction: null }, shift: { classPropertyName: "shift", publicName: "shift", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "autoHide", isSignal: true, isRequired: false, transformFunction: null }, autoCloseIfReferenceHidden: { classPropertyName: "autoCloseIfReferenceHidden", publicName: "autoCloseIfReferenceHidden", isSignal: true, isRequired: false, transformFunction: null }, mirrorWidth: { classPropertyName: "mirrorWidth", publicName: "mirrorWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { properties: { "attr.data-overlay-open": "open() || null", "attr.data-overlay-mode": "mode()" } }, exportAs: ["etOverlay"], ngImport: i0 }); }
11338
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: OverlayDirective, isStandalone: true, selector: "[etOverlay]", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disableClose: { classPropertyName: "disableClose", publicName: "disableClose", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, restoreFocus: { classPropertyName: "restoreFocus", publicName: "restoreFocus", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsidePointer: { classPropertyName: "closeOnOutsidePointer", publicName: "closeOnOutsidePointer", isSignal: true, isRequired: false, transformFunction: null }, hostClass: { classPropertyName: "hostClass", publicName: "hostClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, fallbackPlacements: { classPropertyName: "fallbackPlacements", publicName: "fallbackPlacements", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, viewportPadding: { classPropertyName: "viewportPadding", publicName: "viewportPadding", isSignal: true, isRequired: false, transformFunction: null }, autoResize: { classPropertyName: "autoResize", publicName: "autoResize", isSignal: true, isRequired: false, transformFunction: null }, minAvailableSpace: { classPropertyName: "minAvailableSpace", publicName: "minAvailableSpace", isSignal: true, isRequired: false, transformFunction: null }, shift: { classPropertyName: "shift", publicName: "shift", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "autoHide", isSignal: true, isRequired: false, transformFunction: null }, autoCloseIfReferenceHidden: { classPropertyName: "autoCloseIfReferenceHidden", publicName: "autoCloseIfReferenceHidden", isSignal: true, isRequired: false, transformFunction: null }, mirrorWidth: { classPropertyName: "mirrorWidth", publicName: "mirrorWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { properties: { "attr.data-overlay-open": "open() || null", "attr.data-overlay-mode": "mode()" } }, exportAs: ["etOverlay"], ngImport: i0 }); }
11315
11339
  }
11316
11340
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: OverlayDirective, decorators: [{
11317
11341
  type: Directive,
@@ -11323,7 +11347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
11323
11347
  '[attr.data-overlay-mode]': 'mode()',
11324
11348
  },
11325
11349
  }]
11326
- }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], disableClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableClose", required: false }] }], autoFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFocus", required: false }] }], restoreFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "restoreFocus", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], closeOnOutsidePointer: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnOutsidePointer", required: false }] }], hostClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "hostClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], fallbackPlacements: [{ type: i0.Input, args: [{ isSignal: true, alias: "fallbackPlacements", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], viewportPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportPadding", required: false }] }], autoResize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoResize", required: false }] }], shift: [{ type: i0.Input, args: [{ isSignal: true, alias: "shift", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHide", required: false }] }], autoCloseIfReferenceHidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoCloseIfReferenceHidden", required: false }] }], mirrorWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorWidth", required: false }] }] } });
11350
+ }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], disableClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableClose", required: false }] }], autoFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFocus", required: false }] }], restoreFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "restoreFocus", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], closeOnOutsidePointer: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnOutsidePointer", required: false }] }], hostClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "hostClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], fallbackPlacements: [{ type: i0.Input, args: [{ isSignal: true, alias: "fallbackPlacements", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], viewportPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportPadding", required: false }] }], autoResize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoResize", required: false }] }], minAvailableSpace: [{ type: i0.Input, args: [{ isSignal: true, alias: "minAvailableSpace", required: false }] }], shift: [{ type: i0.Input, args: [{ isSignal: true, alias: "shift", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHide", required: false }] }], autoCloseIfReferenceHidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoCloseIfReferenceHidden", required: false }] }], mirrorWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorWidth", required: false }] }] } });
11327
11351
 
11328
11352
  class OverlayAnchorDirective {
11329
11353
  constructor() {
@@ -18266,6 +18290,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
18266
18290
 
18267
18291
  const DESCRIPTION_LIST_IMPORTS = [DescriptionListComponent];
18268
18292
 
18293
+ /**
18294
+ * A thin rule between two groups of content or controls, announced as a separator.
18295
+ *
18296
+ * A `vertical` divider sizes itself from its parent's cross axis, so it needs a flex or grid parent
18297
+ * (or an explicit `block-size`) to be visible. Set `decorative` when the grouping is already clear
18298
+ * from the surrounding markup - the rule then carries no semantics at all.
18299
+ *
18300
+ * @example
18301
+ * <et-divider />
18302
+ *
18303
+ * @example
18304
+ * <div class="flex items-center">
18305
+ * <button et-button>Save</button>
18306
+ * <et-divider orientation="vertical" decorative />
18307
+ * <button et-button>Discard</button>
18308
+ * </div>
18309
+ */
18310
+ class DividerComponent {
18311
+ constructor() {
18312
+ this.orientation = input('horizontal', /* @ts-ignore */
18313
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
18314
+ this.decorative = input(false, { ...(ngDevMode ? { debugName: "decorative" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
18315
+ }
18316
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18317
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: DividerComponent, isStandalone: true, selector: "et-divider", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, decorative: { classPropertyName: "decorative", publicName: "decorative", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-orientation": "orientation()", "attr.role": "decorative() ? \"presentation\" : \"separator\"", "attr.aria-orientation": "decorative() ? null : orientation()", "attr.aria-hidden": "decorative() ? \"true\" : null" }, classAttribute: "et-divider" }, ngImport: i0, template: ``, isInline: true, styles: ["@layer components{@property --et-divider-thickness{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-divider-spacing{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-divider-inset{syntax: \"<length>\"; inherits: true; initial-value: 0px;}.et-divider{display:block;flex:none;background:var(--et-divider-color, var(--et-surface-border-solid, rgb(255 255 255 / .1)));block-size:var(--et-divider-thickness);margin-block:var(--et-divider-spacing);margin-inline:var(--et-divider-inset)}.et-divider:where([data-orientation=vertical]){align-self:stretch;block-size:auto;inline-size:var(--et-divider-thickness);margin-block:var(--et-divider-inset);margin-inline:var(--et-divider-spacing)}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
18318
+ }
18319
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DividerComponent, decorators: [{
18320
+ type: Component,
18321
+ args: [{ selector: 'et-divider', template: ``, encapsulation: ViewEncapsulation.None, host: {
18322
+ class: 'et-divider',
18323
+ '[attr.data-orientation]': 'orientation()',
18324
+ '[attr.role]': 'decorative() ? "presentation" : "separator"',
18325
+ '[attr.aria-orientation]': 'decorative() ? null : orientation()',
18326
+ '[attr.aria-hidden]': 'decorative() ? "true" : null',
18327
+ }, styles: ["@layer components{@property --et-divider-thickness{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-divider-spacing{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-divider-inset{syntax: \"<length>\"; inherits: true; initial-value: 0px;}.et-divider{display:block;flex:none;background:var(--et-divider-color, var(--et-surface-border-solid, rgb(255 255 255 / .1)));block-size:var(--et-divider-thickness);margin-block:var(--et-divider-spacing);margin-inline:var(--et-divider-inset)}.et-divider:where([data-orientation=vertical]){align-self:stretch;block-size:auto;inline-size:var(--et-divider-thickness);margin-block:var(--et-divider-inset);margin-inline:var(--et-divider-spacing)}}\n"] }]
18328
+ }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], decorative: [{ type: i0.Input, args: [{ isSignal: true, alias: "decorative", required: false }] }] } });
18329
+
18330
+ const DIVIDER_IMPORTS = [DividerComponent];
18331
+
18269
18332
  /**
18270
18333
  * A placeholder for a section or page that currently has nothing to show - no results, an empty
18271
18334
  * list, a not-yet-configured feature. Project an icon via `[etIcon]`, set `title`/`description`,
@@ -18463,7 +18526,7 @@ const provideFilterOverlay = (config) => [{ provide: FILTER_OVERLAY_TOKEN, useFa
18463
18526
  * The filter overlay provided above this component, typed to your filters' **value** shape:
18464
18527
  *
18465
18528
  * ```ts
18466
- * const createTeamFilters = () => createQueryForm({ fields: TEAM_FILTER_FIELDS });
18529
+ * const createTeamFilters = () => defineQueryForm({ fields: TEAM_FILTER_FIELDS });
18467
18530
  * type TeamFilterValue = FilterOverlayValueOf<ReturnType<typeof createTeamFilters>>;
18468
18531
  *
18469
18532
  * protected filters = injectFilterOverlay<TeamFilterValue>();
@@ -19892,9 +19955,9 @@ const createTypeahead = (resetDelay = 500) => {
19892
19955
 
19893
19956
  /** Whether a node can be drilled into - false for explicit leaves and `hasChildren: false`. */
19894
19957
  const canHaveChildren = (node) => node.isLeaf !== true && node.hasChildren !== false;
19895
- const defaultCompareWith = (a, b) => a === b;
19958
+ const defaultCompareWith$1 = (a, b) => a === b;
19896
19959
  /** Value equality between two nodes via the configured comparator. */
19897
- const nodesEqual = (options) => {
19960
+ const nodesEqual$1 = (options) => {
19898
19961
  const { a, b, compareWith } = options;
19899
19962
  return a !== null && b !== null && compareWith(a.value, b.value);
19900
19963
  };
@@ -19904,7 +19967,7 @@ const indexOfNode = (options) => {
19904
19967
  return node === null ? -1 : nodes.findIndex((candidate) => compareWith(candidate.value, node.value));
19905
19968
  };
19906
19969
  /** Normalizes a `loadChildren` result (array | Promise | Observable) into an Observable. */
19907
- const toChildrenObservable = (result) => {
19970
+ const toChildrenObservable$1 = (result) => {
19908
19971
  if (Array.isArray(result)) {
19909
19972
  return of(result);
19910
19973
  }
@@ -19983,7 +20046,7 @@ class CascaderDirective {
19983
20046
  this.selectableLevels = input(CASCADER_SELECTABLE_LEVELS.LEAF, /* @ts-ignore */
19984
20047
  ...(ngDevMode ? [{ debugName: "selectableLevels" }] : /* istanbul ignore next */ []));
19985
20048
  /** Value equality - override when values are objects. */
19986
- this.compareWith = input(defaultCompareWith, /* @ts-ignore */
20049
+ this.compareWith = input(defaultCompareWith$1, /* @ts-ignore */
19987
20050
  ...(ngDevMode ? [{ debugName: "compareWith" }] : /* istanbul ignore next */ []));
19988
20051
  /**
19989
20052
  * Turns a `loadChildren` / `search` failure into the error text shown in the panel. The default
@@ -20199,13 +20262,10 @@ class CascaderDirective {
20199
20262
  ...anchoredOverlayStrategy({
20200
20263
  containerClass: ['et-overlay--anchored', 'et-overlay--cascader'],
20201
20264
  placement: 'bottom-start',
20202
- // prefer flipping the alignment on the same side (right-align under the field) before
20203
- // flipping up, so a field near the right viewport edge opens bottom-end, not shifted
20204
- fallbackPlacements: ['bottom-end', 'top-start', 'top-end'],
20205
20265
  offset: 4,
20206
20266
  viewportPadding: 8,
20207
20267
  autoResize: true,
20208
- shift: { crossAxis: true },
20268
+ minAvailableSpace: 160,
20209
20269
  mirrorWidth: this.mirrorPanelWidth(),
20210
20270
  })().map((entry) => ({ ...entry, breakpoint: 'md' })),
20211
20271
  ],
@@ -20463,7 +20523,7 @@ class CascaderDirective {
20463
20523
  }
20464
20524
  /** Whether a node is expanded (its children fill the next column). */
20465
20525
  isExpanded(node, columnIndex) {
20466
- return nodesEqual({ a: this.openPath()[columnIndex] ?? null, b: node, compareWith: this.compareWith() });
20526
+ return nodesEqual$1({ a: this.openPath()[columnIndex] ?? null, b: node, compareWith: this.compareWith() });
20467
20527
  }
20468
20528
  /**
20469
20529
  * Activates a node from a pointer/keyboard interaction: drills into branches, commits leaves.
@@ -20786,7 +20846,7 @@ class CascaderDirective {
20786
20846
  if (!canHaveChildren(node) || visited.some((seen) => compareWith(seen.value, node.value))) {
20787
20847
  return false;
20788
20848
  }
20789
- const children = this.knownChildren().find((entry) => nodesEqual({ a: entry.parent, b: node, compareWith }))?.children;
20849
+ const children = this.knownChildren().find((entry) => nodesEqual$1({ a: entry.parent, b: node, compareWith }))?.children;
20790
20850
  const selectable = children?.filter((child) => !child.disabled) ?? [];
20791
20851
  return selectable.length > 0 && selectable.every((child) => this.isFullySelected(child, [...visited, node]));
20792
20852
  }
@@ -20887,7 +20947,7 @@ class CascaderDirective {
20887
20947
  }
20888
20948
  this.loadSubscriptions.get(columnIndex)?.unsubscribe();
20889
20949
  this.setColumn(columnIndex, { parent, status: 'loading', nodes: [], error: null });
20890
- const subscription = toChildrenObservable(source.loadChildren(parent))
20950
+ const subscription = toChildrenObservable$1(source.loadChildren(parent))
20891
20951
  .pipe(take(1), tap({
20892
20952
  next: (nodes) => {
20893
20953
  this.setColumn(columnIndex, { parent, status: 'loaded', nodes, error: null });
@@ -20905,7 +20965,7 @@ class CascaderDirective {
20905
20965
  rememberChildren(parent, children) {
20906
20966
  const compareWith = this.compareWith();
20907
20967
  this.knownChildren.update((entries) => [
20908
- ...entries.filter((entry) => parent === null ? entry.parent !== null : !nodesEqual({ a: entry.parent, b: parent, compareWith })),
20968
+ ...entries.filter((entry) => parent === null ? entry.parent !== null : !nodesEqual$1({ a: entry.parent, b: parent, compareWith })),
20909
20969
  { parent, children },
20910
20970
  ]);
20911
20971
  }
@@ -21066,7 +21126,7 @@ class CascaderNodeDirective {
21066
21126
  ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
21067
21127
  this.expanded = computed(() => this.cascader?.isExpanded(this.node(), this.column.columnIndex()) ?? false, /* @ts-ignore */
21068
21128
  ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
21069
- this.focused = computed(() => nodesEqual({
21129
+ this.focused = computed(() => nodesEqual$1({
21070
21130
  a: this.cascader?.focusedNode() ?? null,
21071
21131
  b: this.node(),
21072
21132
  compareWith: this.cascader?.compareWith() ?? ((a, b) => a === b),
@@ -21479,7 +21539,7 @@ class CascaderPanelComponent {
21479
21539
  <div #panelBody class="et-cascader-panel-body">
21480
21540
  <ng-content />
21481
21541
  </div>
21482
- `, isInline: true, styles: ["@layer components{@property --et-cascader-column-inline-size{syntax: \"<length>\"; inherits: true; initial-value: 220px;}@property --et-cascader-panel-max-block-size{syntax: \"<length-percentage>\"; inherits: false; initial-value: 320px;}@property --et-cascader-node-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--cascader[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--cascader[data-overlay-placement].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-cascader-panel{display:block;box-sizing:border-box;border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:14px;box-shadow:0 10px 24px #00000029;overflow:hidden}.et-cascader-panel.et-cascader-panel--resizing{overflow:clip}.et-cascader-panel:not([data-sheet])>.et-cascader-panel-body{inline-size:max-content}.et-cascader-panel .et-cascader-sheet-header{position:relative;display:flex;align-items:center;flex:none;box-sizing:border-box;block-size:var(--et-cascader-node-height);padding-block:4px;padding-inline:20px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-back{position:absolute;inset-block:0;inset-inline-start:20px;display:inline-flex;align-items:center;transition:opacity .18s ease,transform .18s ease}.et-cascader-panel .et-cascader-back.et-cascader-back--hidden{opacity:0;transform:translate(-6px);pointer-events:none}.et-cascader-panel .et-cascader-back-icon{rotate:-90deg}.et-cascader-panel .et-cascader-sheet-title-slot{position:relative;flex:1;min-inline-size:0;align-self:stretch;overflow:hidden;pointer-events:none}.et-cascader-panel .et-cascader-sheet-title-shift{position:absolute;inset:0;transform:translate(0);transition:transform .18s ease}.et-cascader-panel .et-cascader-sheet-header[data-back] .et-cascader-sheet-title-shift{transform:translate(var(--et-cascader-back-slot, 4em))}.et-cascader-panel .et-cascader-sheet-title{position:absolute;inset:0;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600;color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-forward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-backward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-forward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-backward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--enter{animation:et-cascader-title-fade-in .18s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--leave{animation:et-cascader-title-fade-out .18s ease forwards}.et-cascader-panel .et-cascader-breadcrumbs{display:flex;align-items:center;gap:2px;box-sizing:border-box;inline-size:0;min-inline-size:100%;padding:6px;border-block-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));overflow:hidden}.et-cascader-panel .et-cascader-crumb{display:flex;align-items:center;gap:2px;min-inline-size:0}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--enter{animation:et-cascader-crumb-in .2s ease}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--leave{animation:et-cascader-crumb-out .16s ease forwards}.et-cascader-panel .et-cascader-breadcrumb{display:block;min-inline-size:0;padding:4px 8px;border:none;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--et-surface-color-muted-solid, currentColor);text-align:start;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;appearance:none;outline:none;transition:background .12s ease,color .12s ease}@media(hover:hover){.et-cascader-panel .et-cascader-breadcrumb:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}.et-cascader-panel .et-cascader-breadcrumb:focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent);color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb[data-current]{color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb-chevron{flex:none;inline-size:10px;block-size:10px;color:var(--et-surface-color-subtle-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-columns{display:flex;max-block-size:var(--et-cascader-panel-max-block-size)}.et-cascader-panel .et-cascader-columns:not([data-sheet]){display:block;inline-size:calc(var(--_et-cascader-visible-columns, 1) * var(--et-cascader-column-inline-size));overflow:clip}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column{box-sizing:border-box}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column--offstage{contain:size}.et-cascader-panel .et-cascader-columns[data-sheet]{display:block;flex:1;min-block-size:0;max-block-size:none;overflow-y:auto;overflow-x:clip;overscroll-behavior:contain}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column{inline-size:100%;block-size:100%;max-block-size:none;overflow:visible;border-inline-end:none}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:has(.et-cascader-state){display:flex;align-items:center;justify-content:center}.et-cascader-panel .et-cascader-columns-track{display:flex;max-block-size:inherit;transform:translate(calc(var(--_et-cascader-column-window-start, 0) * -1 * var(--et-cascader-column-inline-size)));transition:transform .24s ease}.et-cascader-panel .et-cascader-sheet-body{display:flex;flex-direction:column;block-size:min(60vh,480px)}.et-cascader-panel .et-cascader-search{padding:6px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-search input[etcascadersearch]{inline-size:100%;block-size:36px;box-sizing:border-box;padding-inline:10px;border-radius:6px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;caret-color:var(--et-theme-color-primary-solid, currentColor);transition:border-color .12s ease,background .12s ease}.et-cascader-panel .et-cascader-search input[etcascadersearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-cascader-panel .et-cascader-search input[etcascadersearch]::placeholder{color:var(--et-surface-color-muted-solid, rgb(255 255 255 / .55))}.et-cascader-panel .et-cascader-results{display:block;box-sizing:border-box;inline-size:min(320px,calc(100vw - 24px));max-block-size:var(--et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-sheet-body .et-cascader-results{flex:1;min-block-size:0;inline-size:100%;max-block-size:none}.et-cascader-panel .et-cascader-column{display:block;flex:none;inline-size:var(--et-cascader-column-inline-size);max-block-size:var(--et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-column:not(:last-child){border-inline-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-in-forward .2s ease}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=backward]){animation:et-cascader-column-in-backward .2s ease}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-grow-in .18s ease}.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option{display:flex;align-items:center;gap:8px;inline-size:100%;min-block-size:var(--et-cascader-node-height);padding-inline:10px;border:none;border-radius:6px;background:transparent;font:inherit;text-align:start;color:inherit;cursor:pointer;appearance:none;outline:none;transition:background .12s ease}@media(hover:hover){:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):focus-visible,:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-focused]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-expanded]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-selected]{color:var(--et-theme-color-ink-solid, currentColor);font-weight:500}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-disabled]{cursor:default;opacity:.4}.et-cascader-panel .et-cascader-node-label,.et-cascader-panel .et-cascader-search-option-label{flex:1;min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.et-cascader-panel .et-cascader-search-option-ancestor{color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-check{position:relative;flex:none;inline-size:16px;block-size:16px;box-sizing:border-box;border:2px solid var(--et-surface-border-solid, rgb(255 255 255 / .3));border-radius:4px;transition:background .12s ease,border-color .12s ease}.et-cascader-panel .et-cascader-check:after{content:\"\";position:absolute;opacity:0}.et-cascader-panel [data-selected]>.et-cascader-check,.et-cascader-panel [data-indeterminate]>.et-cascader-check{border-color:var(--et-theme-color-primary-solid, currentColor);background:var(--et-theme-color-primary-solid, currentColor)}.et-cascader-panel [data-selected]>.et-cascader-check:after{inset-inline-start:4px;inset-block-start:1px;inline-size:4px;block-size:8px;border:solid var(--et-theme-color-on-primary, rgb(0 0 0));border-width:0 2px 2px 0;rotate:45deg;opacity:1}.et-cascader-panel [data-indeterminate]>.et-cascader-check:after{inset-inline-start:2px;inset-block-start:5px;inline-size:8px;block-size:2px;background:var(--et-theme-color-on-primary, rgb(0 0 0));opacity:1}.et-cascader-panel .et-cascader-node-chevron{flex:none;inline-size:12px;block-size:12px;color:var(--et-surface-color-muted-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-state{display:flex;align-items:center;justify-content:center;gap:8px;min-block-size:var(--et-cascader-node-height);padding:12px 16px;text-align:center;color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-state.et-cascader-state--error{flex-direction:column;gap:8px;font-size:12px}.et-cascader-panel .et-cascader-state-error-message{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}@keyframes et-cascader-title-enter-forward{0%{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-enter-backward{0%{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-forward{to{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-backward{to{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-fade-in{0%{opacity:0}}@keyframes et-cascader-title-fade-out{to{opacity:0}}@keyframes et-cascader-column-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-cascader-column-in-backward{0%{opacity:0;transform:translate(-14px)}}@keyframes et-cascader-column-grow-in{0%{opacity:0;transform:translate(-10px)}}@keyframes et-cascader-crumb-in{0%{opacity:0;transform:translate(8px)}}@keyframes et-cascader-crumb-out{to{opacity:0;transform:translate(8px)}}@media(prefers-reduced-motion:reduce){.et-cascader-panel .et-cascader-column,.et-cascader-panel .et-cascader-sheet-title,.et-cascader-panel .et-cascader-crumb{animation:none}.et-cascader-panel .et-cascader-back,.et-cascader-panel .et-cascader-sheet-title-shift,.et-cascader-panel .et-cascader-columns-track{transition:none}}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
21542
+ `, isInline: true, styles: ["@layer components{@property --et-cascader-column-inline-size{syntax: \"<length>\"; inherits: true; initial-value: 220px;}@property --et-cascader-panel-max-block-size{syntax: \"<length-percentage>\"; inherits: false; initial-value: 320px;}@property --et-cascader-node-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--cascader[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--cascader[data-overlay-placement].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-cascader-panel{display:block;box-sizing:border-box;--_et-cascader-panel-max-block-size: min( var(--et-cascader-panel-max-block-size), var(--et-overlay-max-height, 100vh) );border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:14px;box-shadow:0 10px 24px #00000029;overflow:hidden}.et-cascader-panel.et-cascader-panel--resizing{overflow:clip}.et-cascader-panel:not([data-sheet])>.et-cascader-panel-body{inline-size:max-content}.et-cascader-panel .et-cascader-sheet-header{position:relative;display:flex;align-items:center;flex:none;box-sizing:border-box;block-size:var(--et-cascader-node-height);padding-block:4px;padding-inline:20px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-back{position:absolute;inset-block:0;inset-inline-start:20px;display:inline-flex;align-items:center;transition:opacity .18s ease,transform .18s ease}.et-cascader-panel .et-cascader-back.et-cascader-back--hidden{opacity:0;transform:translate(-6px);pointer-events:none}.et-cascader-panel .et-cascader-back-icon{rotate:-90deg}.et-cascader-panel .et-cascader-sheet-title-slot{position:relative;flex:1;min-inline-size:0;align-self:stretch;overflow:hidden;pointer-events:none}.et-cascader-panel .et-cascader-sheet-title-shift{position:absolute;inset:0;transform:translate(0);transition:transform .18s ease}.et-cascader-panel .et-cascader-sheet-header[data-back] .et-cascader-sheet-title-shift{transform:translate(var(--et-cascader-back-slot, 4em))}.et-cascader-panel .et-cascader-sheet-title{position:absolute;inset:0;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600;color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-forward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-backward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-forward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-backward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--enter{animation:et-cascader-title-fade-in .18s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--leave{animation:et-cascader-title-fade-out .18s ease forwards}.et-cascader-panel .et-cascader-breadcrumbs{display:flex;align-items:center;gap:2px;box-sizing:border-box;inline-size:0;min-inline-size:100%;padding:6px;border-block-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));overflow:hidden}.et-cascader-panel .et-cascader-crumb{display:flex;align-items:center;gap:2px;min-inline-size:0}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--enter{animation:et-cascader-crumb-in .2s ease}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--leave{animation:et-cascader-crumb-out .16s ease forwards}.et-cascader-panel .et-cascader-breadcrumb{display:block;min-inline-size:0;padding:4px 8px;border:none;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--et-surface-color-muted-solid, currentColor);text-align:start;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;appearance:none;outline:none;transition:background .12s ease,color .12s ease}@media(hover:hover){.et-cascader-panel .et-cascader-breadcrumb:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}.et-cascader-panel .et-cascader-breadcrumb:focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent);color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb[data-current]{color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb-chevron{flex:none;inline-size:10px;block-size:10px;color:var(--et-surface-color-subtle-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-columns{display:flex;max-block-size:var(--_et-cascader-panel-max-block-size)}.et-cascader-panel .et-cascader-columns:not([data-sheet]){display:block;inline-size:calc(var(--_et-cascader-visible-columns, 1) * var(--et-cascader-column-inline-size));overflow:clip}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column{box-sizing:border-box}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column--offstage{contain:size}.et-cascader-panel .et-cascader-columns[data-sheet]{display:block;flex:1;min-block-size:0;max-block-size:none;overflow-y:auto;overflow-x:clip;overscroll-behavior:contain}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column{inline-size:100%;block-size:100%;max-block-size:none;overflow:visible;border-inline-end:none}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:has(.et-cascader-state){display:flex;align-items:center;justify-content:center}.et-cascader-panel .et-cascader-columns-track{display:flex;max-block-size:inherit;transform:translate(calc(var(--_et-cascader-column-window-start, 0) * -1 * var(--et-cascader-column-inline-size)));transition:transform .24s ease}.et-cascader-panel .et-cascader-sheet-body{display:flex;flex-direction:column;block-size:min(60vh,480px)}.et-cascader-panel .et-cascader-search{padding:6px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-search input[etcascadersearch]{inline-size:100%;block-size:36px;box-sizing:border-box;padding-inline:10px;border-radius:6px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;caret-color:var(--et-theme-color-primary-solid, currentColor);transition:border-color .12s ease,background .12s ease}.et-cascader-panel .et-cascader-search input[etcascadersearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-cascader-panel .et-cascader-search input[etcascadersearch]::placeholder{color:var(--et-surface-color-muted-solid, rgb(255 255 255 / .55))}.et-cascader-panel .et-cascader-results{display:block;box-sizing:border-box;inline-size:min(320px,calc(100vw - 24px));max-block-size:var(--_et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-sheet-body .et-cascader-results{flex:1;min-block-size:0;inline-size:100%;max-block-size:none}.et-cascader-panel .et-cascader-column{display:block;flex:none;inline-size:var(--et-cascader-column-inline-size);max-block-size:var(--_et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-column:not(:last-child){border-inline-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-in-forward .2s ease}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=backward]){animation:et-cascader-column-in-backward .2s ease}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-grow-in .18s ease}.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option{display:flex;align-items:center;gap:8px;inline-size:100%;min-block-size:var(--et-cascader-node-height);padding-inline:10px;border:none;border-radius:6px;background:transparent;font:inherit;text-align:start;color:inherit;cursor:pointer;appearance:none;outline:none;transition:background .12s ease}@media(hover:hover){:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):focus-visible,:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-focused]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-expanded]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-selected]{color:var(--et-theme-color-ink-solid, currentColor);font-weight:500}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-disabled]{cursor:default;opacity:.4}.et-cascader-panel .et-cascader-node-label,.et-cascader-panel .et-cascader-search-option-label{flex:1;min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.et-cascader-panel .et-cascader-search-option-ancestor{color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-check{position:relative;flex:none;inline-size:16px;block-size:16px;box-sizing:border-box;border:2px solid var(--et-surface-border-solid, rgb(255 255 255 / .3));border-radius:4px;transition:background .12s ease,border-color .12s ease}.et-cascader-panel .et-cascader-check:after{content:\"\";position:absolute;opacity:0}.et-cascader-panel [data-selected]>.et-cascader-check,.et-cascader-panel [data-indeterminate]>.et-cascader-check{border-color:var(--et-theme-color-primary-solid, currentColor);background:var(--et-theme-color-primary-solid, currentColor)}.et-cascader-panel [data-selected]>.et-cascader-check:after{inset-inline-start:4px;inset-block-start:1px;inline-size:4px;block-size:8px;border:solid var(--et-theme-color-on-primary, rgb(0 0 0));border-width:0 2px 2px 0;rotate:45deg;opacity:1}.et-cascader-panel [data-indeterminate]>.et-cascader-check:after{inset-inline-start:2px;inset-block-start:5px;inline-size:8px;block-size:2px;background:var(--et-theme-color-on-primary, rgb(0 0 0));opacity:1}.et-cascader-panel .et-cascader-node-chevron{flex:none;inline-size:12px;block-size:12px;color:var(--et-surface-color-muted-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-state{display:flex;align-items:center;justify-content:center;gap:8px;min-block-size:var(--et-cascader-node-height);padding:12px 16px;text-align:center;color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-state.et-cascader-state--error{flex-direction:column;gap:8px;font-size:12px}.et-cascader-panel .et-cascader-state-error-message{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}@keyframes et-cascader-title-enter-forward{0%{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-enter-backward{0%{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-forward{to{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-backward{to{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-fade-in{0%{opacity:0}}@keyframes et-cascader-title-fade-out{to{opacity:0}}@keyframes et-cascader-column-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-cascader-column-in-backward{0%{opacity:0;transform:translate(-14px)}}@keyframes et-cascader-column-grow-in{0%{opacity:0;transform:translate(-10px)}}@keyframes et-cascader-crumb-in{0%{opacity:0;transform:translate(8px)}}@keyframes et-cascader-crumb-out{to{opacity:0;transform:translate(8px)}}@media(prefers-reduced-motion:reduce){.et-cascader-panel .et-cascader-column,.et-cascader-panel .et-cascader-sheet-title,.et-cascader-panel .et-cascader-crumb{animation:none}.et-cascader-panel .et-cascader-back,.et-cascader-panel .et-cascader-sheet-title-shift,.et-cascader-panel .et-cascader-columns-track{transition:none}}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
21483
21543
  }
21484
21544
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CascaderPanelComponent, decorators: [{
21485
21545
  type: Component,
@@ -21499,7 +21559,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
21499
21559
  '[attr.data-sheet]': 'isSheet() || null',
21500
21560
  '(focusin)': 'handleFocusIn()',
21501
21561
  '(focusout)': 'handleFocusOut($event)',
21502
- }, styles: ["@layer components{@property --et-cascader-column-inline-size{syntax: \"<length>\"; inherits: true; initial-value: 220px;}@property --et-cascader-panel-max-block-size{syntax: \"<length-percentage>\"; inherits: false; initial-value: 320px;}@property --et-cascader-node-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--cascader[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--cascader[data-overlay-placement].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-cascader-panel{display:block;box-sizing:border-box;border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:14px;box-shadow:0 10px 24px #00000029;overflow:hidden}.et-cascader-panel.et-cascader-panel--resizing{overflow:clip}.et-cascader-panel:not([data-sheet])>.et-cascader-panel-body{inline-size:max-content}.et-cascader-panel .et-cascader-sheet-header{position:relative;display:flex;align-items:center;flex:none;box-sizing:border-box;block-size:var(--et-cascader-node-height);padding-block:4px;padding-inline:20px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-back{position:absolute;inset-block:0;inset-inline-start:20px;display:inline-flex;align-items:center;transition:opacity .18s ease,transform .18s ease}.et-cascader-panel .et-cascader-back.et-cascader-back--hidden{opacity:0;transform:translate(-6px);pointer-events:none}.et-cascader-panel .et-cascader-back-icon{rotate:-90deg}.et-cascader-panel .et-cascader-sheet-title-slot{position:relative;flex:1;min-inline-size:0;align-self:stretch;overflow:hidden;pointer-events:none}.et-cascader-panel .et-cascader-sheet-title-shift{position:absolute;inset:0;transform:translate(0);transition:transform .18s ease}.et-cascader-panel .et-cascader-sheet-header[data-back] .et-cascader-sheet-title-shift{transform:translate(var(--et-cascader-back-slot, 4em))}.et-cascader-panel .et-cascader-sheet-title{position:absolute;inset:0;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600;color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-forward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-backward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-forward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-backward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--enter{animation:et-cascader-title-fade-in .18s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--leave{animation:et-cascader-title-fade-out .18s ease forwards}.et-cascader-panel .et-cascader-breadcrumbs{display:flex;align-items:center;gap:2px;box-sizing:border-box;inline-size:0;min-inline-size:100%;padding:6px;border-block-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));overflow:hidden}.et-cascader-panel .et-cascader-crumb{display:flex;align-items:center;gap:2px;min-inline-size:0}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--enter{animation:et-cascader-crumb-in .2s ease}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--leave{animation:et-cascader-crumb-out .16s ease forwards}.et-cascader-panel .et-cascader-breadcrumb{display:block;min-inline-size:0;padding:4px 8px;border:none;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--et-surface-color-muted-solid, currentColor);text-align:start;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;appearance:none;outline:none;transition:background .12s ease,color .12s ease}@media(hover:hover){.et-cascader-panel .et-cascader-breadcrumb:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}.et-cascader-panel .et-cascader-breadcrumb:focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent);color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb[data-current]{color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb-chevron{flex:none;inline-size:10px;block-size:10px;color:var(--et-surface-color-subtle-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-columns{display:flex;max-block-size:var(--et-cascader-panel-max-block-size)}.et-cascader-panel .et-cascader-columns:not([data-sheet]){display:block;inline-size:calc(var(--_et-cascader-visible-columns, 1) * var(--et-cascader-column-inline-size));overflow:clip}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column{box-sizing:border-box}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column--offstage{contain:size}.et-cascader-panel .et-cascader-columns[data-sheet]{display:block;flex:1;min-block-size:0;max-block-size:none;overflow-y:auto;overflow-x:clip;overscroll-behavior:contain}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column{inline-size:100%;block-size:100%;max-block-size:none;overflow:visible;border-inline-end:none}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:has(.et-cascader-state){display:flex;align-items:center;justify-content:center}.et-cascader-panel .et-cascader-columns-track{display:flex;max-block-size:inherit;transform:translate(calc(var(--_et-cascader-column-window-start, 0) * -1 * var(--et-cascader-column-inline-size)));transition:transform .24s ease}.et-cascader-panel .et-cascader-sheet-body{display:flex;flex-direction:column;block-size:min(60vh,480px)}.et-cascader-panel .et-cascader-search{padding:6px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-search input[etcascadersearch]{inline-size:100%;block-size:36px;box-sizing:border-box;padding-inline:10px;border-radius:6px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;caret-color:var(--et-theme-color-primary-solid, currentColor);transition:border-color .12s ease,background .12s ease}.et-cascader-panel .et-cascader-search input[etcascadersearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-cascader-panel .et-cascader-search input[etcascadersearch]::placeholder{color:var(--et-surface-color-muted-solid, rgb(255 255 255 / .55))}.et-cascader-panel .et-cascader-results{display:block;box-sizing:border-box;inline-size:min(320px,calc(100vw - 24px));max-block-size:var(--et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-sheet-body .et-cascader-results{flex:1;min-block-size:0;inline-size:100%;max-block-size:none}.et-cascader-panel .et-cascader-column{display:block;flex:none;inline-size:var(--et-cascader-column-inline-size);max-block-size:var(--et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-column:not(:last-child){border-inline-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-in-forward .2s ease}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=backward]){animation:et-cascader-column-in-backward .2s ease}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-grow-in .18s ease}.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option{display:flex;align-items:center;gap:8px;inline-size:100%;min-block-size:var(--et-cascader-node-height);padding-inline:10px;border:none;border-radius:6px;background:transparent;font:inherit;text-align:start;color:inherit;cursor:pointer;appearance:none;outline:none;transition:background .12s ease}@media(hover:hover){:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):focus-visible,:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-focused]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-expanded]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-selected]{color:var(--et-theme-color-ink-solid, currentColor);font-weight:500}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-disabled]{cursor:default;opacity:.4}.et-cascader-panel .et-cascader-node-label,.et-cascader-panel .et-cascader-search-option-label{flex:1;min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.et-cascader-panel .et-cascader-search-option-ancestor{color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-check{position:relative;flex:none;inline-size:16px;block-size:16px;box-sizing:border-box;border:2px solid var(--et-surface-border-solid, rgb(255 255 255 / .3));border-radius:4px;transition:background .12s ease,border-color .12s ease}.et-cascader-panel .et-cascader-check:after{content:\"\";position:absolute;opacity:0}.et-cascader-panel [data-selected]>.et-cascader-check,.et-cascader-panel [data-indeterminate]>.et-cascader-check{border-color:var(--et-theme-color-primary-solid, currentColor);background:var(--et-theme-color-primary-solid, currentColor)}.et-cascader-panel [data-selected]>.et-cascader-check:after{inset-inline-start:4px;inset-block-start:1px;inline-size:4px;block-size:8px;border:solid var(--et-theme-color-on-primary, rgb(0 0 0));border-width:0 2px 2px 0;rotate:45deg;opacity:1}.et-cascader-panel [data-indeterminate]>.et-cascader-check:after{inset-inline-start:2px;inset-block-start:5px;inline-size:8px;block-size:2px;background:var(--et-theme-color-on-primary, rgb(0 0 0));opacity:1}.et-cascader-panel .et-cascader-node-chevron{flex:none;inline-size:12px;block-size:12px;color:var(--et-surface-color-muted-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-state{display:flex;align-items:center;justify-content:center;gap:8px;min-block-size:var(--et-cascader-node-height);padding:12px 16px;text-align:center;color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-state.et-cascader-state--error{flex-direction:column;gap:8px;font-size:12px}.et-cascader-panel .et-cascader-state-error-message{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}@keyframes et-cascader-title-enter-forward{0%{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-enter-backward{0%{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-forward{to{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-backward{to{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-fade-in{0%{opacity:0}}@keyframes et-cascader-title-fade-out{to{opacity:0}}@keyframes et-cascader-column-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-cascader-column-in-backward{0%{opacity:0;transform:translate(-14px)}}@keyframes et-cascader-column-grow-in{0%{opacity:0;transform:translate(-10px)}}@keyframes et-cascader-crumb-in{0%{opacity:0;transform:translate(8px)}}@keyframes et-cascader-crumb-out{to{opacity:0;transform:translate(8px)}}@media(prefers-reduced-motion:reduce){.et-cascader-panel .et-cascader-column,.et-cascader-panel .et-cascader-sheet-title,.et-cascader-panel .et-cascader-crumb{animation:none}.et-cascader-panel .et-cascader-back,.et-cascader-panel .et-cascader-sheet-title-shift,.et-cascader-panel .et-cascader-columns-track{transition:none}}}\n"] }]
21562
+ }, styles: ["@layer components{@property --et-cascader-column-inline-size{syntax: \"<length>\"; inherits: true; initial-value: 220px;}@property --et-cascader-panel-max-block-size{syntax: \"<length-percentage>\"; inherits: false; initial-value: 320px;}@property --et-cascader-node-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--cascader[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--cascader.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--cascader[data-overlay-placement].et-animation-enter-from,.et-overlay--cascader[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-cascader-panel{display:block;box-sizing:border-box;--_et-cascader-panel-max-block-size: min( var(--et-cascader-panel-max-block-size), var(--et-overlay-max-height, 100vh) );border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:14px;box-shadow:0 10px 24px #00000029;overflow:hidden}.et-cascader-panel.et-cascader-panel--resizing{overflow:clip}.et-cascader-panel:not([data-sheet])>.et-cascader-panel-body{inline-size:max-content}.et-cascader-panel .et-cascader-sheet-header{position:relative;display:flex;align-items:center;flex:none;box-sizing:border-box;block-size:var(--et-cascader-node-height);padding-block:4px;padding-inline:20px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-back{position:absolute;inset-block:0;inset-inline-start:20px;display:inline-flex;align-items:center;transition:opacity .18s ease,transform .18s ease}.et-cascader-panel .et-cascader-back.et-cascader-back--hidden{opacity:0;transform:translate(-6px);pointer-events:none}.et-cascader-panel .et-cascader-back-icon{rotate:-90deg}.et-cascader-panel .et-cascader-sheet-title-slot{position:relative;flex:1;min-inline-size:0;align-self:stretch;overflow:hidden;pointer-events:none}.et-cascader-panel .et-cascader-sheet-title-shift{position:absolute;inset:0;transform:translate(0);transition:transform .18s ease}.et-cascader-panel .et-cascader-sheet-header[data-back] .et-cascader-sheet-title-shift{transform:translate(var(--et-cascader-back-slot, 4em))}.et-cascader-panel .et-cascader-sheet-title{position:absolute;inset:0;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600;color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-forward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--enter{animation:et-cascader-title-enter-backward .2s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=forward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-forward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=slide][data-nav=backward] .et-cascader-sheet-title--leave{animation:et-cascader-title-leave-backward .18s ease forwards}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--enter{animation:et-cascader-title-fade-in .18s ease}.et-cascader-panel .et-cascader-sheet-title-slot[data-anim=fade] .et-cascader-sheet-title--leave{animation:et-cascader-title-fade-out .18s ease forwards}.et-cascader-panel .et-cascader-breadcrumbs{display:flex;align-items:center;gap:2px;box-sizing:border-box;inline-size:0;min-inline-size:100%;padding:6px;border-block-start:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));overflow:hidden}.et-cascader-panel .et-cascader-crumb{display:flex;align-items:center;gap:2px;min-inline-size:0}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--enter{animation:et-cascader-crumb-in .2s ease}.et-cascader-panel .et-cascader-crumb.et-cascader-crumb--leave{animation:et-cascader-crumb-out .16s ease forwards}.et-cascader-panel .et-cascader-breadcrumb{display:block;min-inline-size:0;padding:4px 8px;border:none;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--et-surface-color-muted-solid, currentColor);text-align:start;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;appearance:none;outline:none;transition:background .12s ease,color .12s ease}@media(hover:hover){.et-cascader-panel .et-cascader-breadcrumb:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}.et-cascader-panel .et-cascader-breadcrumb:focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent);color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb[data-current]{color:var(--et-surface-color-solid, currentColor)}.et-cascader-panel .et-cascader-breadcrumb-chevron{flex:none;inline-size:10px;block-size:10px;color:var(--et-surface-color-subtle-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-columns{display:flex;max-block-size:var(--_et-cascader-panel-max-block-size)}.et-cascader-panel .et-cascader-columns:not([data-sheet]){display:block;inline-size:calc(var(--_et-cascader-visible-columns, 1) * var(--et-cascader-column-inline-size));overflow:clip}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column{box-sizing:border-box}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column--offstage{contain:size}.et-cascader-panel .et-cascader-columns[data-sheet]{display:block;flex:1;min-block-size:0;max-block-size:none;overflow-y:auto;overflow-x:clip;overscroll-behavior:contain}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column{inline-size:100%;block-size:100%;max-block-size:none;overflow:visible;border-inline-end:none}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:has(.et-cascader-state){display:flex;align-items:center;justify-content:center}.et-cascader-panel .et-cascader-columns-track{display:flex;max-block-size:inherit;transform:translate(calc(var(--_et-cascader-column-window-start, 0) * -1 * var(--et-cascader-column-inline-size)));transition:transform .24s ease}.et-cascader-panel .et-cascader-sheet-body{display:flex;flex-direction:column;block-size:min(60vh,480px)}.et-cascader-panel .et-cascader-search{padding:6px;border-block-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-search input[etcascadersearch]{inline-size:100%;block-size:36px;box-sizing:border-box;padding-inline:10px;border-radius:6px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;caret-color:var(--et-theme-color-primary-solid, currentColor);transition:border-color .12s ease,background .12s ease}.et-cascader-panel .et-cascader-search input[etcascadersearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-cascader-panel .et-cascader-search input[etcascadersearch]::placeholder{color:var(--et-surface-color-muted-solid, rgb(255 255 255 / .55))}.et-cascader-panel .et-cascader-results{display:block;box-sizing:border-box;inline-size:min(320px,calc(100vw - 24px));max-block-size:var(--_et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-sheet-body .et-cascader-results{flex:1;min-block-size:0;inline-size:100%;max-block-size:none}.et-cascader-panel .et-cascader-column{display:block;flex:none;inline-size:var(--et-cascader-column-inline-size);max-block-size:var(--_et-cascader-panel-max-block-size);overflow-y:auto;overflow-x:clip;overscroll-behavior:contain;padding:6px}.et-cascader-panel .et-cascader-column:not(:last-child){border-inline-end:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1))}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-in-forward .2s ease}.et-cascader-panel .et-cascader-columns[data-sheet] .et-cascader-column:where([data-nav=backward]){animation:et-cascader-column-in-backward .2s ease}.et-cascader-panel .et-cascader-columns:not([data-sheet]) .et-cascader-column:where([data-nav=forward]){animation:et-cascader-column-grow-in .18s ease}.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option{display:flex;align-items:center;gap:8px;inline-size:100%;min-block-size:var(--et-cascader-node-height);padding-inline:10px;border:none;border-radius:6px;background:transparent;font:inherit;text-align:start;color:inherit;cursor:pointer;appearance:none;outline:none;transition:background .12s ease}@media(hover:hover){:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option):focus-visible,:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-focused]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 16%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-expanded]{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent)}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-selected]{color:var(--et-theme-color-ink-solid, currentColor);font-weight:500}:is(.et-cascader-panel .et-cascader-node,.et-cascader-panel .et-cascader-search-option)[data-disabled]{cursor:default;opacity:.4}.et-cascader-panel .et-cascader-node-label,.et-cascader-panel .et-cascader-search-option-label{flex:1;min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.et-cascader-panel .et-cascader-search-option-ancestor{color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-check{position:relative;flex:none;inline-size:16px;block-size:16px;box-sizing:border-box;border:2px solid var(--et-surface-border-solid, rgb(255 255 255 / .3));border-radius:4px;transition:background .12s ease,border-color .12s ease}.et-cascader-panel .et-cascader-check:after{content:\"\";position:absolute;opacity:0}.et-cascader-panel [data-selected]>.et-cascader-check,.et-cascader-panel [data-indeterminate]>.et-cascader-check{border-color:var(--et-theme-color-primary-solid, currentColor);background:var(--et-theme-color-primary-solid, currentColor)}.et-cascader-panel [data-selected]>.et-cascader-check:after{inset-inline-start:4px;inset-block-start:1px;inline-size:4px;block-size:8px;border:solid var(--et-theme-color-on-primary, rgb(0 0 0));border-width:0 2px 2px 0;rotate:45deg;opacity:1}.et-cascader-panel [data-indeterminate]>.et-cascader-check:after{inset-inline-start:2px;inset-block-start:5px;inline-size:8px;block-size:2px;background:var(--et-theme-color-on-primary, rgb(0 0 0));opacity:1}.et-cascader-panel .et-cascader-node-chevron{flex:none;inline-size:12px;block-size:12px;color:var(--et-surface-color-muted-solid, currentColor);rotate:90deg}.et-cascader-panel .et-cascader-state{display:flex;align-items:center;justify-content:center;gap:8px;min-block-size:var(--et-cascader-node-height);padding:12px 16px;text-align:center;color:var(--et-surface-color-muted-solid, currentColor)}.et-cascader-panel .et-cascader-state.et-cascader-state--error{flex-direction:column;gap:8px;font-size:12px}.et-cascader-panel .et-cascader-state-error-message{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}@keyframes et-cascader-title-enter-forward{0%{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-enter-backward{0%{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-forward{to{opacity:0;transform:translate(-12px)}}@keyframes et-cascader-title-leave-backward{to{opacity:0;transform:translate(12px)}}@keyframes et-cascader-title-fade-in{0%{opacity:0}}@keyframes et-cascader-title-fade-out{to{opacity:0}}@keyframes et-cascader-column-in-forward{0%{opacity:0;transform:translate(14px)}}@keyframes et-cascader-column-in-backward{0%{opacity:0;transform:translate(-14px)}}@keyframes et-cascader-column-grow-in{0%{opacity:0;transform:translate(-10px)}}@keyframes et-cascader-crumb-in{0%{opacity:0;transform:translate(8px)}}@keyframes et-cascader-crumb-out{to{opacity:0;transform:translate(8px)}}@media(prefers-reduced-motion:reduce){.et-cascader-panel .et-cascader-column,.et-cascader-panel .et-cascader-sheet-title,.et-cascader-panel .et-cascader-crumb{animation:none}.et-cascader-panel .et-cascader-back,.et-cascader-panel .et-cascader-sheet-title-shift,.et-cascader-panel .et-cascader-columns-track{transition:none}}}\n"] }]
21503
21563
  }], ctorParameters: () => [], propDecorators: { panelBody: [{ type: i0.ViewChild, args: ['panelBody', { isSignal: true }] }] } });
21504
21564
 
21505
21565
  class CascaderComponent {
@@ -28900,17 +28960,17 @@ class RichTextEditorFloatingToolbarComponent {
28900
28960
  return richTextEditorToolLabel(this.labels(), tool);
28901
28961
  }
28902
28962
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: RichTextEditorFloatingToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28903
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: RichTextEditorFloatingToolbarComponent, isStandalone: true, selector: "et-rich-text-editor-floating-toolbar", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "toolbar" }, listeners: { "mousedown": "$event.preventDefault()" }, properties: { "attr.aria-label": "labels().selectionToolbar" }, classAttribute: "et-rte-floating-toolbar" }, providers: [provideIcons(BOLD_ICON, ITALIC_ICON, UNDERLINE_ICON, STRIKETHROUGH_ICON, CODE_ICON, LINK_ICON)], hostDirectives: [{ directive: i1.ProvideColorDirective }, { directive: i1.AutoSurfaceDirective }], ngImport: i0, template: "@for (def of inlineTools(); track def.token; let first = $first) {\n @if (def.token === TOOLS.LINK && !first) {\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- Icon tools only: this bar has no room for a custom control, and every inline tool is a toggle. -->\n @if (def.icon; as icon) {\n <button\n [pressed]=\"def.isActive?.(editor()) ?? false\"\n [disabled]=\"def.isDisabled?.(editor()) ?? false\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(editor())\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"icon\"></i>\n </button>\n }\n}\n", styles: ["@layer components{.et-overlay.et-rte-floating-toolbar-overlay{overflow:visible;background:transparent;box-shadow:none;border-radius:10px}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-from,.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-rte-floating-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap, 2px);padding:var(--et-rich-text-editor-toolbar-padding, 4px);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(38 38 38)));color:var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));box-shadow:0 10px 24px #00000029;--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius, 4px)}.et-rte-floating-toolbar .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 20%,transparent)}}\n"], dependencies: [{ kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
28963
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: RichTextEditorFloatingToolbarComponent, isStandalone: true, selector: "et-rich-text-editor-floating-toolbar", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "toolbar" }, listeners: { "mousedown": "$event.preventDefault()" }, properties: { "attr.aria-label": "labels().selectionToolbar" }, classAttribute: "et-rte-floating-toolbar" }, providers: [provideIcons(BOLD_ICON, ITALIC_ICON, UNDERLINE_ICON, STRIKETHROUGH_ICON, CODE_ICON, LINK_ICON)], hostDirectives: [{ directive: i1.ProvideColorDirective }, { directive: i1.AutoSurfaceDirective }], ngImport: i0, template: "@for (def of inlineTools(); track def.token; let first = $first) {\n @if (def.token === TOOLS.LINK && !first) {\n <et-divider orientation=\"vertical\" decorative />\n }\n\n <!-- Icon tools only: this bar has no room for a custom control, and every inline tool is a toggle. -->\n @if (def.icon; as icon) {\n <button\n [pressed]=\"def.isActive?.(editor()) ?? false\"\n [disabled]=\"def.isDisabled?.(editor()) ?? false\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(editor())\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"icon\"></i>\n </button>\n }\n}\n", styles: ["@layer components{.et-overlay.et-rte-floating-toolbar-overlay{overflow:visible;background:transparent;box-shadow:none;border-radius:10px}.et-overlay.et-rte-floating-toolbar-overlay>.et-rte-floating-toolbar{display:flex}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-from,.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-rte-floating-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap, 2px);padding:var(--et-rich-text-editor-toolbar-padding, 4px);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(38 38 38)));color:var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));box-shadow:0 10px 24px #00000029;--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius, 4px)}.et-rte-floating-toolbar .et-divider{--et-divider-color: color-mix(in srgb, currentColor 20%, transparent);--et-divider-spacing: 2px;--et-divider-inset: 4px}}\n"], dependencies: [{ kind: "component", type: DividerComponent, selector: "et-divider", inputs: ["orientation", "decorative"] }, { kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
28904
28964
  }
28905
28965
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: RichTextEditorFloatingToolbarComponent, decorators: [{
28906
28966
  type: Component,
28907
- args: [{ selector: 'et-rich-text-editor-floating-toolbar', encapsulation: ViewEncapsulation.None, imports: [IconButtonComponent, IconDirective], providers: [provideIcons(BOLD_ICON, ITALIC_ICON, UNDERLINE_ICON, STRIKETHROUGH_ICON, CODE_ICON, LINK_ICON)], hostDirectives: [ProvideColorDirective, AutoSurfaceDirective], host: {
28967
+ args: [{ selector: 'et-rich-text-editor-floating-toolbar', encapsulation: ViewEncapsulation.None, imports: [DividerComponent, IconButtonComponent, IconDirective], providers: [provideIcons(BOLD_ICON, ITALIC_ICON, UNDERLINE_ICON, STRIKETHROUGH_ICON, CODE_ICON, LINK_ICON)], hostDirectives: [ProvideColorDirective, AutoSurfaceDirective], host: {
28908
28968
  class: 'et-rte-floating-toolbar',
28909
28969
  role: 'toolbar',
28910
28970
  '[attr.aria-label]': 'labels().selectionToolbar',
28911
28971
  // keep the caret/selection in the editor when the user clicks a button
28912
28972
  '(mousedown)': '$event.preventDefault()',
28913
- }, template: "@for (def of inlineTools(); track def.token; let first = $first) {\n @if (def.token === TOOLS.LINK && !first) {\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- Icon tools only: this bar has no room for a custom control, and every inline tool is a toggle. -->\n @if (def.icon; as icon) {\n <button\n [pressed]=\"def.isActive?.(editor()) ?? false\"\n [disabled]=\"def.isDisabled?.(editor()) ?? false\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(editor())\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"icon\"></i>\n </button>\n }\n}\n", styles: ["@layer components{.et-overlay.et-rte-floating-toolbar-overlay{overflow:visible;background:transparent;box-shadow:none;border-radius:10px}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-from,.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-rte-floating-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap, 2px);padding:var(--et-rich-text-editor-toolbar-padding, 4px);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(38 38 38)));color:var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));box-shadow:0 10px 24px #00000029;--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius, 4px)}.et-rte-floating-toolbar .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 20%,transparent)}}\n"] }]
28973
+ }, template: "@for (def of inlineTools(); track def.token; let first = $first) {\n @if (def.token === TOOLS.LINK && !first) {\n <et-divider orientation=\"vertical\" decorative />\n }\n\n <!-- Icon tools only: this bar has no room for a custom control, and every inline tool is a toggle. -->\n @if (def.icon; as icon) {\n <button\n [pressed]=\"def.isActive?.(editor()) ?? false\"\n [disabled]=\"def.isDisabled?.(editor()) ?? false\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(editor())\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"icon\"></i>\n </button>\n }\n}\n", styles: ["@layer components{.et-overlay.et-rte-floating-toolbar-overlay{overflow:visible;background:transparent;box-shadow:none;border-radius:10px}.et-overlay.et-rte-floating-toolbar-overlay>.et-rte-floating-toolbar{display:flex}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-from,.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-rte-floating-toolbar-overlay.et-animation-leave-active{transition:opacity .1s ease}.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-enter-from,.et-rte-floating-toolbar-overlay[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-rte-floating-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap, 2px);padding:var(--et-rich-text-editor-toolbar-padding, 4px);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(38 38 38)));color:var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));box-shadow:0 10px 24px #00000029;--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius, 4px)}.et-rte-floating-toolbar .et-divider{--et-divider-color: color-mix(in srgb, currentColor 20%, transparent);--et-divider-spacing: 2px;--et-divider-inset: 4px}}\n"] }]
28914
28974
  }], ctorParameters: () => [], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }] } });
28915
28975
 
28916
28976
  const HEADING_SELECTOR = 'h1, h2, h3, h4, h5, h6';
@@ -32430,6 +32490,7 @@ const createMenuHoverIntent = () => {
32430
32490
  };
32431
32491
  };
32432
32492
 
32493
+ const MENU_MIN_AVAILABLE_SPACE = 160;
32433
32494
  class MenuDirective {
32434
32495
  constructor() {
32435
32496
  this.destroyRef = inject(DestroyRef);
@@ -33005,6 +33066,7 @@ class MenuDirective {
33005
33066
  const positionOptions = {
33006
33067
  placement: this.resolvedPlacement(),
33007
33068
  fallbackPlacements: this.resolvedFallbackPlacements(),
33069
+ minAvailableSpace: this.resolvedMinAvailableSpace(),
33008
33070
  offset: this.resolvedOffset(),
33009
33071
  arrowPadding: this.arrowPadding(),
33010
33072
  viewportPadding: this.viewportPadding(),
@@ -33066,6 +33128,18 @@ class MenuDirective {
33066
33128
  }
33067
33129
  return ['left-start', 'right-end', 'left-end'];
33068
33130
  }
33131
+ /**
33132
+ * `minAvailableSpace` replaces `flip` outright, so it may only kick in where no consumer has
33133
+ * expressed a placement preference of their own. It is also vertical-only: a submenu opens on the
33134
+ * x axis, where shrinking to the space beside the parent means a narrower - not a shorter - panel.
33135
+ */
33136
+ resolvedMinAvailableSpace() {
33137
+ if (this.fallbackPlacements() || this.anchorPoint() || !this.isRoot) {
33138
+ return undefined;
33139
+ }
33140
+ const side = this.resolvedPlacement().split('-')[0];
33141
+ return side === 'top' || side === 'bottom' ? MENU_MIN_AVAILABLE_SPACE : undefined;
33142
+ }
33069
33143
  resolvedArrow() {
33070
33144
  // a point anchor (context menu) has no element the arrow could meaningfully point at
33071
33145
  return this.arrow() && this.isRoot && !this.anchorPoint();
@@ -34022,12 +34096,12 @@ class MenuComponent {
34022
34096
  this.contextColorProvider = inject(COLOR_PROVIDER, { optional: true, skipSelf: true });
34023
34097
  this.menu = inject(MenuDirective, { optional: true });
34024
34098
  this.errorColorTheme = injectErrorTheme();
34025
- // observed instead of the host: the host's used size is overridden by the resize animation
34026
- // itself, so observing it directly would feed the animation back into the observer
34099
+ // both must stay content-sized: the host's used size is overridden by the resize animation and
34100
+ // the scroller is sized by the host, so observing either would feed the animation back in
34027
34101
  this.headerElement = viewChild('menuHeader', /* @ts-ignore */
34028
34102
  ...(ngDevMode ? [{ debugName: "headerElement" }] : /* istanbul ignore next */ []));
34029
- this.bodyElement = viewChild('menuBody', /* @ts-ignore */
34030
- ...(ngDevMode ? [{ debugName: "bodyElement" }] : /* istanbul ignore next */ []));
34103
+ this.bodyContentElement = viewChild('menuBodyContent', /* @ts-ignore */
34104
+ ...(ngDevMode ? [{ debugName: "bodyContentElement" }] : /* istanbul ignore next */ []));
34031
34105
  this.search = computed(() => this.menu?.registeredSearch() ?? null, /* @ts-ignore */
34032
34106
  ...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
34033
34107
  this.searchLoading = computed(() => this.search()?.loading() ?? false, /* @ts-ignore */
@@ -34053,19 +34127,19 @@ class MenuComponent {
34053
34127
  // animate the menu's block size when its content changes while open
34054
34128
  // (e.g. search filtering items away or the search error line appearing)
34055
34129
  injectAnimatedBlockSize({
34056
- observe: [this.headerElement, this.bodyElement],
34130
+ observe: [this.headerElement, this.bodyContentElement],
34057
34131
  resizingClass: RESIZE_ANIMATION_CLASS,
34058
34132
  });
34059
34133
  }
34060
34134
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34061
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MenuComponent, isStandalone: true, selector: "et-menu", host: { classAttribute: "et-menu" }, viewQueries: [{ propertyName: "headerElement", first: true, predicate: ["menuHeader"], descendants: true, isSignal: true }, { propertyName: "bodyElement", first: true, predicate: ["menuBody"], descendants: true, isSignal: true }], hostDirectives: [{ directive: MenuPanelDirective }, { directive: i1.ProvideColorDirective }, { directive: i1.AutoSurfaceDirective }], ngImport: i0, template: "<div #menuHeader class=\"et-menu-header\">\n <div class=\"et-menu-search-field\">\n <ng-content select=\"input[etMenuSearch]\" />\n\n @if (searchLoading()) {\n <et-spinner class=\"et-menu-search-spinner\" diameter=\"16\" />\n }\n </div>\n\n @if (searchError(); as error) {\n <p [id]=\"searchErrorId\" [etProvideColor]=\"errorColorTheme\" class=\"et-menu-search-error\" role=\"alert\">\n {{ error }}\n </p>\n }\n</div>\n\n<div #menuBody class=\"et-menu-body\">\n <ng-content />\n</div>\n", styles: ["@layer components{@property --et-menu-min-width{syntax: \"<length>\"; inherits: false; initial-value: 180px;}@property --et-menu-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-menu-padding-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-padding-inline{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-item-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}@property --et-menu-item-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-gap{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-menu-item-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-menu-item-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-menu-separator-margin-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-group-label-font-size{syntax: \"<length>\"; inherits: false; initial-value: 12px;}@property --et-menu-search-height{syntax: \"<length>\"; inherits: false; initial-value: 36px;}.et-overlay.et-overlay--menu{overflow:visible;background:transparent;box-shadow:none}.et-menu{--_et-menu-background: var(--et-surface-background-solid, var(--et-surface-2, rgb(32 32 32)));--_et-menu-color: var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));--_et-menu-border: var(--et-surface-border-solid, rgb(255 255 255 / .1));--_et-menu-shadow: 0 10px 24px rgb(0 0 0 / .16);--_et-menu-radius: 10px;--_et-menu-item-active-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 12%, transparent );--_et-menu-item-pressed-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 20%, transparent );--_et-menu-muted-color: var(--et-surface-color-muted-solid, rgb(255 255 255 / .55));--_et-menu-separator-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));display:block;min-inline-size:var(--et-menu-min-width);max-inline-size:min(320px,calc(100vw - 24px));border-radius:var(--_et-menu-radius);border:1px solid var(--_et-menu-border);background:var(--_et-menu-background);color:var(--_et-menu-color);font-family:var(--et-font-family, inherit);font-size:var(--et-menu-item-font-size);box-shadow:var(--_et-menu-shadow);outline:none}.et-menu.et-menu--resizing{overflow:clip}.et-menu .et-menu-header{padding:var(--et-menu-padding-block) var(--et-menu-padding-inline) 0;contain:inline-size}.et-menu .et-menu-header:not(:has(input[etmenusearch])){display:none}.et-menu .et-menu-header .et-menu-search-field{position:relative}.et-menu .et-menu-header .et-menu-search-field:has(.et-menu-search-spinner) input[etmenusearch]{padding-inline-end:calc(var(--et-menu-item-padding-inline) + 22px)}.et-menu .et-menu-header .et-menu-search-spinner{position:absolute;inset-block-start:50%;inset-inline-end:10px;translate:0 -50%;color:var(--_et-menu-muted-color)}.et-menu .et-menu-header .et-menu-search-error{margin:6px 2px 0;font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-header input[etmenusearch]{inline-size:100%;block-size:var(--et-menu-search-height);padding-inline:var(--et-menu-item-padding-inline);border-radius:var(--et-menu-item-border-radius);border:1px solid var(--_et-menu-border);background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;box-sizing:border-box;transition:border-color .12s ease,background .12s ease}.et-menu .et-menu-header input[etmenusearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-menu .et-menu-header input[etmenusearch]::placeholder{color:var(--_et-menu-muted-color)}.et-menu .et-menu-body{max-block-size:var(--et-menu-max-height, var(--et-overlay-max-height));padding:var(--et-menu-padding-block) var(--et-menu-padding-inline);overflow-y:auto;overscroll-behavior:contain}.et-menu .et-menu-group{display:block}.et-menu .et-menu-item{display:flex;align-items:center;gap:var(--et-menu-item-gap);inline-size:100%;min-block-size:var(--et-menu-item-height);padding-inline:var(--et-menu-item-padding-inline);border:none;border-radius:var(--et-menu-item-border-radius);background:transparent;color:inherit;font:inherit;text-align:start;text-decoration:none;cursor:pointer;outline:none;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transition:background .12s ease,color .12s ease,opacity .12s ease}.et-menu .et-menu-item[data-active]:where(:focus-visible),.et-menu .et-menu-item[data-menu-open]{background:var(--_et-menu-item-active-background)}@media(hover:hover){.et-menu .et-menu-item[data-active]:where(:hover){background:var(--_et-menu-item-active-background)}}.et-menu .et-menu-item:active:not([aria-disabled=true]){background:var(--_et-menu-item-pressed-background)}.et-menu .et-menu-item[aria-disabled=true]{opacity:.4;cursor:default}.et-menu .et-menu-item[data-variant=destructive]{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-item .et-menu-item-content{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--menu[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--menu[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=right].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=right].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=left].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=left].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--menu[data-overlay-placement].et-animation-enter-from,.et-overlay--menu[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}}\n"], dependencies: [{ kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], encapsulation: i0.ViewEncapsulation.None }); }
34135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MenuComponent, isStandalone: true, selector: "et-menu", host: { classAttribute: "et-menu" }, viewQueries: [{ propertyName: "headerElement", first: true, predicate: ["menuHeader"], descendants: true, isSignal: true }, { propertyName: "bodyContentElement", first: true, predicate: ["menuBodyContent"], descendants: true, isSignal: true }], hostDirectives: [{ directive: MenuPanelDirective }, { directive: i1.ProvideColorDirective }, { directive: i1.AutoSurfaceDirective }], ngImport: i0, template: "<div #menuHeader class=\"et-menu-header\">\n <div class=\"et-menu-search-field\">\n <ng-content select=\"input[etMenuSearch]\" />\n\n @if (searchLoading()) {\n <et-spinner class=\"et-menu-search-spinner\" diameter=\"16\" />\n }\n </div>\n\n @if (searchError(); as error) {\n <p [id]=\"searchErrorId\" [etProvideColor]=\"errorColorTheme\" class=\"et-menu-search-error\" role=\"alert\">\n {{ error }}\n </p>\n }\n</div>\n\n<div class=\"et-menu-body\">\n <div #menuBodyContent class=\"et-menu-body-content\">\n <ng-content />\n </div>\n</div>\n", styles: ["@layer components{@property --et-menu-min-width{syntax: \"<length>\"; inherits: false; initial-value: 180px;}@property --et-menu-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-menu-padding-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-padding-inline{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-item-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}@property --et-menu-item-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-gap{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-menu-item-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-menu-item-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-menu-separator-margin-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-group-label-font-size{syntax: \"<length>\"; inherits: false; initial-value: 12px;}@property --et-menu-search-height{syntax: \"<length>\"; inherits: false; initial-value: 36px;}.et-overlay.et-overlay--menu{overflow:visible;background:transparent;box-shadow:none}.et-menu{--_et-menu-background: var(--et-surface-background-solid, var(--et-surface-2, rgb(32 32 32)));--_et-menu-color: var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));--_et-menu-border: var(--et-surface-border-solid, rgb(255 255 255 / .1));--_et-menu-shadow: 0 10px 24px rgb(0 0 0 / .16);--_et-menu-radius: 10px;--_et-menu-item-active-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 12%, transparent );--_et-menu-item-pressed-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 20%, transparent );--_et-menu-muted-color: var(--et-surface-color-muted-solid, rgb(255 255 255 / .55));--_et-menu-separator-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));display:flex;flex-direction:column;min-inline-size:var(--et-menu-min-width);max-inline-size:min(320px,calc(100vw - 24px));max-block-size:min(var(--et-menu-max-height),var(--et-overlay-max-height, 100vh));border-radius:var(--_et-menu-radius);border:1px solid var(--_et-menu-border);background:var(--_et-menu-background);color:var(--_et-menu-color);font-family:var(--et-font-family, inherit);font-size:var(--et-menu-item-font-size);box-shadow:var(--_et-menu-shadow);outline:none}.et-menu.et-menu--resizing{overflow:clip}.et-menu.et-menu--resizing .et-menu-body{overflow:clip}.et-menu .et-menu-header{flex:none;padding:var(--et-menu-padding-block) var(--et-menu-padding-inline) 0;contain:inline-size}.et-menu .et-menu-header:not(:has(input[etmenusearch])){display:none}.et-menu .et-menu-header .et-menu-search-field{position:relative}.et-menu .et-menu-header .et-menu-search-field:has(.et-menu-search-spinner) input[etmenusearch]{padding-inline-end:calc(var(--et-menu-item-padding-inline) + 22px)}.et-menu .et-menu-header .et-menu-search-spinner{position:absolute;inset-block-start:50%;inset-inline-end:10px;translate:0 -50%;color:var(--_et-menu-muted-color)}.et-menu .et-menu-header .et-menu-search-error{margin:6px 2px 0;font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-header input[etmenusearch]{inline-size:100%;block-size:var(--et-menu-search-height);padding-inline:var(--et-menu-item-padding-inline);border-radius:var(--et-menu-item-border-radius);border:1px solid var(--_et-menu-border);background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;box-sizing:border-box;transition:border-color .12s ease,background .12s ease}.et-menu .et-menu-header input[etmenusearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-menu .et-menu-header input[etmenusearch]::placeholder{color:var(--_et-menu-muted-color)}.et-menu .et-menu-body{flex:1;min-block-size:0;padding:var(--et-menu-padding-block) var(--et-menu-padding-inline);overflow-y:auto;overscroll-behavior:contain}.et-menu .et-menu-group{display:block}.et-menu .et-menu-item{display:flex;align-items:center;gap:var(--et-menu-item-gap);inline-size:100%;min-block-size:var(--et-menu-item-height);padding-inline:var(--et-menu-item-padding-inline);border:none;border-radius:var(--et-menu-item-border-radius);background:transparent;color:inherit;font:inherit;text-align:start;text-decoration:none;cursor:pointer;outline:none;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transition:background .12s ease,color .12s ease,opacity .12s ease}.et-menu .et-menu-item[data-active]:where(:focus-visible),.et-menu .et-menu-item[data-menu-open]{background:var(--_et-menu-item-active-background)}@media(hover:hover){.et-menu .et-menu-item[data-active]:where(:hover){background:var(--_et-menu-item-active-background)}}.et-menu .et-menu-item:active:not([aria-disabled=true]){background:var(--_et-menu-item-pressed-background)}.et-menu .et-menu-item[aria-disabled=true]{opacity:.4;cursor:default}.et-menu .et-menu-item[data-variant=destructive]{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-item .et-menu-item-content{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--menu[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--menu[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=right].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=right].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=left].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=left].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--menu[data-overlay-placement].et-animation-enter-from,.et-overlay--menu[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}}\n"], dependencies: [{ kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], encapsulation: i0.ViewEncapsulation.None }); }
34062
34136
  }
34063
34137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MenuComponent, decorators: [{
34064
34138
  type: Component,
34065
34139
  args: [{ selector: 'et-menu', encapsulation: ViewEncapsulation.None, imports: [ProvideColorDirective, SpinnerComponent], hostDirectives: [MenuPanelDirective, ProvideColorDirective, AutoSurfaceDirective], host: {
34066
34140
  class: 'et-menu',
34067
- }, template: "<div #menuHeader class=\"et-menu-header\">\n <div class=\"et-menu-search-field\">\n <ng-content select=\"input[etMenuSearch]\" />\n\n @if (searchLoading()) {\n <et-spinner class=\"et-menu-search-spinner\" diameter=\"16\" />\n }\n </div>\n\n @if (searchError(); as error) {\n <p [id]=\"searchErrorId\" [etProvideColor]=\"errorColorTheme\" class=\"et-menu-search-error\" role=\"alert\">\n {{ error }}\n </p>\n }\n</div>\n\n<div #menuBody class=\"et-menu-body\">\n <ng-content />\n</div>\n", styles: ["@layer components{@property --et-menu-min-width{syntax: \"<length>\"; inherits: false; initial-value: 180px;}@property --et-menu-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-menu-padding-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-padding-inline{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-item-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}@property --et-menu-item-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-gap{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-menu-item-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-menu-item-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-menu-separator-margin-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-group-label-font-size{syntax: \"<length>\"; inherits: false; initial-value: 12px;}@property --et-menu-search-height{syntax: \"<length>\"; inherits: false; initial-value: 36px;}.et-overlay.et-overlay--menu{overflow:visible;background:transparent;box-shadow:none}.et-menu{--_et-menu-background: var(--et-surface-background-solid, var(--et-surface-2, rgb(32 32 32)));--_et-menu-color: var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));--_et-menu-border: var(--et-surface-border-solid, rgb(255 255 255 / .1));--_et-menu-shadow: 0 10px 24px rgb(0 0 0 / .16);--_et-menu-radius: 10px;--_et-menu-item-active-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 12%, transparent );--_et-menu-item-pressed-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 20%, transparent );--_et-menu-muted-color: var(--et-surface-color-muted-solid, rgb(255 255 255 / .55));--_et-menu-separator-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));display:block;min-inline-size:var(--et-menu-min-width);max-inline-size:min(320px,calc(100vw - 24px));border-radius:var(--_et-menu-radius);border:1px solid var(--_et-menu-border);background:var(--_et-menu-background);color:var(--_et-menu-color);font-family:var(--et-font-family, inherit);font-size:var(--et-menu-item-font-size);box-shadow:var(--_et-menu-shadow);outline:none}.et-menu.et-menu--resizing{overflow:clip}.et-menu .et-menu-header{padding:var(--et-menu-padding-block) var(--et-menu-padding-inline) 0;contain:inline-size}.et-menu .et-menu-header:not(:has(input[etmenusearch])){display:none}.et-menu .et-menu-header .et-menu-search-field{position:relative}.et-menu .et-menu-header .et-menu-search-field:has(.et-menu-search-spinner) input[etmenusearch]{padding-inline-end:calc(var(--et-menu-item-padding-inline) + 22px)}.et-menu .et-menu-header .et-menu-search-spinner{position:absolute;inset-block-start:50%;inset-inline-end:10px;translate:0 -50%;color:var(--_et-menu-muted-color)}.et-menu .et-menu-header .et-menu-search-error{margin:6px 2px 0;font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-header input[etmenusearch]{inline-size:100%;block-size:var(--et-menu-search-height);padding-inline:var(--et-menu-item-padding-inline);border-radius:var(--et-menu-item-border-radius);border:1px solid var(--_et-menu-border);background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;box-sizing:border-box;transition:border-color .12s ease,background .12s ease}.et-menu .et-menu-header input[etmenusearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-menu .et-menu-header input[etmenusearch]::placeholder{color:var(--_et-menu-muted-color)}.et-menu .et-menu-body{max-block-size:var(--et-menu-max-height, var(--et-overlay-max-height));padding:var(--et-menu-padding-block) var(--et-menu-padding-inline);overflow-y:auto;overscroll-behavior:contain}.et-menu .et-menu-group{display:block}.et-menu .et-menu-item{display:flex;align-items:center;gap:var(--et-menu-item-gap);inline-size:100%;min-block-size:var(--et-menu-item-height);padding-inline:var(--et-menu-item-padding-inline);border:none;border-radius:var(--et-menu-item-border-radius);background:transparent;color:inherit;font:inherit;text-align:start;text-decoration:none;cursor:pointer;outline:none;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transition:background .12s ease,color .12s ease,opacity .12s ease}.et-menu .et-menu-item[data-active]:where(:focus-visible),.et-menu .et-menu-item[data-menu-open]{background:var(--_et-menu-item-active-background)}@media(hover:hover){.et-menu .et-menu-item[data-active]:where(:hover){background:var(--_et-menu-item-active-background)}}.et-menu .et-menu-item:active:not([aria-disabled=true]){background:var(--_et-menu-item-pressed-background)}.et-menu .et-menu-item[aria-disabled=true]{opacity:.4;cursor:default}.et-menu .et-menu-item[data-variant=destructive]{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-item .et-menu-item-content{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--menu[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--menu[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=right].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=right].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=left].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=left].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--menu[data-overlay-placement].et-animation-enter-from,.et-overlay--menu[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}}\n"] }]
34068
- }], ctorParameters: () => [], propDecorators: { headerElement: [{ type: i0.ViewChild, args: ['menuHeader', { isSignal: true }] }], bodyElement: [{ type: i0.ViewChild, args: ['menuBody', { isSignal: true }] }] } });
34141
+ }, template: "<div #menuHeader class=\"et-menu-header\">\n <div class=\"et-menu-search-field\">\n <ng-content select=\"input[etMenuSearch]\" />\n\n @if (searchLoading()) {\n <et-spinner class=\"et-menu-search-spinner\" diameter=\"16\" />\n }\n </div>\n\n @if (searchError(); as error) {\n <p [id]=\"searchErrorId\" [etProvideColor]=\"errorColorTheme\" class=\"et-menu-search-error\" role=\"alert\">\n {{ error }}\n </p>\n }\n</div>\n\n<div class=\"et-menu-body\">\n <div #menuBodyContent class=\"et-menu-body-content\">\n <ng-content />\n </div>\n</div>\n", styles: ["@layer components{@property --et-menu-min-width{syntax: \"<length>\"; inherits: false; initial-value: 180px;}@property --et-menu-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-menu-padding-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-padding-inline{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-item-height{syntax: \"<length>\"; inherits: true; initial-value: 36px;}@property --et-menu-item-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-gap{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-menu-item-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-menu-item-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-menu-item-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-menu-separator-margin-block{syntax: \"<length>\"; inherits: false; initial-value: 6px;}@property --et-menu-group-label-font-size{syntax: \"<length>\"; inherits: false; initial-value: 12px;}@property --et-menu-search-height{syntax: \"<length>\"; inherits: false; initial-value: 36px;}.et-overlay.et-overlay--menu{overflow:visible;background:transparent;box-shadow:none}.et-menu{--_et-menu-background: var(--et-surface-background-solid, var(--et-surface-2, rgb(32 32 32)));--_et-menu-color: var(--et-surface-color-solid, var(--et-color-main-contrast, rgb(244 244 245)));--_et-menu-border: var(--et-surface-border-solid, rgb(255 255 255 / .1));--_et-menu-shadow: 0 10px 24px rgb(0 0 0 / .16);--_et-menu-radius: 10px;--_et-menu-item-active-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 12%, transparent );--_et-menu-item-pressed-background: color-mix( in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 20%, transparent );--_et-menu-muted-color: var(--et-surface-color-muted-solid, rgb(255 255 255 / .55));--_et-menu-separator-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));display:flex;flex-direction:column;min-inline-size:var(--et-menu-min-width);max-inline-size:min(320px,calc(100vw - 24px));max-block-size:min(var(--et-menu-max-height),var(--et-overlay-max-height, 100vh));border-radius:var(--_et-menu-radius);border:1px solid var(--_et-menu-border);background:var(--_et-menu-background);color:var(--_et-menu-color);font-family:var(--et-font-family, inherit);font-size:var(--et-menu-item-font-size);box-shadow:var(--_et-menu-shadow);outline:none}.et-menu.et-menu--resizing{overflow:clip}.et-menu.et-menu--resizing .et-menu-body{overflow:clip}.et-menu .et-menu-header{flex:none;padding:var(--et-menu-padding-block) var(--et-menu-padding-inline) 0;contain:inline-size}.et-menu .et-menu-header:not(:has(input[etmenusearch])){display:none}.et-menu .et-menu-header .et-menu-search-field{position:relative}.et-menu .et-menu-header .et-menu-search-field:has(.et-menu-search-spinner) input[etmenusearch]{padding-inline-end:calc(var(--et-menu-item-padding-inline) + 22px)}.et-menu .et-menu-header .et-menu-search-spinner{position:absolute;inset-block-start:50%;inset-inline-end:10px;translate:0 -50%;color:var(--_et-menu-muted-color)}.et-menu .et-menu-header .et-menu-search-error{margin:6px 2px 0;font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-header input[etmenusearch]{inline-size:100%;block-size:var(--et-menu-search-height);padding-inline:var(--et-menu-item-padding-inline);border-radius:var(--et-menu-item-border-radius);border:1px solid var(--_et-menu-border);background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 6%,transparent);color:inherit;font:inherit;outline:none;box-sizing:border-box;transition:border-color .12s ease,background .12s ease}.et-menu .et-menu-header input[etmenusearch]:focus-visible{border-color:var(--et-theme-color-primary-solid, rgb(255 255 255 / .3))}.et-menu .et-menu-header input[etmenusearch]::placeholder{color:var(--_et-menu-muted-color)}.et-menu .et-menu-body{flex:1;min-block-size:0;padding:var(--et-menu-padding-block) var(--et-menu-padding-inline);overflow-y:auto;overscroll-behavior:contain}.et-menu .et-menu-group{display:block}.et-menu .et-menu-item{display:flex;align-items:center;gap:var(--et-menu-item-gap);inline-size:100%;min-block-size:var(--et-menu-item-height);padding-inline:var(--et-menu-item-padding-inline);border:none;border-radius:var(--et-menu-item-border-radius);background:transparent;color:inherit;font:inherit;text-align:start;text-decoration:none;cursor:pointer;outline:none;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transition:background .12s ease,color .12s ease,opacity .12s ease}.et-menu .et-menu-item[data-active]:where(:focus-visible),.et-menu .et-menu-item[data-menu-open]{background:var(--_et-menu-item-active-background)}@media(hover:hover){.et-menu .et-menu-item[data-active]:where(:hover){background:var(--_et-menu-item-active-background)}}.et-menu .et-menu-item:active:not([aria-disabled=true]){background:var(--_et-menu-item-pressed-background)}.et-menu .et-menu-item[aria-disabled=true]{opacity:.4;cursor:default}.et-menu .et-menu-item[data-variant=destructive]{color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-menu .et-menu-item .et-menu-item-content{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--menu[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--menu[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=right].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=right].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(-.3rem)!important}.et-overlay--menu[data-overlay-placement^=left].et-animation-enter-from,.et-overlay--menu[data-overlay-placement^=left].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translate(.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--menu.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--menu[data-overlay-placement].et-animation-enter-from,.et-overlay--menu[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}}\n"] }]
34142
+ }], ctorParameters: () => [], propDecorators: { headerElement: [{ type: i0.ViewChild, args: ['menuHeader', { isSignal: true }] }], bodyContentElement: [{ type: i0.ViewChild, args: ['menuBodyContent', { isSignal: true }] }] } });
34069
34143
 
34070
34144
  const MENU_IMPORTS = [
34071
34145
  MenuDirective,
@@ -36630,6 +36704,160 @@ const createRichTextEditorTriggerWithQuery = (config) => {
36630
36704
  */
36631
36705
  const RICH_TEXT_EDITOR_TRIGGERS_IMPORTS = [RichTextEditorTriggersDirective];
36632
36706
 
36707
+ const TOOLBAR_ORIENTATIONS = {
36708
+ HORIZONTAL: 'horizontal',
36709
+ VERTICAL: 'vertical',
36710
+ };
36711
+
36712
+ const CONTROL_SELECTOR = 'button, [href], input, select, textarea';
36713
+ const TOOLBAR_SELECTOR = '[role="toolbar"]';
36714
+ /**
36715
+ * Turns its host into an ARIA toolbar: a single tab stop that Tab enters and leaves, with the arrow
36716
+ * keys moving focus between the controls inside it. `Home`/`End` jump to the first/last control and
36717
+ * arrow navigation wraps around; in a horizontal toolbar the left/right keys follow the writing
36718
+ * direction.
36719
+ *
36720
+ * Every focusable control rendered inside the host is a toolbar control - projected content,
36721
+ * `@for` output and components that own their own button templates included - so nothing has to be
36722
+ * marked up per item. Natively disabled controls are skipped; controls belonging to a nested
36723
+ * toolbar stay with that toolbar.
36724
+ *
36725
+ * Pair it with an accessible name (`aria-label`, or `aria-labelledby` pointing at a visible
36726
+ * heading), which is what tells the user what the toolbar is for.
36727
+ *
36728
+ * @example
36729
+ * <div [attr.aria-label]="'Text formatting'" etToolbar>
36730
+ * <button et-icon-button type="button">…</button>
36731
+ * <button et-icon-button type="button">…</button>
36732
+ * </div>
36733
+ */
36734
+ class ToolbarDirective {
36735
+ constructor() {
36736
+ this.elementRef = inject(ElementRef);
36737
+ this.document = inject(DOCUMENT$1);
36738
+ this.orientation = input(TOOLBAR_ORIENTATIONS.HORIZONTAL, /* @ts-ignore */
36739
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
36740
+ this.tabStop = null;
36741
+ afterEveryRender(() => this.syncTabStops());
36742
+ }
36743
+ /** Moves focus to the toolbar's first control, the tab stop a fresh Tab would land on. */
36744
+ focusFirst() {
36745
+ this.focusableControls()[0]?.focus();
36746
+ }
36747
+ handleKeydown(event) {
36748
+ const horizontal = this.orientation() === TOOLBAR_ORIENTATIONS.HORIZONTAL;
36749
+ const rtl = horizontal && getComputedStyle(this.elementRef.nativeElement).direction === 'rtl';
36750
+ const nextKey = horizontal ? (rtl ? 'ArrowLeft' : 'ArrowRight') : 'ArrowDown';
36751
+ const previousKey = horizontal ? (rtl ? 'ArrowRight' : 'ArrowLeft') : 'ArrowUp';
36752
+ let target;
36753
+ const controls = this.focusableControls();
36754
+ if (!controls.length)
36755
+ return;
36756
+ const current = controls.indexOf(this.document.activeElement);
36757
+ switch (event.key) {
36758
+ case nextKey:
36759
+ target = controls[(current + 1) % controls.length];
36760
+ break;
36761
+ case previousKey:
36762
+ target = controls[current <= 0 ? controls.length - 1 : current - 1];
36763
+ break;
36764
+ case 'Home':
36765
+ target = controls[0];
36766
+ break;
36767
+ case 'End':
36768
+ target = controls[controls.length - 1];
36769
+ break;
36770
+ default:
36771
+ return;
36772
+ }
36773
+ if (!target)
36774
+ return;
36775
+ event.preventDefault();
36776
+ target.focus();
36777
+ }
36778
+ /** The last focused control keeps the tab stop, so Shift+Tab back re-enters where the user left. */
36779
+ handleFocusIn(event) {
36780
+ const target = event.target;
36781
+ if (!(target instanceof HTMLElement) || !this.focusableControls().includes(target))
36782
+ return;
36783
+ this.tabStop = target;
36784
+ this.syncTabStops();
36785
+ }
36786
+ /** Every control this toolbar owns. Disabled ones are included: they must lose their tab stop too,
36787
+ * or re-enabling one would leave the toolbar with two. */
36788
+ controls() {
36789
+ const host = this.elementRef.nativeElement;
36790
+ // eslint-disable-next-line ethlete/no-dom-query -- any focusable descendant is a toolbar control, including those inside components that own their own button templates, which no directive token could reach
36791
+ const found = Array.from(host.querySelectorAll(`${CONTROL_SELECTOR}, ${TOOLBAR_SELECTOR}`));
36792
+ const nested = found.filter((element) => element.matches(TOOLBAR_SELECTOR));
36793
+ return found.filter((control) => !nested.includes(control) && !nested.some((toolbar) => toolbar.contains(control)));
36794
+ }
36795
+ focusableControls() {
36796
+ return this.controls().filter((control) => !control.disabled);
36797
+ }
36798
+ syncTabStops() {
36799
+ const focusable = this.focusableControls();
36800
+ if (!this.tabStop || !focusable.includes(this.tabStop)) {
36801
+ this.tabStop = focusable[0] ?? null;
36802
+ }
36803
+ for (const control of this.controls()) {
36804
+ const tabIndex = control === this.tabStop ? 0 : -1;
36805
+ // written imperatively rather than as a binding: the controls are arbitrary projected content,
36806
+ // so only touch the DOM when the value changed to keep the per-render pass free
36807
+ if (control.tabIndex !== tabIndex)
36808
+ control.tabIndex = tabIndex;
36809
+ }
36810
+ }
36811
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ToolbarDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
36812
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: ToolbarDirective, isStandalone: true, selector: "[etToolbar]", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "toolbar" }, listeners: { "keydown": "handleKeydown($event)", "focusin": "handleFocusIn($event)" }, properties: { "attr.aria-orientation": "orientation()" } }, ngImport: i0 }); }
36813
+ }
36814
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ToolbarDirective, decorators: [{
36815
+ type: Directive,
36816
+ args: [{
36817
+ selector: '[etToolbar]',
36818
+ host: {
36819
+ role: 'toolbar',
36820
+ '[attr.aria-orientation]': 'orientation()',
36821
+ '(keydown)': 'handleKeydown($event)',
36822
+ '(focusin)': 'handleFocusIn($event)',
36823
+ },
36824
+ }]
36825
+ }], ctorParameters: () => [], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
36826
+
36827
+ /**
36828
+ * A bar of related controls that share one tab stop, laid out in a row (or a column with
36829
+ * `orientation="vertical"`) and navigated with the arrow keys - see `[etToolbar]` for the keyboard
36830
+ * model. Group the controls inside it with `et-divider`.
36831
+ *
36832
+ * Pass an `aria-label` naming what the toolbar acts on; without one a screen reader announces only
36833
+ * that a toolbar is present.
36834
+ *
36835
+ * @example
36836
+ * <et-toolbar aria-label="Text formatting">
36837
+ * <button et-icon-button type="button"><i etIcon="et-bold"></i></button>
36838
+ * <button et-icon-button type="button"><i etIcon="et-italic"></i></button>
36839
+ * <et-divider orientation="vertical" decorative />
36840
+ * <button et-icon-button type="button"><i etIcon="et-link"></i></button>
36841
+ * </et-toolbar>
36842
+ */
36843
+ class ToolbarComponent {
36844
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36845
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: ToolbarComponent, isStandalone: true, selector: "et-toolbar, [et-toolbar]", host: { classAttribute: "et-toolbar" }, hostDirectives: [{ directive: ToolbarDirective, inputs: ["orientation", "orientation"] }], ngImport: i0, template: `<ng-content />`, isInline: true, styles: ["@layer components{@property --et-toolbar-gap{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-toolbar-padding{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-toolbar-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-toolbar-background{syntax: \"<color>\"; inherits: false; initial-value: transparent;}.et-toolbar{display:flex;align-items:center;gap:var(--et-toolbar-gap);padding:var(--et-toolbar-padding);border-radius:var(--et-toolbar-border-radius);background:var(--et-toolbar-background);box-sizing:border-box}.et-toolbar:where([aria-orientation=vertical]){flex-direction:column;align-items:stretch}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
36846
+ }
36847
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: ToolbarComponent, decorators: [{
36848
+ type: Component,
36849
+ args: [{ selector: 'et-toolbar, [et-toolbar]', template: `<ng-content />`, encapsulation: ViewEncapsulation.None, hostDirectives: [
36850
+ {
36851
+ directive: ToolbarDirective,
36852
+ inputs: ['orientation'],
36853
+ },
36854
+ ], host: {
36855
+ class: 'et-toolbar',
36856
+ }, styles: ["@layer components{@property --et-toolbar-gap{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-toolbar-padding{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-toolbar-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-toolbar-background{syntax: \"<color>\"; inherits: false; initial-value: transparent;}.et-toolbar{display:flex;align-items:center;gap:var(--et-toolbar-gap);padding:var(--et-toolbar-padding);border-radius:var(--et-toolbar-border-radius);background:var(--et-toolbar-background);box-sizing:border-box}.et-toolbar:where([aria-orientation=vertical]){flex-direction:column;align-items:stretch}}\n"] }]
36857
+ }] });
36858
+
36859
+ const TOOLBAR_IMPORTS = [ToolbarComponent, ToolbarDirective];
36860
+
36633
36861
  /** How often the docked toolbar re-checks where the keyboard is, to recover a missed viewport event. */
36634
36862
  const DOCKED_TOOLBAR_POLL_MS = 500;
36635
36863
  /** Caret-navigation / deletion keys that should drop any pending stored-mark toggle. */
@@ -36664,8 +36892,6 @@ class RichTextEditorComponent {
36664
36892
  this.floatingToolbarSetup = inject(RICH_TEXT_EDITOR_FLOATING_TOOLBAR, { optional: true });
36665
36893
  this.editable = viewChild.required('editable', /* @ts-ignore */
36666
36894
  ...(ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []));
36667
- this.toolbar = viewChild.required('toolbar', /* @ts-ignore */
36668
- ...(ngDevMode ? [{ debugName: "toolbar" }] : /* istanbul ignore next */ []));
36669
36895
  this.TOOLS = RICH_TEXT_EDITOR_TOOLS;
36670
36896
  /** The strings in effect, owned by the directive so the opt-in tools read the same set. */
36671
36897
  this.labels = computed(() => this.dir.resolvedLabels(), /* @ts-ignore */
@@ -36679,14 +36905,10 @@ class RichTextEditorComponent {
36679
36905
  /** Dock the toolbar above the keyboard only on touch while editing. */
36680
36906
  this.dockedToolbar = computed(() => this.hasTouchInput() && this.editingActive(), /* @ts-ignore */
36681
36907
  ...(ngDevMode ? [{ debugName: "dockedToolbar" }] : /* istanbul ignore next */ []));
36682
- /** The toolbar button currently holding the single roving tab stop (ARIA toolbar pattern). */
36683
- this.toolbarTabStop = null;
36684
36908
  this.linkEditorSetup?.(this.dir, this.host.nativeElement);
36685
36909
  this.floatingToolbarSetup?.(this.dir);
36686
36910
  this.trackKeyboardInset();
36687
36911
  this.trackEditingActive();
36688
- // keep the roving tab stop valid as tools are added/removed or become disabled
36689
- afterEveryRender(() => this.updateToolbarTabStops());
36690
36912
  afterNextRender(() => {
36691
36913
  this.dir.editorDom.root.set(this.editable().nativeElement ?? null);
36692
36914
  this.dir.renderExternalValue();
@@ -36713,48 +36935,6 @@ class RichTextEditorComponent {
36713
36935
  syncValueFromDom() {
36714
36936
  this.dir.syncFromDom();
36715
36937
  }
36716
- /**
36717
- * The toolbar is a single tab stop (ARIA toolbar pattern): Tab enters on one button, the arrow
36718
- * keys move focus between the buttons, and the next Tab leaves the toolbar. Menu surfaces render
36719
- * into an overlay, so every `button` inside the toolbar element is a toolbar control - including
36720
- * the custom tool controls (`ngComponentOutlet`), which template bindings couldn't reach.
36721
- */
36722
- handleToolbarKeydown(event) {
36723
- if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight' && event.key !== 'Home' && event.key !== 'End') {
36724
- return;
36725
- }
36726
- const buttons = this.toolbarButtons().filter((button) => !button.disabled);
36727
- if (!buttons.length)
36728
- return;
36729
- const currentIndex = buttons.indexOf(this.document.activeElement);
36730
- let next;
36731
- switch (event.key) {
36732
- case 'ArrowLeft':
36733
- next = buttons[currentIndex <= 0 ? buttons.length - 1 : currentIndex - 1];
36734
- break;
36735
- case 'ArrowRight':
36736
- next = buttons[(currentIndex + 1) % buttons.length];
36737
- break;
36738
- case 'Home':
36739
- next = buttons[0];
36740
- break;
36741
- case 'End':
36742
- next = buttons[buttons.length - 1];
36743
- break;
36744
- }
36745
- if (!next)
36746
- return;
36747
- event.preventDefault();
36748
- next.focus();
36749
- }
36750
- /** The last focused button keeps the tab stop, so Shift+Tab back re-enters where the user left. */
36751
- handleToolbarFocusIn(event) {
36752
- const target = event.target;
36753
- if (!(target instanceof HTMLButtonElement) || target.disabled)
36754
- return;
36755
- this.toolbarTabStop = target;
36756
- this.updateToolbarTabStops();
36757
- }
36758
36938
  interceptEditorKeydown(event) {
36759
36939
  // History first, and always prevented: the native contenteditable undo stack must never run,
36760
36940
  // since paste normalization and autoformat rewrite the DOM behind its back and it would restore
@@ -36924,24 +37104,6 @@ class RichTextEditorComponent {
36924
37104
  break;
36925
37105
  }
36926
37106
  }
36927
- toolbarButtons() {
36928
- // eslint-disable-next-line ethlete/no-dom-query -- custom tool controls (ngComponentOutlet) own their button templates, so no directive token could reach them
36929
- return Array.from(this.toolbar().nativeElement.querySelectorAll('button'));
36930
- }
36931
- updateToolbarTabStops() {
36932
- const buttons = this.toolbarButtons();
36933
- const enabled = buttons.filter((button) => !button.disabled);
36934
- if (!this.toolbarTabStop || !enabled.includes(this.toolbarTabStop)) {
36935
- this.toolbarTabStop = enabled[0] ?? null;
36936
- }
36937
- for (const button of buttons) {
36938
- const tabIndex = button === this.toolbarTabStop ? 0 : -1;
36939
- // written imperatively (not a binding) since custom tool controls own their button templates;
36940
- // only touch the DOM when the value changed so the per-render pass stays free
36941
- if (button.tabIndex !== tabIndex)
36942
- button.tabIndex = tabIndex;
36943
- }
36944
- }
36945
37107
  /** Track the visual viewport so the docked (fixed) toolbar sits right above the on-screen
36946
37108
  * keyboard: the inset is the gap from where `position: fixed; bottom: 0` actually renders (a
36947
37109
  * measured probe - see below) down past the keyboard's top edge
@@ -37088,11 +37250,11 @@ class RichTextEditorComponent {
37088
37250
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: RichTextEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
37089
37251
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: RichTextEditorComponent, isStandalone: true, selector: "et-rich-text-editor", host: { listeners: { "click": "dir.activate()" }, properties: { "class.et-rich-text-editor--touch": "hasTouchInput()", "class.et-rich-text-editor--docked-toolbar": "dockedToolbar()" }, classAttribute: "et-rich-text-editor" }, providers: [
37090
37252
  provideIcons(BOLD_ICON, ITALIC_ICON, UNDERLINE_ICON, STRIKETHROUGH_ICON, CODE_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LINK_ICON, QUOTE_ICON, CODE_BLOCK_ICON, UNDO_ICON, REDO_ICON),
37091
- ], viewQueries: [{ propertyName: "editable", first: true, predicate: ["editable"], descendants: true, isSignal: true }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true, isSignal: true }], hostDirectives: [{ directive: RichTextEditorDirective, inputs: ["value", "value", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder", "tools", "tools", "autoformat", "autoformat", "labels", "labels"], outputs: ["valueChange", "valueChange", "touchedChange", "touchedChange"] }], ngImport: i0, template: "<!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- ARIA toolbar pattern: the container only relays keys/focus for its roving tab stop; the buttons inside are the focusable controls -->\n<div\n #toolbar\n [attr.aria-label]=\"labels().toolbar\"\n (keydown)=\"handleToolbarKeydown($event)\"\n (focusin)=\"handleToolbarFocusIn($event)\"\n class=\"et-rte-toolbar\"\n role=\"toolbar\"\n>\n @for (tool of dir.resolvedTools(); track $index) {\n @switch (tool) {\n @case (TOOLS.DIVIDER) {\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n }\n @default {\n @if (dir.toolDefs.get(tool); as def) {\n @if (def.control; as control) {\n <ng-container [ngComponentOutlet]=\"control\" [ngComponentOutletInputs]=\"{ editor: dir }\" />\n } @else {\n <button\n [pressed]=\"def.isActive?.(dir) ?? false\"\n [disabled]=\"dir.disabled() || dir.readonly() || (def.isDisabled?.(dir) ?? false)\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(dir)\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"def.icon ?? ''\"></i>\n </button>\n }\n }\n }\n }\n }\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedBy() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"syncValueFromDom()\"\n (beforeinput)=\"interceptFormattingCommand($event)\"\n (keydown)=\"interceptEditorKeydown($event)\"\n (paste)=\"interceptPaste($event)\"\n (drop)=\"interceptDrop($event)\"\n (click)=\"interceptClick($event)\"\n (pointerdown)=\"dir.clearPendingMarks()\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n", styles: ["@layer components{@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-rich-text-editor-quote-indent{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-rich-text-editor-quote-bar-width{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-code-block-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-rich-text-editor-token-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-token-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar .et-icon-button{--_et-focus-ring-offset: -1px}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{position:fixed;inset-inline:0;inset-block-end:0;z-index:60;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;padding-inline:8px;padding-block-start:6px;padding-block-end:calc(6px + max(var(--_et-rte-keyboard-inset, 0px),env(keyboard-inset-height,0px)));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(24 24 24)));border-block-end:none;border-block-start:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);box-shadow:0 -6px 20px #0000003d;scrollbar-width:none;opacity:0;transform:translateY(100%);pointer-events:none;transition:opacity .16s var(--ease-out-5, ease),transform .26s var(--ease-out-5, ease)}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar::-webkit-scrollbar{display:none}et-rich-text-editor.et-rich-text-editor--touch.et-rich-text-editor--docked-toolbar .et-rte-toolbar{opacity:1;transform:translateY(0);pointer-events:auto}et-rich-text-editor.et-rich-text-editor--touch .et-rte-content{font-size:max(1em,16px)}@media(prefers-reduced-motion:reduce){et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{transition:opacity .16s var(--ease-out-5, ease)}}et-rich-text-editor .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-content{--et-theme-color-primary-rgb: var(--et-color-primary);--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-ink-rgb: var(--et-color-primary-ink, var(--et-color-primary));--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb));display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol,et-rich-text-editor .et-rte-content blockquote,et-rich-text-editor .et-rte-content pre{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1,et-rich-text-editor .et-rte-content h2,et-rich-text-editor .et-rte-content h3,et-rich-text-editor .et-rte-content h4,et-rich-text-editor .et-rte-content h5,et-rich-text-editor .et-rte-content h6{margin-block:0;font-weight:700;line-height:1.25}et-rich-text-editor .et-rte-content :is(h1,h2,h3,h4,h5,h6)+*,et-rich-text-editor .et-rte-content *+:is(h1,h2,h3,h4,h5,h6){margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1{font-size:2.4rem}et-rich-text-editor .et-rte-content h2{font-size:2rem}et-rich-text-editor .et-rte-content h3{font-size:1.6rem}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul{list-style-type:circle}et-rich-text-editor .et-rte-content ul ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul ul{list-style-type:square}et-rich-text-editor .et-rte-content ul ul ul ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol{list-style-type:lower-alpha}et-rich-text-editor .et-rte-content ol ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol ol{list-style-type:lower-roman}et-rich-text-editor .et-rte-content ol ol ol ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}et-rich-text-editor .et-rte-content code{padding:.1em .3em;border-radius:4px;background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em}et-rich-text-editor .et-rte-content blockquote{margin-inline:0;margin-block-end:0;padding-inline-start:var(--et-rich-text-editor-quote-indent);border-inline-start:var(--et-rich-text-editor-quote-bar-width) solid color-mix(in srgb,var(--et-surface-border-solid, currentColor) 80%,transparent);color:color-mix(in srgb,currentColor 82%,transparent)}et-rich-text-editor .et-rte-content blockquote blockquote{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content pre{margin-block-end:0;padding:8px 10px;border-radius:var(--et-rich-text-editor-code-block-radius);background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 10%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em;white-space:pre-wrap}et-rich-text-editor .et-rte-content pre code{padding:0;border-radius:0;background:none;font-size:inherit}et-rich-text-editor .et-rte-content .et-rte-token{--_et-rte-token-accent: var(--et-theme-color-primary-solid, var(--et-surface-interaction-solid, currentColor));display:inline;padding-inline:var(--et-rich-text-editor-token-padding-inline);border-radius:var(--et-rich-text-editor-token-radius);background:color-mix(in srgb,var(--_et-rte-token-accent) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_et-rte-token-accent) 45%,transparent);color:var(--et-theme-color-ink-solid, inherit);font-weight:500;white-space:nowrap;-webkit-user-select:all;user-select:all;cursor:default}et-rich-text-editor .et-rte-content .et-rte-token-prefix{margin-inline-end:1px;opacity:.65}}\n"], dependencies: [{ kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], encapsulation: i0.ViewEncapsulation.None }); }
37253
+ ], viewQueries: [{ propertyName: "editable", first: true, predicate: ["editable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: RichTextEditorDirective, inputs: ["value", "value", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder", "tools", "tools", "autoformat", "autoformat", "labels", "labels"], outputs: ["valueChange", "valueChange", "touchedChange", "touchedChange"] }], ngImport: i0, template: "<div [attr.aria-label]=\"labels().toolbar\" class=\"et-rte-toolbar\" etToolbar>\n @for (tool of dir.resolvedTools(); track $index) {\n @switch (tool) {\n @case (TOOLS.DIVIDER) {\n <et-divider orientation=\"vertical\" decorative />\n }\n @default {\n @if (dir.toolDefs.get(tool); as def) {\n @if (def.control; as control) {\n <ng-container [ngComponentOutlet]=\"control\" [ngComponentOutletInputs]=\"{ editor: dir }\" />\n } @else {\n <button\n [pressed]=\"def.isActive?.(dir) ?? false\"\n [disabled]=\"dir.disabled() || dir.readonly() || (def.isDisabled?.(dir) ?? false)\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(dir)\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"def.icon ?? ''\"></i>\n </button>\n }\n }\n }\n }\n }\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedBy() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"syncValueFromDom()\"\n (beforeinput)=\"interceptFormattingCommand($event)\"\n (keydown)=\"interceptEditorKeydown($event)\"\n (paste)=\"interceptPaste($event)\"\n (drop)=\"interceptDrop($event)\"\n (click)=\"interceptClick($event)\"\n (pointerdown)=\"dir.clearPendingMarks()\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n", styles: ["@layer components{@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-rich-text-editor-quote-indent{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-rich-text-editor-quote-bar-width{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-code-block-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-rich-text-editor-token-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-token-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar .et-icon-button{--_et-focus-ring-offset: -1px}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{position:fixed;inset-inline:0;inset-block-end:0;z-index:60;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;padding-inline:8px;padding-block-start:6px;padding-block-end:calc(6px + max(var(--_et-rte-keyboard-inset, 0px),env(keyboard-inset-height,0px)));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(24 24 24)));border-block-end:none;border-block-start:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);box-shadow:0 -6px 20px #0000003d;scrollbar-width:none;opacity:0;transform:translateY(100%);pointer-events:none;transition:opacity .16s var(--ease-out-5, ease),transform .26s var(--ease-out-5, ease)}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar::-webkit-scrollbar{display:none}et-rich-text-editor.et-rich-text-editor--touch.et-rich-text-editor--docked-toolbar .et-rte-toolbar{opacity:1;transform:translateY(0);pointer-events:auto}et-rich-text-editor.et-rich-text-editor--touch .et-rte-content{font-size:max(1em,16px)}@media(prefers-reduced-motion:reduce){et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{transition:opacity .16s var(--ease-out-5, ease)}}et-rich-text-editor .et-rte-toolbar .et-divider{--et-divider-color: color-mix(in srgb, currentColor 12%, transparent);--et-divider-spacing: 2px;--et-divider-inset: 4px}et-rich-text-editor .et-rte-content{--et-theme-color-primary-rgb: var(--et-color-primary);--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-ink-rgb: var(--et-color-primary-ink, var(--et-color-primary));--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb));display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol,et-rich-text-editor .et-rte-content blockquote,et-rich-text-editor .et-rte-content pre{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1,et-rich-text-editor .et-rte-content h2,et-rich-text-editor .et-rte-content h3,et-rich-text-editor .et-rte-content h4,et-rich-text-editor .et-rte-content h5,et-rich-text-editor .et-rte-content h6{margin-block:0;font-weight:700;line-height:1.25}et-rich-text-editor .et-rte-content :is(h1,h2,h3,h4,h5,h6)+*,et-rich-text-editor .et-rte-content *+:is(h1,h2,h3,h4,h5,h6){margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1{font-size:2.4rem}et-rich-text-editor .et-rte-content h2{font-size:2rem}et-rich-text-editor .et-rte-content h3{font-size:1.6rem}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul{list-style-type:circle}et-rich-text-editor .et-rte-content ul ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul ul{list-style-type:square}et-rich-text-editor .et-rte-content ul ul ul ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol{list-style-type:lower-alpha}et-rich-text-editor .et-rte-content ol ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol ol{list-style-type:lower-roman}et-rich-text-editor .et-rte-content ol ol ol ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}et-rich-text-editor .et-rte-content code{padding:.1em .3em;border-radius:4px;background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em}et-rich-text-editor .et-rte-content blockquote{margin-inline:0;margin-block-end:0;padding-inline-start:var(--et-rich-text-editor-quote-indent);border-inline-start:var(--et-rich-text-editor-quote-bar-width) solid color-mix(in srgb,var(--et-surface-border-solid, currentColor) 80%,transparent);color:color-mix(in srgb,currentColor 82%,transparent)}et-rich-text-editor .et-rte-content blockquote blockquote{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content pre{margin-block-end:0;padding:8px 10px;border-radius:var(--et-rich-text-editor-code-block-radius);background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 10%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em;white-space:pre-wrap}et-rich-text-editor .et-rte-content pre code{padding:0;border-radius:0;background:none;font-size:inherit}et-rich-text-editor .et-rte-content .et-rte-token{--_et-rte-token-accent: var(--et-theme-color-primary-solid, var(--et-surface-interaction-solid, currentColor));display:inline;padding-inline:var(--et-rich-text-editor-token-padding-inline);border-radius:var(--et-rich-text-editor-token-radius);background:color-mix(in srgb,var(--_et-rte-token-accent) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_et-rte-token-accent) 45%,transparent);color:var(--et-theme-color-ink-solid, inherit);font-weight:500;white-space:nowrap;-webkit-user-select:all;user-select:all;cursor:default}et-rich-text-editor .et-rte-content .et-rte-token-prefix{margin-inline-end:1px;opacity:.65}}\n"], dependencies: [{ kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "component", type: DividerComponent, selector: "et-divider", inputs: ["orientation", "decorative"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: ToolbarDirective, selector: "[etToolbar]", inputs: ["orientation"] }], encapsulation: i0.ViewEncapsulation.None }); }
37092
37254
  }
37093
37255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: RichTextEditorComponent, decorators: [{
37094
37256
  type: Component,
37095
- args: [{ selector: 'et-rich-text-editor', encapsulation: ViewEncapsulation.None, imports: [...BUTTON_IMPORTS, IconDirective, NgComponentOutlet], providers: [
37257
+ args: [{ selector: 'et-rich-text-editor', encapsulation: ViewEncapsulation.None, imports: [...BUTTON_IMPORTS, DividerComponent, IconDirective, NgComponentOutlet, ToolbarDirective], providers: [
37096
37258
  provideIcons(BOLD_ICON, ITALIC_ICON, UNDERLINE_ICON, STRIKETHROUGH_ICON, CODE_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LINK_ICON, QUOTE_ICON, CODE_BLOCK_ICON, UNDO_ICON, REDO_ICON),
37097
37259
  ], hostDirectives: [
37098
37260
  {
@@ -37121,8 +37283,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
37121
37283
  '[class.et-rich-text-editor--touch]': 'hasTouchInput()',
37122
37284
  '[class.et-rich-text-editor--docked-toolbar]': 'dockedToolbar()',
37123
37285
  '(click)': 'dir.activate()',
37124
- }, template: "<!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- ARIA toolbar pattern: the container only relays keys/focus for its roving tab stop; the buttons inside are the focusable controls -->\n<div\n #toolbar\n [attr.aria-label]=\"labels().toolbar\"\n (keydown)=\"handleToolbarKeydown($event)\"\n (focusin)=\"handleToolbarFocusIn($event)\"\n class=\"et-rte-toolbar\"\n role=\"toolbar\"\n>\n @for (tool of dir.resolvedTools(); track $index) {\n @switch (tool) {\n @case (TOOLS.DIVIDER) {\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n }\n @default {\n @if (dir.toolDefs.get(tool); as def) {\n @if (def.control; as control) {\n <ng-container [ngComponentOutlet]=\"control\" [ngComponentOutletInputs]=\"{ editor: dir }\" />\n } @else {\n <button\n [pressed]=\"def.isActive?.(dir) ?? false\"\n [disabled]=\"dir.disabled() || dir.readonly() || (def.isDisabled?.(dir) ?? false)\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(dir)\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"def.icon ?? ''\"></i>\n </button>\n }\n }\n }\n }\n }\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedBy() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"syncValueFromDom()\"\n (beforeinput)=\"interceptFormattingCommand($event)\"\n (keydown)=\"interceptEditorKeydown($event)\"\n (paste)=\"interceptPaste($event)\"\n (drop)=\"interceptDrop($event)\"\n (click)=\"interceptClick($event)\"\n (pointerdown)=\"dir.clearPendingMarks()\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n", styles: ["@layer components{@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-rich-text-editor-quote-indent{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-rich-text-editor-quote-bar-width{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-code-block-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-rich-text-editor-token-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-token-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar .et-icon-button{--_et-focus-ring-offset: -1px}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{position:fixed;inset-inline:0;inset-block-end:0;z-index:60;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;padding-inline:8px;padding-block-start:6px;padding-block-end:calc(6px + max(var(--_et-rte-keyboard-inset, 0px),env(keyboard-inset-height,0px)));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(24 24 24)));border-block-end:none;border-block-start:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);box-shadow:0 -6px 20px #0000003d;scrollbar-width:none;opacity:0;transform:translateY(100%);pointer-events:none;transition:opacity .16s var(--ease-out-5, ease),transform .26s var(--ease-out-5, ease)}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar::-webkit-scrollbar{display:none}et-rich-text-editor.et-rich-text-editor--touch.et-rich-text-editor--docked-toolbar .et-rte-toolbar{opacity:1;transform:translateY(0);pointer-events:auto}et-rich-text-editor.et-rich-text-editor--touch .et-rte-content{font-size:max(1em,16px)}@media(prefers-reduced-motion:reduce){et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{transition:opacity .16s var(--ease-out-5, ease)}}et-rich-text-editor .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-content{--et-theme-color-primary-rgb: var(--et-color-primary);--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-ink-rgb: var(--et-color-primary-ink, var(--et-color-primary));--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb));display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol,et-rich-text-editor .et-rte-content blockquote,et-rich-text-editor .et-rte-content pre{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1,et-rich-text-editor .et-rte-content h2,et-rich-text-editor .et-rte-content h3,et-rich-text-editor .et-rte-content h4,et-rich-text-editor .et-rte-content h5,et-rich-text-editor .et-rte-content h6{margin-block:0;font-weight:700;line-height:1.25}et-rich-text-editor .et-rte-content :is(h1,h2,h3,h4,h5,h6)+*,et-rich-text-editor .et-rte-content *+:is(h1,h2,h3,h4,h5,h6){margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1{font-size:2.4rem}et-rich-text-editor .et-rte-content h2{font-size:2rem}et-rich-text-editor .et-rte-content h3{font-size:1.6rem}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul{list-style-type:circle}et-rich-text-editor .et-rte-content ul ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul ul{list-style-type:square}et-rich-text-editor .et-rte-content ul ul ul ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol{list-style-type:lower-alpha}et-rich-text-editor .et-rte-content ol ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol ol{list-style-type:lower-roman}et-rich-text-editor .et-rte-content ol ol ol ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}et-rich-text-editor .et-rte-content code{padding:.1em .3em;border-radius:4px;background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em}et-rich-text-editor .et-rte-content blockquote{margin-inline:0;margin-block-end:0;padding-inline-start:var(--et-rich-text-editor-quote-indent);border-inline-start:var(--et-rich-text-editor-quote-bar-width) solid color-mix(in srgb,var(--et-surface-border-solid, currentColor) 80%,transparent);color:color-mix(in srgb,currentColor 82%,transparent)}et-rich-text-editor .et-rte-content blockquote blockquote{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content pre{margin-block-end:0;padding:8px 10px;border-radius:var(--et-rich-text-editor-code-block-radius);background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 10%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em;white-space:pre-wrap}et-rich-text-editor .et-rte-content pre code{padding:0;border-radius:0;background:none;font-size:inherit}et-rich-text-editor .et-rte-content .et-rte-token{--_et-rte-token-accent: var(--et-theme-color-primary-solid, var(--et-surface-interaction-solid, currentColor));display:inline;padding-inline:var(--et-rich-text-editor-token-padding-inline);border-radius:var(--et-rich-text-editor-token-radius);background:color-mix(in srgb,var(--_et-rte-token-accent) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_et-rte-token-accent) 45%,transparent);color:var(--et-theme-color-ink-solid, inherit);font-weight:500;white-space:nowrap;-webkit-user-select:all;user-select:all;cursor:default}et-rich-text-editor .et-rte-content .et-rte-token-prefix{margin-inline-end:1px;opacity:.65}}\n"] }]
37125
- }], ctorParameters: () => [], propDecorators: { editable: [{ type: i0.ViewChild, args: ['editable', { isSignal: true }] }], toolbar: [{ type: i0.ViewChild, args: ['toolbar', { isSignal: true }] }] } });
37286
+ }, template: "<div [attr.aria-label]=\"labels().toolbar\" class=\"et-rte-toolbar\" etToolbar>\n @for (tool of dir.resolvedTools(); track $index) {\n @switch (tool) {\n @case (TOOLS.DIVIDER) {\n <et-divider orientation=\"vertical\" decorative />\n }\n @default {\n @if (dir.toolDefs.get(tool); as def) {\n @if (def.control; as control) {\n <ng-container [ngComponentOutlet]=\"control\" [ngComponentOutletInputs]=\"{ editor: dir }\" />\n } @else {\n <button\n [pressed]=\"def.isActive?.(dir) ?? false\"\n [disabled]=\"dir.disabled() || dir.readonly() || (def.isDisabled?.(dir) ?? false)\"\n [attr.aria-label]=\"toolLabel(def)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"def.run?.(dir)\"\n mutedUntilPressed\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i [allowHardcodedColor]=\"def.allowHardcodedColor ?? false\" [etIcon]=\"def.icon ?? ''\"></i>\n </button>\n }\n }\n }\n }\n }\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedBy() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"syncValueFromDom()\"\n (beforeinput)=\"interceptFormattingCommand($event)\"\n (keydown)=\"interceptEditorKeydown($event)\"\n (paste)=\"interceptPaste($event)\"\n (drop)=\"interceptDrop($event)\"\n (click)=\"interceptClick($event)\"\n (pointerdown)=\"dir.clearPendingMarks()\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n", styles: ["@layer components{@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-rich-text-editor-quote-indent{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-rich-text-editor-quote-bar-width{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-code-block-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-rich-text-editor-token-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-token-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);--et-icon-button-border-radius: var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar .et-icon-button{--_et-focus-ring-offset: -1px}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{position:fixed;inset-inline:0;inset-block-end:0;z-index:60;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;padding-inline:8px;padding-block-start:6px;padding-block-end:calc(6px + max(var(--_et-rte-keyboard-inset, 0px),env(keyboard-inset-height,0px)));background:var(--et-surface-background-solid, var(--et-surface-2, rgb(24 24 24)));border-block-end:none;border-block-start:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent);box-shadow:0 -6px 20px #0000003d;scrollbar-width:none;opacity:0;transform:translateY(100%);pointer-events:none;transition:opacity .16s var(--ease-out-5, ease),transform .26s var(--ease-out-5, ease)}et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar::-webkit-scrollbar{display:none}et-rich-text-editor.et-rich-text-editor--touch.et-rich-text-editor--docked-toolbar .et-rte-toolbar{opacity:1;transform:translateY(0);pointer-events:auto}et-rich-text-editor.et-rich-text-editor--touch .et-rte-content{font-size:max(1em,16px)}@media(prefers-reduced-motion:reduce){et-rich-text-editor.et-rich-text-editor--touch .et-rte-toolbar{transition:opacity .16s var(--ease-out-5, ease)}}et-rich-text-editor .et-rte-toolbar .et-divider{--et-divider-color: color-mix(in srgb, currentColor 12%, transparent);--et-divider-spacing: 2px;--et-divider-inset: 4px}et-rich-text-editor .et-rte-content{--et-theme-color-primary-rgb: var(--et-color-primary);--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-ink-rgb: var(--et-color-primary-ink, var(--et-color-primary));--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb));display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol,et-rich-text-editor .et-rte-content blockquote,et-rich-text-editor .et-rte-content pre{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1,et-rich-text-editor .et-rte-content h2,et-rich-text-editor .et-rte-content h3,et-rich-text-editor .et-rte-content h4,et-rich-text-editor .et-rte-content h5,et-rich-text-editor .et-rte-content h6{margin-block:0;font-weight:700;line-height:1.25}et-rich-text-editor .et-rte-content :is(h1,h2,h3,h4,h5,h6)+*,et-rich-text-editor .et-rte-content *+:is(h1,h2,h3,h4,h5,h6){margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content h1{font-size:2.4rem}et-rich-text-editor .et-rte-content h2{font-size:2rem}et-rich-text-editor .et-rte-content h3{font-size:1.6rem}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul{list-style-type:circle}et-rich-text-editor .et-rte-content ul ul ul,et-rich-text-editor .et-rte-content ul ul ul ul ul ul{list-style-type:square}et-rich-text-editor .et-rte-content ul ul ul ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol{list-style-type:lower-alpha}et-rich-text-editor .et-rte-content ol ol ol,et-rich-text-editor .et-rte-content ol ol ol ol ol ol{list-style-type:lower-roman}et-rich-text-editor .et-rte-content ol ol ol ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}et-rich-text-editor .et-rte-content code{padding:.1em .3em;border-radius:4px;background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 14%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em}et-rich-text-editor .et-rte-content blockquote{margin-inline:0;margin-block-end:0;padding-inline-start:var(--et-rich-text-editor-quote-indent);border-inline-start:var(--et-rich-text-editor-quote-bar-width) solid color-mix(in srgb,var(--et-surface-border-solid, currentColor) 80%,transparent);color:color-mix(in srgb,currentColor 82%,transparent)}et-rich-text-editor .et-rte-content blockquote blockquote{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content pre{margin-block-end:0;padding:8px 10px;border-radius:var(--et-rich-text-editor-code-block-radius);background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 10%,transparent);font-family:var(--et-font-family-mono, ui-monospace, monospace);font-size:.9em;white-space:pre-wrap}et-rich-text-editor .et-rte-content pre code{padding:0;border-radius:0;background:none;font-size:inherit}et-rich-text-editor .et-rte-content .et-rte-token{--_et-rte-token-accent: var(--et-theme-color-primary-solid, var(--et-surface-interaction-solid, currentColor));display:inline;padding-inline:var(--et-rich-text-editor-token-padding-inline);border-radius:var(--et-rich-text-editor-token-radius);background:color-mix(in srgb,var(--_et-rte-token-accent) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_et-rte-token-accent) 45%,transparent);color:var(--et-theme-color-ink-solid, inherit);font-weight:500;white-space:nowrap;-webkit-user-select:all;user-select:all;cursor:default}et-rich-text-editor .et-rte-content .et-rte-token-prefix{margin-inline-end:1px;opacity:.65}}\n"] }]
37287
+ }], ctorParameters: () => [], propDecorators: { editable: [{ type: i0.ViewChild, args: ['editable', { isSignal: true }] }] } });
37126
37288
 
37127
37289
  const RICH_TEXT_EDITOR_IMPORTS = [RichTextEditorComponent, RichTextEditorDirective];
37128
37290
 
@@ -38377,13 +38539,10 @@ class SelectDirective {
38377
38539
  ...(this.mirrorPanelWidth() ? [] : ['et-overlay--select-content-width']),
38378
38540
  ],
38379
38541
  placement: 'bottom-start',
38380
- // prefer flipping the alignment on the same side (right-align under the field) before
38381
- // flipping up, so a field near the right viewport edge opens bottom-end, not shifted
38382
- fallbackPlacements: ['bottom-end', 'top-start', 'top-end'],
38383
38542
  offset: 4,
38384
38543
  viewportPadding: 8,
38385
38544
  autoResize: true,
38386
- shift: { crossAxis: true },
38545
+ minAvailableSpace: 160,
38387
38546
  mirrorWidth: this.mirrorPanelWidth(),
38388
38547
  }),
38389
38548
  };
@@ -40543,7 +40702,7 @@ class SelectPanelComponent {
40543
40702
  <ng-content select="[etSelectPanelExtras]" />
40544
40703
  </div>
40545
40704
  </div>
40546
- `, isInline: true, styles: ["@layer components{@property --et-select-panel-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-select-panel-padding{syntax: \"<length>\"; inherits: false; initial-value: 6px;}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--select[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--select[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--select[data-overlay-placement].et-animation-enter-from,.et-overlay--select[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-select-panel{display:grid;grid-template-rows:minmax(0,1fr);box-sizing:border-box;max-block-size:var(--et-select-panel-max-height);overflow:hidden;--_et-select-panel-padding: var(--et-select-panel-padding);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:var(--et-select-option-font-size, 14px);box-shadow:0 10px 24px #00000029}.et-select-panel .et-select-panel-scroller{box-sizing:border-box;overflow-y:auto;overscroll-behavior:contain;padding:var(--_et-select-panel-padding)}.et-select-panel.et-select-panel--resizing .et-select-panel-scroller{overflow:clip}.et-select-panel .et-select-listbox,.et-select-panel .et-select-panel-extras{display:contents}.et-select-panel .et-select-state{display:flex;align-items:center;gap:8px;min-block-size:var(--et-select-option-height, 36px);padding-inline:var(--et-select-option-padding-inline, 10px);font-size:var(--et-select-option-font-size, 14px);color:var(--et-surface-color-muted-solid, currentColor)}.et-select-panel .et-select-state.et-select-state--error{font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new{position:relative;display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);inline-size:100%;min-block-size:var(--et-select-option-height, 36px);margin-block-start:7px;padding-inline:var(--et-select-option-padding-inline, 10px);border:none;border-radius:var(--et-select-option-border-radius, 6px);background:transparent;font:inherit;font-size:var(--et-select-option-font-size, 14px);text-align:start;color:var(--et-theme-color-ink-solid, currentColor);cursor:pointer;appearance:none;transition:background .12s ease}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):before{content:\"\";position:absolute;inset-inline:calc(var(--et-select-panel-padding, 6px) * -1);inset-block-start:-4px;block-size:1px;background:var(--et-surface-border-solid, rgb(255 255 255 / .1))}@media(hover:hover){:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 12%,transparent)}}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):active{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 20%,transparent)}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new) .et-icon{flex:none;inline-size:16px;block-size:16px}.et-select-panel .et-select-load-more+.et-select-add-new{margin-block-start:2px}.et-select-panel .et-select-load-more+.et-select-add-new:before{content:none}.et-select-panel .et-select-load-more-icon{rotate:180deg}.et-overlay--select-content-width .et-select-panel{max-inline-size:min(400px,calc(100vw - 24px))}}\n"], dependencies: [{ kind: "directive", type: SelectListboxDirective, selector: "[etSelectListbox]", exportAs: ["etSelectListbox"] }, { kind: "directive", type: SelectViewportDirective, selector: "[etSelectViewport]", exportAs: ["etSelectViewport"] }], encapsulation: i0.ViewEncapsulation.None }); }
40705
+ `, isInline: true, styles: ["@layer components{@property --et-select-panel-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-select-panel-padding{syntax: \"<length>\"; inherits: false; initial-value: 6px;}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--select[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--select[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--select[data-overlay-placement].et-animation-enter-from,.et-overlay--select[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-select-panel{display:grid;grid-template-rows:minmax(0,1fr);box-sizing:border-box;max-block-size:min(var(--et-select-panel-max-height),var(--et-overlay-max-height, 100vh));overflow:hidden;--_et-select-panel-padding: var(--et-select-panel-padding);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:var(--et-select-option-font-size, 14px);box-shadow:0 10px 24px #00000029}.et-select-panel .et-select-panel-scroller{box-sizing:border-box;overflow-y:auto;overscroll-behavior:contain;padding:var(--_et-select-panel-padding)}.et-select-panel.et-select-panel--resizing .et-select-panel-scroller{overflow:clip}.et-select-panel .et-select-listbox,.et-select-panel .et-select-panel-extras{display:contents}.et-select-panel .et-select-state{display:flex;align-items:center;gap:8px;min-block-size:var(--et-select-option-height, 36px);padding-inline:var(--et-select-option-padding-inline, 10px);font-size:var(--et-select-option-font-size, 14px);color:var(--et-surface-color-muted-solid, currentColor)}.et-select-panel .et-select-state.et-select-state--error{font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new{position:relative;display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);inline-size:100%;min-block-size:var(--et-select-option-height, 36px);margin-block-start:7px;padding-inline:var(--et-select-option-padding-inline, 10px);border:none;border-radius:var(--et-select-option-border-radius, 6px);background:transparent;font:inherit;font-size:var(--et-select-option-font-size, 14px);text-align:start;color:var(--et-theme-color-ink-solid, currentColor);cursor:pointer;appearance:none;transition:background .12s ease}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):before{content:\"\";position:absolute;inset-inline:calc(var(--et-select-panel-padding, 6px) * -1);inset-block-start:-4px;block-size:1px;background:var(--et-surface-border-solid, rgb(255 255 255 / .1))}@media(hover:hover){:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 12%,transparent)}}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):active{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 20%,transparent)}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new) .et-icon{flex:none;inline-size:16px;block-size:16px}.et-select-panel .et-select-load-more+.et-select-add-new{margin-block-start:2px}.et-select-panel .et-select-load-more+.et-select-add-new:before{content:none}.et-select-panel .et-select-load-more-icon{rotate:180deg}.et-overlay--select-content-width .et-select-panel{max-inline-size:min(400px,calc(100vw - 24px))}}\n"], dependencies: [{ kind: "directive", type: SelectListboxDirective, selector: "[etSelectListbox]", exportAs: ["etSelectListbox"] }, { kind: "directive", type: SelectViewportDirective, selector: "[etSelectViewport]", exportAs: ["etSelectViewport"] }], encapsulation: i0.ViewEncapsulation.None }); }
40547
40706
  }
40548
40707
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SelectPanelComponent, decorators: [{
40549
40708
  type: Component,
@@ -40558,7 +40717,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
40558
40717
  </div>
40559
40718
  `, encapsulation: ViewEncapsulation.None, imports: [SelectListboxDirective, SelectViewportDirective], hostDirectives: [ProvideColorDirective, AutoSurfaceDirective], host: {
40560
40719
  class: 'et-select-panel',
40561
- }, styles: ["@layer components{@property --et-select-panel-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-select-panel-padding{syntax: \"<length>\"; inherits: false; initial-value: 6px;}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--select[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--select[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--select[data-overlay-placement].et-animation-enter-from,.et-overlay--select[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-select-panel{display:grid;grid-template-rows:minmax(0,1fr);box-sizing:border-box;max-block-size:var(--et-select-panel-max-height);overflow:hidden;--_et-select-panel-padding: var(--et-select-panel-padding);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:var(--et-select-option-font-size, 14px);box-shadow:0 10px 24px #00000029}.et-select-panel .et-select-panel-scroller{box-sizing:border-box;overflow-y:auto;overscroll-behavior:contain;padding:var(--_et-select-panel-padding)}.et-select-panel.et-select-panel--resizing .et-select-panel-scroller{overflow:clip}.et-select-panel .et-select-listbox,.et-select-panel .et-select-panel-extras{display:contents}.et-select-panel .et-select-state{display:flex;align-items:center;gap:8px;min-block-size:var(--et-select-option-height, 36px);padding-inline:var(--et-select-option-padding-inline, 10px);font-size:var(--et-select-option-font-size, 14px);color:var(--et-surface-color-muted-solid, currentColor)}.et-select-panel .et-select-state.et-select-state--error{font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new{position:relative;display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);inline-size:100%;min-block-size:var(--et-select-option-height, 36px);margin-block-start:7px;padding-inline:var(--et-select-option-padding-inline, 10px);border:none;border-radius:var(--et-select-option-border-radius, 6px);background:transparent;font:inherit;font-size:var(--et-select-option-font-size, 14px);text-align:start;color:var(--et-theme-color-ink-solid, currentColor);cursor:pointer;appearance:none;transition:background .12s ease}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):before{content:\"\";position:absolute;inset-inline:calc(var(--et-select-panel-padding, 6px) * -1);inset-block-start:-4px;block-size:1px;background:var(--et-surface-border-solid, rgb(255 255 255 / .1))}@media(hover:hover){:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 12%,transparent)}}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):active{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 20%,transparent)}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new) .et-icon{flex:none;inline-size:16px;block-size:16px}.et-select-panel .et-select-load-more+.et-select-add-new{margin-block-start:2px}.et-select-panel .et-select-load-more+.et-select-add-new:before{content:none}.et-select-panel .et-select-load-more-icon{rotate:180deg}.et-overlay--select-content-width .et-select-panel{max-inline-size:min(400px,calc(100vw - 24px))}}\n"] }]
40720
+ }, styles: ["@layer components{@property --et-select-panel-max-height{syntax: \"<length-percentage>\"; inherits: false; initial-value: 40vh;}@property --et-select-panel-padding{syntax: \"<length>\"; inherits: false; initial-value: 6px;}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-to{opacity:0}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:transform .14s ease,opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:transform .1s ease,opacity .1s ease}.et-overlay--select[data-overlay-placement^=top].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=top].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(.3rem)!important}.et-overlay--select[data-overlay-placement^=bottom].et-animation-enter-from,.et-overlay--select[data-overlay-placement^=bottom].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0) translateY(-.3rem)!important}@media(prefers-reduced-motion:reduce){.et-overlay.et-with-default-animation.et-overlay--select.et-animation-enter-active{transition:opacity .14s ease}.et-overlay.et-with-default-animation.et-overlay--select.et-animation-leave-active{transition:opacity .1s ease}.et-overlay--select[data-overlay-placement].et-animation-enter-from,.et-overlay--select[data-overlay-placement].et-animation-leave-to{transform:translate3d(var(--et-overlay-anchored-x, 0px),var(--et-overlay-anchored-y, 0px),0)!important}}.et-select-panel{display:grid;grid-template-rows:minmax(0,1fr);box-sizing:border-box;max-block-size:min(var(--et-select-panel-max-height),var(--et-overlay-max-height, 100vh));overflow:hidden;--_et-select-panel-padding: var(--et-select-panel-padding);border-radius:10px;border:1px solid var(--et-surface-border-solid, rgb(255 255 255 / .1));background:var(--et-surface-background-solid, rgb(32 32 32));color:var(--et-surface-color-solid, rgb(244 244 245));font-size:var(--et-select-option-font-size, 14px);box-shadow:0 10px 24px #00000029}.et-select-panel .et-select-panel-scroller{box-sizing:border-box;overflow-y:auto;overscroll-behavior:contain;padding:var(--_et-select-panel-padding)}.et-select-panel.et-select-panel--resizing .et-select-panel-scroller{overflow:clip}.et-select-panel .et-select-listbox,.et-select-panel .et-select-panel-extras{display:contents}.et-select-panel .et-select-state{display:flex;align-items:center;gap:8px;min-block-size:var(--et-select-option-height, 36px);padding-inline:var(--et-select-option-padding-inline, 10px);font-size:var(--et-select-option-font-size, 14px);color:var(--et-surface-color-muted-solid, currentColor)}.et-select-panel .et-select-state.et-select-state--error{font-size:12px;color:var(--et-theme-color-primary-solid, rgb(248 113 113))}.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new{position:relative;display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);inline-size:100%;min-block-size:var(--et-select-option-height, 36px);margin-block-start:7px;padding-inline:var(--et-select-option-padding-inline, 10px);border:none;border-radius:var(--et-select-option-border-radius, 6px);background:transparent;font:inherit;font-size:var(--et-select-option-font-size, 14px);text-align:start;color:var(--et-theme-color-ink-solid, currentColor);cursor:pointer;appearance:none;transition:background .12s ease}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):before{content:\"\";position:absolute;inset-inline:calc(var(--et-select-panel-padding, 6px) * -1);inset-block-start:-4px;block-size:1px;background:var(--et-surface-border-solid, rgb(255 255 255 / .1))}@media(hover:hover){:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 12%,transparent)}}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new):active{background:color-mix(in srgb,var(--et-surface-interaction-solid, rgb(255 255 255)) 20%,transparent)}:is(.et-select-panel .et-select-load-more,.et-select-panel .et-select-add-new) .et-icon{flex:none;inline-size:16px;block-size:16px}.et-select-panel .et-select-load-more+.et-select-add-new{margin-block-start:2px}.et-select-panel .et-select-load-more+.et-select-add-new:before{content:none}.et-select-panel .et-select-load-more-icon{rotate:180deg}.et-overlay--select-content-width .et-select-panel{max-inline-size:min(400px,calc(100vw - 24px))}}\n"] }]
40562
40721
  }], ctorParameters: () => [], propDecorators: { panelBody: [{ type: i0.ViewChild, args: ['panelBody', { isSignal: true }] }] } });
40563
40722
 
40564
40723
  /**
@@ -49019,17 +49178,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
49019
49178
  args: [{ selector: 'et-query-devtools-faults-tab', encapsulation: ViewEncapsulation.None, template: "<div class=\"et-query-devtools-scroll\">\n <div class=\"et-query-devtools-toolbar\">\n <p class=\"et-query-devtools-hint\">\n Faults are injected into the request pipeline, so retries, error handling features and the cache see them exactly\n as they would see a real one. Unlike the rest of the panel, what you arm here is not persisted - a page reload\n disarms every client.\n </p>\n </div>\n\n @for (client of host.faultClients(); track client.name) {\n @let fault = client.fault;\n <div [class.et-query-devtools-card--armed]=\"client.armed\" class=\"et-query-devtools-card\">\n <div class=\"et-query-devtools-card-head\">\n <strong class=\"et-query-devtools-mono\">{{ client.name }}</strong>\n <span class=\"et-query-devtools-url\">{{ client.baseUrl }}</span>\n @if (client.armed) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--error\">armed</span>\n <button (click)=\"CLEAR_FAULTS(client.name)\" class=\"et-query-devtools-btn\" type=\"button\">Disarm</button>\n }\n </div>\n\n <div class=\"et-query-devtools-faults\">\n <label class=\"et-query-devtools-field\">\n <span>Latency</span>\n <input\n #latencyInput\n [value]=\"fault.latencyMs\"\n (change)=\"armFaultValue({ clientName: client.name, field: 'latencyMs', value: latencyInput.value })\"\n class=\"et-query-devtools-input et-query-devtools-input--number\"\n type=\"number\"\n min=\"0\"\n max=\"60000\"\n step=\"100\"\n />\n <small>ms before every attempt starts</small>\n </label>\n\n <label class=\"et-query-devtools-field\">\n <span>Fail next</span>\n <input\n #failNextInput\n [value]=\"fault.failNext\"\n (change)=\"armFaultValue({ clientName: client.name, field: 'failNext', value: failNextInput.value })\"\n class=\"et-query-devtools-input et-query-devtools-input--number\"\n type=\"number\"\n min=\"0\"\n max=\"99\"\n step=\"1\"\n />\n <small>attempts, counted down as they are spent</small>\n </label>\n\n <label class=\"et-query-devtools-field\">\n <span>Fail rate</span>\n <input\n #failRateInput\n [value]=\"fault.failRate\"\n (change)=\"armFaultValue({ clientName: client.name, field: 'failRate', value: failRateInput.value })\"\n class=\"et-query-devtools-input et-query-devtools-input--number\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"5\"\n />\n <small>% of attempts, rolled per attempt</small>\n </label>\n\n <label class=\"et-query-devtools-field\">\n <span>Status</span>\n <select\n #statusSelect\n (change)=\"armFaultStatus({ clientName: client.name, value: statusSelect.value })\"\n class=\"et-query-devtools-select\"\n >\n @for (option of FAULT_STATUSES; track option.status) {\n <!-- `selected` on the option, not `value` on the select: the select's value is\n applied before its options exist, so it would fall back to the first one. -->\n <option [value]=\"option.status\" [selected]=\"option.status === fault.status\">\n {{ option.status }} \u00B7 {{ option.label }}\n </option>\n }\n </select>\n <small>\n @if (isFaultStatusRetryable(fault.status)) {\n the default retry policy retries this\n } @else {\n the default retry policy gives up on this\n }\n </small>\n </label>\n </div>\n </div>\n } @empty {\n <p class=\"et-query-devtools-empty\">No query clients registered yet.</p>\n }\n</div>\n" }]
49020
49179
  }] });
49021
49180
 
49022
- /** The Forms tab: registered `createQueryForm()` handles, each expandable to its field table. */
49181
+ /** The Forms tab: registered `defineQueryForm()` handles, each expandable to its field table. */
49023
49182
  class QueryDevtoolsFormsTabComponent {
49024
49183
  constructor() {
49025
49184
  this.host = injectQueryDevtoolsHost();
49026
49185
  }
49027
49186
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: QueryDevtoolsFormsTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
49028
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: QueryDevtoolsFormsTabComponent, isStandalone: true, selector: "et-query-devtools-forms-tab", ngImport: i0, template: "<div #panes class=\"et-query-devtools-split\">\n <div class=\"et-query-devtools-scroll\">\n @for (entry of host.formEntries(); track entry.id) {\n @let form = host.asForm(entry);\n @let expanded = host.selectedFormId() === entry.id;\n <div class=\"et-query-devtools-card\">\n <div class=\"et-query-devtools-card-head\">\n <button\n [attr.aria-expanded]=\"expanded\"\n (click)=\"host.selectedFormId.set(expanded ? null : entry.id)\"\n class=\"et-query-devtools-row-link\"\n type=\"button\"\n >\n <span class=\"et-query-devtools-caret\">{{ expanded ? '\u25BE' : '\u25B8' }}</span>\n <strong>{{ entry.meta.name || 'query form' }}</strong>\n </button>\n @if (form.activeFilterCount(); as count) {\n <span class=\"et-query-devtools-chip\">{{ count }} active</span>\n } @else {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">at defaults</span>\n }\n @if (form.isCommitPending()) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--loading\">debouncing</span>\n }\n @if (!form.isObserving()) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"observe() has not been called, so nothing syncs with the URL\"\n >\n not observing\n </span>\n }\n <button\n [disabled]=\"form.isAtDefaults()\"\n (click)=\"form.resetAll()\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2 Reset all\n </button>\n </div>\n\n @let driven = host.queriesDrivenByForm(entry);\n <dl class=\"et-query-devtools-meta\">\n <dt>Drives</dt>\n <dd>\n @if (driven.length) {\n <div class=\"et-query-devtools-inner-queries\">\n @for (link of driven; track link.id) {\n <button\n [class.et-query-devtools-inner-row--active]=\"host.formSelectedQueryId() === link.id\"\n [disabled]=\"!link.id\"\n (click)=\"host.formSelectedQueryId.set(link.id)\"\n class=\"et-query-devtools-inner-row\"\n type=\"button\"\n >\n <span [attr.data-status]=\"host.queryStatus(link.query)\" class=\"et-query-devtools-status\"></span>\n <span class=\"et-query-devtools-method\">{{ link.method }}</span>\n <span class=\"et-query-devtools-route\">\n <et-query-devtools-route [segments]=\"link.segments\" [fallback]=\"link.query.id() || 'query'\" />\n </span>\n </button>\n }\n </div>\n } @else {\n <span class=\"et-query-devtools-hint\">\n No query has read this form's value yet. A query picks it up the first time its\n <code>withArgs</code> reads <code>value()</code>.\n </span>\n }\n </dd>\n </dl>\n\n @if (expanded) {\n <table class=\"et-query-devtools-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th>Value</th>\n <th>Default</th>\n <th>URL param</th>\n <th>Rules</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (field of form.fields(); track field.key) {\n <tr [attr.data-status]=\"field.isDefault ? null : 'success'\">\n <td class=\"et-query-devtools-mono\">{{ field.key }}</td>\n <td class=\"et-query-devtools-mono\">\n {{ host.inlineValue(field.value) }}\n <!-- The live value only differs while a debounce is pending, which is exactly\n when \"the input says X but the query asked for Y\" needs explaining. -->\n @if (field.liveValue !== field.value) {\n <span class=\"et-query-devtools-stat-sub\">typing {{ host.inlineValue(field.liveValue) }}</span>\n }\n </td>\n <td class=\"et-query-devtools-mono\">{{ host.inlineValue(field.defaultValue) }}</td>\n <td class=\"et-query-devtools-mono\">\n @if (field.queryParam === undefined) {\n <span class=\"et-query-devtools-hint\">\u2014</span>\n } @else {\n {{ field.paramKey }}={{ host.inlineValue(field.queryParam) }}\n }\n </td>\n <td>\n <div class=\"et-query-devtools-chips\">\n @if (field.debounceMs !== null) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">\n {{ field.debounceMs }}ms\n </span>\n }\n @if (field.isResetBy.length) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Reset to its default whenever one of these changes\"\n >\n reset by {{ field.isResetBy.join(', ') }}\n </span>\n }\n @if (!field.countsAsFilter) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Not counted by activeFilterCount\"\n >\n not a filter\n </span>\n }\n </div>\n </td>\n <td>\n <button\n [disabled]=\"field.isDefault\"\n (click)=\"form.resetField(field.key)\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n <h4 class=\"et-query-devtools-section\">Committed value</h4>\n <et-query-devtools-json [value]=\"form.value()\" />\n }\n </div>\n } @empty {\n <p class=\"et-query-devtools-empty\">\n No query forms registered. A form created with <code>createQueryForm()</code> registers itself.\n </p>\n }\n </div>\n\n <et-query-devtools-drawer\n [sel]=\"host.formSelectedQuery()\"\n [container]=\"panes\"\n (dismiss)=\"host.formSelectedQueryId.set(null)\"\n />\n</div>\n", dependencies: [{ kind: "component", type: QueryDevtoolsDrawerComponent, selector: "et-query-devtools-drawer", inputs: ["sel", "container"], outputs: ["dismiss"] }, { kind: "component", type: QueryDevtoolsJsonComponent, selector: "et-query-devtools-json", inputs: ["value", "nodeKey", "depth", "search", "chunk", "path", "expandedPaths", "collapsedPaths", "toggleFn", "jsonPath", "parentKind", "overrides"] }, { kind: "component", type: QueryDevtoolsRouteComponent, selector: "et-query-devtools-route", inputs: ["segments", "fallback"] }], encapsulation: i0.ViewEncapsulation.None }); }
49187
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: QueryDevtoolsFormsTabComponent, isStandalone: true, selector: "et-query-devtools-forms-tab", ngImport: i0, template: "<div #panes class=\"et-query-devtools-split\">\n <div class=\"et-query-devtools-scroll\">\n @for (entry of host.formEntries(); track entry.id) {\n @let form = host.asForm(entry);\n @let expanded = host.selectedFormId() === entry.id;\n <div class=\"et-query-devtools-card\">\n <div class=\"et-query-devtools-card-head\">\n <button\n [attr.aria-expanded]=\"expanded\"\n (click)=\"host.selectedFormId.set(expanded ? null : entry.id)\"\n class=\"et-query-devtools-row-link\"\n type=\"button\"\n >\n <span class=\"et-query-devtools-caret\">{{ expanded ? '\u25BE' : '\u25B8' }}</span>\n <strong>{{ entry.meta.name || 'query form' }}</strong>\n </button>\n @if (form.activeFilterCount(); as count) {\n <span class=\"et-query-devtools-chip\">{{ count }} active</span>\n } @else {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">at defaults</span>\n }\n @if (form.isCommitPending()) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--loading\">debouncing</span>\n }\n @if (!form.isObserving()) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"observe() has not been called, so nothing syncs with the URL\"\n >\n not observing\n </span>\n }\n <button\n [disabled]=\"form.isAtDefaults()\"\n (click)=\"form.resetAll()\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2 Reset all\n </button>\n </div>\n\n @let driven = host.queriesDrivenByForm(entry);\n <dl class=\"et-query-devtools-meta\">\n <dt>Drives</dt>\n <dd>\n @if (driven.length) {\n <div class=\"et-query-devtools-inner-queries\">\n @for (link of driven; track link.id) {\n <button\n [class.et-query-devtools-inner-row--active]=\"host.formSelectedQueryId() === link.id\"\n [disabled]=\"!link.id\"\n (click)=\"host.formSelectedQueryId.set(link.id)\"\n class=\"et-query-devtools-inner-row\"\n type=\"button\"\n >\n <span [attr.data-status]=\"host.queryStatus(link.query)\" class=\"et-query-devtools-status\"></span>\n <span class=\"et-query-devtools-method\">{{ link.method }}</span>\n <span class=\"et-query-devtools-route\">\n <et-query-devtools-route [segments]=\"link.segments\" [fallback]=\"link.query.id() || 'query'\" />\n </span>\n </button>\n }\n </div>\n } @else {\n <span class=\"et-query-devtools-hint\">\n No query has read this form's value yet. A query picks it up the first time its\n <code>withArgs</code> reads <code>value()</code>.\n </span>\n }\n </dd>\n </dl>\n\n @if (expanded) {\n <table class=\"et-query-devtools-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th>Value</th>\n <th>Default</th>\n <th>URL param</th>\n <th>Rules</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (field of form.fields(); track field.key) {\n <tr [attr.data-status]=\"field.isDefault ? null : 'success'\">\n <td class=\"et-query-devtools-mono\">{{ field.key }}</td>\n <td class=\"et-query-devtools-mono\">\n {{ host.inlineValue(field.value) }}\n <!-- The live value only differs while a debounce is pending, which is exactly\n when \"the input says X but the query asked for Y\" needs explaining. -->\n @if (field.liveValue !== field.value) {\n <span class=\"et-query-devtools-stat-sub\">typing {{ host.inlineValue(field.liveValue) }}</span>\n }\n </td>\n <td class=\"et-query-devtools-mono\">{{ host.inlineValue(field.defaultValue) }}</td>\n <td class=\"et-query-devtools-mono\">\n @if (field.queryParam === undefined) {\n <span class=\"et-query-devtools-hint\">\u2014</span>\n } @else {\n {{ field.paramKey }}={{ host.inlineValue(field.queryParam) }}\n }\n </td>\n <td>\n <div class=\"et-query-devtools-chips\">\n @if (field.debounceMs !== null) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">\n {{ field.debounceMs }}ms\n </span>\n }\n @if (field.isResetBy.length) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Reset to its default whenever one of these changes\"\n >\n reset by {{ field.isResetBy.join(', ') }}\n </span>\n }\n @if (!field.countsAsFilter) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Not counted by activeFilterCount\"\n >\n not a filter\n </span>\n }\n </div>\n </td>\n <td>\n <button\n [disabled]=\"field.isDefault\"\n (click)=\"form.resetField(field.key)\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n <h4 class=\"et-query-devtools-section\">Committed value</h4>\n <et-query-devtools-json [value]=\"form.value()\" />\n }\n </div>\n } @empty {\n <p class=\"et-query-devtools-empty\">\n No query forms registered. A form created with <code>defineQueryForm()</code> registers itself.\n </p>\n }\n </div>\n\n <et-query-devtools-drawer\n [sel]=\"host.formSelectedQuery()\"\n [container]=\"panes\"\n (dismiss)=\"host.formSelectedQueryId.set(null)\"\n />\n</div>\n", dependencies: [{ kind: "component", type: QueryDevtoolsDrawerComponent, selector: "et-query-devtools-drawer", inputs: ["sel", "container"], outputs: ["dismiss"] }, { kind: "component", type: QueryDevtoolsJsonComponent, selector: "et-query-devtools-json", inputs: ["value", "nodeKey", "depth", "search", "chunk", "path", "expandedPaths", "collapsedPaths", "toggleFn", "jsonPath", "parentKind", "overrides"] }, { kind: "component", type: QueryDevtoolsRouteComponent, selector: "et-query-devtools-route", inputs: ["segments", "fallback"] }], encapsulation: i0.ViewEncapsulation.None }); }
49029
49188
  }
49030
49189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: QueryDevtoolsFormsTabComponent, decorators: [{
49031
49190
  type: Component,
49032
- args: [{ selector: 'et-query-devtools-forms-tab', encapsulation: ViewEncapsulation.None, imports: [QueryDevtoolsDrawerComponent, QueryDevtoolsJsonComponent, QueryDevtoolsRouteComponent], template: "<div #panes class=\"et-query-devtools-split\">\n <div class=\"et-query-devtools-scroll\">\n @for (entry of host.formEntries(); track entry.id) {\n @let form = host.asForm(entry);\n @let expanded = host.selectedFormId() === entry.id;\n <div class=\"et-query-devtools-card\">\n <div class=\"et-query-devtools-card-head\">\n <button\n [attr.aria-expanded]=\"expanded\"\n (click)=\"host.selectedFormId.set(expanded ? null : entry.id)\"\n class=\"et-query-devtools-row-link\"\n type=\"button\"\n >\n <span class=\"et-query-devtools-caret\">{{ expanded ? '\u25BE' : '\u25B8' }}</span>\n <strong>{{ entry.meta.name || 'query form' }}</strong>\n </button>\n @if (form.activeFilterCount(); as count) {\n <span class=\"et-query-devtools-chip\">{{ count }} active</span>\n } @else {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">at defaults</span>\n }\n @if (form.isCommitPending()) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--loading\">debouncing</span>\n }\n @if (!form.isObserving()) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"observe() has not been called, so nothing syncs with the URL\"\n >\n not observing\n </span>\n }\n <button\n [disabled]=\"form.isAtDefaults()\"\n (click)=\"form.resetAll()\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2 Reset all\n </button>\n </div>\n\n @let driven = host.queriesDrivenByForm(entry);\n <dl class=\"et-query-devtools-meta\">\n <dt>Drives</dt>\n <dd>\n @if (driven.length) {\n <div class=\"et-query-devtools-inner-queries\">\n @for (link of driven; track link.id) {\n <button\n [class.et-query-devtools-inner-row--active]=\"host.formSelectedQueryId() === link.id\"\n [disabled]=\"!link.id\"\n (click)=\"host.formSelectedQueryId.set(link.id)\"\n class=\"et-query-devtools-inner-row\"\n type=\"button\"\n >\n <span [attr.data-status]=\"host.queryStatus(link.query)\" class=\"et-query-devtools-status\"></span>\n <span class=\"et-query-devtools-method\">{{ link.method }}</span>\n <span class=\"et-query-devtools-route\">\n <et-query-devtools-route [segments]=\"link.segments\" [fallback]=\"link.query.id() || 'query'\" />\n </span>\n </button>\n }\n </div>\n } @else {\n <span class=\"et-query-devtools-hint\">\n No query has read this form's value yet. A query picks it up the first time its\n <code>withArgs</code> reads <code>value()</code>.\n </span>\n }\n </dd>\n </dl>\n\n @if (expanded) {\n <table class=\"et-query-devtools-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th>Value</th>\n <th>Default</th>\n <th>URL param</th>\n <th>Rules</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (field of form.fields(); track field.key) {\n <tr [attr.data-status]=\"field.isDefault ? null : 'success'\">\n <td class=\"et-query-devtools-mono\">{{ field.key }}</td>\n <td class=\"et-query-devtools-mono\">\n {{ host.inlineValue(field.value) }}\n <!-- The live value only differs while a debounce is pending, which is exactly\n when \"the input says X but the query asked for Y\" needs explaining. -->\n @if (field.liveValue !== field.value) {\n <span class=\"et-query-devtools-stat-sub\">typing {{ host.inlineValue(field.liveValue) }}</span>\n }\n </td>\n <td class=\"et-query-devtools-mono\">{{ host.inlineValue(field.defaultValue) }}</td>\n <td class=\"et-query-devtools-mono\">\n @if (field.queryParam === undefined) {\n <span class=\"et-query-devtools-hint\">\u2014</span>\n } @else {\n {{ field.paramKey }}={{ host.inlineValue(field.queryParam) }}\n }\n </td>\n <td>\n <div class=\"et-query-devtools-chips\">\n @if (field.debounceMs !== null) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">\n {{ field.debounceMs }}ms\n </span>\n }\n @if (field.isResetBy.length) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Reset to its default whenever one of these changes\"\n >\n reset by {{ field.isResetBy.join(', ') }}\n </span>\n }\n @if (!field.countsAsFilter) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Not counted by activeFilterCount\"\n >\n not a filter\n </span>\n }\n </div>\n </td>\n <td>\n <button\n [disabled]=\"field.isDefault\"\n (click)=\"form.resetField(field.key)\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n <h4 class=\"et-query-devtools-section\">Committed value</h4>\n <et-query-devtools-json [value]=\"form.value()\" />\n }\n </div>\n } @empty {\n <p class=\"et-query-devtools-empty\">\n No query forms registered. A form created with <code>createQueryForm()</code> registers itself.\n </p>\n }\n </div>\n\n <et-query-devtools-drawer\n [sel]=\"host.formSelectedQuery()\"\n [container]=\"panes\"\n (dismiss)=\"host.formSelectedQueryId.set(null)\"\n />\n</div>\n" }]
49191
+ args: [{ selector: 'et-query-devtools-forms-tab', encapsulation: ViewEncapsulation.None, imports: [QueryDevtoolsDrawerComponent, QueryDevtoolsJsonComponent, QueryDevtoolsRouteComponent], template: "<div #panes class=\"et-query-devtools-split\">\n <div class=\"et-query-devtools-scroll\">\n @for (entry of host.formEntries(); track entry.id) {\n @let form = host.asForm(entry);\n @let expanded = host.selectedFormId() === entry.id;\n <div class=\"et-query-devtools-card\">\n <div class=\"et-query-devtools-card-head\">\n <button\n [attr.aria-expanded]=\"expanded\"\n (click)=\"host.selectedFormId.set(expanded ? null : entry.id)\"\n class=\"et-query-devtools-row-link\"\n type=\"button\"\n >\n <span class=\"et-query-devtools-caret\">{{ expanded ? '\u25BE' : '\u25B8' }}</span>\n <strong>{{ entry.meta.name || 'query form' }}</strong>\n </button>\n @if (form.activeFilterCount(); as count) {\n <span class=\"et-query-devtools-chip\">{{ count }} active</span>\n } @else {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">at defaults</span>\n }\n @if (form.isCommitPending()) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--loading\">debouncing</span>\n }\n @if (!form.isObserving()) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"observe() has not been called, so nothing syncs with the URL\"\n >\n not observing\n </span>\n }\n <button\n [disabled]=\"form.isAtDefaults()\"\n (click)=\"form.resetAll()\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2 Reset all\n </button>\n </div>\n\n @let driven = host.queriesDrivenByForm(entry);\n <dl class=\"et-query-devtools-meta\">\n <dt>Drives</dt>\n <dd>\n @if (driven.length) {\n <div class=\"et-query-devtools-inner-queries\">\n @for (link of driven; track link.id) {\n <button\n [class.et-query-devtools-inner-row--active]=\"host.formSelectedQueryId() === link.id\"\n [disabled]=\"!link.id\"\n (click)=\"host.formSelectedQueryId.set(link.id)\"\n class=\"et-query-devtools-inner-row\"\n type=\"button\"\n >\n <span [attr.data-status]=\"host.queryStatus(link.query)\" class=\"et-query-devtools-status\"></span>\n <span class=\"et-query-devtools-method\">{{ link.method }}</span>\n <span class=\"et-query-devtools-route\">\n <et-query-devtools-route [segments]=\"link.segments\" [fallback]=\"link.query.id() || 'query'\" />\n </span>\n </button>\n }\n </div>\n } @else {\n <span class=\"et-query-devtools-hint\">\n No query has read this form's value yet. A query picks it up the first time its\n <code>withArgs</code> reads <code>value()</code>.\n </span>\n }\n </dd>\n </dl>\n\n @if (expanded) {\n <table class=\"et-query-devtools-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th>Value</th>\n <th>Default</th>\n <th>URL param</th>\n <th>Rules</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (field of form.fields(); track field.key) {\n <tr [attr.data-status]=\"field.isDefault ? null : 'success'\">\n <td class=\"et-query-devtools-mono\">{{ field.key }}</td>\n <td class=\"et-query-devtools-mono\">\n {{ host.inlineValue(field.value) }}\n <!-- The live value only differs while a debounce is pending, which is exactly\n when \"the input says X but the query asked for Y\" needs explaining. -->\n @if (field.liveValue !== field.value) {\n <span class=\"et-query-devtools-stat-sub\">typing {{ host.inlineValue(field.liveValue) }}</span>\n }\n </td>\n <td class=\"et-query-devtools-mono\">{{ host.inlineValue(field.defaultValue) }}</td>\n <td class=\"et-query-devtools-mono\">\n @if (field.queryParam === undefined) {\n <span class=\"et-query-devtools-hint\">\u2014</span>\n } @else {\n {{ field.paramKey }}={{ host.inlineValue(field.queryParam) }}\n }\n </td>\n <td>\n <div class=\"et-query-devtools-chips\">\n @if (field.debounceMs !== null) {\n <span class=\"et-query-devtools-chip et-query-devtools-chip--muted\">\n {{ field.debounceMs }}ms\n </span>\n }\n @if (field.isResetBy.length) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Reset to its default whenever one of these changes\"\n >\n reset by {{ field.isResetBy.join(', ') }}\n </span>\n }\n @if (!field.countsAsFilter) {\n <span\n class=\"et-query-devtools-chip et-query-devtools-chip--muted\"\n title=\"Not counted by activeFilterCount\"\n >\n not a filter\n </span>\n }\n </div>\n </td>\n <td>\n <button\n [disabled]=\"field.isDefault\"\n (click)=\"form.resetField(field.key)\"\n class=\"et-query-devtools-btn\"\n type=\"button\"\n >\n \u27F2\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n <h4 class=\"et-query-devtools-section\">Committed value</h4>\n <et-query-devtools-json [value]=\"form.value()\" />\n }\n </div>\n } @empty {\n <p class=\"et-query-devtools-empty\">\n No query forms registered. A form created with <code>defineQueryForm()</code> registers itself.\n </p>\n }\n </div>\n\n <et-query-devtools-drawer\n [sel]=\"host.formSelectedQuery()\"\n [container]=\"panes\"\n (dismiss)=\"host.formSelectedQueryId.set(null)\"\n />\n</div>\n" }]
49033
49192
  }] });
49034
49193
 
49035
49194
  /* eslint-disable @typescript-eslint/naming-convention -- the `__export_*` keys are Insomnia's file format */
@@ -51776,6 +51935,8 @@ const SCHEDULER_ERROR_CODES = {
51776
51935
  FEATURE_OUTSIDE_SCHEDULER: 4500,
51777
51936
  /** A view layout directive (e.g. `[etSchedulerMonth]`) was placed outside an `[etScheduler]`. */
51778
51937
  VIEW_OUTSIDE_SCHEDULER: 4501,
51938
+ /** An edit-surface feature (e.g. an edit field or appointment action) was used outside an `<et-scheduler-edit-surface>`. */
51939
+ EDIT_SURFACE_FEATURE_OUTSIDE_SURFACE: 4502,
51779
51940
  };
51780
51941
 
51781
51942
  /** The built-in English labels. */
@@ -51789,6 +51950,21 @@ const DEFAULT_SCHEDULER_LABELS = {
51789
51950
  week: 'Week',
51790
51951
  day: 'Day',
51791
51952
  agenda: 'Agenda',
51953
+ addAppointment: 'Add appointment',
51954
+ untitledAppointment: 'Untitled appointment',
51955
+ ancestors: 'Ancestor chain',
51956
+ subAppointments: 'Sub-appointments',
51957
+ moreActions: 'More actions',
51958
+ save: 'Save',
51959
+ cancel: 'Cancel',
51960
+ addSubAppointment: 'Add sub-appointment',
51961
+ deleteWithDescendants: 'Delete (with descendants)',
51962
+ titleField: 'Title',
51963
+ startField: 'Starts',
51964
+ endField: 'Ends',
51965
+ locationField: 'Location',
51966
+ descriptionField: 'Description',
51967
+ colorField: 'Color',
51792
51968
  };
51793
51969
  const SCHEDULER_LABELS_DEF = /* @__PURE__ */ defineLabels('SCHEDULER_LABELS', DEFAULT_SCHEDULER_LABELS);
51794
51970
  const provideSchedulerLabels = /* @__PURE__ */ toProvideFn(SCHEDULER_LABELS_DEF);
@@ -51825,6 +52001,21 @@ const buildAppointmentTree = (appointments) => {
51825
52001
  const flattenAppointmentTree = (nodes) => nodes.flatMap((node) => [node, ...flattenAppointmentTree(node.children)]);
51826
52002
  /** Every descendant a node has, at any depth - what the chain-count badge adornment shows. */
51827
52003
  const countDescendants = (node) => node.children.reduce((count, child) => count + 1 + countDescendants(child), 0);
52004
+ /** Finds the tree node for an appointment id, searching every chain at any depth. */
52005
+ const findAppointmentNode = (nodes, id) => {
52006
+ for (const node of nodes) {
52007
+ if (node.appointment.id === id) {
52008
+ return node;
52009
+ }
52010
+ const found = findAppointmentNode(node.children, id);
52011
+ if (found) {
52012
+ return found;
52013
+ }
52014
+ }
52015
+ return null;
52016
+ };
52017
+ /** Every descendant id a node has, at any depth - what "delete (with descendants)" removes in one pass. */
52018
+ const collectDescendantIds = (node) => node.children.flatMap((child) => [child.appointment.id, ...collectDescendantIds(child)]);
51828
52019
 
51829
52020
  /**
51830
52021
  * Headless scheduler state: the active view, the focused date, the visible date range each view
@@ -52001,6 +52192,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
52001
52192
  }]
52002
52193
  }], ctorParameters: () => [] });
52003
52194
 
52195
+ /**
52196
+ * Headless edit-surface state: which appointment is open, the live draft every field reads and
52197
+ * writes, and navigation across the sub-appointment chain (ancestors, children, "add
52198
+ * sub-appointment") - all without any template structure. `<et-scheduler-edit-surface>` applies
52199
+ * this via `hostDirectives` and renders the registered fields/actions on top (see
52200
+ * `SCHEDULER_EDIT_SURFACE_HOST`).
52201
+ */
52202
+ class SchedulerEditSurfaceDirective {
52203
+ constructor() {
52204
+ /** The appointment to open the surface for - a freshly-synthesized blank one (with `id` already assigned) for "add". */
52205
+ this.appointment = input.required(/* @ts-ignore */
52206
+ ...(ngDevMode ? [{ debugName: "appointment" }] : /* istanbul ignore next */ []));
52207
+ /** Every appointment the scheduler knows about - for the ancestor breadcrumb, the children list, and chain-aware actions. */
52208
+ this.appointments = input([], /* @ts-ignore */
52209
+ ...(ngDevMode ? [{ debugName: "appointments" }] : /* istanbul ignore next */ []));
52210
+ /** Emits the draft when the surface commits an edit or a new sub-appointment. */
52211
+ this.save = output();
52212
+ /** Emits every id to remove - the current appointment plus, for "delete with descendants", its whole chain. */
52213
+ this.deleteAppointments = output();
52214
+ this.appointmentTree = computed(() => buildAppointmentTree(this.appointments()), /* @ts-ignore */
52215
+ ...(ngDevMode ? [{ debugName: "appointmentTree" }] : /* istanbul ignore next */ []));
52216
+ /** A synthesized appointment not yet in `appointments()` - set while "add sub-appointment" is in progress. */
52217
+ this.pendingAppointment = signal(null, /* @ts-ignore */
52218
+ ...(ngDevMode ? [{ debugName: "pendingAppointment" }] : /* istanbul ignore next */ []));
52219
+ /**
52220
+ * Which appointment id the surface is currently showing. Starts at `appointment()`'s id;
52221
+ * breadcrumb/children navigation and "add sub-appointment" move it without opening a new dialog.
52222
+ */
52223
+ this.currentAppointmentId = linkedSignal(() => this.appointment().id, /* @ts-ignore */
52224
+ ...(ngDevMode ? [{ debugName: "currentAppointmentId" }] : /* istanbul ignore next */ []));
52225
+ /** The pre-edit snapshot of whichever appointment is currently shown. */
52226
+ this.currentAppointment = computed(() => this.pendingAppointment() ??
52227
+ this.appointments().find((candidate) => candidate.id === this.currentAppointmentId()) ??
52228
+ this.appointment(), /* @ts-ignore */
52229
+ ...(ngDevMode ? [{ debugName: "currentAppointment" }] : /* istanbul ignore next */ []));
52230
+ /**
52231
+ * The live draft every edit field reads and writes. Resets to `currentAppointment()` whenever
52232
+ * the surface navigates - unsaved edits are discarded on navigation, the same "edit a copy"
52233
+ * tradeoff the filter overlay makes.
52234
+ */
52235
+ this.draft = linkedSignal(() => this.currentAppointment(), /* @ts-ignore */
52236
+ ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
52237
+ /** `currentAppointment()`'s ancestor chain, root first - what the breadcrumb renders. */
52238
+ this.ancestors = computed(() => {
52239
+ const byId = new Map(this.appointments().map((candidate) => [candidate.id, candidate]));
52240
+ const chain = [];
52241
+ const seen = new Set();
52242
+ let parentId = this.currentAppointment().parentId;
52243
+ while (parentId !== null && !seen.has(parentId)) {
52244
+ seen.add(parentId);
52245
+ const parent = byId.get(parentId);
52246
+ if (!parent) {
52247
+ break;
52248
+ }
52249
+ chain.unshift(parent);
52250
+ parentId = parent.parentId;
52251
+ }
52252
+ return chain;
52253
+ }, /* @ts-ignore */
52254
+ ...(ngDevMode ? [{ debugName: "ancestors" }] : /* istanbul ignore next */ []));
52255
+ this.currentNode = computed(() => findAppointmentNode(this.appointmentTree(), this.currentAppointmentId()), /* @ts-ignore */
52256
+ ...(ngDevMode ? [{ debugName: "currentNode" }] : /* istanbul ignore next */ []));
52257
+ /** `currentAppointment()`'s direct children - what the children list renders, each navigable via `navigateTo`. */
52258
+ this.children = computed(() => this.currentNode()?.children ?? [], /* @ts-ignore */
52259
+ ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
52260
+ }
52261
+ /**
52262
+ * Navigates to a different appointment already in `appointments()` - a breadcrumb ancestor or a
52263
+ * child in the list. Discards any unsaved draft edits for the appointment navigated away from.
52264
+ */
52265
+ navigateTo(id) {
52266
+ this.pendingAppointment.set(null);
52267
+ this.currentAppointmentId.set(id);
52268
+ }
52269
+ /** Starts "add sub-appointment": synthesizes a blank child of `currentAppointment()` and navigates to it. */
52270
+ startAddSubAppointment() {
52271
+ const parent = this.currentAppointment();
52272
+ const blank = {
52273
+ id: randomId(),
52274
+ parentId: parent.id,
52275
+ title: '',
52276
+ start: parent.start,
52277
+ end: parent.end,
52278
+ };
52279
+ this.pendingAppointment.set(blank);
52280
+ this.currentAppointmentId.set(blank.id);
52281
+ }
52282
+ /** Commits the current draft via `save` - the component closes the dialog on this. */
52283
+ commit() {
52284
+ this.save.emit(this.draft());
52285
+ }
52286
+ /** Emits `deleteAppointments` for the current appointment and every descendant - the component closes the dialog on this. */
52287
+ requestDelete() {
52288
+ const node = this.currentNode();
52289
+ const ids = node ? [node.appointment.id, ...collectDescendantIds(node)] : [this.currentAppointment().id];
52290
+ this.deleteAppointments.emit(ids);
52291
+ }
52292
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditSurfaceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
52293
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditSurfaceDirective, isStandalone: true, selector: "[etSchedulerEditSurface]", inputs: { appointment: { classPropertyName: "appointment", publicName: "appointment", isSignal: true, isRequired: true, transformFunction: null }, appointments: { classPropertyName: "appointments", publicName: "appointments", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { save: "save", deleteAppointments: "deleteAppointments" }, exportAs: ["etSchedulerEditSurface"], ngImport: i0 }); }
52294
+ }
52295
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditSurfaceDirective, decorators: [{
52296
+ type: Directive,
52297
+ args: [{
52298
+ selector: '[etSchedulerEditSurface]',
52299
+ exportAs: 'etSchedulerEditSurface',
52300
+ }]
52301
+ }], propDecorators: { appointment: [{ type: i0.Input, args: [{ isSignal: true, alias: "appointment", required: true }] }], appointments: [{ type: i0.Input, args: [{ isSignal: true, alias: "appointments", required: false }] }], save: [{ type: i0.Output, args: ["save"] }], deleteAppointments: [{ type: i0.Output, args: ["deleteAppointments"] }] } });
52302
+
52004
52303
  const SCHEDULER_FEATURE_HOST = new InjectionToken('SCHEDULER_FEATURE_HOST');
52005
52304
  /**
52006
52305
  * Read a feature's config input. A feature directive is usually written bare
@@ -52019,6 +52318,18 @@ const injectSchedulerFeatureHost = (feature) => {
52019
52318
  }
52020
52319
  return host;
52021
52320
  };
52321
+ const SCHEDULER_EDIT_SURFACE_HOST = new InjectionToken('SCHEDULER_EDIT_SURFACE_HOST');
52322
+ /**
52323
+ * Inject the host edit surface from inside a feature. Throws a labelled error when the feature was
52324
+ * placed outside an `<et-scheduler-edit-surface>`, where it could only ever silently do nothing.
52325
+ */
52326
+ const injectSchedulerEditSurfaceHost = (feature) => {
52327
+ const host = inject(SCHEDULER_EDIT_SURFACE_HOST, { optional: true });
52328
+ if (!host) {
52329
+ throw new RuntimeError(SCHEDULER_ERROR_CODES.EDIT_SURFACE_FEATURE_OUTSIDE_SURFACE, `[${feature}] must be used inside an <et-scheduler-edit-surface>.`);
52330
+ }
52331
+ return host;
52332
+ };
52022
52333
 
52023
52334
  const appointmentCoversDay = (appointment, day) => appointment.start <= day.end && appointment.end >= day.start;
52024
52335
  /**
@@ -52224,6 +52535,22 @@ const buildSchedulerTimeGrid = (options) => {
52224
52535
  }));
52225
52536
  return { days: dayColumns, allDay, allDayRowCount: rowCount };
52226
52537
  };
52538
+ /**
52539
+ * Which hour the time grid's scrollable body should open scrolled to, so day/week view never
52540
+ * starts on an empty screen scrolled to midnight: the current hour (with an hour of lead-in) when
52541
+ * today is one of the visible days, else the earliest timed appointment's hour (same lead-in),
52542
+ * else a business-hours default.
52543
+ */
52544
+ const computeInitialScrollHour = (grid, now) => {
52545
+ if (grid.days.some((day) => day.today)) {
52546
+ return Math.max(0, now.getHours() - 1);
52547
+ }
52548
+ const offsets = grid.days.flatMap((day) => day.blocks.map((block) => block.offset));
52549
+ if (offsets.length === 0) {
52550
+ return 8;
52551
+ }
52552
+ return Math.max(0, Math.floor((Math.min(...offsets) / 100) * 24) - 1);
52553
+ };
52227
52554
 
52228
52555
  /**
52229
52556
  * Lays the host `[etScheduler]`'s appointments onto an hour-axis time grid: one day column per day
@@ -52257,6 +52584,14 @@ class SchedulerTimeGridDirective {
52257
52584
  /** How many stacking rows {@link allDay} needs - sizes the all-day lane's reserved space. */
52258
52585
  this.allDayRowCount = computed(() => this.grid().allDayRowCount, /* @ts-ignore */
52259
52586
  ...(ngDevMode ? [{ debugName: "allDayRowCount" }] : /* istanbul ignore next */ []));
52587
+ /**
52588
+ * Which hour the body's scrollable region should open scrolled to - the current hour when today
52589
+ * is visible, else the earliest appointment's hour, else a business-hours default. See
52590
+ * `SchedulerTimeGridViewComponent`, which reads this once on mount rather than reactively, so
52591
+ * navigating days/weeks afterwards never yanks the user's own scroll position back.
52592
+ */
52593
+ this.initialScrollHour = computed(() => computeInitialScrollHour(this.grid(), new Date()), /* @ts-ignore */
52594
+ ...(ngDevMode ? [{ debugName: "initialScrollHour" }] : /* istanbul ignore next */ []));
52260
52595
  if (ngDevMode) {
52261
52596
  afterNextRender(() => {
52262
52597
  if (!this.scheduler) {
@@ -52276,6 +52611,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
52276
52611
  }]
52277
52612
  }], ctorParameters: () => [] });
52278
52613
 
52614
+ /**
52615
+ * Built-in toolbar action: opens the default edit surface for a brand-new, blank top-level
52616
+ * appointment - see `SchedulerFeatureHost.addAppointment`. One of the default pieces
52617
+ * `<et-scheduler>` bundles - see `registerToolbarAction`. Depends on the default edit surface
52618
+ * (it's what the dialog it opens is), so unlike `etSchedulerActionAddSubAppointment` it has no
52619
+ * bare-`[etScheduler]` equivalent - a headless-only composition needs its own "new appointment"
52620
+ * affordance.
52621
+ *
52622
+ * @example
52623
+ * <et-scheduler [etSchedulerActionAddAppointment]="{ enabled: false }" … />
52624
+ */
52625
+ class SchedulerActionAddAppointmentDirective {
52626
+ constructor() {
52627
+ this.host = injectSchedulerFeatureHost('etSchedulerActionAddAppointment');
52628
+ this.labels = injectSchedulerLabels();
52629
+ /** See {@link SchedulerActionAddAppointmentConfig}. */
52630
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerActionAddAppointment',
52631
+ transform: (schedulerFeatureConfig) });
52632
+ this.host.registerToolbarAction({
52633
+ label: computed(() => this.labels().addAppointment),
52634
+ icon: 'et-plus',
52635
+ order: 0,
52636
+ enabled: computed(() => this.config().enabled ?? true),
52637
+ run: () => this.host.addAppointment(),
52638
+ });
52639
+ }
52640
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerActionAddAppointmentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
52641
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerActionAddAppointmentDirective, isStandalone: true, selector: "[etSchedulerActionAddAppointment]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerActionAddAppointment", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerActionAddAppointment"], ngImport: i0 }); }
52642
+ }
52643
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerActionAddAppointmentDirective, decorators: [{
52644
+ type: Directive,
52645
+ args: [{
52646
+ selector: '[etSchedulerActionAddAppointment]',
52647
+ exportAs: 'etSchedulerActionAddAppointment',
52648
+ }]
52649
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerActionAddAppointment", required: false }] }] } });
52650
+
52651
+ /**
52652
+ * Built-in appointment action: starts adding a sub-appointment of the surface's current
52653
+ * appointment - see `SchedulerEditSurfaceDirective.startAddSubAppointment`. One of the default
52654
+ * pieces `<et-scheduler-edit-surface>` bundles - see `registerAppointmentAction`.
52655
+ *
52656
+ * @example
52657
+ * <et-scheduler-edit-surface [etSchedulerActionAddSubAppointment]="{ enabled: false }" … />
52658
+ */
52659
+ class SchedulerActionAddSubAppointmentDirective {
52660
+ constructor() {
52661
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerActionAddSubAppointment');
52662
+ this.surface = inject(SchedulerEditSurfaceDirective);
52663
+ this.labels = injectSchedulerLabels();
52664
+ /** See {@link SchedulerActionAddSubAppointmentConfig}. */
52665
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerActionAddSubAppointment',
52666
+ transform: (schedulerFeatureConfig) });
52667
+ this.host.registerAppointmentAction({
52668
+ label: computed(() => this.labels().addSubAppointment),
52669
+ icon: 'et-plus',
52670
+ order: 0,
52671
+ enabled: computed(() => this.config().enabled ?? true),
52672
+ run: () => this.surface.startAddSubAppointment(),
52673
+ });
52674
+ }
52675
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerActionAddSubAppointmentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
52676
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerActionAddSubAppointmentDirective, isStandalone: true, selector: "[etSchedulerActionAddSubAppointment]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerActionAddSubAppointment", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerActionAddSubAppointment"], ngImport: i0 }); }
52677
+ }
52678
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerActionAddSubAppointmentDirective, decorators: [{
52679
+ type: Directive,
52680
+ args: [{
52681
+ selector: '[etSchedulerActionAddSubAppointment]',
52682
+ exportAs: 'etSchedulerActionAddSubAppointment',
52683
+ }]
52684
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerActionAddSubAppointment", required: false }] }] } });
52685
+
52686
+ /**
52687
+ * Built-in appointment action: deletes the surface's current appointment together with every
52688
+ * descendant - see `SchedulerEditSurfaceDirective.requestDelete`. One of the default pieces
52689
+ * `<et-scheduler-edit-surface>` bundles - see `registerAppointmentAction`.
52690
+ *
52691
+ * @example
52692
+ * <et-scheduler-edit-surface [etSchedulerActionDelete]="{ enabled: false }" … />
52693
+ */
52694
+ class SchedulerActionDeleteDirective {
52695
+ constructor() {
52696
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerActionDelete');
52697
+ this.surface = inject(SchedulerEditSurfaceDirective);
52698
+ this.labels = injectSchedulerLabels();
52699
+ /** See {@link SchedulerActionDeleteConfig}. */
52700
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerActionDelete',
52701
+ transform: (schedulerFeatureConfig) });
52702
+ this.host.registerAppointmentAction({
52703
+ label: computed(() => this.labels().deleteWithDescendants),
52704
+ icon: 'et-trash',
52705
+ order: 100,
52706
+ destructive: true,
52707
+ enabled: computed(() => this.config().enabled ?? true),
52708
+ run: () => this.surface.requestDelete(),
52709
+ });
52710
+ }
52711
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerActionDeleteDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
52712
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerActionDeleteDirective, isStandalone: true, selector: "[etSchedulerActionDelete]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerActionDelete", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerActionDelete"], ngImport: i0 }); }
52713
+ }
52714
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerActionDeleteDirective, decorators: [{
52715
+ type: Directive,
52716
+ args: [{
52717
+ selector: '[etSchedulerActionDelete]',
52718
+ exportAs: 'etSchedulerActionDelete',
52719
+ }]
52720
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerActionDelete", required: false }] }] } });
52721
+
52279
52722
  /**
52280
52723
  * The `.et-scheduler-appointment` badge rule, as a styles-only component mounted by every
52281
52724
  * scheduler view that renders a plain (non-time-grid) appointment badge - see
@@ -52654,6 +53097,524 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
52654
53097
  }]
52655
53098
  }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerBadgeTitle", required: false }] }] } });
52656
53099
 
53100
+ /**
53101
+ * The color piece of the edit surface, stamped by `etSchedulerEditColor`. A plain text field for
53102
+ * `colorToken` rather than a swatch picker - theme names are app-registered (see `theming`), so
53103
+ * the SDK has no fixed set of tokens to offer as choices.
53104
+ *
53105
+ * @internal
53106
+ */
53107
+ class SchedulerEditColorComponent {
53108
+ constructor() {
53109
+ this.labels = injectSchedulerLabels();
53110
+ this.draft = input.required(/* @ts-ignore */
53111
+ ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
53112
+ this.label = computed(() => this.labels().colorField, /* @ts-ignore */
53113
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
53114
+ this.value = computed(() => this.draft()().colorToken ?? '', /* @ts-ignore */
53115
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
53116
+ }
53117
+ updateColorToken(value) {
53118
+ this.draft().update((appointment) => ({ ...appointment, colorToken: value || undefined }));
53119
+ }
53120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditColorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditColorComponent, isStandalone: true, selector: "et-scheduler-edit-color", inputs: { draft: { classPropertyName: "draft", publicName: "draft", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
53122
+ <et-form-field>
53123
+ <et-label>{{ label() }}</et-label>
53124
+ <et-input [value]="value()" (valueChange)="updateColorToken($event)" />
53125
+ </et-form-field>
53126
+ `, isInline: true, dependencies: [{ kind: "component", type: FormFieldComponent, selector: "et-form-field", inputs: ["appearance", "fill", "labelMode", "size", "busy"] }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "component", type: InputComponent, selector: "et-input" }], encapsulation: i0.ViewEncapsulation.None }); }
53127
+ }
53128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditColorComponent, decorators: [{
53129
+ type: Component,
53130
+ args: [{
53131
+ selector: 'et-scheduler-edit-color',
53132
+ template: `
53133
+ <et-form-field>
53134
+ <et-label>{{ label() }}</et-label>
53135
+ <et-input [value]="value()" (valueChange)="updateColorToken($event)" />
53136
+ </et-form-field>
53137
+ `,
53138
+ encapsulation: ViewEncapsulation.None,
53139
+ imports: [...FORM_FIELD_IMPORTS, ...INPUT_IMPORTS],
53140
+ }]
53141
+ }], propDecorators: { draft: [{ type: i0.Input, args: [{ isSignal: true, alias: "draft", required: true }] }] } });
53142
+
53143
+ /**
53144
+ * Built-in edit-surface field: the appointment's `colorToken`. One of the default pieces
53145
+ * `<et-scheduler-edit-surface>` bundles - see `registerEditField`.
53146
+ *
53147
+ * @example
53148
+ * <et-scheduler-edit-surface [etSchedulerEditColor]="{ enabled: false }" … />
53149
+ */
53150
+ class SchedulerEditColorDirective {
53151
+ constructor() {
53152
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerEditColor');
53153
+ /** See {@link SchedulerEditColorConfig}. */
53154
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerEditColor',
53155
+ transform: (schedulerFeatureConfig) });
53156
+ this.host.registerEditField({
53157
+ component: SchedulerEditColorComponent,
53158
+ injector: inject(Injector),
53159
+ order: 40,
53160
+ enabled: computed(() => this.config().enabled ?? true),
53161
+ });
53162
+ }
53163
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditColorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
53164
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditColorDirective, isStandalone: true, selector: "[etSchedulerEditColor]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerEditColor", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerEditColor"], ngImport: i0 }); }
53165
+ }
53166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditColorDirective, decorators: [{
53167
+ type: Directive,
53168
+ args: [{
53169
+ selector: '[etSchedulerEditColor]',
53170
+ exportAs: 'etSchedulerEditColor',
53171
+ }]
53172
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerEditColor", required: false }] }] } });
53173
+
53174
+ /**
53175
+ * The description piece of the edit surface, stamped by `etSchedulerEditDescription`.
53176
+ *
53177
+ * @internal
53178
+ */
53179
+ class SchedulerEditDescriptionComponent {
53180
+ constructor() {
53181
+ this.labels = injectSchedulerLabels();
53182
+ this.draft = input.required(/* @ts-ignore */
53183
+ ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
53184
+ this.label = computed(() => this.labels().descriptionField, /* @ts-ignore */
53185
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
53186
+ this.value = computed(() => this.draft()().description ?? '', /* @ts-ignore */
53187
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
53188
+ }
53189
+ updateDescription(value) {
53190
+ this.draft().update((appointment) => ({ ...appointment, description: value || undefined }));
53191
+ }
53192
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53193
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditDescriptionComponent, isStandalone: true, selector: "et-scheduler-edit-description", inputs: { draft: { classPropertyName: "draft", publicName: "draft", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
53194
+ <et-form-field>
53195
+ <et-label>{{ label() }}</et-label>
53196
+ <et-textarea [value]="value()" (valueChange)="updateDescription($event)" />
53197
+ </et-form-field>
53198
+ `, isInline: true, dependencies: [{ kind: "component", type: FormFieldComponent, selector: "et-form-field", inputs: ["appearance", "fill", "labelMode", "size", "busy"] }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "component", type: TextareaComponent, selector: "et-textarea" }], encapsulation: i0.ViewEncapsulation.None }); }
53199
+ }
53200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditDescriptionComponent, decorators: [{
53201
+ type: Component,
53202
+ args: [{
53203
+ selector: 'et-scheduler-edit-description',
53204
+ template: `
53205
+ <et-form-field>
53206
+ <et-label>{{ label() }}</et-label>
53207
+ <et-textarea [value]="value()" (valueChange)="updateDescription($event)" />
53208
+ </et-form-field>
53209
+ `,
53210
+ encapsulation: ViewEncapsulation.None,
53211
+ imports: [...FORM_FIELD_IMPORTS, ...TEXTAREA_IMPORTS],
53212
+ }]
53213
+ }], propDecorators: { draft: [{ type: i0.Input, args: [{ isSignal: true, alias: "draft", required: true }] }] } });
53214
+
53215
+ /**
53216
+ * Built-in edit-surface field: the appointment's `description`. One of the default pieces
53217
+ * `<et-scheduler-edit-surface>` bundles - see `registerEditField`.
53218
+ *
53219
+ * @example
53220
+ * <et-scheduler-edit-surface [etSchedulerEditDescription]="{ enabled: false }" … />
53221
+ */
53222
+ class SchedulerEditDescriptionDirective {
53223
+ constructor() {
53224
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerEditDescription');
53225
+ /** See {@link SchedulerEditDescriptionConfig}. */
53226
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerEditDescription',
53227
+ transform: (schedulerFeatureConfig) });
53228
+ this.host.registerEditField({
53229
+ component: SchedulerEditDescriptionComponent,
53230
+ injector: inject(Injector),
53231
+ order: 30,
53232
+ enabled: computed(() => this.config().enabled ?? true),
53233
+ });
53234
+ }
53235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
53236
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditDescriptionDirective, isStandalone: true, selector: "[etSchedulerEditDescription]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerEditDescription", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerEditDescription"], ngImport: i0 }); }
53237
+ }
53238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditDescriptionDirective, decorators: [{
53239
+ type: Directive,
53240
+ args: [{
53241
+ selector: '[etSchedulerEditDescription]',
53242
+ exportAs: 'etSchedulerEditDescription',
53243
+ }]
53244
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerEditDescription", required: false }] }] } });
53245
+
53246
+ /**
53247
+ * The location piece of the edit surface, stamped by `etSchedulerEditLocation`.
53248
+ *
53249
+ * @internal
53250
+ */
53251
+ class SchedulerEditLocationComponent {
53252
+ constructor() {
53253
+ this.labels = injectSchedulerLabels();
53254
+ this.draft = input.required(/* @ts-ignore */
53255
+ ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
53256
+ this.label = computed(() => this.labels().locationField, /* @ts-ignore */
53257
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
53258
+ this.value = computed(() => this.draft()().location ?? '', /* @ts-ignore */
53259
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
53260
+ }
53261
+ updateLocation(value) {
53262
+ this.draft().update((appointment) => ({ ...appointment, location: value || undefined }));
53263
+ }
53264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditLocationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditLocationComponent, isStandalone: true, selector: "et-scheduler-edit-location", inputs: { draft: { classPropertyName: "draft", publicName: "draft", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
53266
+ <et-form-field>
53267
+ <et-label>{{ label() }}</et-label>
53268
+ <et-input [value]="value()" (valueChange)="updateLocation($event)" />
53269
+ </et-form-field>
53270
+ `, isInline: true, dependencies: [{ kind: "component", type: FormFieldComponent, selector: "et-form-field", inputs: ["appearance", "fill", "labelMode", "size", "busy"] }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "component", type: InputComponent, selector: "et-input" }], encapsulation: i0.ViewEncapsulation.None }); }
53271
+ }
53272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditLocationComponent, decorators: [{
53273
+ type: Component,
53274
+ args: [{
53275
+ selector: 'et-scheduler-edit-location',
53276
+ template: `
53277
+ <et-form-field>
53278
+ <et-label>{{ label() }}</et-label>
53279
+ <et-input [value]="value()" (valueChange)="updateLocation($event)" />
53280
+ </et-form-field>
53281
+ `,
53282
+ encapsulation: ViewEncapsulation.None,
53283
+ imports: [...FORM_FIELD_IMPORTS, ...INPUT_IMPORTS],
53284
+ }]
53285
+ }], propDecorators: { draft: [{ type: i0.Input, args: [{ isSignal: true, alias: "draft", required: true }] }] } });
53286
+
53287
+ /**
53288
+ * Built-in edit-surface field: the appointment's `location`. One of the default pieces
53289
+ * `<et-scheduler-edit-surface>` bundles - see `registerEditField`.
53290
+ *
53291
+ * @example
53292
+ * <et-scheduler-edit-surface [etSchedulerEditLocation]="{ enabled: false }" … />
53293
+ */
53294
+ class SchedulerEditLocationDirective {
53295
+ constructor() {
53296
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerEditLocation');
53297
+ /** See {@link SchedulerEditLocationConfig}. */
53298
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerEditLocation',
53299
+ transform: (schedulerFeatureConfig) });
53300
+ this.host.registerEditField({
53301
+ component: SchedulerEditLocationComponent,
53302
+ injector: inject(Injector),
53303
+ order: 20,
53304
+ enabled: computed(() => this.config().enabled ?? true),
53305
+ });
53306
+ }
53307
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditLocationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
53308
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditLocationDirective, isStandalone: true, selector: "[etSchedulerEditLocation]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerEditLocation", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerEditLocation"], ngImport: i0 }); }
53309
+ }
53310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditLocationDirective, decorators: [{
53311
+ type: Directive,
53312
+ args: [{
53313
+ selector: '[etSchedulerEditLocation]',
53314
+ exportAs: 'etSchedulerEditLocation',
53315
+ }]
53316
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerEditLocation", required: false }] }] } });
53317
+
53318
+ /**
53319
+ * The start/end piece of the edit surface, stamped by `etSchedulerEditTimeRange`.
53320
+ *
53321
+ * @internal
53322
+ */
53323
+ class SchedulerEditTimeRangeComponent {
53324
+ constructor() {
53325
+ this.labels = injectSchedulerLabels();
53326
+ this.dateFormat = injectDateFormat();
53327
+ this.draft = input.required(/* @ts-ignore */
53328
+ ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
53329
+ this.startLabel = computed(() => this.labels().startField, /* @ts-ignore */
53330
+ ...(ngDevMode ? [{ debugName: "startLabel" }] : /* istanbul ignore next */ []));
53331
+ this.endLabel = computed(() => this.labels().endField, /* @ts-ignore */
53332
+ ...(ngDevMode ? [{ debugName: "endLabel" }] : /* istanbul ignore next */ []));
53333
+ this.startValue = computed(() => format(this.draft()().start, this.dateFormat), /* @ts-ignore */
53334
+ ...(ngDevMode ? [{ debugName: "startValue" }] : /* istanbul ignore next */ []));
53335
+ this.endValue = computed(() => format(this.draft()().end, this.dateFormat), /* @ts-ignore */
53336
+ ...(ngDevMode ? [{ debugName: "endValue" }] : /* istanbul ignore next */ []));
53337
+ }
53338
+ updateStart(value) {
53339
+ if (!value) {
53340
+ return;
53341
+ }
53342
+ const start = parse(value, this.dateFormat, this.draft()().start);
53343
+ this.draft().update((appointment) => ({ ...appointment, start }));
53344
+ }
53345
+ updateEnd(value) {
53346
+ if (!value) {
53347
+ return;
53348
+ }
53349
+ const end = parse(value, this.dateFormat, this.draft()().end);
53350
+ this.draft().update((appointment) => ({ ...appointment, end }));
53351
+ }
53352
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53353
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditTimeRangeComponent, isStandalone: true, selector: "et-scheduler-edit-time-range", inputs: { draft: { classPropertyName: "draft", publicName: "draft", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "et-scheduler-edit-time-range" }, ngImport: i0, template: `
53354
+ <et-form-field class="et-scheduler-edit-time-range-field">
53355
+ <et-label>{{ startLabel() }}</et-label>
53356
+ <et-date-time-input [value]="startValue()" (valueChange)="updateStart($event)" />
53357
+ </et-form-field>
53358
+
53359
+ <et-form-field class="et-scheduler-edit-time-range-field">
53360
+ <et-label>{{ endLabel() }}</et-label>
53361
+ <et-date-time-input [value]="endValue()" (valueChange)="updateEnd($event)" />
53362
+ </et-form-field>
53363
+ `, isInline: true, dependencies: [{ kind: "component", type: FormFieldComponent, selector: "et-form-field", inputs: ["appearance", "fill", "labelMode", "size", "busy"] }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "component", type: DateTimeInputComponent, selector: "et-date-time-input", inputs: ["pickerTriggerLabel", "minuteStep", "secondStep", "dateTabLabel", "timeTabLabel", "clearable", "clearLabel"] }], encapsulation: i0.ViewEncapsulation.None }); }
53364
+ }
53365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTimeRangeComponent, decorators: [{
53366
+ type: Component,
53367
+ args: [{
53368
+ selector: 'et-scheduler-edit-time-range',
53369
+ template: `
53370
+ <et-form-field class="et-scheduler-edit-time-range-field">
53371
+ <et-label>{{ startLabel() }}</et-label>
53372
+ <et-date-time-input [value]="startValue()" (valueChange)="updateStart($event)" />
53373
+ </et-form-field>
53374
+
53375
+ <et-form-field class="et-scheduler-edit-time-range-field">
53376
+ <et-label>{{ endLabel() }}</et-label>
53377
+ <et-date-time-input [value]="endValue()" (valueChange)="updateEnd($event)" />
53378
+ </et-form-field>
53379
+ `,
53380
+ encapsulation: ViewEncapsulation.None,
53381
+ imports: [...FORM_FIELD_IMPORTS, ...DATE_TIME_INPUT_IMPORTS],
53382
+ host: {
53383
+ class: 'et-scheduler-edit-time-range',
53384
+ },
53385
+ }]
53386
+ }], propDecorators: { draft: [{ type: i0.Input, args: [{ isSignal: true, alias: "draft", required: true }] }] } });
53387
+
53388
+ /**
53389
+ * Built-in edit-surface field: the appointment's `start`/`end`. One of the default pieces
53390
+ * `<et-scheduler-edit-surface>` bundles - see `registerEditField`. Invalid while `end` is before
53391
+ * `start`, which gates the surface's save button.
53392
+ *
53393
+ * @example
53394
+ * <et-scheduler-edit-surface [etSchedulerEditTimeRange]="{ enabled: false }" … />
53395
+ */
53396
+ class SchedulerEditTimeRangeDirective {
53397
+ constructor() {
53398
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerEditTimeRange');
53399
+ this.surface = inject(SchedulerEditSurfaceDirective);
53400
+ /** See {@link SchedulerEditTimeRangeConfig}. */
53401
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerEditTimeRange',
53402
+ transform: (schedulerFeatureConfig) });
53403
+ this.host.registerEditField({
53404
+ component: SchedulerEditTimeRangeComponent,
53405
+ injector: inject(Injector),
53406
+ order: 10,
53407
+ enabled: computed(() => this.config().enabled ?? true),
53408
+ valid: computed(() => this.surface.draft().end >= this.surface.draft().start),
53409
+ });
53410
+ }
53411
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTimeRangeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
53412
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditTimeRangeDirective, isStandalone: true, selector: "[etSchedulerEditTimeRange]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerEditTimeRange", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerEditTimeRange"], ngImport: i0 }); }
53413
+ }
53414
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTimeRangeDirective, decorators: [{
53415
+ type: Directive,
53416
+ args: [{
53417
+ selector: '[etSchedulerEditTimeRange]',
53418
+ exportAs: 'etSchedulerEditTimeRange',
53419
+ }]
53420
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerEditTimeRange", required: false }] }] } });
53421
+
53422
+ /**
53423
+ * The title piece of the edit surface, stamped by `etSchedulerEditTitle`.
53424
+ *
53425
+ * @internal
53426
+ */
53427
+ class SchedulerEditTitleComponent {
53428
+ constructor() {
53429
+ this.labels = injectSchedulerLabels();
53430
+ this.draft = input.required(/* @ts-ignore */
53431
+ ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
53432
+ this.label = computed(() => this.labels().titleField, /* @ts-ignore */
53433
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
53434
+ this.value = computed(() => this.draft()().title, /* @ts-ignore */
53435
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
53436
+ }
53437
+ updateTitle(value) {
53438
+ this.draft().update((appointment) => ({ ...appointment, title: value }));
53439
+ }
53440
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53441
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditTitleComponent, isStandalone: true, selector: "et-scheduler-edit-title", inputs: { draft: { classPropertyName: "draft", publicName: "draft", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
53442
+ <et-form-field>
53443
+ <et-label>{{ label() }}</et-label>
53444
+ <et-input [value]="value()" (valueChange)="updateTitle($event)" />
53445
+ </et-form-field>
53446
+ `, isInline: true, dependencies: [{ kind: "component", type: FormFieldComponent, selector: "et-form-field", inputs: ["appearance", "fill", "labelMode", "size", "busy"] }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "component", type: InputComponent, selector: "et-input" }], encapsulation: i0.ViewEncapsulation.None }); }
53447
+ }
53448
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTitleComponent, decorators: [{
53449
+ type: Component,
53450
+ args: [{
53451
+ selector: 'et-scheduler-edit-title',
53452
+ template: `
53453
+ <et-form-field>
53454
+ <et-label>{{ label() }}</et-label>
53455
+ <et-input [value]="value()" (valueChange)="updateTitle($event)" />
53456
+ </et-form-field>
53457
+ `,
53458
+ encapsulation: ViewEncapsulation.None,
53459
+ imports: [...FORM_FIELD_IMPORTS, ...INPUT_IMPORTS],
53460
+ }]
53461
+ }], propDecorators: { draft: [{ type: i0.Input, args: [{ isSignal: true, alias: "draft", required: true }] }] } });
53462
+
53463
+ /**
53464
+ * Built-in edit-surface field: the appointment's title. One of the default pieces
53465
+ * `<et-scheduler-edit-surface>` bundles - see `registerEditField`. Required - the field is
53466
+ * invalid while the draft's title is blank, which gates the surface's save button.
53467
+ *
53468
+ * @example
53469
+ * <et-scheduler-edit-surface [etSchedulerEditTitle]="{ enabled: false }" … />
53470
+ */
53471
+ class SchedulerEditTitleDirective {
53472
+ constructor() {
53473
+ this.host = injectSchedulerEditSurfaceHost('etSchedulerEditTitle');
53474
+ this.surface = inject(SchedulerEditSurfaceDirective);
53475
+ /** See {@link SchedulerEditTitleConfig}. */
53476
+ this.config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'etSchedulerEditTitle',
53477
+ transform: (schedulerFeatureConfig) });
53478
+ this.host.registerEditField({
53479
+ component: SchedulerEditTitleComponent,
53480
+ injector: inject(Injector),
53481
+ order: 0,
53482
+ enabled: computed(() => this.config().enabled ?? true),
53483
+ valid: computed(() => this.surface.draft().title.trim().length > 0),
53484
+ });
53485
+ }
53486
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
53487
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: SchedulerEditTitleDirective, isStandalone: true, selector: "[etSchedulerEditTitle]", inputs: { config: { classPropertyName: "config", publicName: "etSchedulerEditTitle", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["etSchedulerEditTitle"], ngImport: i0 }); }
53488
+ }
53489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditTitleDirective, decorators: [{
53490
+ type: Directive,
53491
+ args: [{
53492
+ selector: '[etSchedulerEditTitle]',
53493
+ exportAs: 'etSchedulerEditTitle',
53494
+ }]
53495
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerEditTitle", required: false }] }] } });
53496
+
53497
+ /**
53498
+ * The default edit surface: a dialog for one appointment, its fields, its ancestor breadcrumb and
53499
+ * children list, and an action menu - built on the overlay system. Orchestrates the active fields
53500
+ * + actions via `hostDirectives: [SchedulerEditSurfaceDirective]`, bakes the built-in fields and
53501
+ * actions in by default (each forwarding its own config input, same pattern as `<et-scheduler>`'s
53502
+ * badge adornments), and applies `SCHEDULER_EDIT_SURFACE_HOST` so they can register.
53503
+ */
53504
+ class SchedulerEditSurfaceComponent {
53505
+ constructor() {
53506
+ this.labels = injectSchedulerLabels();
53507
+ this.elementRef = inject(ElementRef);
53508
+ this.overlayRef = inject(OVERLAY_REF, { optional: true });
53509
+ /** The headless directive behind this surface - field/action registration, draft state and navigation. */
53510
+ this.surface = inject(SchedulerEditSurfaceDirective);
53511
+ this.cancelLabel = computed(() => this.labels().cancel, /* @ts-ignore */
53512
+ ...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
53513
+ this.saveLabel = computed(() => this.labels().save, /* @ts-ignore */
53514
+ ...(ngDevMode ? [{ debugName: "saveLabel" }] : /* istanbul ignore next */ []));
53515
+ this.moreActionsLabel = computed(() => this.labels().moreActions, /* @ts-ignore */
53516
+ ...(ngDevMode ? [{ debugName: "moreActionsLabel" }] : /* istanbul ignore next */ []));
53517
+ this.ancestorsLabel = computed(() => this.labels().ancestors, /* @ts-ignore */
53518
+ ...(ngDevMode ? [{ debugName: "ancestorsLabel" }] : /* istanbul ignore next */ []));
53519
+ this.subAppointmentsLabel = computed(() => this.labels().subAppointments, /* @ts-ignore */
53520
+ ...(ngDevMode ? [{ debugName: "subAppointmentsLabel" }] : /* istanbul ignore next */ []));
53521
+ this.untitledLabel = computed(() => this.labels().untitledAppointment, /* @ts-ignore */
53522
+ ...(ngDevMode ? [{ debugName: "untitledLabel" }] : /* istanbul ignore next */ []));
53523
+ this.headerLabel = computed(() => this.surface.currentAppointment().title || this.untitledLabel(), /* @ts-ignore */
53524
+ ...(ngDevMode ? [{ debugName: "headerLabel" }] : /* istanbul ignore next */ []));
53525
+ // UI contributed by edit-field/action features - see SCHEDULER_EDIT_SURFACE_HOST. The built-ins
53526
+ // above are features too, registering the same way a consumer's own field/action would.
53527
+ this.editFieldList = signal([], /* @ts-ignore */
53528
+ ...(ngDevMode ? [{ debugName: "editFieldList" }] : /* istanbul ignore next */ []));
53529
+ this.appointmentActionList = signal([], /* @ts-ignore */
53530
+ ...(ngDevMode ? [{ debugName: "appointmentActionList" }] : /* istanbul ignore next */ []));
53531
+ this.editFields = computed(() => this.editFieldList()
53532
+ .filter((field) => field.enabled?.() ?? true)
53533
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), /* @ts-ignore */
53534
+ ...(ngDevMode ? [{ debugName: "editFields" }] : /* istanbul ignore next */ []));
53535
+ this.appointmentActions = computed(() => this.appointmentActionList()
53536
+ .filter((action) => action.enabled?.() ?? true)
53537
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), /* @ts-ignore */
53538
+ ...(ngDevMode ? [{ debugName: "appointmentActions" }] : /* istanbul ignore next */ []));
53539
+ /** Gates the save button - every currently-enabled field must report itself valid. */
53540
+ this.canSave = computed(() => this.editFields().every((field) => field.valid?.() ?? true), /* @ts-ignore */
53541
+ ...(ngDevMode ? [{ debugName: "canSave" }] : /* istanbul ignore next */ []));
53542
+ outputToObservable(this.surface.save)
53543
+ .pipe(takeUntilDestroyed(), tap((appointment) => this.overlayRef?.close({ kind: 'save', appointment })))
53544
+ .subscribe();
53545
+ outputToObservable(this.surface.deleteAppointments)
53546
+ .pipe(takeUntilDestroyed(), tap((ids) => this.overlayRef?.close({ kind: 'delete', ids })))
53547
+ .subscribe();
53548
+ }
53549
+ /** Part of the feature contract - see `SchedulerEditSurfaceHost`. */
53550
+ get element() {
53551
+ return this.elementRef.nativeElement;
53552
+ }
53553
+ /** Part of the feature contract - see `SchedulerEditSurfaceHost`. */
53554
+ get appointment() {
53555
+ return this.surface.currentAppointment;
53556
+ }
53557
+ /** Part of the feature contract - see `SchedulerEditSurfaceHost`. */
53558
+ get appointmentTree() {
53559
+ return this.surface.appointmentTree;
53560
+ }
53561
+ /** Part of the feature contract - see `SchedulerEditSurfaceHost`. */
53562
+ registerEditField(field) {
53563
+ this.editFieldList.update((list) => [...list, field]);
53564
+ }
53565
+ /** Part of the feature contract - see `SchedulerEditSurfaceHost`. */
53566
+ registerAppointmentAction(action) {
53567
+ this.appointmentActionList.update((list) => [...list, action]);
53568
+ }
53569
+ save() {
53570
+ this.surface.commit();
53571
+ }
53572
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditSurfaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53573
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SchedulerEditSurfaceComponent, isStandalone: true, selector: "et-scheduler-edit-surface", host: { classAttribute: "et-scheduler-edit-surface" }, providers: [
53574
+ provideIcons(PLUS_ICON, TRASH_ICON, ELLIPSIS_VERTICAL_ICON),
53575
+ { provide: SCHEDULER_EDIT_SURFACE_HOST, useExisting: SchedulerEditSurfaceComponent },
53576
+ ], hostDirectives: [{ directive: OverlayMainDirective }, { directive: SchedulerEditSurfaceDirective, inputs: ["appointment", "appointment", "appointments", "appointments"] }, { directive: SchedulerEditTitleDirective, inputs: ["etSchedulerEditTitle", "etSchedulerEditTitle"] }, { directive: SchedulerEditTimeRangeDirective, inputs: ["etSchedulerEditTimeRange", "etSchedulerEditTimeRange"] }, { directive: SchedulerEditLocationDirective, inputs: ["etSchedulerEditLocation", "etSchedulerEditLocation"] }, { directive: SchedulerEditDescriptionDirective, inputs: ["etSchedulerEditDescription", "etSchedulerEditDescription"] }, { directive: SchedulerEditColorDirective, inputs: ["etSchedulerEditColor", "etSchedulerEditColor"] }, { directive: SchedulerActionAddSubAppointmentDirective, inputs: ["etSchedulerActionAddSubAppointment", "etSchedulerActionAddSubAppointment"] }, { directive: SchedulerActionDeleteDirective, inputs: ["etSchedulerActionDelete", "etSchedulerActionDelete"] }], ngImport: i0, template: "<div class=\"et-scheduler-edit-surface-header\" etOverlayHeader>\n <h2 class=\"et-scheduler-edit-surface-title\" etOverlayTitle>{{ headerLabel() }}</h2>\n\n @if (appointmentActions().length > 0) {\n <div class=\"et-scheduler-edit-surface-actions\" etMenu>\n <button [attr.aria-label]=\"moreActionsLabel()\" et-icon-button etMenuTrigger size=\"sm\" type=\"button\">\n <i etIcon=\"et-ellipsis-vertical\"></i>\n </button>\n\n <ng-template etMenuSurface>\n <et-menu>\n @for (action of appointmentActions(); track $index) {\n <button\n [variant]=\"action.destructive ? 'destructive' : 'default'\"\n (click)=\"action.run()\"\n et-menu-item\n type=\"button\"\n >\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n </et-menu>\n </ng-template>\n </div>\n }\n</div>\n\n<et-overlay-body>\n @if (surface.ancestors().length > 0) {\n <nav [attr.aria-label]=\"ancestorsLabel()\" class=\"et-scheduler-edit-surface-breadcrumb\">\n @for (ancestor of surface.ancestors(); track ancestor.id) {\n <button\n (click)=\"surface.navigateTo(ancestor.id)\"\n class=\"et-scheduler-edit-surface-breadcrumb-item\"\n type=\"button\"\n >\n {{ ancestor.title || untitledLabel() }}\n </button>\n <span class=\"et-scheduler-edit-surface-breadcrumb-separator\" aria-hidden=\"true\">/</span>\n }\n <span class=\"et-scheduler-edit-surface-breadcrumb-current\" aria-current=\"page\">{{ headerLabel() }}</span>\n </nav>\n }\n\n <div class=\"et-scheduler-edit-surface-fields\">\n @for (field of editFields(); track $index) {\n <ng-container *ngComponentOutlet=\"field.component; inputs: { draft: surface.draft }; injector: field.injector\" />\n }\n </div>\n\n @if (surface.children().length > 0) {\n <div class=\"et-scheduler-edit-surface-children\">\n <h3 class=\"et-scheduler-edit-surface-children-heading\">{{ subAppointmentsLabel() }}</h3>\n\n <ul class=\"et-scheduler-edit-surface-children-list\">\n @for (child of surface.children(); track child.appointment.id) {\n <li>\n <button\n (click)=\"surface.navigateTo(child.appointment.id)\"\n class=\"et-scheduler-edit-surface-children-item\"\n type=\"button\"\n >\n {{ child.appointment.title || untitledLabel() }}\n </button>\n </li>\n }\n </ul>\n </div>\n }\n</et-overlay-body>\n\n<div class=\"et-scheduler-edit-surface-footer\" etOverlayFooter>\n <button et-button etOverlayClose type=\"button\" variant=\"outline\">{{ cancelLabel() }}</button>\n <button [disabled]=\"!canSave()\" (click)=\"save()\" et-button type=\"button\">{{ saveLabel() }}</button>\n</div>\n", styles: ["@layer components{.et-scheduler-edit-surface-header{display:flex;align-items:center;gap:12px}.et-scheduler-edit-surface-title{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-scheduler-edit-surface-actions{flex-shrink:0;margin-inline-start:auto}.et-scheduler-edit-surface-footer{display:flex;justify-content:flex-end;gap:12px}.et-scheduler-edit-surface-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin-block-end:16px;font-size:13px;color:var(--et-surface-color-muted-solid)}.et-scheduler-edit-surface-breadcrumb-item{color:inherit;text-decoration:underline;text-underline-offset:2px}.et-scheduler-edit-surface-breadcrumb-current{color:var(--et-surface-color-solid);font-weight:600}.et-scheduler-edit-surface-fields{display:flex;flex-direction:column;gap:16px}.et-scheduler-edit-time-range{display:flex;gap:12px}.et-scheduler-edit-time-range-field{flex:1;min-inline-size:0}.et-scheduler-edit-surface-children{margin-block-start:20px}.et-scheduler-edit-surface-children-heading{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--et-surface-color-muted-solid)}.et-scheduler-edit-surface-children-list{display:flex;flex-direction:column;gap:4px;margin:0;padding:0;list-style:none}.et-scheduler-edit-surface-children-item{color:var(--et-theme-color-ink-solid, var(--et-surface-color-solid));text-decoration:underline;text-underline-offset:2px}}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "[et-button]", inputs: ["variant", "size", "iconAlignment"] }, { kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: MenuDirective, selector: "[etMenu]", inputs: ["placement", "fallbackPlacements", "offset", "viewportPadding", "arrow", "arrowPadding", "autoFocus", "hoverOpen", "loop", "hoverOpenDelay", "hoverCloseDelay", "disabled", "open"], outputs: ["openChange"], exportAs: ["etMenu"] }, { kind: "directive", type: MenuTriggerDirective, selector: "[etMenuTrigger]", exportAs: ["etMenuTrigger"] }, { kind: "directive", type: MenuSurfaceDirective, selector: "ng-template[etMenuSurface]", exportAs: ["etMenuSurface"] }, { kind: "component", type: MenuComponent, selector: "et-menu" }, { kind: "component", type: MenuItemComponent, selector: "button[et-menu-item], a[et-menu-item]", inputs: ["variant"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: OverlayBodyComponent, selector: "[et-overlay-body], et-overlay-body", inputs: ["dividers"] }, { kind: "directive", type: OverlayCloseDirective, selector: "[et-overlay-close], [etOverlayClose]", inputs: ["aria-label", "type", "etOverlayClose", "et-overlay-close"], exportAs: ["etOverlayClose"] }, { kind: "directive", type: OverlayFooterDirective, selector: "[etOverlayFooter], et-overlay-footer" }, { kind: "directive", type: OverlayHeaderDirective, selector: "[etOverlayHeader], et-overlay-header" }, { kind: "directive", type: OverlayTitleDirective, selector: "[et-overlay-title], [etOverlayTitle]", inputs: ["id"], exportAs: ["etOverlayTitle"] }], encapsulation: i0.ViewEncapsulation.None }); }
53577
+ }
53578
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerEditSurfaceComponent, decorators: [{
53579
+ type: Component,
53580
+ args: [{ selector: 'et-scheduler-edit-surface', encapsulation: ViewEncapsulation.None, imports: [
53581
+ ...BUTTON_IMPORTS,
53582
+ ...MENU_IMPORTS,
53583
+ IconDirective,
53584
+ NgComponentOutlet,
53585
+ OverlayBodyComponent,
53586
+ OverlayCloseDirective,
53587
+ OverlayFooterDirective,
53588
+ OverlayHeaderDirective,
53589
+ OverlayTitleDirective,
53590
+ ], providers: [
53591
+ provideIcons(PLUS_ICON, TRASH_ICON, ELLIPSIS_VERTICAL_ICON),
53592
+ { provide: SCHEDULER_EDIT_SURFACE_HOST, useExisting: SchedulerEditSurfaceComponent },
53593
+ ], hostDirectives: [
53594
+ OverlayMainDirective,
53595
+ { directive: SchedulerEditSurfaceDirective, inputs: ['appointment', 'appointments'] },
53596
+ // The built-in edit fields and appointment actions, bundled by default so
53597
+ // `<et-scheduler-edit-surface>` renders a full surface zero-config - each forwards its own
53598
+ // config input, so e.g. `[etSchedulerEditLocation]="{ enabled: false }"` disables just that
53599
+ // one piece without dropping to headless composition.
53600
+ { directive: SchedulerEditTitleDirective, inputs: ['etSchedulerEditTitle'] },
53601
+ { directive: SchedulerEditTimeRangeDirective, inputs: ['etSchedulerEditTimeRange'] },
53602
+ { directive: SchedulerEditLocationDirective, inputs: ['etSchedulerEditLocation'] },
53603
+ { directive: SchedulerEditDescriptionDirective, inputs: ['etSchedulerEditDescription'] },
53604
+ { directive: SchedulerEditColorDirective, inputs: ['etSchedulerEditColor'] },
53605
+ { directive: SchedulerActionAddSubAppointmentDirective, inputs: ['etSchedulerActionAddSubAppointment'] },
53606
+ { directive: SchedulerActionDeleteDirective, inputs: ['etSchedulerActionDelete'] },
53607
+ ], host: {
53608
+ class: 'et-scheduler-edit-surface',
53609
+ }, template: "<div class=\"et-scheduler-edit-surface-header\" etOverlayHeader>\n <h2 class=\"et-scheduler-edit-surface-title\" etOverlayTitle>{{ headerLabel() }}</h2>\n\n @if (appointmentActions().length > 0) {\n <div class=\"et-scheduler-edit-surface-actions\" etMenu>\n <button [attr.aria-label]=\"moreActionsLabel()\" et-icon-button etMenuTrigger size=\"sm\" type=\"button\">\n <i etIcon=\"et-ellipsis-vertical\"></i>\n </button>\n\n <ng-template etMenuSurface>\n <et-menu>\n @for (action of appointmentActions(); track $index) {\n <button\n [variant]=\"action.destructive ? 'destructive' : 'default'\"\n (click)=\"action.run()\"\n et-menu-item\n type=\"button\"\n >\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n </et-menu>\n </ng-template>\n </div>\n }\n</div>\n\n<et-overlay-body>\n @if (surface.ancestors().length > 0) {\n <nav [attr.aria-label]=\"ancestorsLabel()\" class=\"et-scheduler-edit-surface-breadcrumb\">\n @for (ancestor of surface.ancestors(); track ancestor.id) {\n <button\n (click)=\"surface.navigateTo(ancestor.id)\"\n class=\"et-scheduler-edit-surface-breadcrumb-item\"\n type=\"button\"\n >\n {{ ancestor.title || untitledLabel() }}\n </button>\n <span class=\"et-scheduler-edit-surface-breadcrumb-separator\" aria-hidden=\"true\">/</span>\n }\n <span class=\"et-scheduler-edit-surface-breadcrumb-current\" aria-current=\"page\">{{ headerLabel() }}</span>\n </nav>\n }\n\n <div class=\"et-scheduler-edit-surface-fields\">\n @for (field of editFields(); track $index) {\n <ng-container *ngComponentOutlet=\"field.component; inputs: { draft: surface.draft }; injector: field.injector\" />\n }\n </div>\n\n @if (surface.children().length > 0) {\n <div class=\"et-scheduler-edit-surface-children\">\n <h3 class=\"et-scheduler-edit-surface-children-heading\">{{ subAppointmentsLabel() }}</h3>\n\n <ul class=\"et-scheduler-edit-surface-children-list\">\n @for (child of surface.children(); track child.appointment.id) {\n <li>\n <button\n (click)=\"surface.navigateTo(child.appointment.id)\"\n class=\"et-scheduler-edit-surface-children-item\"\n type=\"button\"\n >\n {{ child.appointment.title || untitledLabel() }}\n </button>\n </li>\n }\n </ul>\n </div>\n }\n</et-overlay-body>\n\n<div class=\"et-scheduler-edit-surface-footer\" etOverlayFooter>\n <button et-button etOverlayClose type=\"button\" variant=\"outline\">{{ cancelLabel() }}</button>\n <button [disabled]=\"!canSave()\" (click)=\"save()\" et-button type=\"button\">{{ saveLabel() }}</button>\n</div>\n", styles: ["@layer components{.et-scheduler-edit-surface-header{display:flex;align-items:center;gap:12px}.et-scheduler-edit-surface-title{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-scheduler-edit-surface-actions{flex-shrink:0;margin-inline-start:auto}.et-scheduler-edit-surface-footer{display:flex;justify-content:flex-end;gap:12px}.et-scheduler-edit-surface-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin-block-end:16px;font-size:13px;color:var(--et-surface-color-muted-solid)}.et-scheduler-edit-surface-breadcrumb-item{color:inherit;text-decoration:underline;text-underline-offset:2px}.et-scheduler-edit-surface-breadcrumb-current{color:var(--et-surface-color-solid);font-weight:600}.et-scheduler-edit-surface-fields{display:flex;flex-direction:column;gap:16px}.et-scheduler-edit-time-range{display:flex;gap:12px}.et-scheduler-edit-time-range-field{flex:1;min-inline-size:0}.et-scheduler-edit-surface-children{margin-block-start:20px}.et-scheduler-edit-surface-children-heading{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--et-surface-color-muted-solid)}.et-scheduler-edit-surface-children-list{display:flex;flex-direction:column;gap:4px;margin:0;padding:0;list-style:none}.et-scheduler-edit-surface-children-item{color:var(--et-theme-color-ink-solid, var(--et-surface-color-solid));text-decoration:underline;text-underline-offset:2px}}\n"] }]
53610
+ }], ctorParameters: () => [] });
53611
+ /** Opens `<et-scheduler-edit-surface>` as a dialog - what `<et-scheduler>` uses to auto-open on selection. */
53612
+ const SCHEDULER_EDIT_SURFACE_OVERLAY = /* @__PURE__ */ defineOverlay({
53613
+ component: SchedulerEditSurfaceComponent,
53614
+ strategies: /* @__PURE__ */ dialogOverlayStrategy({ maxWidth: '520px' }),
53615
+ panelClass: 'et-scheduler-edit-surface-panel',
53616
+ });
53617
+
52657
53618
  /** The default month grid: one day cell per day, appointments as one-line badges with a "+N more" overflow. */
52658
53619
  class SchedulerMonthViewComponent {
52659
53620
  constructor() {
@@ -52697,6 +53658,10 @@ class SchedulerTimeGridViewComponent {
52697
53658
  this.scheduler = inject(SchedulerDirective, { optional: true });
52698
53659
  this.grid = inject(SchedulerTimeGridDirective);
52699
53660
  this.featureHost = inject(SCHEDULER_FEATURE_HOST, { optional: true });
53661
+ this.timeGridBody = viewChild('timeGridBody', /* @ts-ignore */
53662
+ ...(ngDevMode ? [{ debugName: "timeGridBody" }] : /* istanbul ignore next */ []));
53663
+ this.firstHourRow = viewChild('hourRow', /* @ts-ignore */
53664
+ ...(ngDevMode ? [{ debugName: "firstHourRow" }] : /* istanbul ignore next */ []));
52700
53665
  this.hours = computed(() => {
52701
53666
  const locale = this.scheduler?.effectiveLocale();
52702
53667
  const reference = startOfDay(new Date());
@@ -52707,6 +53672,16 @@ class SchedulerTimeGridViewComponent {
52707
53672
  }, /* @ts-ignore */
52708
53673
  ...(ngDevMode ? [{ debugName: "hours" }] : /* istanbul ignore next */ []));
52709
53674
  injectStyleManager().mount(SchedulerAppointmentStylesComponent);
53675
+ // Once per mount, not reactively - re-scrolling on every `focusedDate` change would yank a
53676
+ // user's own scroll position back every time they step to the next day/week.
53677
+ afterNextRender(() => {
53678
+ const body = this.timeGridBody()?.nativeElement;
53679
+ const hourRow = this.firstHourRow()?.nativeElement;
53680
+ if (!body || !hourRow) {
53681
+ return;
53682
+ }
53683
+ body.scrollTop = this.grid.initialScrollHour() * hourRow.offsetHeight;
53684
+ });
52710
53685
  }
52711
53686
  /** UI contributed by badge features (title, time range, …) - see `registerBadgeAdornment`. */
52712
53687
  badgeAdornments() {
@@ -52723,14 +53698,14 @@ class SchedulerTimeGridViewComponent {
52723
53698
  this.scheduler?.selectedAppointmentId.set(appointment.id);
52724
53699
  }
52725
53700
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerTimeGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52726
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SchedulerTimeGridViewComponent, isStandalone: true, selector: "et-scheduler-time-grid-view", host: { classAttribute: "et-scheduler-time-grid-view" }, hostDirectives: [{ directive: SchedulerTimeGridDirective }], ngImport: i0, template: "<div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-header\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-header-day\" role=\"columnheader\">\n <span class=\"et-scheduler-time-grid-header-weekday\">{{ weekdayLabel(day.date) }}</span>\n <span class=\"et-scheduler-time-grid-header-date\">{{ day.date.getDate() }}</span>\n </div>\n }\n </div>\n</div>\n\n@if (grid.allDayRowCount() > 0) {\n <div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-all-day\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div\n [style.--_et-scheduler-time-grid-all-day-row-count]=\"grid.allDayRowCount()\"\n class=\"et-scheduler-time-grid-all-day-lane\"\n role=\"gridcell\"\n >\n @for (entry of grid.allDay(); track entry.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-all-day-offset]=\"entry.inlineOffset\"\n [style.--_et-scheduler-time-grid-all-day-size]=\"entry.inlineSize\"\n [style.--_et-scheduler-time-grid-all-day-row]=\"entry.row\"\n [attr.data-selected]=\"isSelected(entry.node.appointment) ? '' : null\"\n [attr.title]=\"entry.node.appointment.title\"\n [etProvideColor]=\"entry.node.appointment.colorToken ?? null\"\n (click)=\"select(entry.node.appointment)\"\n class=\"et-scheduler-appointment et-scheduler-time-grid-all-day-entry\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: entry.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n </div>\n}\n\n<div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-body\">\n <div class=\"et-scheduler-time-grid-gutter\" role=\"presentation\">\n @for (hour of hours(); track hour.hour) {\n <div class=\"et-scheduler-time-grid-hour-row\">\n <span class=\"et-scheduler-time-grid-hour-label\">{{ hour.label }}</span>\n </div>\n }\n </div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-day\" role=\"gridcell\">\n @for (hour of hours(); track hour.hour) {\n <div class=\"et-scheduler-time-grid-hour-row\" role=\"presentation\"></div>\n }\n\n @for (block of day.blocks; track block.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-block-offset]=\"block.offset\"\n [style.--_et-scheduler-time-grid-block-span]=\"block.span\"\n [style.--_et-scheduler-time-grid-block-inline-offset]=\"block.inlineOffset\"\n [style.--_et-scheduler-time-grid-block-inline-size]=\"block.inlineSize\"\n [style.--_et-scheduler-time-grid-block-depth]=\"block.node.depth\"\n [attr.data-selected]=\"isSelected(block.node.appointment) ? '' : null\"\n [attr.data-nested]=\"block.node.depth > 0 ? '' : null\"\n [attr.title]=\"block.node.appointment.title\"\n [etProvideColor]=\"block.node.appointment.colorToken ?? null\"\n (click)=\"select(block.node.appointment)\"\n class=\"et-scheduler-time-grid-block\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: block.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n }\n </div>\n</div>\n", styles: ["@layer components{@property --et-scheduler-time-grid-hour-size{syntax: \"<length>\"; inherits: true; initial-value: 48px;}@property --et-scheduler-time-grid-gutter-size{syntax: \"<length>\"; inherits: true; initial-value: 56px;}@property --et-scheduler-time-grid-all-day-row-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}.et-scheduler-time-grid-view{display:flex;flex-direction:column}.et-scheduler-time-grid-row{display:flex}.et-scheduler-time-grid-gutter{flex-shrink:0;inline-size:var(--et-scheduler-time-grid-gutter-size)}.et-scheduler-time-grid-days{display:grid;flex:1;grid-auto-flow:column;grid-auto-columns:1fr}.et-scheduler-time-grid-header{padding-block-end:6px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-header-day{display:flex;flex-direction:column;align-items:center;gap:2px;padding-block:4px}.et-scheduler-time-grid-header-day:where([data-today]) .et-scheduler-time-grid-header-date{background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}.et-scheduler-time-grid-header-weekday{font-size:12px;font-weight:600;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-header-date{display:inline-flex;align-items:center;justify-content:center;inline-size:22px;block-size:22px;border-radius:999px;font-size:13px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-solid)}.et-scheduler-time-grid-all-day{padding-block:4px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-all-day-lane{position:relative;flex:1;min-block-size:calc(var(--_et-scheduler-time-grid-all-day-row-count, 0) * var(--et-scheduler-time-grid-all-day-row-size))}.et-scheduler-time-grid-all-day-entry{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-all-day-row, 0) * var(--et-scheduler-time-grid-all-day-row-size));inset-inline-start:calc(var(--_et-scheduler-time-grid-all-day-offset, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-all-day-size, 100) * 1% - 4px);block-size:calc(var(--et-scheduler-time-grid-all-day-row-size) - 2px)}.et-scheduler-time-grid-hour-row{box-sizing:border-box;block-size:var(--et-scheduler-time-grid-hour-size);border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-gutter .et-scheduler-time-grid-hour-row{display:flex;align-items:flex-start;justify-content:flex-end;padding-inline-end:8px;border-block-end:none}.et-scheduler-time-grid-hour-label{inline-size:max-content;transform:translateY(-50%);font-size:11px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-days{border-inline-start:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day{position:relative;border-inline-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day:where([data-today]){background:color-mix(in srgb,var(--et-theme-color-primary-solid) 6%,transparent)}.et-scheduler-time-grid-block{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-block-offset, 0) * 1%);inset-inline-start:calc(var(--_et-scheduler-time-grid-block-inline-offset, 0) * 1%);block-size:calc(var(--_et-scheduler-time-grid-block-span, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-block-inline-size, 100) * 1% - 2px);min-block-size:16px;display:flex;align-items:flex-start;gap:6px;overflow:hidden;padding:2px 6px;padding-inline-start:calc(min(var(--_et-scheduler-time-grid-block-depth, 0),4)*6px + 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}.et-scheduler-time-grid-block .et-scheduler-appointment-dot{margin-block-start:4px}@media(hover:hover){.et-scheduler-time-grid-block:hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid) 22%,transparent)}}.et-scheduler-time-grid-block:focus-visible{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:1px}.et-scheduler-time-grid-block:where([data-selected]){background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}}\n"], dependencies: [{ kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], encapsulation: i0.ViewEncapsulation.None }); }
53701
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SchedulerTimeGridViewComponent, isStandalone: true, selector: "et-scheduler-time-grid-view", host: { classAttribute: "et-scheduler-time-grid-view" }, viewQueries: [{ propertyName: "timeGridBody", first: true, predicate: ["timeGridBody"], descendants: true, isSignal: true }, { propertyName: "firstHourRow", first: true, predicate: ["hourRow"], descendants: true, isSignal: true }], hostDirectives: [{ directive: SchedulerTimeGridDirective }], ngImport: i0, template: "<div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-header\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-header-day\" role=\"columnheader\">\n <span class=\"et-scheduler-time-grid-header-weekday\">{{ weekdayLabel(day.date) }}</span>\n <span class=\"et-scheduler-time-grid-header-date\">{{ day.date.getDate() }}</span>\n </div>\n }\n </div>\n</div>\n\n@if (grid.allDayRowCount() > 0) {\n <div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-all-day\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div\n [style.--_et-scheduler-time-grid-all-day-row-count]=\"grid.allDayRowCount()\"\n class=\"et-scheduler-time-grid-all-day-lane\"\n role=\"gridcell\"\n >\n @for (entry of grid.allDay(); track entry.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-all-day-offset]=\"entry.inlineOffset\"\n [style.--_et-scheduler-time-grid-all-day-size]=\"entry.inlineSize\"\n [style.--_et-scheduler-time-grid-all-day-row]=\"entry.row\"\n [attr.data-selected]=\"isSelected(entry.node.appointment) ? '' : null\"\n [attr.title]=\"entry.node.appointment.title\"\n [etProvideColor]=\"entry.node.appointment.colorToken ?? null\"\n (click)=\"select(entry.node.appointment)\"\n class=\"et-scheduler-appointment et-scheduler-time-grid-all-day-entry\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: entry.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n </div>\n}\n\n<div #timeGridBody class=\"et-scheduler-time-grid-row et-scheduler-time-grid-body\">\n <div class=\"et-scheduler-time-grid-gutter\" role=\"presentation\">\n @for (hour of hours(); track hour.hour) {\n <div #hourRow class=\"et-scheduler-time-grid-hour-row\">\n <span class=\"et-scheduler-time-grid-hour-label\">{{ hour.label }}</span>\n </div>\n }\n </div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-day\" role=\"gridcell\">\n @for (hour of hours(); track hour.hour) {\n <div class=\"et-scheduler-time-grid-hour-row\" role=\"presentation\"></div>\n }\n\n @for (block of day.blocks; track block.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-block-offset]=\"block.offset\"\n [style.--_et-scheduler-time-grid-block-span]=\"block.span\"\n [style.--_et-scheduler-time-grid-block-inline-offset]=\"block.inlineOffset\"\n [style.--_et-scheduler-time-grid-block-inline-size]=\"block.inlineSize\"\n [style.--_et-scheduler-time-grid-block-depth]=\"block.node.depth\"\n [attr.data-selected]=\"isSelected(block.node.appointment) ? '' : null\"\n [attr.data-nested]=\"block.node.depth > 0 ? '' : null\"\n [attr.title]=\"block.node.appointment.title\"\n [etProvideColor]=\"block.node.appointment.colorToken ?? null\"\n (click)=\"select(block.node.appointment)\"\n class=\"et-scheduler-time-grid-block\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: block.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n }\n </div>\n</div>\n", styles: ["@layer components{@property --et-scheduler-time-grid-hour-size{syntax: \"<length>\"; inherits: true; initial-value: 48px;}@property --et-scheduler-time-grid-gutter-size{syntax: \"<length>\"; inherits: true; initial-value: 56px;}@property --et-scheduler-time-grid-all-day-row-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}@property --et-scheduler-time-grid-body-max-height{syntax: \"<length>\"; inherits: true; initial-value: 600px;}.et-scheduler-time-grid-view{display:flex;flex-direction:column}.et-scheduler-time-grid-row{display:flex}.et-scheduler-time-grid-body{overflow-y:auto;max-block-size:var(--et-scheduler-time-grid-body-max-height)}.et-scheduler-time-grid-gutter{flex-shrink:0;inline-size:var(--et-scheduler-time-grid-gutter-size)}.et-scheduler-time-grid-days{display:grid;flex:1;grid-auto-flow:column;grid-auto-columns:1fr}.et-scheduler-time-grid-header{padding-block-end:6px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-header-day{display:flex;flex-direction:column;align-items:center;gap:2px;padding-block:4px}.et-scheduler-time-grid-header-day:where([data-today]) .et-scheduler-time-grid-header-date{background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}.et-scheduler-time-grid-header-weekday{font-size:12px;font-weight:600;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-header-date{display:inline-flex;align-items:center;justify-content:center;inline-size:22px;block-size:22px;border-radius:999px;font-size:13px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-solid)}.et-scheduler-time-grid-all-day{padding-block:4px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-all-day-lane{position:relative;flex:1;min-block-size:calc(var(--_et-scheduler-time-grid-all-day-row-count, 0) * var(--et-scheduler-time-grid-all-day-row-size))}.et-scheduler-time-grid-all-day-entry{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-all-day-row, 0) * var(--et-scheduler-time-grid-all-day-row-size));inset-inline-start:calc(var(--_et-scheduler-time-grid-all-day-offset, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-all-day-size, 100) * 1% - 4px);block-size:calc(var(--et-scheduler-time-grid-all-day-row-size) - 2px)}.et-scheduler-time-grid-hour-row{box-sizing:border-box;block-size:var(--et-scheduler-time-grid-hour-size);border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-gutter .et-scheduler-time-grid-hour-row{display:flex;align-items:flex-start;justify-content:flex-end;padding-inline-end:8px;border-block-end:none}.et-scheduler-time-grid-hour-label{inline-size:max-content;transform:translateY(-50%);font-size:11px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-days{border-inline-start:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day{position:relative;border-inline-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day:where([data-today]){background:color-mix(in srgb,var(--et-theme-color-primary-solid) 6%,transparent)}.et-scheduler-time-grid-block{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-block-offset, 0) * 1%);inset-inline-start:calc(var(--_et-scheduler-time-grid-block-inline-offset, 0) * 1%);block-size:calc(var(--_et-scheduler-time-grid-block-span, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-block-inline-size, 100) * 1% - 2px);min-block-size:16px;display:flex;align-items:flex-start;gap:6px;overflow:hidden;padding:2px 6px;padding-inline-start:calc(min(var(--_et-scheduler-time-grid-block-depth, 0),4)*6px + 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}.et-scheduler-time-grid-block .et-scheduler-appointment-dot{margin-block-start:4px}@media(hover:hover){.et-scheduler-time-grid-block:hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid) 22%,transparent)}}.et-scheduler-time-grid-block:focus-visible{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:1px}.et-scheduler-time-grid-block:where([data-selected]){background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}}\n"], dependencies: [{ kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], encapsulation: i0.ViewEncapsulation.None }); }
52727
53702
  }
52728
53703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerTimeGridViewComponent, decorators: [{
52729
53704
  type: Component,
52730
53705
  args: [{ selector: 'et-scheduler-time-grid-view', encapsulation: ViewEncapsulation.None, imports: [ProvideColorDirective, NgComponentOutlet], hostDirectives: [SchedulerTimeGridDirective], host: {
52731
53706
  class: 'et-scheduler-time-grid-view',
52732
- }, template: "<div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-header\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-header-day\" role=\"columnheader\">\n <span class=\"et-scheduler-time-grid-header-weekday\">{{ weekdayLabel(day.date) }}</span>\n <span class=\"et-scheduler-time-grid-header-date\">{{ day.date.getDate() }}</span>\n </div>\n }\n </div>\n</div>\n\n@if (grid.allDayRowCount() > 0) {\n <div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-all-day\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div\n [style.--_et-scheduler-time-grid-all-day-row-count]=\"grid.allDayRowCount()\"\n class=\"et-scheduler-time-grid-all-day-lane\"\n role=\"gridcell\"\n >\n @for (entry of grid.allDay(); track entry.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-all-day-offset]=\"entry.inlineOffset\"\n [style.--_et-scheduler-time-grid-all-day-size]=\"entry.inlineSize\"\n [style.--_et-scheduler-time-grid-all-day-row]=\"entry.row\"\n [attr.data-selected]=\"isSelected(entry.node.appointment) ? '' : null\"\n [attr.title]=\"entry.node.appointment.title\"\n [etProvideColor]=\"entry.node.appointment.colorToken ?? null\"\n (click)=\"select(entry.node.appointment)\"\n class=\"et-scheduler-appointment et-scheduler-time-grid-all-day-entry\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: entry.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n </div>\n}\n\n<div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-body\">\n <div class=\"et-scheduler-time-grid-gutter\" role=\"presentation\">\n @for (hour of hours(); track hour.hour) {\n <div class=\"et-scheduler-time-grid-hour-row\">\n <span class=\"et-scheduler-time-grid-hour-label\">{{ hour.label }}</span>\n </div>\n }\n </div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-day\" role=\"gridcell\">\n @for (hour of hours(); track hour.hour) {\n <div class=\"et-scheduler-time-grid-hour-row\" role=\"presentation\"></div>\n }\n\n @for (block of day.blocks; track block.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-block-offset]=\"block.offset\"\n [style.--_et-scheduler-time-grid-block-span]=\"block.span\"\n [style.--_et-scheduler-time-grid-block-inline-offset]=\"block.inlineOffset\"\n [style.--_et-scheduler-time-grid-block-inline-size]=\"block.inlineSize\"\n [style.--_et-scheduler-time-grid-block-depth]=\"block.node.depth\"\n [attr.data-selected]=\"isSelected(block.node.appointment) ? '' : null\"\n [attr.data-nested]=\"block.node.depth > 0 ? '' : null\"\n [attr.title]=\"block.node.appointment.title\"\n [etProvideColor]=\"block.node.appointment.colorToken ?? null\"\n (click)=\"select(block.node.appointment)\"\n class=\"et-scheduler-time-grid-block\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: block.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n }\n </div>\n</div>\n", styles: ["@layer components{@property --et-scheduler-time-grid-hour-size{syntax: \"<length>\"; inherits: true; initial-value: 48px;}@property --et-scheduler-time-grid-gutter-size{syntax: \"<length>\"; inherits: true; initial-value: 56px;}@property --et-scheduler-time-grid-all-day-row-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}.et-scheduler-time-grid-view{display:flex;flex-direction:column}.et-scheduler-time-grid-row{display:flex}.et-scheduler-time-grid-gutter{flex-shrink:0;inline-size:var(--et-scheduler-time-grid-gutter-size)}.et-scheduler-time-grid-days{display:grid;flex:1;grid-auto-flow:column;grid-auto-columns:1fr}.et-scheduler-time-grid-header{padding-block-end:6px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-header-day{display:flex;flex-direction:column;align-items:center;gap:2px;padding-block:4px}.et-scheduler-time-grid-header-day:where([data-today]) .et-scheduler-time-grid-header-date{background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}.et-scheduler-time-grid-header-weekday{font-size:12px;font-weight:600;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-header-date{display:inline-flex;align-items:center;justify-content:center;inline-size:22px;block-size:22px;border-radius:999px;font-size:13px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-solid)}.et-scheduler-time-grid-all-day{padding-block:4px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-all-day-lane{position:relative;flex:1;min-block-size:calc(var(--_et-scheduler-time-grid-all-day-row-count, 0) * var(--et-scheduler-time-grid-all-day-row-size))}.et-scheduler-time-grid-all-day-entry{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-all-day-row, 0) * var(--et-scheduler-time-grid-all-day-row-size));inset-inline-start:calc(var(--_et-scheduler-time-grid-all-day-offset, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-all-day-size, 100) * 1% - 4px);block-size:calc(var(--et-scheduler-time-grid-all-day-row-size) - 2px)}.et-scheduler-time-grid-hour-row{box-sizing:border-box;block-size:var(--et-scheduler-time-grid-hour-size);border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-gutter .et-scheduler-time-grid-hour-row{display:flex;align-items:flex-start;justify-content:flex-end;padding-inline-end:8px;border-block-end:none}.et-scheduler-time-grid-hour-label{inline-size:max-content;transform:translateY(-50%);font-size:11px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-days{border-inline-start:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day{position:relative;border-inline-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day:where([data-today]){background:color-mix(in srgb,var(--et-theme-color-primary-solid) 6%,transparent)}.et-scheduler-time-grid-block{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-block-offset, 0) * 1%);inset-inline-start:calc(var(--_et-scheduler-time-grid-block-inline-offset, 0) * 1%);block-size:calc(var(--_et-scheduler-time-grid-block-span, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-block-inline-size, 100) * 1% - 2px);min-block-size:16px;display:flex;align-items:flex-start;gap:6px;overflow:hidden;padding:2px 6px;padding-inline-start:calc(min(var(--_et-scheduler-time-grid-block-depth, 0),4)*6px + 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}.et-scheduler-time-grid-block .et-scheduler-appointment-dot{margin-block-start:4px}@media(hover:hover){.et-scheduler-time-grid-block:hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid) 22%,transparent)}}.et-scheduler-time-grid-block:focus-visible{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:1px}.et-scheduler-time-grid-block:where([data-selected]){background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}}\n"] }]
52733
- }], ctorParameters: () => [] });
53707
+ }, template: "<div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-header\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-header-day\" role=\"columnheader\">\n <span class=\"et-scheduler-time-grid-header-weekday\">{{ weekdayLabel(day.date) }}</span>\n <span class=\"et-scheduler-time-grid-header-date\">{{ day.date.getDate() }}</span>\n </div>\n }\n </div>\n</div>\n\n@if (grid.allDayRowCount() > 0) {\n <div class=\"et-scheduler-time-grid-row et-scheduler-time-grid-all-day\" role=\"row\">\n <div class=\"et-scheduler-time-grid-gutter\"></div>\n\n <div\n [style.--_et-scheduler-time-grid-all-day-row-count]=\"grid.allDayRowCount()\"\n class=\"et-scheduler-time-grid-all-day-lane\"\n role=\"gridcell\"\n >\n @for (entry of grid.allDay(); track entry.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-all-day-offset]=\"entry.inlineOffset\"\n [style.--_et-scheduler-time-grid-all-day-size]=\"entry.inlineSize\"\n [style.--_et-scheduler-time-grid-all-day-row]=\"entry.row\"\n [attr.data-selected]=\"isSelected(entry.node.appointment) ? '' : null\"\n [attr.title]=\"entry.node.appointment.title\"\n [etProvideColor]=\"entry.node.appointment.colorToken ?? null\"\n (click)=\"select(entry.node.appointment)\"\n class=\"et-scheduler-appointment et-scheduler-time-grid-all-day-entry\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: entry.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n </div>\n}\n\n<div #timeGridBody class=\"et-scheduler-time-grid-row et-scheduler-time-grid-body\">\n <div class=\"et-scheduler-time-grid-gutter\" role=\"presentation\">\n @for (hour of hours(); track hour.hour) {\n <div #hourRow class=\"et-scheduler-time-grid-hour-row\">\n <span class=\"et-scheduler-time-grid-hour-label\">{{ hour.label }}</span>\n </div>\n }\n </div>\n\n <div class=\"et-scheduler-time-grid-days\">\n @for (day of grid.days(); track day.date.getTime()) {\n <div [attr.data-today]=\"day.today ? '' : null\" class=\"et-scheduler-time-grid-day\" role=\"gridcell\">\n @for (hour of hours(); track hour.hour) {\n <div class=\"et-scheduler-time-grid-hour-row\" role=\"presentation\"></div>\n }\n\n @for (block of day.blocks; track block.node.appointment.id) {\n <button\n [style.--_et-scheduler-time-grid-block-offset]=\"block.offset\"\n [style.--_et-scheduler-time-grid-block-span]=\"block.span\"\n [style.--_et-scheduler-time-grid-block-inline-offset]=\"block.inlineOffset\"\n [style.--_et-scheduler-time-grid-block-inline-size]=\"block.inlineSize\"\n [style.--_et-scheduler-time-grid-block-depth]=\"block.node.depth\"\n [attr.data-selected]=\"isSelected(block.node.appointment) ? '' : null\"\n [attr.data-nested]=\"block.node.depth > 0 ? '' : null\"\n [attr.title]=\"block.node.appointment.title\"\n [etProvideColor]=\"block.node.appointment.colorToken ?? null\"\n (click)=\"select(block.node.appointment)\"\n class=\"et-scheduler-time-grid-block\"\n type=\"button\"\n >\n @for (adornment of badgeAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { node: block.node }; injector: adornment.injector\"\n />\n }\n </button>\n }\n </div>\n }\n </div>\n</div>\n", styles: ["@layer components{@property --et-scheduler-time-grid-hour-size{syntax: \"<length>\"; inherits: true; initial-value: 48px;}@property --et-scheduler-time-grid-gutter-size{syntax: \"<length>\"; inherits: true; initial-value: 56px;}@property --et-scheduler-time-grid-all-day-row-size{syntax: \"<length>\"; inherits: true; initial-value: 24px;}@property --et-scheduler-time-grid-body-max-height{syntax: \"<length>\"; inherits: true; initial-value: 600px;}.et-scheduler-time-grid-view{display:flex;flex-direction:column}.et-scheduler-time-grid-row{display:flex}.et-scheduler-time-grid-body{overflow-y:auto;max-block-size:var(--et-scheduler-time-grid-body-max-height)}.et-scheduler-time-grid-gutter{flex-shrink:0;inline-size:var(--et-scheduler-time-grid-gutter-size)}.et-scheduler-time-grid-days{display:grid;flex:1;grid-auto-flow:column;grid-auto-columns:1fr}.et-scheduler-time-grid-header{padding-block-end:6px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-header-day{display:flex;flex-direction:column;align-items:center;gap:2px;padding-block:4px}.et-scheduler-time-grid-header-day:where([data-today]) .et-scheduler-time-grid-header-date{background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}.et-scheduler-time-grid-header-weekday{font-size:12px;font-weight:600;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-header-date{display:inline-flex;align-items:center;justify-content:center;inline-size:22px;block-size:22px;border-radius:999px;font-size:13px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-solid)}.et-scheduler-time-grid-all-day{padding-block:4px;border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-all-day-lane{position:relative;flex:1;min-block-size:calc(var(--_et-scheduler-time-grid-all-day-row-count, 0) * var(--et-scheduler-time-grid-all-day-row-size))}.et-scheduler-time-grid-all-day-entry{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-all-day-row, 0) * var(--et-scheduler-time-grid-all-day-row-size));inset-inline-start:calc(var(--_et-scheduler-time-grid-all-day-offset, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-all-day-size, 100) * 1% - 4px);block-size:calc(var(--et-scheduler-time-grid-all-day-row-size) - 2px)}.et-scheduler-time-grid-hour-row{box-sizing:border-box;block-size:var(--et-scheduler-time-grid-hour-size);border-block-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-gutter .et-scheduler-time-grid-hour-row{display:flex;align-items:flex-start;justify-content:flex-end;padding-inline-end:8px;border-block-end:none}.et-scheduler-time-grid-hour-label{inline-size:max-content;transform:translateY(-50%);font-size:11px;font-variant-numeric:tabular-nums;color:var(--et-surface-color-muted-solid)}.et-scheduler-time-grid-body .et-scheduler-time-grid-days{border-inline-start:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day{position:relative;border-inline-end:1px solid var(--et-surface-border-solid)}.et-scheduler-time-grid-day:where([data-today]){background:color-mix(in srgb,var(--et-theme-color-primary-solid) 6%,transparent)}.et-scheduler-time-grid-block{position:absolute;inset-block-start:calc(var(--_et-scheduler-time-grid-block-offset, 0) * 1%);inset-inline-start:calc(var(--_et-scheduler-time-grid-block-inline-offset, 0) * 1%);block-size:calc(var(--_et-scheduler-time-grid-block-span, 0) * 1%);inline-size:calc(var(--_et-scheduler-time-grid-block-inline-size, 100) * 1% - 2px);min-block-size:16px;display:flex;align-items:flex-start;gap:6px;overflow:hidden;padding:2px 6px;padding-inline-start:calc(min(var(--_et-scheduler-time-grid-block-depth, 0),4)*6px + 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}.et-scheduler-time-grid-block .et-scheduler-appointment-dot{margin-block-start:4px}@media(hover:hover){.et-scheduler-time-grid-block:hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid) 22%,transparent)}}.et-scheduler-time-grid-block:focus-visible{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:1px}.et-scheduler-time-grid-block:where([data-selected]){background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}}\n"] }]
53708
+ }], ctorParameters: () => [], propDecorators: { timeGridBody: [{ type: i0.ViewChild, args: ['timeGridBody', { isSignal: true }] }], firstHourRow: [{ type: i0.ViewChild, args: ['hourRow', { isSignal: true }] }] } });
52734
53709
 
52735
53710
  class SchedulerComponent {
52736
53711
  constructor() {
@@ -52741,6 +53716,10 @@ class SchedulerComponent {
52741
53716
  */
52742
53717
  this.headless = inject(SchedulerDirective);
52743
53718
  this.elementRef = inject(ElementRef);
53719
+ /** Emits the edited or newly-added appointment once the default edit surface saves. */
53720
+ this.appointmentSave = output();
53721
+ /** Emits every id to remove once the default edit surface deletes a chain. */
53722
+ this.appointmentsDelete = output();
52744
53723
  this.previousLabel = computed(() => this.labels().previous, /* @ts-ignore */
52745
53724
  ...(ngDevMode ? [{ debugName: "previousLabel" }] : /* istanbul ignore next */ []));
52746
53725
  this.nextLabel = computed(() => this.labels().next, /* @ts-ignore */
@@ -52786,11 +53765,56 @@ class SchedulerComponent {
52786
53765
  .filter((adornment) => adornment.enabled?.() ?? true)
52787
53766
  .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), /* @ts-ignore */
52788
53767
  ...(ngDevMode ? [{ debugName: "badgeAdornments" }] : /* istanbul ignore next */ []));
53768
+ // UI contributed by toolbar features (just "Add appointment" today) - rendered in the header
53769
+ // alongside the built-in nav controls. Same registration story as the badge adornments above.
53770
+ this.toolbarActionList = signal([], /* @ts-ignore */
53771
+ ...(ngDevMode ? [{ debugName: "toolbarActionList" }] : /* istanbul ignore next */ []));
53772
+ this.toolbarActions = computed(() => this.toolbarActionList()
53773
+ .filter((action) => action.enabled?.() ?? true)
53774
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), /* @ts-ignore */
53775
+ ...(ngDevMode ? [{ debugName: "toolbarActions" }] : /* istanbul ignore next */ []));
53776
+ /**
53777
+ * Opens `<et-scheduler-edit-surface>` for the selected appointment - covers the zero-config
53778
+ * case (no feature directives applied) per the plan. Its result bubbles as `appointmentSave` /
53779
+ * `appointmentsDelete`, and closing always clears `selectedAppointmentId` back to `null` so
53780
+ * clicking the same appointment again reopens a fresh surface.
53781
+ */
53782
+ this.editSurfaceOpener = createOverlayOpener(SCHEDULER_EDIT_SURFACE_OVERLAY, {
53783
+ afterClosed: (result) => {
53784
+ if (result?.kind === 'save') {
53785
+ this.appointmentSave.emit(result.appointment);
53786
+ }
53787
+ else if (result?.kind === 'delete') {
53788
+ this.appointmentsDelete.emit(result.ids);
53789
+ }
53790
+ this.headless.selectedAppointmentId.set(null);
53791
+ },
53792
+ });
53793
+ effect(() => {
53794
+ const appointment = this.headless.selectedAppointment();
53795
+ if (!appointment) {
53796
+ return;
53797
+ }
53798
+ untracked(() => this.openEditSurface(appointment));
53799
+ });
52789
53800
  }
52790
53801
  /** Bound to the view-switch's `(valueChange)` - safe to cast since every `<et-segmented-button>` below carries a `SchedulerView` literal. */
52791
53802
  setView(value) {
52792
53803
  this.headless.view.set(value);
52793
53804
  }
53805
+ /**
53806
+ * Synthesizes a brand-new, blank top-level appointment - anchored to `focusedDate` so it lands
53807
+ * in whatever period is currently in view, defaulting to the next hour if that's today, else a
53808
+ * business-hours 9am - and opens the edit surface for it. Run by the built-in
53809
+ * `etSchedulerActionAddAppointment` toolbar action; call directly to trigger the same flow from
53810
+ * your own UI (`<et-scheduler #s>` then `s.addAppointment()`).
53811
+ */
53812
+ addAppointment() {
53813
+ const day = startOfDay(this.headless.focusedDate());
53814
+ const hour = isSameDay(day, new Date()) ? Math.min(23, new Date().getHours() + 1) : 9;
53815
+ const start = setMinutes(setHours(day, hour), 0);
53816
+ this.openEditSurface({ id: randomId(), parentId: null, title: '', start, end: addHours(start, 1) });
53817
+ }
52794
53818
  /** The scheduler's own element. Part of the feature contract (a feature is a directive on it). */
52795
53819
  get element() {
52796
53820
  return this.elementRef.nativeElement;
@@ -52810,8 +53834,23 @@ class SchedulerComponent {
52810
53834
  registerBadgeAdornment(adornment) {
52811
53835
  this.badgeAdornmentList.update((list) => [...list, adornment]);
52812
53836
  }
53837
+ /** Part of the feature contract - see `SchedulerFeatureHost`. */
53838
+ registerToolbarAction(action) {
53839
+ this.toolbarActionList.update((list) => [...list, action]);
53840
+ }
53841
+ openEditSurface(appointment) {
53842
+ this.editSurfaceOpener.open({
53843
+ bindings: [
53844
+ inputBinding('appointment', () => appointment),
53845
+ inputBinding('appointments', () => this.headless.appointments()),
53846
+ ],
53847
+ });
53848
+ }
52813
53849
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52814
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SchedulerComponent, isStandalone: true, selector: "et-scheduler", host: { classAttribute: "et-scheduler" }, providers: [provideIcons(CHEVRON_ICON), { provide: SCHEDULER_FEATURE_HOST, useExisting: SchedulerComponent }], hostDirectives: [{ directive: SchedulerDirective, inputs: ["appointments", "appointments", "view", "view", "focusedDate", "focusedDate", "selectedAppointmentId", "selectedAppointmentId", "locale", "locale", "firstDayOfWeek", "firstDayOfWeek"], 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"] }], ngImport: i0, template: "<div class=\"et-scheduler-header\">\n <button\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n {{ todayLabel() }}\n </button>\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 [value]=\"headless.view()\" (valueChange)=\"setView($event)\" size=\"sm\" variant=\"tabs\">\n <et-label class=\"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 ('week') {\n <et-scheduler-time-grid-view />\n }\n @case ('day') {\n <et-scheduler-time-grid-view />\n }\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @default {\n <et-scheduler-month-view />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;align-items:center;gap:8px}.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{font-size:15px;font-weight:600;color:var(--et-surface-color-solid)}.et-scheduler-header-spacer{flex:1}.et-scheduler-view-switch-label{position:absolute;inline-size:1px;block-size:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.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: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { 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 }); }
53850
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SchedulerComponent, isStandalone: true, selector: "et-scheduler", outputs: { appointmentSave: "appointmentSave", appointmentsDelete: "appointmentsDelete" }, host: { classAttribute: "et-scheduler" }, providers: [
53851
+ provideIcons(CHEVRON_ICON, PLUS_ICON),
53852
+ { provide: SCHEDULER_FEATURE_HOST, useExisting: SchedulerComponent },
53853
+ ], hostDirectives: [{ directive: SchedulerDirective, inputs: ["appointments", "appointments", "view", "view", "focusedDate", "focusedDate", "selectedAppointmentId", "selectedAppointmentId", "locale", "locale", "firstDayOfWeek", "firstDayOfWeek"], 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"] }], ngImport: i0, template: "<div class=\"et-scheduler-header\">\n <button\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n {{ todayLabel() }}\n </button>\n\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 <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-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 ('week') {\n <et-scheduler-time-grid-view />\n }\n @case ('day') {\n <et-scheduler-time-grid-view />\n }\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @default {\n <et-scheduler-month-view />\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%}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}}.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-view-switch-label{position:absolute;inline-size:1px;block-size:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.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: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { 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 }); }
52815
53854
  }
52816
53855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SchedulerComponent, decorators: [{
52817
53856
  type: Component,
@@ -52823,7 +53862,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
52823
53862
  SchedulerAgendaViewComponent,
52824
53863
  SchedulerMonthViewComponent,
52825
53864
  SchedulerTimeGridViewComponent,
52826
- ], providers: [provideIcons(CHEVRON_ICON), { provide: SCHEDULER_FEATURE_HOST, useExisting: SchedulerComponent }], hostDirectives: [
53865
+ ], providers: [
53866
+ provideIcons(CHEVRON_ICON, PLUS_ICON),
53867
+ { provide: SCHEDULER_FEATURE_HOST, useExisting: SchedulerComponent },
53868
+ ], hostDirectives: [
52827
53869
  {
52828
53870
  directive: SchedulerDirective,
52829
53871
  inputs: ['appointments', 'view', 'focusedDate', 'selectedAppointmentId', 'locale', 'firstDayOfWeek'],
@@ -52837,16 +53879,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
52837
53879
  { directive: SchedulerBadgeTimeRangeDirective, inputs: ['etSchedulerBadgeTimeRange'] },
52838
53880
  { directive: SchedulerBadgeLocationDirective, inputs: ['etSchedulerBadgeLocation'] },
52839
53881
  { directive: SchedulerBadgeChainCountDirective, inputs: ['etSchedulerBadgeChainCount'] },
53882
+ { directive: SchedulerActionAddAppointmentDirective, inputs: ['etSchedulerActionAddAppointment'] },
52840
53883
  ], host: {
52841
53884
  class: 'et-scheduler',
52842
- }, template: "<div class=\"et-scheduler-header\">\n <button\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n {{ todayLabel() }}\n </button>\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 [value]=\"headless.view()\" (valueChange)=\"setView($event)\" size=\"sm\" variant=\"tabs\">\n <et-label class=\"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 ('week') {\n <et-scheduler-time-grid-view />\n }\n @case ('day') {\n <et-scheduler-time-grid-view />\n }\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @default {\n <et-scheduler-month-view />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;align-items:center;gap:8px}.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{font-size:15px;font-weight:600;color:var(--et-surface-color-solid)}.et-scheduler-header-spacer{flex:1}.et-scheduler-view-switch-label{position:absolute;inline-size:1px;block-size:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"] }]
52843
- }] });
53885
+ }, template: "<div class=\"et-scheduler-header\">\n <button\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n {{ todayLabel() }}\n </button>\n\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 <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-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 ('week') {\n <et-scheduler-time-grid-view />\n }\n @case ('day') {\n <et-scheduler-time-grid-view />\n }\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @default {\n <et-scheduler-month-view />\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%}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}}.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-view-switch-label{position:absolute;inline-size:1px;block-size:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"] }]
53886
+ }], ctorParameters: () => [], propDecorators: { appointmentSave: [{ type: i0.Output, args: ["appointmentSave"] }], appointmentsDelete: [{ type: i0.Output, args: ["appointmentsDelete"] }] } });
52844
53887
 
52845
53888
  const SCHEDULER_IMPORTS = [
52846
53889
  SchedulerDirective,
52847
53890
  SchedulerAgendaDirective,
52848
53891
  SchedulerMonthDirective,
52849
53892
  SchedulerTimeGridDirective,
53893
+ SchedulerEditSurfaceDirective,
52850
53894
  SchedulerComponent,
52851
53895
  SchedulerAgendaViewComponent,
52852
53896
  SchedulerMonthViewComponent,
@@ -52856,6 +53900,15 @@ const SCHEDULER_IMPORTS = [
52856
53900
  SchedulerBadgeTimeRangeDirective,
52857
53901
  SchedulerBadgeLocationDirective,
52858
53902
  SchedulerBadgeChainCountDirective,
53903
+ SchedulerEditSurfaceComponent,
53904
+ SchedulerEditTitleDirective,
53905
+ SchedulerEditTimeRangeDirective,
53906
+ SchedulerEditLocationDirective,
53907
+ SchedulerEditDescriptionDirective,
53908
+ SchedulerEditColorDirective,
53909
+ SchedulerActionAddSubAppointmentDirective,
53910
+ SchedulerActionDeleteDirective,
53911
+ SchedulerActionAddAppointmentDirective,
52859
53912
  ];
52860
53913
 
52861
53914
  /** The built-in English labels. */
@@ -63750,9 +64803,785 @@ const TAB_IMPORTS = [TabGroupComponent, TabComponent, TabLabelDirective];
63750
64803
 
63751
64804
  const TOOLTIP_IMPORTS = [TooltipDirective, TooltipComponent];
63752
64805
 
64806
+ // codes 4600-4699
64807
+ const TREE_ERROR_CODES = {
64808
+ /** An `[etTree]` was rendered without a `[dataSource]`, so it has nothing to show. */
64809
+ MISSING_DATA_SOURCE: 4600,
64810
+ /** A tree part (`etTreeNode`, `etTreeNodeDef`) was used outside an `[etTree]`. */
64811
+ PART_OUTSIDE_TREE: 4601,
64812
+ };
64813
+
64814
+ /** Whether a node can be expanded - false for explicit leaves and `hasChildren: false`. */
64815
+ const canExpand = (node) => node.isLeaf !== true && node.hasChildren !== false;
64816
+ const defaultCompareWith = (a, b) => a === b;
64817
+ /** Value equality between two nodes via the configured comparator. `null` matches only `null`. */
64818
+ const nodesEqual = (options) => {
64819
+ const { a, b, compareWith } = options;
64820
+ if (a === null || b === null) {
64821
+ return a === b;
64822
+ }
64823
+ return compareWith(a.value, b.value);
64824
+ };
64825
+ /** Normalizes a `loadChildren` result (array | Promise | Observable) into an Observable. */
64826
+ const toChildrenObservable = (result) => {
64827
+ if (Array.isArray(result)) {
64828
+ return of(result);
64829
+ }
64830
+ if (isObservable(result)) {
64831
+ return result;
64832
+ }
64833
+ return from(result);
64834
+ };
64835
+
64836
+ const TREE_SELECTION_MODES = {
64837
+ /** Rows never select. Expansion, focus and `activated` still work - a pure navigation tree. */
64838
+ NONE: 'none',
64839
+ /** At most one selected node; `value` is `T | null`. */
64840
+ SINGLE: 'single',
64841
+ /** Any number of selected nodes; `value` is `T[]`, and activating a row toggles it. */
64842
+ MULTIPLE: 'multiple',
64843
+ };
64844
+ const TREE_LEVEL_STATUSES = {
64845
+ /** Not requested yet - a collapsed branch's children start here. */
64846
+ IDLE: 'idle',
64847
+ LOADING: 'loading',
64848
+ LOADED: 'loaded',
64849
+ ERROR: 'error',
64850
+ };
64851
+
64852
+ /**
64853
+ * An ARIA tree over a lazily loaded hierarchy: owns the expansion state, the selection, roving focus
64854
+ * and the keyboard model, and flattens the whole thing into the list of rows a template renders
64855
+ * ({@link visibleRows}). No visual opinion - bring your own template, or use the default `et-tree`.
64856
+ *
64857
+ * Children are loaded per branch through the {@link TreeDataSource}, the first time that branch is
64858
+ * expanded, so a deep or remote hierarchy costs only what the user actually opens. Every node is
64859
+ * identified by its `value`, which therefore has to be unique across the tree.
64860
+ *
64861
+ * Rows are rendered flat rather than nested, which is why each one carries `level`, `posInSet` and
64862
+ * `setSize` - a flat DOM has to state those for assistive tech.
64863
+ *
64864
+ * @example
64865
+ * <div [dataSource]="source" [(value)]="selected" etTree #tree="etTree">
64866
+ * @for (row of tree.visibleRows(); track row.node) {
64867
+ * <div [row]="row" etTreeNode>{{ row.node.label }}</div>
64868
+ * }
64869
+ * </div>
64870
+ */
64871
+ class TreeDirective {
64872
+ constructor() {
64873
+ this.hostElement = injectHostElement();
64874
+ /** The hierarchical source the tree renders. Required. */
64875
+ this.dataSource = input(null, /* @ts-ignore */
64876
+ ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
64877
+ /** Value equality - override when node values are objects. */
64878
+ this.compareWith = input(defaultCompareWith, /* @ts-ignore */
64879
+ ...(ngDevMode ? [{ debugName: "compareWith" }] : /* istanbul ignore next */ []));
64880
+ /** Whether rows select, and how many at a time. @default 'single' */
64881
+ this.selectionMode = input(TREE_SELECTION_MODES.SINGLE, /* @ts-ignore */
64882
+ ...(ngDevMode ? [{ debugName: "selectionMode" }] : /* istanbul ignore next */ []));
64883
+ /** The selected value: `T | null` in single mode, `T[]` in multiple. Two-way bindable. */
64884
+ this.value = model(null, /* @ts-ignore */
64885
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
64886
+ /**
64887
+ * The values of the expanded branches. Two-way bindable, and the tree's only expansion state - nothing
64888
+ * is inferred from the data, so an expansion set can be persisted and restored as-is.
64889
+ *
64890
+ * Values that match no node are ignored rather than pruned, so a set restored before its branch has
64891
+ * loaded still opens once the node arrives.
64892
+ */
64893
+ this.expandedValues = model([], /* @ts-ignore */
64894
+ ...(ngDevMode ? [{ debugName: "expandedValues" }] : /* istanbul ignore next */ []));
64895
+ /** Refuse to expand, select or move focus. Rows are marked `aria-disabled` and keep their DOM order. */
64896
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
64897
+ /**
64898
+ * Turns a `loadChildren` failure into the message shown on the branch that failed. The default shows an
64899
+ * `Error`'s `message` verbatim and a generic fallback for anything else.
64900
+ */
64901
+ this.toErrorMessage = input((error) => (error instanceof Error && error.message) || 'Something went wrong', /* @ts-ignore */
64902
+ ...(ngDevMode ? [{ debugName: "toErrorMessage" }] : /* istanbul ignore next */ []));
64903
+ /** A row was activated - clicked, or Enter'd. Fires for branches and leaves alike. */
64904
+ this.nodeActivate = output();
64905
+ this.levels = signal([], /* @ts-ignore */
64906
+ ...(ngDevMode ? [{ debugName: "levels" }] : /* istanbul ignore next */ []));
64907
+ this.registeredNodes = signal([], /* @ts-ignore */
64908
+ ...(ngDevMode ? [{ debugName: "registeredNodes" }] : /* istanbul ignore next */ []));
64909
+ /** @internal The `etTreeNodeDef` row template, when one is projected. */
64910
+ this.nodeTemplate = signal(null, /* @ts-ignore */
64911
+ ...(ngDevMode ? [{ debugName: "nodeTemplate" }] : /* istanbul ignore next */ []));
64912
+ /**
64913
+ * The node holding roving focus, once the user has moved it. A row writes it on `focusin`, so the tab
64914
+ * stop stays where the user left it and Shift+Tab re-enters there.
64915
+ */
64916
+ this.focusedNode = signal(null, /* @ts-ignore */
64917
+ ...(ngDevMode ? [{ debugName: "focusedNode" }] : /* istanbul ignore next */ []));
64918
+ /**
64919
+ * The flattened tree: every row that is currently visible, in DOM order - the root's children plus
64920
+ * the loaded children of every expanded branch below them.
64921
+ */
64922
+ this.visibleRows = computed(() => {
64923
+ const compareWith = this.compareWith();
64924
+ const levels = this.levels();
64925
+ const expanded = this.expandedValues();
64926
+ const rows = [];
64927
+ const levelOf = (parent) => levels.find((level) => nodesEqual({ a: level.parent, b: parent, compareWith })) ?? null;
64928
+ // `seen` guards against a malformed source whose branch contains its own value, which would
64929
+ // otherwise recurse until the stack gives out
64930
+ const walk = (options) => {
64931
+ const { parent, level, path, seen } = options;
64932
+ const entry = levelOf(parent);
64933
+ if (!entry)
64934
+ return;
64935
+ entry.nodes.forEach((node, index) => {
64936
+ const isExpandable = canExpand(node);
64937
+ const children = isExpandable ? levelOf(node) : null;
64938
+ const isExpanded = isExpandable && expanded.some((value) => compareWith(value, node.value));
64939
+ const nodePath = [...path, node];
64940
+ rows.push({
64941
+ node,
64942
+ level,
64943
+ path: nodePath,
64944
+ isExpandable,
64945
+ isExpanded,
64946
+ isDisabled: node.disabled === true,
64947
+ childrenStatus: children?.status ?? TREE_LEVEL_STATUSES.IDLE,
64948
+ childrenError: children?.error ?? null,
64949
+ posInSet: index + 1,
64950
+ setSize: entry.nodes.length,
64951
+ });
64952
+ if (isExpanded && !seen.some((value) => compareWith(value, node.value))) {
64953
+ walk({ parent: node, level: level + 1, path: nodePath, seen: [...seen, node.value] });
64954
+ }
64955
+ });
64956
+ };
64957
+ walk({ parent: null, level: 1, path: [], seen: [] });
64958
+ return rows;
64959
+ }, /* @ts-ignore */
64960
+ ...(ngDevMode ? [{ debugName: "visibleRows" }] : /* istanbul ignore next */ []));
64961
+ /** Load state of the root level - what a tree shows a loading or empty state for. */
64962
+ this.rootStatus = computed(() => this.levelOf(null)?.status ?? TREE_LEVEL_STATUSES.IDLE, /* @ts-ignore */
64963
+ ...(ngDevMode ? [{ debugName: "rootStatus" }] : /* istanbul ignore next */ []));
64964
+ /** The message from a failed root load, or `null`. */
64965
+ this.rootError = computed(() => this.levelOf(null)?.error ?? null, /* @ts-ignore */
64966
+ ...(ngDevMode ? [{ debugName: "rootError" }] : /* istanbul ignore next */ []));
64967
+ /** The selected values, normalized to an array (empty for no selection). */
64968
+ this.values = computed(() => {
64969
+ const value = this.value();
64970
+ if (Array.isArray(value)) {
64971
+ return value;
64972
+ }
64973
+ return value === null || value === undefined ? [] : [value];
64974
+ }, /* @ts-ignore */
64975
+ ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
64976
+ /**
64977
+ * The row that owns the tree's single tab stop: the focused node while it is still visible, else the
64978
+ * first row. A tree is one tab stop with the arrow keys moving inside it, so exactly one row is
64979
+ * tabbable at any time.
64980
+ */
64981
+ this.activeNode = computed(() => {
64982
+ const rows = this.visibleRows();
64983
+ const focused = this.focusedNode();
64984
+ const compareWith = this.compareWith();
64985
+ if (focused && rows.some((row) => compareWith(row.node.value, focused.value))) {
64986
+ return focused;
64987
+ }
64988
+ return rows[0]?.node ?? null;
64989
+ }, /* @ts-ignore */
64990
+ ...(ngDevMode ? [{ debugName: "activeNode" }] : /* istanbul ignore next */ []));
64991
+ // type-to-focus by label across the visible rows - a deep tree cannot be navigated by name otherwise
64992
+ this.typeahead = createTypeahead();
64993
+ // Every branch that needs loading right now: the root, plus each expanded branch whose children
64994
+ // have not been requested yet. Expansion is therefore the only trigger a load ever needs - an
64995
+ // `expandedValues` set that was restored from storage loads its branches exactly like a click does.
64996
+ const idleParents = computed(() => {
64997
+ if (!this.dataSource())
64998
+ return [];
64999
+ const parents = [];
65000
+ if (this.rootStatus() === TREE_LEVEL_STATUSES.IDLE) {
65001
+ parents.push(null);
65002
+ }
65003
+ for (const row of this.visibleRows()) {
65004
+ if (row.isExpanded && row.childrenStatus === TREE_LEVEL_STATUSES.IDLE) {
65005
+ parents.push(row.node);
65006
+ }
65007
+ }
65008
+ return parents;
65009
+ }, /* @ts-ignore */
65010
+ ...(ngDevMode ? [{ debugName: "idleParents" }] : /* istanbul ignore next */ []));
65011
+ // created here rather than inside the switchMap below, which is not an injection context
65012
+ const idleParents$ = toObservable(idleParents);
65013
+ toObservable(this.dataSource)
65014
+ .pipe(switchMap((source) => {
65015
+ // a swapped source describes a different tree - drop what was learned from the old one, and
65016
+ // let switchMap cancel its in-flight loads so a late response cannot write into the new tree
65017
+ untracked(() => {
65018
+ this.levels.set([]);
65019
+ this.focusedNode.set(null);
65020
+ });
65021
+ if (!source)
65022
+ return EMPTY;
65023
+ // mergeMap, not switchMap: sibling branches expanded in quick succession all load
65024
+ return idleParents$.pipe(mergeMap((parents) => merge(...parents.map((parent) => this.load(source, parent)))));
65025
+ }), takeUntilDestroyed())
65026
+ .subscribe();
65027
+ inject(DestroyRef).onDestroy(() => this.typeahead.destroy());
65028
+ if (ngDevMode) {
65029
+ afterNextRender(() => {
65030
+ if (!this.dataSource()) {
65031
+ throw new RuntimeError(TREE_ERROR_CODES.MISSING_DATA_SOURCE, '[TreeDirective] A [dataSource] is required - without one the tree has nothing to load. ' +
65032
+ 'Bind an object with a loadChildren(parent) method.', { element: this.hostElement });
65033
+ }
65034
+ });
65035
+ }
65036
+ }
65037
+ /** Whether a node is expanded. */
65038
+ isExpanded(node) {
65039
+ const compareWith = this.compareWith();
65040
+ return this.expandedValues().some((value) => compareWith(value, node.value));
65041
+ }
65042
+ /** Whether a node is selected. */
65043
+ isSelected(node) {
65044
+ const compareWith = this.compareWith();
65045
+ return this.values().some((value) => compareWith(value, node.value));
65046
+ }
65047
+ /** Expand a branch, loading its children if this is the first time. No-op on leaves and disabled nodes. */
65048
+ expand(node) {
65049
+ if (this.disabled() || node.disabled || !canExpand(node) || this.isExpanded(node))
65050
+ return;
65051
+ this.expandedValues.update((values) => [...values, node.value]);
65052
+ }
65053
+ /** Collapse a branch. Its children stay loaded, so re-expanding it is instant. */
65054
+ collapse(node) {
65055
+ if (this.disabled())
65056
+ return;
65057
+ const compareWith = this.compareWith();
65058
+ this.expandedValues.update((values) => values.filter((value) => !compareWith(value, node.value)));
65059
+ }
65060
+ toggleExpansion(node) {
65061
+ if (this.isExpanded(node)) {
65062
+ this.collapse(node);
65063
+ }
65064
+ else {
65065
+ this.expand(node);
65066
+ }
65067
+ }
65068
+ /**
65069
+ * Expand every branch loaded so far. On a lazy source that is one level deeper than what is currently
65070
+ * visible: call it again once the newly loaded branches arrive to keep going.
65071
+ */
65072
+ expandAll() {
65073
+ if (this.disabled())
65074
+ return;
65075
+ const compareWith = this.compareWith();
65076
+ const expandable = this.levels()
65077
+ .flatMap((level) => level.nodes)
65078
+ .filter((node) => canExpand(node) && !node.disabled);
65079
+ this.expandedValues.update((values) => [
65080
+ ...values,
65081
+ ...expandable.filter((node) => !values.some((value) => compareWith(value, node.value))).map((node) => node.value),
65082
+ ]);
65083
+ }
65084
+ collapseAll() {
65085
+ if (this.disabled())
65086
+ return;
65087
+ this.expandedValues.set([]);
65088
+ }
65089
+ /** Reload a branch's children - what a failed load is retried with. Pass `null` for the root. */
65090
+ retry(parent) {
65091
+ this.setLevel(parent, { status: TREE_LEVEL_STATUSES.IDLE, nodes: [], error: null });
65092
+ }
65093
+ /** Select a node. No-op while `selectionMode` is `'none'`. */
65094
+ select(node) {
65095
+ if (this.disabled() || node.disabled || this.selectionMode() === TREE_SELECTION_MODES.NONE)
65096
+ return;
65097
+ if (this.selectionMode() === TREE_SELECTION_MODES.MULTIPLE) {
65098
+ if (this.isSelected(node))
65099
+ return;
65100
+ this.value.set([...this.values(), node.value]);
65101
+ return;
65102
+ }
65103
+ this.value.set(node.value);
65104
+ }
65105
+ deselect(node) {
65106
+ if (this.disabled() || !this.isSelected(node))
65107
+ return;
65108
+ const compareWith = this.compareWith();
65109
+ if (this.selectionMode() === TREE_SELECTION_MODES.MULTIPLE) {
65110
+ this.value.set(this.values().filter((value) => !compareWith(value, node.value)));
65111
+ return;
65112
+ }
65113
+ this.value.set(null);
65114
+ }
65115
+ /** Multiple mode: add the node to the selection, or remove it when already selected. */
65116
+ toggleSelection(node) {
65117
+ if (this.isSelected(node)) {
65118
+ this.deselect(node);
65119
+ }
65120
+ else {
65121
+ this.select(node);
65122
+ }
65123
+ }
65124
+ clearSelection() {
65125
+ this.value.set(this.selectionMode() === TREE_SELECTION_MODES.MULTIPLE ? [] : null);
65126
+ }
65127
+ /**
65128
+ * What a click or Enter on a row does: move roving focus there, retry a branch whose children failed to
65129
+ * load, otherwise expand/collapse it, and apply the selection for the current mode. Always emits
65130
+ * {@link nodeActivate}, so a leaf can be "opened" without being selected.
65131
+ */
65132
+ activate(node) {
65133
+ if (this.disabled() || node.disabled)
65134
+ return;
65135
+ this.focusNode(node);
65136
+ const row = this.rowOf(node);
65137
+ if (row?.childrenError) {
65138
+ this.retry(node);
65139
+ }
65140
+ else if (canExpand(node)) {
65141
+ this.toggleExpansion(node);
65142
+ }
65143
+ if (this.selectionMode() === TREE_SELECTION_MODES.MULTIPLE) {
65144
+ this.toggleSelection(node);
65145
+ }
65146
+ else {
65147
+ this.select(node);
65148
+ }
65149
+ this.nodeActivate.emit(node);
65150
+ }
65151
+ /** Move roving focus - and DOM focus, when the row is rendered - to a node. */
65152
+ focusNode(node) {
65153
+ this.focusedNode.set(node);
65154
+ const compareWith = this.compareWith();
65155
+ const element = this.registeredNodes().find((registered) => compareWith(registered.row().node.value, node.value))
65156
+ ?.elementRef.nativeElement;
65157
+ if (!element)
65158
+ return;
65159
+ element.focus({ preventScroll: true });
65160
+ element.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
65161
+ }
65162
+ /** Move focus to the tree's first row - where a fresh Tab lands. */
65163
+ focusFirst() {
65164
+ const first = this.visibleRows()[0]?.node;
65165
+ if (first) {
65166
+ this.focusNode(first);
65167
+ }
65168
+ }
65169
+ /** @internal Called from a node's constructor; the registration is undone when the row is destroyed. */
65170
+ registerNode(node) {
65171
+ this.registeredNodes.update((nodes) => [...nodes, node]);
65172
+ inject(DestroyRef).onDestroy(() => this.registeredNodes.update((nodes) => nodes.filter((candidate) => candidate !== node)));
65173
+ }
65174
+ /** @internal Routes a row's keydown through the tree navigation model. */
65175
+ handleNodeKeydown(event, node) {
65176
+ if (event.ctrlKey || event.metaKey || event.altKey || this.disabled())
65177
+ return;
65178
+ const rows = this.visibleRows();
65179
+ const compareWith = this.compareWith();
65180
+ const index = rows.findIndex((row) => compareWith(row.node.value, node.value));
65181
+ const row = rows[index];
65182
+ if (!row)
65183
+ return;
65184
+ // ArrowRight/ArrowLeft expand and collapse, which means they follow the writing direction
65185
+ const rtl = getComputedStyle(this.hostElement).direction === 'rtl';
65186
+ const expandKey = rtl ? 'ArrowLeft' : 'ArrowRight';
65187
+ const collapseKey = rtl ? 'ArrowRight' : 'ArrowLeft';
65188
+ switch (event.key) {
65189
+ case 'ArrowDown':
65190
+ event.preventDefault();
65191
+ this.focusRow(rows, index + 1);
65192
+ return;
65193
+ case 'ArrowUp':
65194
+ event.preventDefault();
65195
+ this.focusRow(rows, index - 1);
65196
+ return;
65197
+ case 'Home':
65198
+ event.preventDefault();
65199
+ this.focusRow(rows, 0);
65200
+ return;
65201
+ case 'End':
65202
+ event.preventDefault();
65203
+ this.focusRow(rows, rows.length - 1);
65204
+ return;
65205
+ case expandKey:
65206
+ event.preventDefault();
65207
+ if (row.isExpandable && !row.isExpanded) {
65208
+ this.expand(node);
65209
+ }
65210
+ else if (row.isExpanded && rows[index + 1]?.level === row.level + 1) {
65211
+ this.focusRow(rows, index + 1);
65212
+ }
65213
+ return;
65214
+ case collapseKey:
65215
+ event.preventDefault();
65216
+ if (row.isExpanded) {
65217
+ this.collapse(node);
65218
+ return;
65219
+ }
65220
+ // to the parent - the closest row above that sits one level up
65221
+ for (let candidate = index - 1; candidate >= 0; candidate--) {
65222
+ if (rows[candidate]?.level === row.level - 1) {
65223
+ this.focusRow(rows, candidate);
65224
+ return;
65225
+ }
65226
+ }
65227
+ return;
65228
+ case 'Enter':
65229
+ event.preventDefault();
65230
+ this.activate(node);
65231
+ return;
65232
+ case ' ':
65233
+ if (this.selectionMode() === TREE_SELECTION_MODES.NONE)
65234
+ return;
65235
+ event.preventDefault();
65236
+ if (this.selectionMode() === TREE_SELECTION_MODES.MULTIPLE) {
65237
+ this.toggleSelection(node);
65238
+ }
65239
+ else {
65240
+ this.select(node);
65241
+ }
65242
+ return;
65243
+ case '*':
65244
+ event.preventDefault();
65245
+ this.expandSiblings(rows, row);
65246
+ return;
65247
+ }
65248
+ if (event.key.length !== 1)
65249
+ return;
65250
+ const query = this.typeahead.append(event.key);
65251
+ // start after the focused row and wrap, so repeating a letter walks through the matches
65252
+ const match = rows
65253
+ .slice(index + 1)
65254
+ .concat(rows.slice(0, index + 1))
65255
+ .find((candidate) => !candidate.isDisabled && candidate.node.label.toLowerCase().startsWith(query));
65256
+ if (match) {
65257
+ event.preventDefault();
65258
+ this.focusNode(match.node);
65259
+ }
65260
+ }
65261
+ levelOf(parent) {
65262
+ const compareWith = this.compareWith();
65263
+ return this.levels().find((level) => nodesEqual({ a: level.parent, b: parent, compareWith })) ?? null;
65264
+ }
65265
+ rowOf(node) {
65266
+ const compareWith = this.compareWith();
65267
+ return this.visibleRows().find((row) => compareWith(row.node.value, node.value)) ?? null;
65268
+ }
65269
+ focusRow(rows, index) {
65270
+ const row = rows[Math.max(0, Math.min(rows.length - 1, index))];
65271
+ if (row) {
65272
+ this.focusNode(row.node);
65273
+ }
65274
+ }
65275
+ /** `*` expands every branch at the focused row's level that shares its parent. */
65276
+ expandSiblings(rows, row) {
65277
+ const compareWith = this.compareWith();
65278
+ const parent = row.path[row.path.length - 2] ?? null;
65279
+ for (const candidate of rows) {
65280
+ if (candidate.level === row.level &&
65281
+ nodesEqual({ a: candidate.path[candidate.path.length - 2] ?? null, b: parent, compareWith })) {
65282
+ this.expand(candidate.node);
65283
+ }
65284
+ }
65285
+ }
65286
+ load(source, parent) {
65287
+ // The request was queued from a state that has since changed - the source was swapped, or the
65288
+ // branch collapsed again while `toObservable` was still holding this list. Reading the current
65289
+ // set is what keeps a re-emission from loading the same branch twice.
65290
+ if (!this.isIdle(parent))
65291
+ return EMPTY;
65292
+ this.setLevel(parent, { status: TREE_LEVEL_STATUSES.LOADING, nodes: [], error: null });
65293
+ // defer, so a `loadChildren` that throws on the spot fails the branch like a rejected load
65294
+ // rather than tearing down the whole pipeline
65295
+ return defer(() => toChildrenObservable(source.loadChildren(parent))).pipe(take(1), tap({
65296
+ next: (nodes) => this.setLevel(parent, { status: TREE_LEVEL_STATUSES.LOADED, nodes, error: null }),
65297
+ error: (error) => this.setLevel(parent, {
65298
+ status: TREE_LEVEL_STATUSES.ERROR,
65299
+ nodes: [],
65300
+ error: this.toErrorMessage()(error),
65301
+ }),
65302
+ }), catchError(() => EMPTY));
65303
+ }
65304
+ isIdle(parent) {
65305
+ const level = this.levelOf(parent);
65306
+ if (level !== null && level.status !== TREE_LEVEL_STATUSES.IDLE) {
65307
+ return false;
65308
+ }
65309
+ return parent === null || this.isExpanded(parent);
65310
+ }
65311
+ setLevel(parent, state) {
65312
+ const compareWith = this.compareWith();
65313
+ this.levels.update((levels) => [
65314
+ ...levels.filter((level) => !nodesEqual({ a: level.parent, b: parent, compareWith })),
65315
+ { parent, ...state },
65316
+ ]);
65317
+ }
65318
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
65319
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: TreeDirective, isStandalone: true, selector: "[etTree]", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, expandedValues: { classPropertyName: "expandedValues", publicName: "expandedValues", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, toErrorMessage: { classPropertyName: "toErrorMessage", publicName: "toErrorMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", expandedValues: "expandedValuesChange", nodeActivate: "nodeActivate" }, host: { attributes: { "role": "tree" }, properties: { "attr.aria-multiselectable": "selectionMode() === \"multiple\" ? \"true\" : null", "attr.aria-busy": "rootStatus() === \"loading\" ? \"true\" : null", "attr.data-disabled": "disabled() || null" } }, exportAs: ["etTree"], ngImport: i0 }); }
65320
+ }
65321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeDirective, decorators: [{
65322
+ type: Directive,
65323
+ args: [{
65324
+ selector: '[etTree]',
65325
+ exportAs: 'etTree',
65326
+ host: {
65327
+ role: 'tree',
65328
+ '[attr.aria-multiselectable]': 'selectionMode() === "multiple" ? "true" : null',
65329
+ '[attr.aria-busy]': 'rootStatus() === "loading" ? "true" : null',
65330
+ '[attr.data-disabled]': 'disabled() || null',
65331
+ },
65332
+ }]
65333
+ }], ctorParameters: () => [], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], expandedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedValues", required: false }] }, { type: i0.Output, args: ["expandedValuesChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], toErrorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "toErrorMessage", required: false }] }], nodeActivate: [{ type: i0.Output, args: ["nodeActivate"] }] } });
65334
+
65335
+ /**
65336
+ * A single row of a tree. Bind the {@link TreeRow} it represents; the directive wires the ARIA tree
65337
+ * semantics (including the position values a flat DOM has to state), the roving tab stop and the
65338
+ * interaction, and mirrors the row's state as `data-*` attributes for styling.
65339
+ *
65340
+ * @example
65341
+ * @for (row of tree.visibleRows(); track row.node) {
65342
+ * <div [row]="row" etTreeNode>{{ row.node.label }}</div>
65343
+ * }
65344
+ */
65345
+ class TreeNodeDirective {
65346
+ constructor() {
65347
+ this.tree = inject(TreeDirective, { optional: true });
65348
+ /** @internal The element the tree moves DOM focus to when roving focus lands on this row. */
65349
+ this.elementRef = inject(ElementRef);
65350
+ /** The row this element renders - one entry of the tree's `visibleRows()`. */
65351
+ this.row = input.required(/* @ts-ignore */
65352
+ ...(ngDevMode ? [{ debugName: "row" }] : /* istanbul ignore next */ []));
65353
+ this.selectionMode = computed(() => this.tree?.selectionMode() ?? 'none', /* @ts-ignore */
65354
+ ...(ngDevMode ? [{ debugName: "selectionMode" }] : /* istanbul ignore next */ []));
65355
+ this.selected = computed(() => this.tree?.isSelected(this.row().node) ?? false, /* @ts-ignore */
65356
+ ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
65357
+ this.disabled = computed(() => this.row().isDisabled || (this.tree?.disabled() ?? false), /* @ts-ignore */
65358
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
65359
+ this.active = computed(() => {
65360
+ const active = this.tree?.activeNode();
65361
+ if (!active || !this.tree)
65362
+ return false;
65363
+ return this.tree.compareWith()(active.value, this.row().node.value);
65364
+ }, /* @ts-ignore */
65365
+ ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
65366
+ this.tree?.registerNode(this);
65367
+ if (ngDevMode) {
65368
+ afterNextRender(() => {
65369
+ if (!this.tree) {
65370
+ throw new RuntimeError(TREE_ERROR_CODES.PART_OUTSIDE_TREE, '[TreeNodeDirective] etTreeNode must be placed inside an [etTree] element (e.g. <et-tree>).', { element: this.elementRef.nativeElement });
65371
+ }
65372
+ });
65373
+ }
65374
+ }
65375
+ handleClick() {
65376
+ this.tree?.activate(this.row().node);
65377
+ }
65378
+ handleKeydown(event) {
65379
+ this.tree?.handleNodeKeydown(event, this.row().node);
65380
+ }
65381
+ handleFocusIn() {
65382
+ this.tree?.focusedNode.set(this.row().node);
65383
+ }
65384
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeNodeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
65385
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: TreeNodeDirective, isStandalone: true, selector: "[etTreeNode]", inputs: { row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "treeitem" }, listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)", "focusin": "handleFocusIn()" }, properties: { "attr.aria-level": "row().level", "attr.aria-posinset": "row().posInSet", "attr.aria-setsize": "row().setSize", "attr.aria-expanded": "row().isExpandable ? row().isExpanded : null", "attr.aria-selected": "selectionMode() === \"none\" ? null : selected()", "attr.aria-disabled": "disabled() || null", "attr.aria-busy": "row().childrenStatus === \"loading\" ? \"true\" : null", "attr.tabindex": "active() ? 0 : -1", "attr.data-selected": "selected() || null", "attr.data-expanded": "row().isExpanded || null", "attr.data-branch": "row().isExpandable || null", "attr.data-disabled": "disabled() || null", "attr.data-error": "row().childrenError !== null || null" } }, exportAs: ["etTreeNode"], ngImport: i0 }); }
65386
+ }
65387
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeNodeDirective, decorators: [{
65388
+ type: Directive,
65389
+ args: [{
65390
+ selector: '[etTreeNode]',
65391
+ exportAs: 'etTreeNode',
65392
+ host: {
65393
+ role: 'treeitem',
65394
+ '[attr.aria-level]': 'row().level',
65395
+ '[attr.aria-posinset]': 'row().posInSet',
65396
+ '[attr.aria-setsize]': 'row().setSize',
65397
+ '[attr.aria-expanded]': 'row().isExpandable ? row().isExpanded : null',
65398
+ '[attr.aria-selected]': 'selectionMode() === "none" ? null : selected()',
65399
+ '[attr.aria-disabled]': 'disabled() || null',
65400
+ '[attr.aria-busy]': 'row().childrenStatus === "loading" ? "true" : null',
65401
+ '[attr.tabindex]': 'active() ? 0 : -1',
65402
+ '[attr.data-selected]': 'selected() || null',
65403
+ '[attr.data-expanded]': 'row().isExpanded || null',
65404
+ '[attr.data-branch]': 'row().isExpandable || null',
65405
+ '[attr.data-disabled]': 'disabled() || null',
65406
+ '[attr.data-error]': 'row().childrenError !== null || null',
65407
+ '(click)': 'handleClick()',
65408
+ '(keydown)': 'handleKeydown($event)',
65409
+ '(focusin)': 'handleFocusIn()',
65410
+ },
65411
+ }]
65412
+ }], ctorParameters: () => [], propDecorators: { row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: true }] }] } });
65413
+
65414
+ /**
65415
+ * Replaces the default tree's plain-text row label with a template, for rows that need markup - an
65416
+ * icon per node type, a badge, a secondary line. The node is the template's implicit value, and its
65417
+ * full {@link TreeRow} is available as `let-row` for the level, expansion and load state.
65418
+ *
65419
+ * @example
65420
+ * <et-tree [dataSource]="files">
65421
+ * <ng-template etTreeNodeDef let-node let-row="row">
65422
+ * <i [etIcon]="row.isExpandable ? 'folder' : 'file'"></i>
65423
+ * {{ node.label }}
65424
+ * </ng-template>
65425
+ * </et-tree>
65426
+ */
65427
+ class TreeNodeDefDirective {
65428
+ constructor() {
65429
+ this.hostElement = injectHostElement();
65430
+ this.tree = inject(TreeDirective, { optional: true });
65431
+ this.templateRef = inject(TemplateRef);
65432
+ this.tree?.nodeTemplate.set(this);
65433
+ inject(DestroyRef).onDestroy(() => {
65434
+ if (this.tree?.nodeTemplate() === this) {
65435
+ this.tree.nodeTemplate.set(null);
65436
+ }
65437
+ });
65438
+ if (ngDevMode) {
65439
+ afterNextRender(() => {
65440
+ if (!this.tree) {
65441
+ throw new RuntimeError(TREE_ERROR_CODES.PART_OUTSIDE_TREE, '[TreeNodeDefDirective] etTreeNodeDef must be placed inside an [etTree] element (e.g. <et-tree>).', { element: this.hostElement });
65442
+ }
65443
+ });
65444
+ }
65445
+ }
65446
+ // static on purpose (the lint ban excepts it): Angular's template type checker requires the
65447
+ // context guard to be static - it types the `let-` bindings of the host ng-template
65448
+ static ngTemplateContextGuard(_directive, _context) {
65449
+ return true;
65450
+ }
65451
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeNodeDefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
65452
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: TreeNodeDefDirective, isStandalone: true, selector: "ng-template[etTreeNodeDef]", exportAs: ["etTreeNodeDef"], ngImport: i0 }); }
65453
+ }
65454
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeNodeDefDirective, decorators: [{
65455
+ type: Directive,
65456
+ args: [{
65457
+ selector: 'ng-template[etTreeNodeDef]',
65458
+ exportAs: 'etTreeNodeDef',
65459
+ }]
65460
+ }], ctorParameters: () => [] });
65461
+
65462
+ /** What the slot in front of a tree row shows. */
65463
+ const TREE_MARKERS = {
65464
+ /** Nothing - a leaf, which keeps the slot so its label lines up with its siblings. */
65465
+ NONE: 'none',
65466
+ /** A collapsed or expanded branch; the rotation follows the row's `data-expanded`. */
65467
+ CHEVRON: 'chevron',
65468
+ /** The branch is loading its children. */
65469
+ SPINNER: 'spinner',
65470
+ /** The branch failed to load. */
65471
+ WARNING: 'warning',
65472
+ };
65473
+ /**
65474
+ * The slot in front of a tree row: its chevron, load spinner or failure mark. Its own component so
65475
+ * that it - and not the tree - is what registers the icons it draws. A `provideIcons()` on the tree
65476
+ * would sit above every projected row template in the injector tree and hide the consumer's own icon
65477
+ * registration from it, since an embedded view resolves DI from where it is inserted.
65478
+ */
65479
+ class TreeMarkerComponent {
65480
+ constructor() {
65481
+ this.marker = input(TREE_MARKERS.NONE, /* @ts-ignore */
65482
+ ...(ngDevMode ? [{ debugName: "marker" }] : /* istanbul ignore next */ []));
65483
+ }
65484
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeMarkerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65485
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: TreeMarkerComponent, isStandalone: true, selector: "et-tree-marker", inputs: { marker: { classPropertyName: "marker", publicName: "marker", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, classAttribute: "et-tree-node-marker" }, providers: [provideIcons(CHEVRON_ICON, TRIANGLE_EXCLAMATION_ICON)], ngImport: i0, template: `
65486
+ @switch (marker()) {
65487
+ @case ('spinner') {
65488
+ <et-spinner [diameter]="12" />
65489
+ }
65490
+ @case ('warning') {
65491
+ <i class="et-tree-node-warning" etIcon="et-triangle-exclamation"></i>
65492
+ }
65493
+ @case ('chevron') {
65494
+ <i class="et-tree-node-chevron" etIcon="et-chevron"></i>
65495
+ }
65496
+ }
65497
+ `, isInline: true, dependencies: [{ kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], encapsulation: i0.ViewEncapsulation.None }); }
65498
+ }
65499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeMarkerComponent, decorators: [{
65500
+ type: Component,
65501
+ args: [{
65502
+ selector: 'et-tree-marker',
65503
+ template: `
65504
+ @switch (marker()) {
65505
+ @case ('spinner') {
65506
+ <et-spinner [diameter]="12" />
65507
+ }
65508
+ @case ('warning') {
65509
+ <i class="et-tree-node-warning" etIcon="et-triangle-exclamation"></i>
65510
+ }
65511
+ @case ('chevron') {
65512
+ <i class="et-tree-node-chevron" etIcon="et-chevron"></i>
65513
+ }
65514
+ }
65515
+ `,
65516
+ encapsulation: ViewEncapsulation.None,
65517
+ imports: [IconDirective, SpinnerComponent],
65518
+ providers: [provideIcons(CHEVRON_ICON, TRIANGLE_EXCLAMATION_ICON)],
65519
+ host: {
65520
+ class: 'et-tree-node-marker',
65521
+ 'aria-hidden': 'true',
65522
+ },
65523
+ }]
65524
+ }], propDecorators: { marker: [{ type: i0.Input, args: [{ isSignal: true, alias: "marker", required: false }] }] } });
65525
+
65526
+ const markerFor = (row) => {
65527
+ if (row.childrenStatus === 'loading')
65528
+ return TREE_MARKERS.SPINNER;
65529
+ if (row.childrenError !== null)
65530
+ return TREE_MARKERS.WARNING;
65531
+ return row.isExpandable ? TREE_MARKERS.CHEVRON : TREE_MARKERS.NONE;
65532
+ };
65533
+ /**
65534
+ * The default tree: an indented, themed, keyboard-navigable rendering of a hierarchy, driven by the
65535
+ * headless {@link TreeDirective}. Rows show their label; project an `<ng-template etTreeNodeDef>` to
65536
+ * render them with markup instead.
65537
+ *
65538
+ * Branches load their children the first time they expand, so binding a lazy `[dataSource]` needs no
65539
+ * extra wiring - a branch that is still loading shows a spinner in place of its chevron, and one whose
65540
+ * load failed shows the message and reloads when selected again.
65541
+ *
65542
+ * @example
65543
+ * <et-tree [dataSource]="categories" [(value)]="categoryId" [(expandedValues)]="openBranches" />
65544
+ */
65545
+ class TreeComponent {
65546
+ constructor() {
65547
+ this.tree = inject(TreeDirective);
65548
+ /** Shown while the root level loads. */
65549
+ this.loadingLabel = input('Loading…', /* @ts-ignore */
65550
+ ...(ngDevMode ? [{ debugName: "loadingLabel" }] : /* istanbul ignore next */ []));
65551
+ /** Shown when the root level loaded no nodes at all. */
65552
+ this.emptyLabel = input('Nothing to show', /* @ts-ignore */
65553
+ ...(ngDevMode ? [{ debugName: "emptyLabel" }] : /* istanbul ignore next */ []));
65554
+ /** Appended to a failed level's message, to say that selecting the row loads it again. */
65555
+ this.retryLabel = input('select to retry', /* @ts-ignore */
65556
+ ...(ngDevMode ? [{ debugName: "retryLabel" }] : /* istanbul ignore next */ []));
65557
+ /**
65558
+ * The rows plus their marker and template context, built together so each row's context object
65559
+ * survives change detection instead of being rebuilt on every pass.
65560
+ */
65561
+ this.rows = computed(() => this.tree.visibleRows().map((row) => ({ row, marker: markerFor(row), context: { $implicit: row.node, row } })), /* @ts-ignore */
65562
+ ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
65563
+ }
65564
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65565
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: TreeComponent, isStandalone: true, selector: "et-tree", inputs: { loadingLabel: { classPropertyName: "loadingLabel", publicName: "loadingLabel", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null }, retryLabel: { classPropertyName: "retryLabel", publicName: "retryLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-tree" }, hostDirectives: [{ directive: TreeDirective, inputs: ["dataSource", "dataSource", "compareWith", "compareWith", "selectionMode", "selectionMode", "value", "value", "expandedValues", "expandedValues", "disabled", "disabled", "toErrorMessage", "toErrorMessage"], outputs: ["valueChange", "valueChange", "expandedValuesChange", "expandedValuesChange", "nodeActivate", "nodeActivate"] }], ngImport: i0, template: "@for (entry of rows(); track entry.row.node) {\n <div [row]=\"entry.row\" [style.--_et-tree-node-depth]=\"entry.row.level - 1\" class=\"et-tree-node\" etTreeNode>\n <et-tree-marker [marker]=\"entry.marker\" />\n\n <span class=\"et-tree-node-label\">\n @if (tree.nodeTemplate(); as nodeTemplate) {\n <ng-container [ngTemplateOutlet]=\"nodeTemplate.templateRef\" [ngTemplateOutletContext]=\"entry.context\" />\n } @else {\n {{ entry.row.node.label }}\n }\n </span>\n\n @if (entry.row.childrenError; as error) {\n <span class=\"et-tree-node-error\">{{ error }} \u00B7 {{ retryLabel() }}</span>\n }\n </div>\n}\n\n<!-- The status lines are `treeitem`s rather than plain text: everything inside a `role=\"tree\"` has to be\n one. The error line is also the retry control - selecting it reloads, the same way activating a\n branch whose children failed does. -->\n@if (tree.rootStatus() === 'loading') {\n <div class=\"et-tree-status\" aria-disabled=\"true\" aria-level=\"1\" aria-selected=\"false\" role=\"treeitem\">\n <et-tree-marker marker=\"spinner\" />\n {{ loadingLabel() }}\n </div>\n} @else if (tree.rootError(); as error) {\n <div\n (click)=\"tree.retry(null)\"\n (keydown.enter)=\"tree.retry(null)\"\n class=\"et-tree-status et-tree-status--error\"\n aria-level=\"1\"\n aria-selected=\"false\"\n role=\"treeitem\"\n tabindex=\"0\"\n >\n <et-tree-marker marker=\"warning\" />\n {{ error }} \u00B7 {{ retryLabel() }}\n </div>\n} @else if (!rows().length) {\n <div class=\"et-tree-status\" aria-disabled=\"true\" aria-level=\"1\" aria-selected=\"false\" role=\"treeitem\">\n {{ emptyLabel() }}\n </div>\n}\n", styles: ["@layer components{@property --et-tree-indent{syntax: \"<length>\"; inherits: true; initial-value: 18px;}@property --et-tree-node-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 5px;}@property --et-tree-node-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-tree-node-gap{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-tree-node-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-tree-marker-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-tree-duration{syntax: \"<time>\"; inherits: true; initial-value: .15s;}@property --_et-tree-node-depth{syntax: \"<number>\"; inherits: false; initial-value: 0;}.et-tree{display:block;color:var(--et-surface-color-solid, CanvasText)}.et-tree-node,.et-tree-status{display:flex;align-items:center;gap:var(--et-tree-node-gap);padding-block:var(--et-tree-node-padding-block);padding-inline:calc(var(--et-tree-node-padding-inline) + var(--_et-tree-node-depth) * var(--et-tree-indent)) var(--et-tree-node-padding-inline);border-radius:var(--et-tree-node-radius);box-sizing:border-box}.et-tree-node-marker{display:flex;flex:none;align-items:center;justify-content:center;inline-size:var(--et-tree-marker-size);block-size:var(--et-tree-marker-size);color:var(--et-surface-color-muted-solid, GrayText)}.et-tree-node-marker .et-tree-node-chevron{inline-size:100%;block-size:100%;rotate:90deg;transition:rotate var(--et-tree-duration) cubic-bezier(.25,0,.1,1)}.et-tree-node{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color var(--et-tree-duration) ease}.et-tree-node .et-tree-node-label{flex:1;min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.et-tree-node .et-tree-node-error{flex:none;color:var(--et-tree-error-color, var(--et-surface-color-muted-solid, GrayText));font-size:.875em}.et-tree-node:where([data-expanded]) .et-tree-node-chevron{rotate:180deg}.et-tree-node:dir(rtl) .et-tree-node-chevron{rotate:-90deg}.et-tree-node:dir(rtl):where([data-expanded]) .et-tree-node-chevron{rotate:180deg}.et-tree-node:where([data-error]) .et-tree-node-marker{color:var(--et-tree-error-color, var(--et-surface-color-muted-solid, GrayText))}.et-tree-node:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 7%,transparent)}.et-tree-node:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 14%,transparent)}.et-tree-node:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-tree-node:where([data-selected]){background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 16%,transparent);color:var(--et-theme-color-ink-solid, inherit)}.et-tree-node:where([data-selected]):hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 24%,transparent)}.et-tree-node:where([data-selected]):active{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 32%,transparent)}.et-tree-node:where([aria-disabled]){color:var(--et-surface-color-muted-solid, GrayText);cursor:default}.et-tree-node:where([aria-disabled]):hover,.et-tree-node:where([aria-disabled]):active{background:transparent}.et-tree:where([aria-multiselectable]) .et-tree-node:after{content:\"\";flex:none;inline-size:4px;block-size:8px;margin-inline:3px;border:solid var(--et-theme-color-primary-solid, currentColor);border-width:0 2px 2px 0;rotate:45deg;opacity:0;transition:opacity var(--et-tree-duration) ease}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]){background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 8%,transparent);color:inherit}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]):after{opacity:1}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]):hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 14%,transparent)}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]):active{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 20%,transparent)}.et-tree-status{color:var(--et-surface-color-muted-solid, GrayText)}.et-tree-status:where(.et-tree-status--error){color:var(--et-tree-error-color, var(--et-surface-color-muted-solid, GrayText));cursor:pointer}.et-tree-status:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}@media(prefers-reduced-motion:reduce){.et-tree-node,.et-tree-node:after,.et-tree-node .et-tree-node-chevron{transition:none}}}\n"], dependencies: [{ kind: "directive", type: TreeNodeDirective, selector: "[etTreeNode]", inputs: ["row"], exportAs: ["etTreeNode"] }, { kind: "component", type: TreeMarkerComponent, selector: "et-tree-marker", inputs: ["marker"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
65566
+ }
65567
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TreeComponent, decorators: [{
65568
+ type: Component,
65569
+ args: [{ selector: 'et-tree', encapsulation: ViewEncapsulation.None, imports: [TreeNodeDirective, TreeMarkerComponent, NgTemplateOutlet], hostDirectives: [
65570
+ {
65571
+ directive: TreeDirective,
65572
+ inputs: ['dataSource', 'compareWith', 'selectionMode', 'value', 'expandedValues', 'disabled', 'toErrorMessage'],
65573
+ outputs: ['valueChange', 'expandedValuesChange', 'nodeActivate'],
65574
+ },
65575
+ ], host: {
65576
+ class: 'et-tree',
65577
+ }, template: "@for (entry of rows(); track entry.row.node) {\n <div [row]=\"entry.row\" [style.--_et-tree-node-depth]=\"entry.row.level - 1\" class=\"et-tree-node\" etTreeNode>\n <et-tree-marker [marker]=\"entry.marker\" />\n\n <span class=\"et-tree-node-label\">\n @if (tree.nodeTemplate(); as nodeTemplate) {\n <ng-container [ngTemplateOutlet]=\"nodeTemplate.templateRef\" [ngTemplateOutletContext]=\"entry.context\" />\n } @else {\n {{ entry.row.node.label }}\n }\n </span>\n\n @if (entry.row.childrenError; as error) {\n <span class=\"et-tree-node-error\">{{ error }} \u00B7 {{ retryLabel() }}</span>\n }\n </div>\n}\n\n<!-- The status lines are `treeitem`s rather than plain text: everything inside a `role=\"tree\"` has to be\n one. The error line is also the retry control - selecting it reloads, the same way activating a\n branch whose children failed does. -->\n@if (tree.rootStatus() === 'loading') {\n <div class=\"et-tree-status\" aria-disabled=\"true\" aria-level=\"1\" aria-selected=\"false\" role=\"treeitem\">\n <et-tree-marker marker=\"spinner\" />\n {{ loadingLabel() }}\n </div>\n} @else if (tree.rootError(); as error) {\n <div\n (click)=\"tree.retry(null)\"\n (keydown.enter)=\"tree.retry(null)\"\n class=\"et-tree-status et-tree-status--error\"\n aria-level=\"1\"\n aria-selected=\"false\"\n role=\"treeitem\"\n tabindex=\"0\"\n >\n <et-tree-marker marker=\"warning\" />\n {{ error }} \u00B7 {{ retryLabel() }}\n </div>\n} @else if (!rows().length) {\n <div class=\"et-tree-status\" aria-disabled=\"true\" aria-level=\"1\" aria-selected=\"false\" role=\"treeitem\">\n {{ emptyLabel() }}\n </div>\n}\n", styles: ["@layer components{@property --et-tree-indent{syntax: \"<length>\"; inherits: true; initial-value: 18px;}@property --et-tree-node-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 5px;}@property --et-tree-node-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-tree-node-gap{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-tree-node-radius{syntax: \"<length>\"; inherits: true; initial-value: 6px;}@property --et-tree-marker-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-tree-duration{syntax: \"<time>\"; inherits: true; initial-value: .15s;}@property --_et-tree-node-depth{syntax: \"<number>\"; inherits: false; initial-value: 0;}.et-tree{display:block;color:var(--et-surface-color-solid, CanvasText)}.et-tree-node,.et-tree-status{display:flex;align-items:center;gap:var(--et-tree-node-gap);padding-block:var(--et-tree-node-padding-block);padding-inline:calc(var(--et-tree-node-padding-inline) + var(--_et-tree-node-depth) * var(--et-tree-indent)) var(--et-tree-node-padding-inline);border-radius:var(--et-tree-node-radius);box-sizing:border-box}.et-tree-node-marker{display:flex;flex:none;align-items:center;justify-content:center;inline-size:var(--et-tree-marker-size);block-size:var(--et-tree-marker-size);color:var(--et-surface-color-muted-solid, GrayText)}.et-tree-node-marker .et-tree-node-chevron{inline-size:100%;block-size:100%;rotate:90deg;transition:rotate var(--et-tree-duration) cubic-bezier(.25,0,.1,1)}.et-tree-node{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color var(--et-tree-duration) ease}.et-tree-node .et-tree-node-label{flex:1;min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.et-tree-node .et-tree-node-error{flex:none;color:var(--et-tree-error-color, var(--et-surface-color-muted-solid, GrayText));font-size:.875em}.et-tree-node:where([data-expanded]) .et-tree-node-chevron{rotate:180deg}.et-tree-node:dir(rtl) .et-tree-node-chevron{rotate:-90deg}.et-tree-node:dir(rtl):where([data-expanded]) .et-tree-node-chevron{rotate:180deg}.et-tree-node:where([data-error]) .et-tree-node-marker{color:var(--et-tree-error-color, var(--et-surface-color-muted-solid, GrayText))}.et-tree-node:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 7%,transparent)}.et-tree-node:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 14%,transparent)}.et-tree-node:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-tree-node:where([data-selected]){background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 16%,transparent);color:var(--et-theme-color-ink-solid, inherit)}.et-tree-node:where([data-selected]):hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 24%,transparent)}.et-tree-node:where([data-selected]):active{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 32%,transparent)}.et-tree-node:where([aria-disabled]){color:var(--et-surface-color-muted-solid, GrayText);cursor:default}.et-tree-node:where([aria-disabled]):hover,.et-tree-node:where([aria-disabled]):active{background:transparent}.et-tree:where([aria-multiselectable]) .et-tree-node:after{content:\"\";flex:none;inline-size:4px;block-size:8px;margin-inline:3px;border:solid var(--et-theme-color-primary-solid, currentColor);border-width:0 2px 2px 0;rotate:45deg;opacity:0;transition:opacity var(--et-tree-duration) ease}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]){background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 8%,transparent);color:inherit}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]):after{opacity:1}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]):hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 14%,transparent)}.et-tree:where([aria-multiselectable]) .et-tree-node:where([data-selected]):active{background:color-mix(in srgb,var(--et-theme-color-primary-solid, gray) 20%,transparent)}.et-tree-status{color:var(--et-surface-color-muted-solid, GrayText)}.et-tree-status:where(.et-tree-status--error){color:var(--et-tree-error-color, var(--et-surface-color-muted-solid, GrayText));cursor:pointer}.et-tree-status:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}@media(prefers-reduced-motion:reduce){.et-tree-node,.et-tree-node:after,.et-tree-node .et-tree-node-chevron{transition:none}}}\n"] }]
65578
+ }], propDecorators: { loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], retryLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "retryLabel", required: false }] }] } });
65579
+
65580
+ const TREE_IMPORTS = [TreeComponent, TreeDirective, TreeNodeDirective, TreeNodeDefDirective];
65581
+
63753
65582
  /**
63754
65583
  * Generated bundle index. Do not edit.
63755
65584
  */
63756
65585
 
63757
- export { ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, 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_SHAPES, AVATAR_SIZES, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, AvatarComponent, AvatarGroupComponent, BADGE_IMPORTS, BADGE_VARIANTS, BANNER_IMPORTS, BANNER_LABELS, BANNER_TYPES, BOLD_ICON, BRACKET_CARD_CONTEXT, BRACKET_DATA_LAYOUT, BRACKET_DEFAULTS, BRACKET_DENSITY, BRACKET_DENSITY_PRESETS, BRACKET_ERROR_CODES, BRACKET_IMPORTS, BRACKET_LABELS, BRACKET_ROUND_MIRROR_TYPE, BRACKET_SWISS_GROUP_COLOR_TYPE, 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, BracketComponent, BracketDefaultContinueComponent, BracketDefaultFinalMatchComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketMap, BracketRoundsListComponent, BrandLoaderComponent, BreadcrumbCollapseDirective, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbOverflowComponent, BreadcrumbSegmentDirective, BreadcrumbSeoDirective, BreadcrumbSeparatorDirective, 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, CHECKBOX_GROUP_IMPORTS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CIRCLE_CHECK_ICON, CIRCLE_INFO_ICON, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_BLOCK_ICON, CODE_ICON, COLOR_INPUT_IMPORTS, COMMON_BRACKET_ROUND_TYPE, COPY_BUTTON_IMPORTS, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CalendarHeaderDirective, CardComponent, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxGroupSelectAllComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, 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_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_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_CHIP_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_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_PIP_WINDOW_CONFIG, 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_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DESCRIPTION_IMPORTS, DESCRIPTION_LIST_IMPORTS, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, 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, DescriptionComponent, DescriptionListComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, EMPTY_STATE_IMPORTS, ET_BUILT_IN_ICON_NAMES, EYE_ICON, EYE_SLASH_ICON, EmptyStateComponent, FACEBOOK_PLAYER_TOKEN, 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, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_QUERY_ERROR_LABELS, GRID_2X2_ICON, GRID_DEBUG_IMPORTS, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GROUP_BRACKET_ROUND_TYPE, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemRef, 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, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_LABELS, LOCATION_ICON, LOCK_ICON, LabelDirective, 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_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, 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_STATUS, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, 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_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, 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, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGE_SIZE_SELECT_IMPORTS, PAGINATION_IMPORTS, PAGINATION_LABELS, 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, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PROGRESS_STEPS_IMPORTS, PROGRESS_STEP_STATES, PageSizeSelectComponent, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, ProgressStepComponent, ProgressStepsComponent, QUERY_DEVTOOLS_IMPORTS, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QUOTE_ICON, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsJsonStylesComponent, QueryDevtoolsTimelineStylesComponent, QueryDevtoolsToggleComponent, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_GROUP_IMPORTS, RADIO_VARIANTS, 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, RichTextEditorImageStylesComponent, RichTextEditorImageToolComponent, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableStylesComponent, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, SCHEDULER_ERROR_CODES, SCHEDULER_FEATURE_HOST, SCHEDULER_IMPORTS, SCHEDULER_LABELS, SCROLLABLE_DARKEN_IMPORTS, SCROLLABLE_DRAG_IMPORTS, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SCROLLABLE_NAVIGATION_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SEGMENTED_BUTTON_IMPORTS, 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, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_MARK_VALUE_ATTRIBUTE, SLIDER_TOKEN, SNAP_HYSTERESIS, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STANDINGS_ERROR_CODES, STANDINGS_IMPORTS, STANDINGS_LABELS, STAR_ICON, STREAM_ALL_IMPORTS, STREAM_CONSENT_TOKEN, STREAM_DAILYMOTION_IMPORTS, 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, SWISS_ADVANCE_WINS, SWISS_BRACKET_ROUND_TYPE, SWISS_ELIMINATE_LOSSES, SWITCH_IMPORTS, SchedulerAgendaDirective, SchedulerAgendaViewComponent, SchedulerBadgeChainCountComponent, SchedulerBadgeChainCountDirective, SchedulerBadgeColorDotComponent, SchedulerBadgeColorDotDirective, SchedulerBadgeLocationComponent, SchedulerBadgeLocationDirective, SchedulerBadgeTimeRangeComponent, SchedulerBadgeTimeRangeDirective, SchedulerBadgeTitleComponent, SchedulerBadgeTitleDirective, SchedulerComponent, SchedulerDirective, SchedulerMonthDirective, SchedulerMonthViewComponent, SchedulerTimeGridDirective, SchedulerTimeGridViewComponent, ScrollableActiveChildDirective, ScrollableButtonsComponent, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksComponent, ScrollableNavigationComponent, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, 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, 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_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_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_ROW_EXPANSION_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, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TOURNAMENT_MODE, TRIANGLE_EXCLAMATION_ICON, TROPHY_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCellDirective, TableCellEditDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableCsvExportDirective, TableDetailStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableGroupHeaderRowComponent, TableGroupHeadersDirective, TableHeaderCellDirective, TableInlineEditDirective, TableInlineEditStylesComponent, TableKeyboardNavDirective, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableRowDetailComponent, TableRowExpansionDirective, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableSkeletonDirective, TableSkeletonRowsComponent, TableStatePersistenceDirective, TableStickyColumnsDirective, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerColumnDirective, TimePickerComponent, TimePickerDirective, TimePickerOptionDirective, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNDO_ICON, UNIT_MS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, abortFullscreenAnimation, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, autoPlace, bottomSheetOverlayStrategy, bracketFitsWidth, bracketNaturalWidth, buildAnchoredRuntimePositionStrategy, canHaveChildren, cascaderFromQuery, centeredOverlayStrategy, clampPosition, clampResizeRect, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, compactLayout, computeGeometry, computeGridHeight, countDescendants, createAnchoredPanelController, createAutoScroller, createBracket, createBracketBase, createCardMask, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createFixedLengthRangeStrategy, createGridAdapter, createIbanMask, createMatchesMapBase, createNewMatchParticipantBase, createNormalizedBracketMatch, createNotificationPromiseFn, createNotificationRef, createOverlayOpener, createOverlayRef, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createParticipantsMapBase, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createRoundsMapBase, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableStateStorage, createV2DropzoneUpload, createWeekRangeStrategy, defaultCompareWith, defaultDropzoneRejectionMessage, defineOverlay, defineQueryParamOverlay, deriveDurationFormatSpec, deserializeGridLayout, deserializeTableState, dialogOverlayStrategy, disposeDropzoneEntry, doubleEliminationBracketLayout, dropzoneFiles, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, findCollision, findNextRelevantHtmlElement, findScrollableAncestor, formatDuration, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateBracketRoundSwissGroupMaps, generateMatchPosition, generateMatchRelationPositions, generateMatchRelationsNew, generateRoundRelationsNew, generateRoundTypeFromEthleteRoundType, generateTournamentModeFormEthleteRounds, getAvailableSwissGroupsForRound, getClosestOverlay, getOriginCoordinatesAndDimensions, getSwissGroupColorType, hysteresisRound, iconRegistryKey, indexOfNode, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBannerLabels, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBracketLabels, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChipLabels, injectDateFormat, injectDateLocale, injectDateTimeLabels, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectMatchLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSchedulerFeatureHost, injectSchedulerLabels, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStandingsLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableCsvExport, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isTargetInsideOverlayTree, isTouchEvent, itemsCollide, kindOf, leftSheetOverlayStrategy, legacyQueryErrorSource, mapLayoutToBreakpoint, matchCountryByDialCode, matchParticipantDisplayName, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, mirroredDoubleEliminationBracketLayout, mirroredSingleEliminationBracketLayout, mountRichTextEditorImageStyles, mountRichTextEditorTableStyles, nodesEqual, normalizeEthleteBracketMatch, normalizeEthleteGroupRanking, normalizeEthleteMatch, normalizeEthleteMatchStatus, normalizeEthleteMedia, normalizeEthleteParticipant, normalizeEthletePlacement, normalizePictureSizes, normalizePictureSource, paginate, parseDuration, phoneCountryFlag, phoneCountryName, pixelRectsEqual, positionToPixelRect, positionsEqual, projectDragCell, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBannerLabels, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBracketLabels, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChipLabels, provideDateFormat, provideDateLocale, provideDateTimeLabels, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldLabels, provideFormSupport, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideMatchLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorAutoformat, provideRichTextEditorBlockquoteTool, provideRichTextEditorCodeBlockTool, provideRichTextEditorDefaultTools, provideRichTextEditorFloatingToolbar, provideRichTextEditorHeadingTool, provideRichTextEditorImageTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorLinkEditor, provideRichTextEditorLinkTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSchedulerLabels, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStandingsLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerSingleton, requiredLanguages, resizeSpanBounds, resolveBracketLayout, resolveBreakpoint, resolveClosestOverlay, resolveCollisions, resolveFilterOverlaySubmitButton, resolveNotificationStatusIcon, resolveTableCsvRows, richTextEditorToolLabel, rightSheetOverlayStrategy, rowsToPixelHeight, schedulerFeatureConfig, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, setupRichTextEditorFloatingToolbar, setupRichTextEditorLinkEditor, singleEliminationBracketLayout, snapResizeSpan, sortRows, spanHeight, spanWidth, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, startImageUpload, startOfCalendarUnit, stripTrunkZero, supportPresentationIncludesState, swissBracketLayout, tableCsvRowsFromPages, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, tableToCsv, toChildrenObservable, toGridPosition, toNotificationContent, toPathObservable, toSearchObservable, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, wireFormSupport, withPictureBaseUrl };
65586
+ export { ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, 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_SHAPES, AVATAR_SIZES, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, AvatarComponent, AvatarGroupComponent, BADGE_IMPORTS, BADGE_VARIANTS, BANNER_IMPORTS, BANNER_LABELS, BANNER_TYPES, BOLD_ICON, BRACKET_CARD_CONTEXT, BRACKET_DATA_LAYOUT, BRACKET_DEFAULTS, BRACKET_DENSITY, BRACKET_DENSITY_PRESETS, BRACKET_ERROR_CODES, BRACKET_IMPORTS, BRACKET_LABELS, BRACKET_ROUND_MIRROR_TYPE, BRACKET_SWISS_GROUP_COLOR_TYPE, 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, BracketComponent, BracketDefaultContinueComponent, BracketDefaultFinalMatchComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketMap, BracketRoundsListComponent, BrandLoaderComponent, BreadcrumbCollapseDirective, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbOverflowComponent, BreadcrumbSegmentDirective, BreadcrumbSeoDirective, BreadcrumbSeparatorDirective, 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, CHECKBOX_GROUP_IMPORTS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CIRCLE_CHECK_ICON, CIRCLE_INFO_ICON, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_BLOCK_ICON, CODE_ICON, COLOR_INPUT_IMPORTS, COMMON_BRACKET_ROUND_TYPE, COPY_BUTTON_IMPORTS, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CalendarHeaderDirective, CardComponent, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxGroupSelectAllComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, 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_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_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_CHIP_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_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_PIP_WINDOW_CONFIG, 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_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DESCRIPTION_IMPORTS, DESCRIPTION_LIST_IMPORTS, DIVIDER_IMPORTS, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, 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, DescriptionComponent, DescriptionListComponent, DividerComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, EMPTY_STATE_IMPORTS, ET_BUILT_IN_ICON_NAMES, EYE_ICON, EYE_SLASH_ICON, EmptyStateComponent, FACEBOOK_PLAYER_TOKEN, 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, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_QUERY_ERROR_LABELS, GRID_2X2_ICON, GRID_DEBUG_IMPORTS, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GROUP_BRACKET_ROUND_TYPE, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemRef, 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, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_LABELS, LOCATION_ICON, LOCK_ICON, LabelDirective, 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_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, 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_STATUS, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, 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_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, 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, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGE_SIZE_SELECT_IMPORTS, PAGINATION_IMPORTS, PAGINATION_LABELS, 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, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PROGRESS_STEPS_IMPORTS, PROGRESS_STEP_STATES, PageSizeSelectComponent, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, ProgressStepComponent, ProgressStepsComponent, QUERY_DEVTOOLS_IMPORTS, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QUOTE_ICON, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsJsonStylesComponent, QueryDevtoolsTimelineStylesComponent, QueryDevtoolsToggleComponent, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_GROUP_IMPORTS, RADIO_VARIANTS, 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, RichTextEditorImageStylesComponent, RichTextEditorImageToolComponent, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableStylesComponent, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, SCHEDULER_EDIT_SURFACE_HOST, SCHEDULER_EDIT_SURFACE_OVERLAY, SCHEDULER_ERROR_CODES, SCHEDULER_FEATURE_HOST, SCHEDULER_IMPORTS, SCHEDULER_LABELS, SCROLLABLE_DARKEN_IMPORTS, SCROLLABLE_DRAG_IMPORTS, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SCROLLABLE_NAVIGATION_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SEGMENTED_BUTTON_IMPORTS, 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, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_MARK_VALUE_ATTRIBUTE, SLIDER_TOKEN, SNAP_HYSTERESIS, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STANDINGS_ERROR_CODES, STANDINGS_IMPORTS, STANDINGS_LABELS, STAR_ICON, STREAM_ALL_IMPORTS, STREAM_CONSENT_TOKEN, STREAM_DAILYMOTION_IMPORTS, 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, SWISS_BRACKET_ROUND_TYPE, SWITCH_IMPORTS, SchedulerActionAddAppointmentDirective, SchedulerActionAddSubAppointmentDirective, SchedulerActionDeleteDirective, SchedulerAgendaDirective, SchedulerAgendaViewComponent, SchedulerBadgeChainCountComponent, SchedulerBadgeChainCountDirective, SchedulerBadgeColorDotComponent, SchedulerBadgeColorDotDirective, SchedulerBadgeLocationComponent, SchedulerBadgeLocationDirective, SchedulerBadgeTimeRangeComponent, SchedulerBadgeTimeRangeDirective, SchedulerBadgeTitleComponent, SchedulerBadgeTitleDirective, SchedulerComponent, SchedulerDirective, SchedulerEditColorComponent, SchedulerEditColorDirective, SchedulerEditDescriptionComponent, SchedulerEditDescriptionDirective, SchedulerEditLocationComponent, SchedulerEditLocationDirective, SchedulerEditSurfaceComponent, SchedulerEditSurfaceDirective, SchedulerEditTimeRangeComponent, SchedulerEditTimeRangeDirective, SchedulerEditTitleComponent, SchedulerEditTitleDirective, SchedulerMonthDirective, SchedulerMonthViewComponent, SchedulerTimeGridDirective, SchedulerTimeGridViewComponent, ScrollableActiveChildDirective, ScrollableButtonsComponent, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksComponent, ScrollableNavigationComponent, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, 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, 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_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_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_ROW_EXPANSION_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, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLBAR_IMPORTS, TOOLBAR_ORIENTATIONS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TOURNAMENT_MODE, TRASH_ICON, TREE_ERROR_CODES, TREE_IMPORTS, 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, TableCellDirective, TableCellEditDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableCsvExportDirective, TableDetailStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableGroupHeaderRowComponent, TableGroupHeadersDirective, TableHeaderCellDirective, TableInlineEditDirective, TableInlineEditStylesComponent, TableKeyboardNavDirective, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableRowDetailComponent, TableRowExpansionDirective, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableSkeletonDirective, TableSkeletonRowsComponent, TableStatePersistenceDirective, TableStickyColumnsDirective, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerColumnDirective, TimePickerComponent, TimePickerDirective, TimePickerOptionDirective, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, ToolbarComponent, ToolbarDirective, TooltipComponent, TooltipDirective, TreeComponent, TreeDirective, TreeMarkerComponent, TreeNodeDefDirective, TreeNodeDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNDO_ICON, UNIT_MS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, abortFullscreenAnimation, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, autoPlace, bottomSheetOverlayStrategy, bracketFitsWidth, bracketNaturalWidth, buildAnchoredRuntimePositionStrategy, canHaveChildren, cascaderFromQuery, centeredOverlayStrategy, clampPosition, clampResizeRect, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, compactLayout, computeGeometry, computeGridHeight, countDescendants, createAnchoredPanelController, createAutoScroller, createCardMask, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createFixedLengthRangeStrategy, createGridAdapter, createIbanMask, createNormalizedBracketMatch, createNotificationPromiseFn, createNotificationRef, createOverlayOpener, createOverlayRef, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableStateStorage, createV2DropzoneUpload, createWeekRangeStrategy, defaultCompareWith$1 as defaultCompareWith, defaultDropzoneRejectionMessage, defineOverlay, defineQueryParamOverlay, deriveDurationFormatSpec, deserializeGridLayout, deserializeTableState, dialogOverlayStrategy, disposeDropzoneEntry, doubleEliminationBracketLayout, dropzoneFiles, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, findCollision, findNextRelevantHtmlElement, findScrollableAncestor, formatDuration, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateRoundTypeFromEthleteRoundType, generateTournamentModeFormEthleteRounds, getClosestOverlay, getOriginCoordinatesAndDimensions, hysteresisRound, iconRegistryKey, indexOfNode, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBannerLabels, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBracketLabels, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChipLabels, injectDateFormat, injectDateLocale, injectDateTimeLabels, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectMatchLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSchedulerEditSurfaceHost, injectSchedulerFeatureHost, injectSchedulerLabels, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStandingsLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableCsvExport, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isTargetInsideOverlayTree, isTouchEvent, itemsCollide, kindOf, leftSheetOverlayStrategy, legacyQueryErrorSource, mapLayoutToBreakpoint, matchCountryByDialCode, matchParticipantDisplayName, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, mirroredDoubleEliminationBracketLayout, mirroredSingleEliminationBracketLayout, mountRichTextEditorImageStyles, mountRichTextEditorTableStyles, nodesEqual$1 as nodesEqual, normalizeEthleteBracketMatch, normalizeEthleteGroupRanking, normalizeEthleteMatch, normalizeEthleteMatchStatus, normalizeEthleteMedia, normalizeEthleteParticipant, normalizeEthletePlacement, normalizePictureSizes, normalizePictureSource, paginate, parseDuration, phoneCountryFlag, phoneCountryName, pixelRectsEqual, positionToPixelRect, positionsEqual, projectDragCell, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBannerLabels, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBracketLabels, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChipLabels, provideDateFormat, provideDateLocale, provideDateTimeLabels, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldLabels, provideFormSupport, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideMatchLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorAutoformat, provideRichTextEditorBlockquoteTool, provideRichTextEditorCodeBlockTool, provideRichTextEditorDefaultTools, provideRichTextEditorFloatingToolbar, provideRichTextEditorHeadingTool, provideRichTextEditorImageTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorLinkEditor, provideRichTextEditorLinkTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSchedulerLabels, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStandingsLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerSingleton, requiredLanguages, resizeSpanBounds, resolveBracketLayout, resolveBreakpoint, resolveClosestOverlay, resolveCollisions, resolveFilterOverlaySubmitButton, resolveNotificationStatusIcon, resolveTableCsvRows, richTextEditorToolLabel, rightSheetOverlayStrategy, rowsToPixelHeight, schedulerFeatureConfig, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, setupRichTextEditorFloatingToolbar, setupRichTextEditorLinkEditor, singleEliminationBracketLayout, snapResizeSpan, sortRows, spanHeight, spanWidth, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, startImageUpload, startOfCalendarUnit, stripTrunkZero, supportPresentationIncludesState, swissBracketLayout, tableCsvRowsFromPages, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, tableToCsv, toChildrenObservable$1 as toChildrenObservable, toGridPosition, toNotificationContent, toPathObservable, toSearchObservable, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, wireFormSupport, withPictureBaseUrl };
63758
65587
  //# sourceMappingURL=ethlete-components.mjs.map