@ethlete/components 0.1.0-beta.4 → 0.1.0-next.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ChangeDetectionStrategy, ViewEncapsulation, Component, Directive, input, booleanAttribute, signal, effect, numberAttribute, computed, inject, ElementRef, InjectionToken, afterNextRender, untracked, DestroyRef, model, viewChild, Injector, output, ApplicationRef, EnvironmentInjector, DOCUMENT, createEnvironmentInjector, createComponent, TemplateRef, linkedSignal, afterRenderEffect, contentChild, inputBinding, PLATFORM_ID, isDevMode, contentChildren } from '@angular/core';
2
+ import { ChangeDetectionStrategy, ViewEncapsulation, Component, Directive, input, booleanAttribute, signal, effect, numberAttribute, computed, inject, ElementRef, InjectionToken, afterNextRender, untracked, DestroyRef, model, viewChild, Injector, output, ApplicationRef, EnvironmentInjector, DOCUMENT as DOCUMENT$1, createEnvironmentInjector, createComponent, TemplateRef, linkedSignal, afterRenderEffect, contentChild, inputBinding, PLATFORM_ID, isDevMode, contentChildren } from '@angular/core';
3
3
  import * as i2 from '@ethlete/core';
4
- import { injectStyleManager, createCanAnimateSignal, ColorInteractiveDirective, ProvideColorDirective, RuntimeError, injectErrorTheme, signalElementDimensions, createProvider, AnimatableDirective, ColorInteractiveContainerDirective, ColorInteractiveExcludeDirective, ProvideSurfaceDirective, SURFACE_PROVIDER, injectSurfaceThemes, resolveSurfaceByElevation, ColorInteractiveHasFocusDirective, createStaticRootProvider, signalHostElementDimensions, signalHostStyles, DragHandleDirective, injectRenderer, injectLocale, ResizeHandlesComponent, ANIMATED_LIFECYCLE_TOKEN, injectSurfaceContextTracker, AnimatedLifecycleDirective, createRootProvider, injectOverlayRuntime, typedBreakpointTransform, signalElementChildren, signalElementScrollState, signalElementIntersection, signalHostAttributes, signalHostClasses, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, signalClasses, useCursorDragScroll, signalStyles, getScrollSnapTarget, ScrollObserverDirective, ScrollObserverStartDirective, ScrollObserverEndDirective, injectViewportSize, createFlipAnimation, signalHostElementIntersection, injectHostElement, setInputSignal, SurfaceInteractiveDirective, injectRouterEvent, canUseSessionMemory, createAutoSessionMemoryKey, createSessionMemory, COLOR_PROVIDER, injectFocusVisibleTracker } from '@ethlete/core';
5
- import { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';
4
+ import { injectStyleManager, SurfaceInteractiveDirective, createCanAnimateSignal, ColorInteractiveDirective, ProvideColorDirective, RuntimeError, injectErrorTheme, signalElementDimensions, createProvider, AnimatableDirective, ColorInteractiveContainerDirective, ColorInteractiveExcludeDirective, ProvideSurfaceDirective, SURFACE_PROVIDER, injectSurfaceThemes, resolveSurfaceByElevation, ColorInteractiveHasFocusDirective, injectRenderer, htmlToMarkdown, markdownToHtml, createStaticRootProvider, signalHostElementDimensions, DragHandleDirective, injectLocale, ResizeHandlesComponent, ANIMATED_LIFECYCLE_TOKEN, injectSurfaceContextTracker, AnimatedLifecycleDirective, createRootProvider, injectOverlayRuntime, typedBreakpointTransform, signalElementChildren, signalElementScrollState, signalElementIntersection, signalHostAttributes, signalHostClasses, signalHostStyles, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, signalClasses, useCursorDragScroll, signalStyles, getScrollSnapTarget, ScrollObserverDirective, ScrollObserverStartDirective, ScrollObserverEndDirective, injectViewportSize, createFlipAnimation, signalHostElementIntersection, injectHostElement, setInputSignal, injectRouterEvent, canUseSessionMemory, createAutoSessionMemoryKey, createSessionMemory, COLOR_PROVIDER, injectFocusVisibleTracker } from '@ethlete/core';
5
+ import { NgTemplateOutlet, DOCUMENT, NgComponentOutlet, isPlatformBrowser } from '@angular/common';
6
6
  import { toObservable, takeUntilDestroyed, outputToObservable, outputFromObservable, rxResource } from '@angular/core/rxjs-interop';
7
- import { switchMap, EMPTY, filter, tap, take, of, timer, animationFrameScheduler, Subject, fromEvent, debounceTime, map, exhaustMap, takeUntil, finalize, distinctUntilChanged, Observable, shareReplay, catchError, interval } from 'rxjs';
7
+ import { switchMap, EMPTY, filter, tap, fromEvent, timer, take, of, animationFrameScheduler, Subject, debounceTime, map, exhaustMap, takeUntil, finalize, distinctUntilChanged, Observable, shareReplay, catchError, interval } from 'rxjs';
8
8
  import { DomSanitizer } from '@angular/platform-browser';
9
+ import { tap as tap$1 } from 'rxjs/operators';
9
10
  import * as i1 from '@angular/router';
10
11
  import { RouterLinkActive, NavigationEnd, RouterLink } from '@angular/router';
11
12
 
@@ -374,21 +375,27 @@ class ButtonDirective {
374
375
  this.type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
375
376
  this.pressed = input(false, { ...(ngDevMode ? { debugName: "pressed" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
376
377
  this.emitAriaPressed = input(true, { ...(ngDevMode ? { debugName: "emitAriaPressed" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
378
+ // Opt-in: keep the button visually neutral (surface-themed) until it's pressed, only picking
379
+ // up the provided color theme once active — for toggle-style buttons (e.g. a formatting
380
+ // toolbar) where every button always being tinted by the ambient color theme reads as noise.
381
+ this.mutedUntilPressed = input(false, { ...(ngDevMode ? { debugName: "mutedUntilPressed" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
377
382
  this.IS_BUTTON = this.elementRef.nativeElement.tagName === 'BUTTON';
378
383
  this.IS_ANCHOR = this.elementRef.nativeElement.tagName === 'A';
379
384
  this.isInactive = computed(() => this.disabled() || this.loading(), ...(ngDevMode ? [{ debugName: "isInactive" }] : /* istanbul ignore next */ []));
380
385
  }
381
386
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
382
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: ButtonDirective, isStandalone: true, selector: "[etButton]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, emitAriaPressed: { classPropertyName: "emitAriaPressed", publicName: "emitAriaPressed", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-loading": "loading() ? true : null", "attr.data-pressed": "pressed() ? true : null", "attr.disabled": "IS_BUTTON && isInactive() ? \"\" : null", "attr.aria-busy": "loading() ? true : null", "attr.aria-disabled": "isInactive() ? true : null", "attr.aria-pressed": "emitAriaPressed() && pressed() ? true : null", "attr.type": "IS_BUTTON ? type() : null", "attr.tabindex": "IS_ANCHOR && isInactive() ? -1 : null" } }, exportAs: ["etButton"], ngImport: i0 }); }
387
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: ButtonDirective, isStandalone: true, selector: "[etButton]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, emitAriaPressed: { classPropertyName: "emitAriaPressed", publicName: "emitAriaPressed", isSignal: true, isRequired: false, transformFunction: null }, mutedUntilPressed: { classPropertyName: "mutedUntilPressed", publicName: "mutedUntilPressed", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-loading": "loading() ? true : null", "attr.data-pressed": "pressed() ? true : null", "attr.data-muted-until-pressed": "mutedUntilPressed() ? true : null", "attr.disabled": "IS_BUTTON && isInactive() ? \"\" : null", "attr.aria-busy": "loading() ? true : null", "attr.aria-disabled": "isInactive() ? true : null", "attr.aria-pressed": "emitAriaPressed() && pressed() ? true : null", "attr.type": "IS_BUTTON ? type() : null", "attr.tabindex": "IS_ANCHOR && isInactive() ? -1 : null" } }, exportAs: ["etButton"], hostDirectives: [{ directive: i2.SurfaceInteractiveDirective }], ngImport: i0 }); }
383
388
  }
384
389
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ButtonDirective, decorators: [{
385
390
  type: Directive,
386
391
  args: [{
387
392
  selector: '[etButton]',
388
393
  exportAs: 'etButton',
394
+ hostDirectives: [SurfaceInteractiveDirective],
389
395
  host: {
390
396
  '[attr.data-loading]': 'loading() ? true : null',
391
397
  '[attr.data-pressed]': 'pressed() ? true : null',
398
+ '[attr.data-muted-until-pressed]': 'mutedUntilPressed() ? true : null',
392
399
  '[attr.disabled]': 'IS_BUTTON && isInactive() ? "" : null',
393
400
  '[attr.aria-busy]': 'loading() ? true : null',
394
401
  '[attr.aria-disabled]': 'isInactive() ? true : null',
@@ -397,7 +404,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
397
404
  '[attr.tabindex]': 'IS_ANCHOR && isInactive() ? -1 : null',
398
405
  },
399
406
  }]
400
- }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], pressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "pressed", required: false }] }], emitAriaPressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitAriaPressed", required: false }] }] } });
407
+ }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], pressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "pressed", required: false }] }], emitAriaPressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitAriaPressed", required: false }] }], mutedUntilPressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "mutedUntilPressed", required: false }] }] } });
401
408
 
402
409
  const BUTTON_SIZES = {
403
410
  XS: 'xs',
@@ -440,7 +447,7 @@ class ButtonComponent {
440
447
  this.pressedVariant = computed(() => (this.buttonDir.pressed() ? PRESSED_VARIANT_MAP$2[this.variant()] : null), ...(ngDevMode ? [{ debugName: "pressedVariant" }] : /* istanbul ignore next */ []));
441
448
  }
442
449
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
443
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: ButtonComponent, isStandalone: true, selector: "[et-button]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, iconAlignment: { classPropertyName: "iconAlignment", publicName: "iconAlignment", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-icon-alignment": "iconAlignment()", "attr.data-variant": "variant()", "attr.data-size": "size()", "attr.data-pressed-variant": "pressedVariant()", "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-button" }, hostDirectives: [{ directive: ButtonDirective, inputs: ["disabled", "disabled", "loading", "loading", "type", "type", "pressed", "pressed"] }, { directive: ButtonStylesDirective }, { directive: i2.ColorInteractiveDirective }, { directive: FocusRingDirective }, { directive: i2.ProvideColorDirective, inputs: ["etProvideColor", "color"] }], ngImport: i0, template: `
450
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: ButtonComponent, isStandalone: true, selector: "[et-button]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, iconAlignment: { classPropertyName: "iconAlignment", publicName: "iconAlignment", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-icon-alignment": "iconAlignment()", "attr.data-variant": "variant()", "attr.data-size": "size()", "attr.data-pressed-variant": "pressedVariant()", "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-button" }, hostDirectives: [{ directive: ButtonDirective, inputs: ["disabled", "disabled", "loading", "loading", "type", "type", "pressed", "pressed", "mutedUntilPressed", "mutedUntilPressed"] }, { directive: ButtonStylesDirective }, { directive: i2.ColorInteractiveDirective }, { directive: FocusRingDirective }, { directive: i2.ProvideColorDirective, inputs: ["etProvideColor", "color"] }], ngImport: i0, template: `
444
451
  @if (iconAlignment() === 'start') {
445
452
  <div class="et-button-icon">
446
453
  <ng-container *ngTemplateOutlet="iconTpl" />
@@ -470,7 +477,7 @@ class ButtonComponent {
470
477
  <ng-template #iconTpl>
471
478
  <ng-content select="[etIcon]" />
472
479
  </ng-template>
473
- `, isInline: true, styles: [".et-button{--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):hover{--et-theme-color-primary-opacity: .24}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):focus-visible{--et-theme-color-primary-opacity: .28}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):active{--et-theme-color-primary-opacity: .32}.et-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
480
+ `, isInline: true, styles: [".et-button{--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):hover{--et-theme-color-primary-opacity: .24}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):focus-visible{--et-theme-color-primary-opacity: .28}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):active{--et-theme-color-primary-opacity: .32}.et-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button[data-muted-until-pressed]:not([data-pressed=true]){--_et-button-color: currentColor}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 32%, transparent);--_et-button-border-color: transparent}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 40%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 44%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 48%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]){--_et-button-background: transparent;--_et-button-border-color: var(--et-surface-interaction-solid)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 12%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 16%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 20%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 16%, transparent);--_et-button-border-color: transparent}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 24%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 28%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 32%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]){--_et-button-background: transparent;--_et-button-border-color: transparent}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 12%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 16%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 20%, transparent)}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
474
481
  }
475
482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ButtonComponent, decorators: [{
476
483
  type: Component,
@@ -507,7 +514,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
507
514
  `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, SpinnerComponent], hostDirectives: [
508
515
  {
509
516
  directive: ButtonDirective,
510
- inputs: ['disabled', 'loading', 'type', 'pressed'],
517
+ inputs: ['disabled', 'loading', 'type', 'pressed', 'mutedUntilPressed'],
511
518
  },
512
519
  ButtonStylesDirective,
513
520
  ColorInteractiveDirective,
@@ -523,7 +530,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
523
530
  '[attr.data-size]': 'size()',
524
531
  '[attr.data-pressed-variant]': 'pressedVariant()',
525
532
  '[attr.data-can-animate]': 'canAnimate.state() || null',
526
- }, styles: [".et-button{--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):hover{--et-theme-color-primary-opacity: .24}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):focus-visible{--et-theme-color-primary-opacity: .28}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):active{--et-theme-color-primary-opacity: .32}.et-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}\n"] }]
533
+ }, styles: [".et-button{--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):hover{--et-theme-color-primary-opacity: .24}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):focus-visible{--et-theme-color-primary-opacity: .28}:is(.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal])):active{--et-theme-color-primary-opacity: .32}.et-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: var(--et-theme-color-primary);--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button[data-muted-until-pressed]:not([data-pressed=true]){--_et-button-color: currentColor}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 32%, transparent);--_et-button-border-color: transparent}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 40%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 44%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 48%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]){--_et-button-background: transparent;--_et-button-border-color: var(--et-surface-interaction-solid)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 12%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 16%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 20%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 16%, transparent);--_et-button-border-color: transparent}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 24%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 28%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 32%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]){--_et-button-background: transparent;--_et-button-border-color: transparent}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):hover:not([disabled]):not([aria-disabled=true]){--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 12%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):focus-visible{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 16%, transparent)}.et-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):active{--_et-button-background: color-mix(in srgb, var(--et-surface-interaction-solid) 20%, transparent)}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}\n"] }]
527
534
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], iconAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconAlignment", required: false }] }] } });
528
535
 
529
536
  class FabComponent {
@@ -635,7 +642,7 @@ class IconButtonComponent {
635
642
  this.pressedVariant = computed(() => (this.buttonDir.pressed() ? PRESSED_VARIANT_MAP$1[this.variant()] : null), ...(ngDevMode ? [{ debugName: "pressedVariant" }] : /* istanbul ignore next */ []));
636
643
  }
637
644
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IconButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
638
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: IconButtonComponent, isStandalone: true, selector: "[et-icon-button]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-variant": "variant()", "attr.data-size": "size()", "attr.data-pressed-variant": "pressedVariant()", "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-icon-button" }, hostDirectives: [{ directive: ButtonDirective, inputs: ["disabled", "disabled", "loading", "loading", "type", "type", "pressed", "pressed"] }, { directive: ButtonStylesDirective }, { directive: i2.ColorInteractiveDirective }, { directive: FocusRingDirective }, { directive: i2.ProvideColorDirective, inputs: ["etProvideColor", "color"] }], ngImport: i0, template: `
645
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: IconButtonComponent, isStandalone: true, selector: "[et-icon-button]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-variant": "variant()", "attr.data-size": "size()", "attr.data-pressed-variant": "pressedVariant()", "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-icon-button" }, hostDirectives: [{ directive: ButtonDirective, inputs: ["disabled", "disabled", "loading", "loading", "type", "type", "pressed", "pressed", "mutedUntilPressed", "mutedUntilPressed"] }, { directive: ButtonStylesDirective }, { directive: i2.ColorInteractiveDirective }, { directive: FocusRingDirective }, { directive: i2.ProvideColorDirective, inputs: ["etProvideColor", "color"] }], ngImport: i0, template: `
639
646
  <div class="et-icon-button-icon">
640
647
  <ng-content select="[etIcon]" />
641
648
  </div>
@@ -649,7 +656,7 @@ class IconButtonComponent {
649
656
  />
650
657
  </div>
651
658
  }
652
- `, isInline: true, styles: ["@property --_et-icon-button-icon-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}.et-icon-button{display:inline-flex;position:relative;align-items:center;justify-content:center;background:var(--et-theme-color-primary);color:var(--et-theme-color-ink-solid);border:none;border-radius:9999px;padding:0;font-size:var(--et-button-font-size);cursor:var(--et-button-cursor);appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;overflow:hidden;flex-shrink:0;--et-theme-color-primary-opacity: 0}.et-icon-button[data-can-animate]{transition:background .12s ease,color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-icon-button:where([data-size=xs]){width:2.8rem;height:2.8rem;--_et-icon-button-icon-size: 1.4rem}.et-icon-button:where([data-size=sm]){width:3.6rem;height:3.6rem;--_et-icon-button-icon-size: 1.8rem}.et-icon-button:where([data-size=md]){width:4rem;height:4rem;--_et-icon-button-icon-size: 2rem}.et-icon-button:where([data-size=lg]){width:4.8rem;height:4.8rem;--_et-icon-button-icon-size: 2.4rem}.et-icon-button:where([data-size=xl]){width:5.6rem;height:5.6rem;--_et-icon-button-icon-size: 2.8rem}.et-icon-button:where([disabled]),.et-icon-button:where([aria-disabled=true]){opacity:var(--et-button-opacity-disabled);cursor:not-allowed;pointer-events:none}.et-icon-button:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button:where([data-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button:where([data-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button:where([data-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;border:var(--et-button-border-width, .1rem) solid var(--et-theme-color-ink-solid)}.et-icon-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button:where([data-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button:where([data-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0}.et-icon-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button .et-icon-button-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%;transition:opacity .12s ease}.et-icon-button .et-icon-button-icon .et-icon{width:var(--_et-icon-button-icon-size);height:var(--_et-icon-button-icon-size)}.et-icon-button[data-loading=true] .et-icon-button-icon{opacity:0}.et-icon-button[data-loading=true] .et-button-loader{opacity:1}\n"], dependencies: [{ kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
659
+ `, isInline: true, styles: ["@property --_et-icon-button-icon-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}.et-icon-button{display:inline-flex;position:relative;align-items:center;justify-content:center;background:var(--et-theme-color-primary);color:var(--et-theme-color-ink-solid);border:none;border-radius:9999px;padding:0;font-size:var(--et-button-font-size);cursor:var(--et-button-cursor);appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;overflow:hidden;flex-shrink:0;--et-theme-color-primary-opacity: 0}.et-icon-button[data-can-animate]{transition:background .12s ease,color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-icon-button:where([data-size=xs]){width:2.8rem;height:2.8rem;--_et-icon-button-icon-size: 1.4rem}.et-icon-button:where([data-size=sm]){width:3.6rem;height:3.6rem;--_et-icon-button-icon-size: 1.8rem}.et-icon-button:where([data-size=md]){width:4rem;height:4rem;--_et-icon-button-icon-size: 2rem}.et-icon-button:where([data-size=lg]){width:4.8rem;height:4.8rem;--_et-icon-button-icon-size: 2.4rem}.et-icon-button:where([data-size=xl]){width:5.6rem;height:5.6rem;--_et-icon-button-icon-size: 2.8rem}.et-icon-button:where([disabled]),.et-icon-button:where([aria-disabled=true]){opacity:var(--et-button-opacity-disabled);cursor:not-allowed;pointer-events:none}.et-icon-button:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button:where([data-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button:where([data-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button:where([data-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;border:var(--et-button-border-width, .1rem) solid var(--et-theme-color-ink-solid)}.et-icon-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button:where([data-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button:where([data-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0}.et-icon-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]){color:currentColor}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 32%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 40%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 44%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 48%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]){background:transparent;border-color:var(--et-surface-interaction-solid)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 12%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 16%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 20%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 16%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 24%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 28%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 32%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]){background:transparent}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 12%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 16%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 20%,transparent)}.et-icon-button .et-icon-button-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%;transition:opacity .12s ease}.et-icon-button .et-icon-button-icon .et-icon{width:var(--_et-icon-button-icon-size);height:var(--_et-icon-button-icon-size)}.et-icon-button[data-loading=true] .et-icon-button-icon{opacity:0}.et-icon-button[data-loading=true] .et-button-loader{opacity:1}\n"], dependencies: [{ kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value", "determinate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
653
660
  }
654
661
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IconButtonComponent, decorators: [{
655
662
  type: Component,
@@ -670,7 +677,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
670
677
  `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SpinnerComponent], hostDirectives: [
671
678
  {
672
679
  directive: ButtonDirective,
673
- inputs: ['disabled', 'loading', 'type', 'pressed'],
680
+ inputs: ['disabled', 'loading', 'type', 'pressed', 'mutedUntilPressed'],
674
681
  },
675
682
  ButtonStylesDirective,
676
683
  ColorInteractiveDirective,
@@ -685,7 +692,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
685
692
  '[attr.data-size]': 'size()',
686
693
  '[attr.data-pressed-variant]': 'pressedVariant()',
687
694
  '[attr.data-can-animate]': 'canAnimate.state() || null',
688
- }, styles: ["@property --_et-icon-button-icon-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}.et-icon-button{display:inline-flex;position:relative;align-items:center;justify-content:center;background:var(--et-theme-color-primary);color:var(--et-theme-color-ink-solid);border:none;border-radius:9999px;padding:0;font-size:var(--et-button-font-size);cursor:var(--et-button-cursor);appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;overflow:hidden;flex-shrink:0;--et-theme-color-primary-opacity: 0}.et-icon-button[data-can-animate]{transition:background .12s ease,color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-icon-button:where([data-size=xs]){width:2.8rem;height:2.8rem;--_et-icon-button-icon-size: 1.4rem}.et-icon-button:where([data-size=sm]){width:3.6rem;height:3.6rem;--_et-icon-button-icon-size: 1.8rem}.et-icon-button:where([data-size=md]){width:4rem;height:4rem;--_et-icon-button-icon-size: 2rem}.et-icon-button:where([data-size=lg]){width:4.8rem;height:4.8rem;--_et-icon-button-icon-size: 2.4rem}.et-icon-button:where([data-size=xl]){width:5.6rem;height:5.6rem;--_et-icon-button-icon-size: 2.8rem}.et-icon-button:where([disabled]),.et-icon-button:where([aria-disabled=true]){opacity:var(--et-button-opacity-disabled);cursor:not-allowed;pointer-events:none}.et-icon-button:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button:where([data-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button:where([data-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button:where([data-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;border:var(--et-button-border-width, .1rem) solid var(--et-theme-color-ink-solid)}.et-icon-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button:where([data-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button:where([data-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0}.et-icon-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button .et-icon-button-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%;transition:opacity .12s ease}.et-icon-button .et-icon-button-icon .et-icon{width:var(--_et-icon-button-icon-size);height:var(--_et-icon-button-icon-size)}.et-icon-button[data-loading=true] .et-icon-button-icon{opacity:0}.et-icon-button[data-loading=true] .et-button-loader{opacity:1}\n"] }]
695
+ }, styles: ["@property --_et-icon-button-icon-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}.et-icon-button{display:inline-flex;position:relative;align-items:center;justify-content:center;background:var(--et-theme-color-primary);color:var(--et-theme-color-ink-solid);border:none;border-radius:9999px;padding:0;font-size:var(--et-button-font-size);cursor:var(--et-button-cursor);appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;overflow:hidden;flex-shrink:0;--et-theme-color-primary-opacity: 0}.et-icon-button[data-can-animate]{transition:background .12s ease,color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-icon-button:where([data-size=xs]){width:2.8rem;height:2.8rem;--_et-icon-button-icon-size: 1.4rem}.et-icon-button:where([data-size=sm]){width:3.6rem;height:3.6rem;--_et-icon-button-icon-size: 1.8rem}.et-icon-button:where([data-size=md]){width:4rem;height:4rem;--_et-icon-button-icon-size: 2rem}.et-icon-button:where([data-size=lg]){width:4.8rem;height:4.8rem;--_et-icon-button-icon-size: 2.4rem}.et-icon-button:where([data-size=xl]){width:5.6rem;height:5.6rem;--_et-icon-button-icon-size: 2.8rem}.et-icon-button:where([disabled]),.et-icon-button:where([aria-disabled=true]){opacity:var(--et-button-opacity-disabled);cursor:not-allowed;pointer-events:none}.et-icon-button:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button:where([data-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button:where([data-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button:where([data-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;border:var(--et-button-border-width, .1rem) solid var(--et-theme-color-ink-solid)}.et-icon-button:where([data-variant=outline]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=outline]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=outline]):active{--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button:where([data-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button:where([data-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button:where([data-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button:where([data-variant=transparent]){--et-theme-color-primary-opacity: 0}.et-icon-button:where([data-variant=transparent]):hover{--et-theme-color-primary-opacity: .08}.et-icon-button:where([data-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .12}.et-icon-button:where([data-variant=transparent]):active{--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=transparent]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]){--et-theme-color-primary-opacity: .16}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):hover{--et-theme-color-primary-opacity: .24}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):focus-visible{--et-theme-color-primary-opacity: .28}.et-icon-button[data-pressed=true]:where([data-pressed-variant=tonal]):active{--et-theme-color-primary-opacity: .32}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;color:var(--et-theme-color-on-primary)}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: .92}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: .88}.et-icon-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: .84}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]){color:currentColor}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 32%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 40%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 44%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=filled]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 48%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]){background:transparent;border-color:var(--et-surface-interaction-solid)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 12%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 16%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=outline]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 20%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 16%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 24%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 28%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=tonal]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 32%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]){background:transparent}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):hover:not([disabled]):not([aria-disabled=true]){background:color-mix(in srgb,var(--et-surface-interaction-solid) 12%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):focus-visible{background:color-mix(in srgb,var(--et-surface-interaction-solid) 16%,transparent)}.et-icon-button[data-muted-until-pressed]:not([data-pressed=true]):where([data-variant=transparent]):active{background:color-mix(in srgb,var(--et-surface-interaction-solid) 20%,transparent)}.et-icon-button .et-icon-button-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%;transition:opacity .12s ease}.et-icon-button .et-icon-button-icon .et-icon{width:var(--_et-icon-button-icon-size);height:var(--_et-icon-button-icon-size)}.et-icon-button[data-loading=true] .et-icon-button-icon{opacity:0}.et-icon-button[data-loading=true] .et-button-loader{opacity:1}\n"] }]
689
696
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
690
697
 
691
698
  class TextButtonComponent {
@@ -871,6 +878,7 @@ const FORM_FIELD_ERROR_CODES = {
871
878
 
872
879
  const FORM_FIELD_CONTROL_TYPES = {
873
880
  TEXT_INPUT: 'text-input',
881
+ RICH_TEXT: 'rich-text',
874
882
  CHECKBOX: 'checkbox',
875
883
  RADIO: 'radio',
876
884
  SWITCH: 'switch',
@@ -910,7 +918,8 @@ class FormFieldDirective {
910
918
  this.controlType = computed(() => this.registeredControl()?.controlType() ?? FORM_FIELD_CONTROL_TYPES.TEXT_INPUT, ...(ngDevMode ? [{ debugName: "controlType" }] : /* istanbul ignore next */ []));
911
919
  this.focused = computed(() => this.registeredControl()?.focused?.() ?? false, ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
912
920
  this.hasValue = computed(() => this.registeredControl()?.hasValue?.() ?? false, ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
913
- this.usesTextFieldShell = computed(() => this.controlType() === FORM_FIELD_CONTROL_TYPES.TEXT_INPUT, ...(ngDevMode ? [{ debugName: "usesTextFieldShell" }] : /* istanbul ignore next */ []));
921
+ this.usesTextFieldShell = computed(() => this.controlType() === FORM_FIELD_CONTROL_TYPES.TEXT_INPUT ||
922
+ this.controlType() === FORM_FIELD_CONTROL_TYPES.RICH_TEXT, ...(ngDevMode ? [{ debugName: "usesTextFieldShell" }] : /* istanbul ignore next */ []));
914
923
  this.shouldFloatLabel = computed(() => this.focused() || this.hasValue(), ...(ngDevMode ? [{ debugName: "shouldFloatLabel" }] : /* istanbul ignore next */ []));
915
924
  this.describedById = computed(() => {
916
925
  if (this.shouldDisplayError() && this.errors().length > 0) {
@@ -1277,7 +1286,7 @@ class CheckboxComponent {
1277
1286
  });
1278
1287
  }
1279
1288
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1280
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.13", type: CheckboxComponent, isStandalone: true, selector: "et-checkbox", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-checkbox" }, viewQueries: [{ propertyName: "checkmarkEl", first: true, predicate: ["checkmark"], descendants: true, isSignal: true }, { propertyName: "indeterminateEl", first: true, predicate: ["indeterminate"], descendants: true, isSignal: true }], hostDirectives: [{ directive: CheckboxDirective, inputs: ["checked", "checked", "indeterminate", "indeterminate", "disabled", "disabled", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name"], outputs: ["checkedChange", "checkedChange", "indeterminateChange", "indeterminateChange", "touchedChange", "touchedChange"] }, { directive: i2.ColorInteractiveDirective }, { directive: FocusRingDirective }], ngImport: i0, template: "<div class=\"et-checkbox-box\">\n <svg\n #checkmark\n [style.color]=\"frozenCheckmarkColor()\"\n class=\"et-checkbox-checkmark\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <polyline\n class=\"et-checkbox-checkmark-path\"\n points=\"3.5 8 6.5 11 12.5 5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg\n #indeterminate\n [style.color]=\"frozenIndeterminateColor()\"\n class=\"et-checkbox-indeterminate\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <line\n class=\"et-checkbox-indeterminate-path\"\n x1=\"4\"\n y1=\"8\"\n x2=\"12\"\n y2=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n</div>\n", styles: ["@property --et-checkbox-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-checkbox{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:inline-flex;align-items:center;cursor:pointer;border-radius:var(--et-checkbox-border-radius);transition:opacity .15s ease,outline-color .15s ease}et-checkbox[aria-disabled=true]{opacity:var(--et-checkbox-opacity-disabled);pointer-events:none;cursor:default}et-checkbox .et-checkbox-box{position:relative;display:grid;place-items:center;width:var(--et-checkbox-size);height:var(--et-checkbox-size);border:var(--et-checkbox-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-checkbox-border-radius)}et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor)}:where(et-choice-field[data-error]) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}:where(et-choice-field[data-error]) et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field[data-error]:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor);transform:scale(.95)}et-checkbox:active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{transform:scale(.95)}et-checkbox .et-checkbox-checkmark{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-checkmark-path{stroke-dasharray:18;stroke-dashoffset:18}et-checkbox .et-checkbox-indeterminate{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-indeterminate-path{stroke-dasharray:8;stroke-dashoffset:8}et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=true] .et-checkbox-checkmark{opacity:1}et-checkbox[aria-checked=true] .et-checkbox-checkmark-path{stroke-dashoffset:0}et-checkbox[aria-checked=true]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate{opacity:1}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate-path{stroke-dashoffset:0}et-checkbox[aria-checked=mixed]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[data-can-animate]{transition:opacity var(--et-checkbox-transition-duration) ease,outline-color var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-box{transition:background-color var(--et-checkbox-transition-duration) ease,border-color var(--et-checkbox-transition-duration) ease,transform var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-checkmark{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-checkmark-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate] .et-checkbox-indeterminate{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-indeterminate-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate][aria-checked=true] .et-checkbox-checkmark{transition:opacity 0s 0s}et-checkbox[data-can-animate][aria-checked=mixed] .et-checkbox-indeterminate{transition:opacity 0s 0s}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1289
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.13", type: CheckboxComponent, isStandalone: true, selector: "et-checkbox", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-checkbox" }, viewQueries: [{ propertyName: "checkmarkEl", first: true, predicate: ["checkmark"], descendants: true, isSignal: true }, { propertyName: "indeterminateEl", first: true, predicate: ["indeterminate"], descendants: true, isSignal: true }], hostDirectives: [{ directive: CheckboxDirective, inputs: ["checked", "checked", "indeterminate", "indeterminate", "disabled", "disabled", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name"], outputs: ["checkedChange", "checkedChange", "indeterminateChange", "indeterminateChange", "touchedChange", "touchedChange"] }, { directive: i2.ColorInteractiveDirective }, { directive: FocusRingDirective }], ngImport: i0, template: "<div class=\"et-checkbox-box\">\n <svg\n #checkmark\n [style.color]=\"frozenCheckmarkColor()\"\n class=\"et-checkbox-checkmark\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <polyline\n class=\"et-checkbox-checkmark-path\"\n points=\"3.5 8 6.5 11 12.5 5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg\n #indeterminate\n [style.color]=\"frozenIndeterminateColor()\"\n class=\"et-checkbox-indeterminate\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <line\n class=\"et-checkbox-indeterminate-path\"\n x1=\"4\"\n y1=\"8\"\n x2=\"12\"\n y2=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n</div>\n", styles: ["@property --et-checkbox-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-checkbox{display:inline-flex;align-items:center;cursor:pointer;border-radius:var(--et-checkbox-border-radius);transition:opacity .15s ease,outline-color .15s ease}et-checkbox[aria-disabled=true]{opacity:var(--et-checkbox-opacity-disabled);pointer-events:none;cursor:default}et-checkbox .et-checkbox-box{position:relative;display:grid;place-items:center;width:var(--et-checkbox-size);height:var(--et-checkbox-size);border:var(--et-checkbox-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-checkbox-border-radius)}et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor)}:where(et-choice-field[data-error]) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}:where(et-choice-field[data-error]) et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field[data-error]:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor);transform:scale(.95)}et-checkbox:active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{transform:scale(.95)}et-checkbox .et-checkbox-checkmark{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-checkmark-path{stroke-dasharray:18;stroke-dashoffset:18}et-checkbox .et-checkbox-indeterminate{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-indeterminate-path{stroke-dasharray:8;stroke-dashoffset:8}et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=true] .et-checkbox-checkmark{opacity:1}et-checkbox[aria-checked=true] .et-checkbox-checkmark-path{stroke-dashoffset:0}et-checkbox[aria-checked=true]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate{opacity:1}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate-path{stroke-dashoffset:0}et-checkbox[aria-checked=mixed]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[data-can-animate]{transition:opacity var(--et-checkbox-transition-duration) ease,outline-color var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-box{transition:background-color var(--et-checkbox-transition-duration) ease,border-color var(--et-checkbox-transition-duration) ease,transform var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-checkmark{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-checkmark-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate] .et-checkbox-indeterminate{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-indeterminate-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate][aria-checked=true] .et-checkbox-checkmark{transition:opacity 0s 0s}et-checkbox[data-can-animate][aria-checked=mixed] .et-checkbox-indeterminate{transition:opacity 0s 0s}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1281
1290
  }
1282
1291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CheckboxComponent, decorators: [{
1283
1292
  type: Component,
@@ -1292,7 +1301,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
1292
1301
  ], host: {
1293
1302
  class: 'et-checkbox',
1294
1303
  '[attr.data-can-animate]': 'canAnimate.state() || null',
1295
- }, template: "<div class=\"et-checkbox-box\">\n <svg\n #checkmark\n [style.color]=\"frozenCheckmarkColor()\"\n class=\"et-checkbox-checkmark\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <polyline\n class=\"et-checkbox-checkmark-path\"\n points=\"3.5 8 6.5 11 12.5 5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg\n #indeterminate\n [style.color]=\"frozenIndeterminateColor()\"\n class=\"et-checkbox-indeterminate\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <line\n class=\"et-checkbox-indeterminate-path\"\n x1=\"4\"\n y1=\"8\"\n x2=\"12\"\n y2=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n</div>\n", styles: ["@property --et-checkbox-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-checkbox{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:inline-flex;align-items:center;cursor:pointer;border-radius:var(--et-checkbox-border-radius);transition:opacity .15s ease,outline-color .15s ease}et-checkbox[aria-disabled=true]{opacity:var(--et-checkbox-opacity-disabled);pointer-events:none;cursor:default}et-checkbox .et-checkbox-box{position:relative;display:grid;place-items:center;width:var(--et-checkbox-size);height:var(--et-checkbox-size);border:var(--et-checkbox-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-checkbox-border-radius)}et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor)}:where(et-choice-field[data-error]) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}:where(et-choice-field[data-error]) et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field[data-error]:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor);transform:scale(.95)}et-checkbox:active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{transform:scale(.95)}et-checkbox .et-checkbox-checkmark{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-checkmark-path{stroke-dasharray:18;stroke-dashoffset:18}et-checkbox .et-checkbox-indeterminate{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-indeterminate-path{stroke-dasharray:8;stroke-dashoffset:8}et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=true] .et-checkbox-checkmark{opacity:1}et-checkbox[aria-checked=true] .et-checkbox-checkmark-path{stroke-dashoffset:0}et-checkbox[aria-checked=true]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate{opacity:1}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate-path{stroke-dashoffset:0}et-checkbox[aria-checked=mixed]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[data-can-animate]{transition:opacity var(--et-checkbox-transition-duration) ease,outline-color var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-box{transition:background-color var(--et-checkbox-transition-duration) ease,border-color var(--et-checkbox-transition-duration) ease,transform var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-checkmark{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-checkmark-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate] .et-checkbox-indeterminate{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-indeterminate-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate][aria-checked=true] .et-checkbox-checkmark{transition:opacity 0s 0s}et-checkbox[data-can-animate][aria-checked=mixed] .et-checkbox-indeterminate{transition:opacity 0s 0s}\n"] }]
1304
+ }, template: "<div class=\"et-checkbox-box\">\n <svg\n #checkmark\n [style.color]=\"frozenCheckmarkColor()\"\n class=\"et-checkbox-checkmark\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <polyline\n class=\"et-checkbox-checkmark-path\"\n points=\"3.5 8 6.5 11 12.5 5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg\n #indeterminate\n [style.color]=\"frozenIndeterminateColor()\"\n class=\"et-checkbox-indeterminate\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n <line\n class=\"et-checkbox-indeterminate-path\"\n x1=\"4\"\n y1=\"8\"\n x2=\"12\"\n y2=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n</div>\n", styles: ["@property --et-checkbox-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-checkbox{display:inline-flex;align-items:center;cursor:pointer;border-radius:var(--et-checkbox-border-radius);transition:opacity .15s ease,outline-color .15s ease}et-checkbox[aria-disabled=true]{opacity:var(--et-checkbox-opacity-disabled);pointer-events:none;cursor:default}et-checkbox .et-checkbox-box{position:relative;display:grid;place-items:center;width:var(--et-checkbox-size);height:var(--et-checkbox-size);border:var(--et-checkbox-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-checkbox-border-radius)}et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor)}:where(et-choice-field[data-error]) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}:where(et-choice-field[data-error]) et-checkbox:hover:not([aria-disabled=true]) .et-checkbox-box,:where(et-choice-field[data-error]:has(.et-choice-field-label-area:hover)) et-checkbox:not([aria-disabled=true]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-color-solid, currentColor)}et-checkbox:focus-visible:is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]){--_et-focus-ring-color: var(--et-theme-color-primary-solid)}et-choice-field[data-error] et-checkbox:focus-visible:not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-theme-color-primary-solid)}et-checkbox:active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):not([aria-checked=true]):not([aria-checked=mixed]) .et-checkbox-box{border-color:var(--et-surface-interaction-hover-solid, currentColor);transform:scale(.95)}et-checkbox:active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,et-checkbox.et-focus-ring--active:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:active)) et-checkbox:not([aria-disabled=true]):is([aria-checked=true],[aria-checked=mixed]) .et-checkbox-box{transform:scale(.95)}et-checkbox .et-checkbox-checkmark{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-checkmark-path{stroke-dasharray:18;stroke-dashoffset:18}et-checkbox .et-checkbox-indeterminate{position:absolute;inset:0;width:100%;height:100%;color:var(--et-theme-color-on-primary-solid, white);opacity:0}et-checkbox .et-checkbox-indeterminate-path{stroke-dasharray:8;stroke-dashoffset:8}et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=true] .et-checkbox-checkmark{opacity:1}et-checkbox[aria-checked=true] .et-checkbox-checkmark-path{stroke-dashoffset:0}et-checkbox[aria-checked=true]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=true] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate{opacity:1}et-checkbox[aria-checked=mixed] .et-checkbox-indeterminate-path{stroke-dashoffset:0}et-checkbox[aria-checked=mixed]:hover .et-checkbox-box,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-checkbox[aria-checked=mixed] .et-checkbox-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox[data-can-animate]{transition:opacity var(--et-checkbox-transition-duration) ease,outline-color var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-box{transition:background-color var(--et-checkbox-transition-duration) ease,border-color var(--et-checkbox-transition-duration) ease,transform var(--et-checkbox-transition-duration) ease}et-checkbox[data-can-animate] .et-checkbox-checkmark{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-checkmark-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate] .et-checkbox-indeterminate{transition:opacity 0s calc(var(--et-checkbox-transition-duration) * 1.5)}et-checkbox[data-can-animate] .et-checkbox-indeterminate-path{transition:stroke-dashoffset calc(var(--et-checkbox-transition-duration) * 1.5) ease}et-checkbox[data-can-animate][aria-checked=true] .et-checkbox-checkmark{transition:opacity 0s 0s}et-checkbox[data-can-animate][aria-checked=mixed] .et-checkbox-indeterminate{transition:opacity 0s 0s}\n"] }]
1296
1305
  }], ctorParameters: () => [], propDecorators: { checkmarkEl: [{ type: i0.ViewChild, args: ['checkmark', { isSignal: true }] }], indeterminateEl: [{ type: i0.ViewChild, args: ['indeterminate', { isSignal: true }] }] } });
1297
1306
 
1298
1307
  const CHECKBOX_IMPORTS = [CheckboxComponent, CheckboxDirective];
@@ -1645,7 +1654,8 @@ class FormFieldComponent {
1645
1654
  }
1646
1655
  const target = event.target;
1647
1656
  const tagName = target.tagName;
1648
- if (tagName === 'INPUT' ||
1657
+ if (target.isContentEditable ||
1658
+ tagName === 'INPUT' ||
1649
1659
  tagName === 'TEXTAREA' ||
1650
1660
  tagName === 'SELECT' ||
1651
1661
  tagName === 'BUTTON' ||
@@ -1656,7 +1666,7 @@ class FormFieldComponent {
1656
1666
  this.formFieldDir.activate();
1657
1667
  }
1658
1668
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1659
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: FormFieldComponent, isStandalone: true, selector: "et-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, labelMode: { classPropertyName: "labelMode", publicName: "labelMode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-can-animate": "canAnimate.state() || null", "attr.data-control-type": "formFieldDir.controlType()", "attr.data-error": "displaysError() || null", "attr.data-appearance": "formFieldDir.usesTextFieldShell() ? appearance() : null", "attr.data-fill": "formFieldDir.usesTextFieldShell() ? fill() : null", "attr.data-label-floated": "hasFloatingTextLabel() && formFieldDir.shouldFloatLabel() ? \"\" : null", "attr.data-label-mode": "formFieldDir.usesTextFieldShell() ? labelMode() : null", "attr.data-size": "formFieldDir.usesTextFieldShell() ? size() : null", "attr.data-text-shell": "formFieldDir.usesTextFieldShell() || null", "style.--_et-form-field-prefix-offset": "prefixOffset()" }, classAttribute: "et-form-field" }, viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "prefixEl", first: true, predicate: ["prefixEl"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: FormFieldDirective }, { directive: i2.ProvideColorDirective, inputs: ["etProvideColor", "color"] }, { directive: i2.ProvideSurfaceDirective, inputs: ["etProvideSurface", "surface"] }, { directive: i2.ColorInteractiveHasFocusDirective }], ngImport: i0, template: "<div class=\"et-form-field-shell\">\n <div (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <ng-content select=\"[etInputSuffix]\" />\n </div>\n </div>\n</div>\n\n@if (shouldRenderSupport()) {\n <div [style.block-size.px]=\"supportHeight()\" class=\"et-form-field-support\" etColorInteractiveExclude>\n <div class=\"et-form-field-support-stack\">\n @if (shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!errorActive() ? 'true' : null\"\n [attr.aria-live]=\"errorActive() ? 'polite' : null\"\n [attr.data-active]=\"errorActive() || null\"\n [attr.data-direction]=\"errorDirection()\"\n [attr.data-state]=\"errorState()\"\n [etProvideColor]=\"errorColorTheme\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!hintActive() ? 'true' : null\"\n [attr.data-active]=\"hintActive() || null\"\n [attr.data-direction]=\"hintDirection()\"\n [attr.data-state]=\"hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n </div>\n}\n", styles: ["@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-field-support-offset{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 42px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md]){--et-form-field-gap: 5px;--et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var(--et-surface-background-solid, var(--et-surface-base-solid, transparent))}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius);background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--et-surface-color-muted-solid, currentColor);opacity:.78;pointer-events:none;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field:where([data-control-type=text-input])[data-label-mode=static] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input])[data-label-mode=static] .et-form-field-control-area{position:static}et-form-field:where([data-control-type=text-input])[data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field:where([data-control-type=text-input])[data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field:where([data-control-type=text-input])[data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field:where([data-control-type=text-input])[data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside]) .et-input-native::placeholder{transition:color .15s ease}:is(et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside]):not([data-label-floated]) .et-input-native::placeholder{color:transparent}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field:where([data-control-type=text-input]) .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field:where([data-control-type=text-input]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field:where([data-control-type=text-input]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-label-area,et-form-field:where([data-control-type=text-input]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input]):where(:has(:focus-visible)) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input]):where(:has(:focus-visible)) .et-form-field-label-area,et-form-field:where([data-control-type=text-input]):where(:has(:focus-visible)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input])[data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input])[data-error] .et-form-field-label-area{color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input])[data-error] .et-form-field-affix{color:var(--et-theme-color-primary-solid);opacity:1}et-form-field:where([data-control-type=text-input]):has(:disabled) .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field:where([data-control-type=text-input]):has(:disabled) .et-form-field-label-area{cursor:not-allowed}et-form-field:where([data-control-type=text-input])[data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field:where([data-control-type=text-input])[data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field:where([data-control-type=text-input])[data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field:where([data-control-type=text-input])[data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}et-form-field .et-form-field-support{overflow:clip;block-size:0}et-form-field .et-form-field-support-stack{position:relative;display:grid}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0;transform:translateY(0)}et-form-field .et-form-field-support-content[data-active]{opacity:1;transform:translateY(0)}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-above]{position:absolute;inset:0;opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1));pointer-events:none}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-below]{position:absolute;inset:0;opacity:0;transform:translateY(var(--et-form-field-support-offset));pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-primary-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-hint{font-size:var(--et-form-field-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width));transition:color .15s ease}et-form-field .et-form-field-hint:empty{display:none}et-form-field:has(:disabled) .et-form-field-hint{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-form-field[data-can-animate] .et-form-field-support{transition:block-size var(--et-form-field-support-duration) ease}et-form-field[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease,transform var(--et-form-field-support-duration) ease}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-above]{opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1))}}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-below]{opacity:0;transform:translateY(var(--et-form-field-support-offset))}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms;--et-form-field-support-offset: 0px}}\n"], dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "directive", type: ColorInteractiveExcludeDirective, selector: "[etColorInteractiveExclude]" }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1669
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: FormFieldComponent, isStandalone: true, selector: "et-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, labelMode: { classPropertyName: "labelMode", publicName: "labelMode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-can-animate": "canAnimate.state() || null", "attr.data-control-type": "formFieldDir.controlType()", "attr.data-error": "displaysError() || null", "attr.data-appearance": "formFieldDir.usesTextFieldShell() ? appearance() : null", "attr.data-fill": "formFieldDir.usesTextFieldShell() ? fill() : null", "attr.data-label-floated": "hasFloatingTextLabel() && formFieldDir.shouldFloatLabel() ? \"\" : null", "attr.data-label-mode": "formFieldDir.usesTextFieldShell() ? labelMode() : null", "attr.data-size": "formFieldDir.usesTextFieldShell() ? size() : null", "attr.data-text-shell": "formFieldDir.usesTextFieldShell() || null", "style.--_et-form-field-prefix-offset": "prefixOffset()" }, classAttribute: "et-form-field" }, viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "prefixEl", first: true, predicate: ["prefixEl"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: FormFieldDirective }, { directive: i2.ProvideColorDirective, inputs: ["etProvideColor", "color"] }, { directive: i2.ProvideSurfaceDirective, inputs: ["etProvideSurface", "surface"] }, { directive: i2.ColorInteractiveHasFocusDirective }], ngImport: i0, template: "<div class=\"et-form-field-shell\">\n <div (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <ng-content select=\"[etInputSuffix]\" />\n </div>\n </div>\n</div>\n\n@if (shouldRenderSupport()) {\n <div [style.block-size.px]=\"supportHeight()\" class=\"et-form-field-support\" etColorInteractiveExclude>\n <div class=\"et-form-field-support-stack\">\n @if (shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!errorActive() ? 'true' : null\"\n [attr.aria-live]=\"errorActive() ? 'polite' : null\"\n [attr.data-active]=\"errorActive() || null\"\n [attr.data-direction]=\"errorDirection()\"\n [attr.data-state]=\"errorState()\"\n [etProvideColor]=\"errorColorTheme\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!hintActive() ? 'true' : null\"\n [attr.data-active]=\"hintActive() || null\"\n [attr.data-direction]=\"hintDirection()\"\n [attr.data-state]=\"hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n </div>\n}\n", styles: ["@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-field-support-offset{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 42px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md]){--et-form-field-gap: 5px;--et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var(--et-surface-background-solid, var(--et-surface-base-solid, transparent))}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius);background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--et-surface-color-muted-solid, currentColor);opacity:.78;pointer-events:none;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static] .et-form-field-control-area{position:static}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside]) .et-input-native::placeholder{transition:color .15s ease}:is(et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside]):not([data-label-floated]) .et-input-native::placeholder{color:transparent}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]) .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-label-area,et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:has(:focus-visible)) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:has(:focus-visible)) .et-form-field-label-area,et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:has(:focus-visible)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-error] .et-form-field-label-area{color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-error] .et-form-field-affix{color:var(--et-theme-color-primary-solid);opacity:1}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):has(:disabled) .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):has(:disabled) .et-form-field-label-area{cursor:not-allowed}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}et-form-field:where([data-control-type=rich-text]) .et-form-field-control-frame{align-items:stretch;padding:0;cursor:auto}et-form-field:where([data-control-type=rich-text]) .et-form-field-control-area,et-form-field:where([data-control-type=rich-text]) .et-form-field-control-slot{align-items:stretch}et-form-field .et-form-field-support{overflow:clip;block-size:0}et-form-field .et-form-field-support-stack{position:relative;display:grid}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0;transform:translateY(0)}et-form-field .et-form-field-support-content[data-active]{opacity:1;transform:translateY(0)}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-above]{position:absolute;inset:0;opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1));pointer-events:none}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-below]{position:absolute;inset:0;opacity:0;transform:translateY(var(--et-form-field-support-offset));pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-primary-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-hint{font-size:var(--et-form-field-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width));transition:color .15s ease}et-form-field .et-form-field-hint:empty{display:none}et-form-field:has(:disabled) .et-form-field-hint{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-form-field[data-can-animate] .et-form-field-support{transition:block-size var(--et-form-field-support-duration) ease}et-form-field[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease,transform var(--et-form-field-support-duration) ease}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-above]{opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1))}}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-below]{opacity:0;transform:translateY(var(--et-form-field-support-offset))}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms;--et-form-field-support-offset: 0px}}\n"], dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "directive", type: ColorInteractiveExcludeDirective, selector: "[etColorInteractiveExclude]" }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1660
1670
  }
1661
1671
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FormFieldComponent, decorators: [{
1662
1672
  type: Component,
@@ -1677,7 +1687,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
1677
1687
  '[attr.data-size]': 'formFieldDir.usesTextFieldShell() ? size() : null',
1678
1688
  '[attr.data-text-shell]': 'formFieldDir.usesTextFieldShell() || null',
1679
1689
  '[style.--_et-form-field-prefix-offset]': 'prefixOffset()',
1680
- }, template: "<div class=\"et-form-field-shell\">\n <div (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <ng-content select=\"[etInputSuffix]\" />\n </div>\n </div>\n</div>\n\n@if (shouldRenderSupport()) {\n <div [style.block-size.px]=\"supportHeight()\" class=\"et-form-field-support\" etColorInteractiveExclude>\n <div class=\"et-form-field-support-stack\">\n @if (shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!errorActive() ? 'true' : null\"\n [attr.aria-live]=\"errorActive() ? 'polite' : null\"\n [attr.data-active]=\"errorActive() || null\"\n [attr.data-direction]=\"errorDirection()\"\n [attr.data-state]=\"errorState()\"\n [etProvideColor]=\"errorColorTheme\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!hintActive() ? 'true' : null\"\n [attr.data-active]=\"hintActive() || null\"\n [attr.data-direction]=\"hintDirection()\"\n [attr.data-state]=\"hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n </div>\n}\n", styles: ["@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-field-support-offset{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 42px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md]){--et-form-field-gap: 5px;--et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var(--et-surface-background-solid, var(--et-surface-base-solid, transparent))}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius);background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--et-surface-color-muted-solid, currentColor);opacity:.78;pointer-events:none;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field:where([data-control-type=text-input])[data-label-mode=static] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input])[data-label-mode=static] .et-form-field-control-area{position:static}et-form-field:where([data-control-type=text-input])[data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field:where([data-control-type=text-input])[data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field:where([data-control-type=text-input])[data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field:where([data-control-type=text-input])[data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field:where([data-control-type=text-input])[data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside]) .et-input-native::placeholder{transition:color .15s ease}:is(et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside]):not([data-label-floated]) .et-input-native::placeholder{color:transparent}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field:where([data-control-type=text-input])[data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field:where([data-control-type=text-input]) .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field:where([data-control-type=text-input]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field:where([data-control-type=text-input]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-label-area,et-form-field:where([data-control-type=text-input]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input]):where(:has(:focus-visible)) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input]):where(:has(:focus-visible)) .et-form-field-label-area,et-form-field:where([data-control-type=text-input]):where(:has(:focus-visible)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input])[data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input])[data-error] .et-form-field-label-area{color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input])[data-error] .et-form-field-affix{color:var(--et-theme-color-primary-solid);opacity:1}et-form-field:where([data-control-type=text-input]):has(:disabled) .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field:where([data-control-type=text-input]):has(:disabled) .et-form-field-label-area{cursor:not-allowed}et-form-field:where([data-control-type=text-input])[data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field:where([data-control-type=text-input])[data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field:where([data-control-type=text-input])[data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field:where([data-control-type=text-input])[data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}et-form-field .et-form-field-support{overflow:clip;block-size:0}et-form-field .et-form-field-support-stack{position:relative;display:grid}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0;transform:translateY(0)}et-form-field .et-form-field-support-content[data-active]{opacity:1;transform:translateY(0)}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-above]{position:absolute;inset:0;opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1));pointer-events:none}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-below]{position:absolute;inset:0;opacity:0;transform:translateY(var(--et-form-field-support-offset));pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-primary-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-hint{font-size:var(--et-form-field-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width));transition:color .15s ease}et-form-field .et-form-field-hint:empty{display:none}et-form-field:has(:disabled) .et-form-field-hint{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-form-field[data-can-animate] .et-form-field-support{transition:block-size var(--et-form-field-support-duration) ease}et-form-field[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease,transform var(--et-form-field-support-duration) ease}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-above]{opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1))}}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-below]{opacity:0;transform:translateY(var(--et-form-field-support-offset))}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms;--et-form-field-support-offset: 0px}}\n"] }]
1690
+ }, template: "<div class=\"et-form-field-shell\">\n <div (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <ng-content select=\"[etInputSuffix]\" />\n </div>\n </div>\n</div>\n\n@if (shouldRenderSupport()) {\n <div [style.block-size.px]=\"supportHeight()\" class=\"et-form-field-support\" etColorInteractiveExclude>\n <div class=\"et-form-field-support-stack\">\n @if (shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!errorActive() ? 'true' : null\"\n [attr.aria-live]=\"errorActive() ? 'polite' : null\"\n [attr.data-active]=\"errorActive() || null\"\n [attr.data-direction]=\"errorDirection()\"\n [attr.data-state]=\"errorState()\"\n [etProvideColor]=\"errorColorTheme\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!hintActive() ? 'true' : null\"\n [attr.data-active]=\"hintActive() || null\"\n [attr.data-direction]=\"hintDirection()\"\n [attr.data-state]=\"hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n </div>\n}\n", styles: ["@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}@property --et-form-field-support-offset{syntax: \"<length>\"; inherits: true; initial-value: 4px;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 42px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md]){--et-form-field-gap: 5px;--et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var(--et-surface-background-solid, var(--et-surface-base-solid, transparent))}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius);background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--et-surface-color-muted-solid, currentColor);opacity:.78;pointer-events:none;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static] .et-form-field-control-area{position:static}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside]) .et-input-native::placeholder{transition:color .15s ease}:is(et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside],et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside]):not([data-label-floated]) .et-input-native::placeholder{color:transparent}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]) .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-label-area,et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:hover:not(:has(.et-color-interactive-exclude:hover))) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:has(:focus-visible)) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:has(:focus-visible)) .et-form-field-label-area,et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):where(:has(:focus-visible)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-error] .et-form-field-label-area{color:var(--et-theme-color-primary-solid)}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-error] .et-form-field-affix{color:var(--et-theme-color-primary-solid);opacity:1}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):has(:disabled) .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text]):has(:disabled) .et-form-field-label-area{cursor:not-allowed}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field:where([data-control-type=text-input],[data-control-type=rich-text])[data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}et-form-field:where([data-control-type=rich-text]) .et-form-field-control-frame{align-items:stretch;padding:0;cursor:auto}et-form-field:where([data-control-type=rich-text]) .et-form-field-control-area,et-form-field:where([data-control-type=rich-text]) .et-form-field-control-slot{align-items:stretch}et-form-field .et-form-field-support{overflow:clip;block-size:0}et-form-field .et-form-field-support-stack{position:relative;display:grid}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0;transform:translateY(0)}et-form-field .et-form-field-support-content[data-active]{opacity:1;transform:translateY(0)}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-above]{position:absolute;inset:0;opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1));pointer-events:none}et-form-field .et-form-field-support-content[data-state=leaving][data-direction=to-below]{position:absolute;inset:0;opacity:0;transform:translateY(var(--et-form-field-support-offset));pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-primary-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-hint{font-size:var(--et-form-field-hint-font-size);color:var(--et-surface-color-muted-solid, currentColor);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width));transition:color .15s ease}et-form-field .et-form-field-hint:empty{display:none}et-form-field:has(:disabled) .et-form-field-hint{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-form-field[data-can-animate] .et-form-field-support{transition:block-size var(--et-form-field-support-duration) ease}et-form-field[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease,transform var(--et-form-field-support-duration) ease}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-above]{opacity:0;transform:translateY(calc(var(--et-form-field-support-offset) * -1))}}@starting-style{et-form-field[data-can-animate] .et-form-field-support-content[data-active][data-direction=from-below]{opacity:0;transform:translateY(var(--et-form-field-support-offset))}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms;--et-form-field-support-offset: 0px}}\n"] }]
1681
1691
  }], ctorParameters: () => [], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], labelMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelMode", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], errorContent: [{ type: i0.ViewChild, args: ['errorContent', { isSignal: true }] }], hintContent: [{ type: i0.ViewChild, args: ['hintContent', { isSignal: true }] }], prefixEl: [{ type: i0.ViewChild, args: ['prefixEl', { isSignal: true }] }], errorAnimatable: [{ type: i0.ViewChild, args: ['errorAnimatable', { isSignal: true }] }], hintAnimatable: [{ type: i0.ViewChild, args: ['hintAnimatable', { isSignal: true }] }] } });
1682
1692
 
1683
1693
  class InputPrefixDirective {
@@ -1813,181 +1823,1468 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
1813
1823
 
1814
1824
  const INPUT_IMPORTS = [InputComponent, InputDirective];
1815
1825
 
1816
- const SELECTION_LIST_TOKEN = new InjectionToken('SELECTION_LIST_TOKEN');
1817
- const SELECTION_LIST_MULTIPLE = new InjectionToken('SELECTION_LIST_MULTIPLE');
1818
-
1819
- class SelectionListControlDirective {
1820
- constructor() {
1821
- this.list = inject(SELECTION_LIST_TOKEN);
1822
- this.checked = computed(() => this.list.allSelected(), ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
1823
- this.indeterminate = computed(() => this.list.someSelected(), ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
1824
- this.labelId = signal(`et-selection-list-control-label-${uniqueControlLabelId++}`, ...(ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []));
1825
- this.ariaChecked = computed(() => {
1826
- if (this.indeterminate()) {
1827
- return 'mixed';
1826
+ const richTextEditorDomFactory = () => {
1827
+ const renderer = injectRenderer();
1828
+ const doc = inject(DOCUMENT);
1829
+ /** The contenteditable element, set by the owning directive once its view exists. */
1830
+ const root = signal(null, ...(ngDevMode ? [{ debugName: "root" }] : /* istanbul ignore next */ []));
1831
+ const getSelection = () => {
1832
+ const el = root();
1833
+ if (!el) {
1834
+ return null;
1835
+ }
1836
+ const selection = doc.getSelection();
1837
+ if (!selection || selection.rangeCount === 0) {
1838
+ return null;
1839
+ }
1840
+ const range = selection.getRangeAt(0);
1841
+ if (!el.contains(range.commonAncestorContainer)) {
1842
+ return null;
1843
+ }
1844
+ return { selection, range };
1845
+ };
1846
+ const closestWithin = (node, selector) => {
1847
+ const el = root();
1848
+ if (!el) {
1849
+ return null;
1850
+ }
1851
+ let current = node instanceof HTMLElement ? node : (node?.parentElement ?? null);
1852
+ while (current && el.contains(current)) {
1853
+ if (current.matches(selector)) {
1854
+ return current;
1828
1855
  }
1829
- return this.checked();
1830
- }, ...(ngDevMode ? [{ debugName: "ariaChecked" }] : /* istanbul ignore next */ []));
1831
- }
1832
- toggle() {
1833
- if (this.list.disabled()) {
1856
+ current = current.parentElement;
1857
+ }
1858
+ return null;
1859
+ };
1860
+ const selectNodeContents = (node) => {
1861
+ const selection = doc.getSelection();
1862
+ if (!selection) {
1834
1863
  return;
1835
1864
  }
1836
- this.list.toggleAll();
1837
- }
1838
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListControlDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1839
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: SelectionListControlDirective, isStandalone: true, selector: "[etSelectionListControl]", host: { listeners: { "click": "toggle()", "keydown.space": "toggle(); $event.preventDefault()", "keydown.enter": "toggle(); $event.preventDefault()" }, properties: { "attr.role": "\"option\"", "attr.aria-checked": "ariaChecked()", "attr.aria-disabled": "list.disabled() || null", "attr.tabindex": "list.disabled() ? -1 : 0" } }, ngImport: i0 }); }
1840
- }
1841
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListControlDirective, decorators: [{
1842
- type: Directive,
1843
- args: [{
1844
- selector: '[etSelectionListControl]',
1845
- host: {
1846
- '[attr.role]': '"option"',
1847
- '[attr.aria-checked]': 'ariaChecked()',
1848
- '[attr.aria-disabled]': 'list.disabled() || null',
1849
- '[attr.tabindex]': 'list.disabled() ? -1 : 0',
1850
- '(click)': 'toggle()',
1851
- '(keydown.space)': 'toggle(); $event.preventDefault()',
1852
- '(keydown.enter)': 'toggle(); $event.preventDefault()',
1853
- },
1854
- }]
1855
- }] });
1856
- let uniqueControlLabelId = 0;
1857
-
1858
- class SelectionListDirective {
1859
- constructor() {
1860
- this.formField = inject(FORM_FIELD_TOKEN, { optional: true });
1861
- this.destroyRef = inject(DestroyRef);
1862
- this.multipleOverride = inject(SELECTION_LIST_MULTIPLE, { optional: true });
1863
- this.value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1864
- this.touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
1865
- this.multipleInput = input(false, { ...(ngDevMode ? { debugName: "multipleInput" } : /* istanbul ignore next */ {}), alias: 'multiple' });
1866
- this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
1867
- this.invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
1868
- this.errors = input([], ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
1869
- this.required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
1870
- this.name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
1871
- this.multiple = computed(() => this.multipleOverride ?? this.multipleInput(), ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
1872
- this.items = signal([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1873
- this.shouldDisplayError = computed(() => this.touched() && this.invalid(), ...(ngDevMode ? [{ debugName: "shouldDisplayError" }] : /* istanbul ignore next */ []));
1874
- this.role = computed(() => (this.multiple() ? 'group' : 'radiogroup'), ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
1875
- this.describedBy = signal(null, ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
1876
- this.controlType = signal(FORM_FIELD_CONTROL_TYPES.SELECTION_LIST, ...(ngDevMode ? [{ debugName: "controlType" }] : /* istanbul ignore next */ []));
1877
- this.describedById = computed(() => this.describedBy(), ...(ngDevMode ? [{ debugName: "describedById" }] : /* istanbul ignore next */ []));
1878
- this.labelId = computed(() => this.formField?.registeredLabel()?.id() ?? null, ...(ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []));
1879
- this.allSelected = computed(() => {
1880
- const list = this.items();
1881
- if (list.length === 0) {
1882
- return false;
1865
+ const range = doc.createRange();
1866
+ range.selectNodeContents(node);
1867
+ selection.removeAllRanges();
1868
+ selection.addRange(range);
1869
+ };
1870
+ const selectAcross = (first, last) => {
1871
+ const selection = doc.getSelection();
1872
+ if (!selection) {
1873
+ return;
1874
+ }
1875
+ const range = doc.createRange();
1876
+ range.setStartBefore(first);
1877
+ range.setEndAfter(last);
1878
+ selection.removeAllRanges();
1879
+ selection.addRange(range);
1880
+ };
1881
+ const collapseInto = (node, offset) => {
1882
+ const selection = doc.getSelection();
1883
+ if (!selection) {
1884
+ return;
1885
+ }
1886
+ const range = doc.createRange();
1887
+ range.setStart(node, offset);
1888
+ range.collapse(true);
1889
+ selection.removeAllRanges();
1890
+ selection.addRange(range);
1891
+ };
1892
+ const unwrapElement = (el) => {
1893
+ const parent = el.parentNode;
1894
+ if (!parent) {
1895
+ return;
1896
+ }
1897
+ while (el.firstChild) {
1898
+ renderer.insertBefore(parent, el.firstChild, el);
1899
+ }
1900
+ renderer.removeChild(parent, el);
1901
+ };
1902
+ const replaceWith = (oldEl, newNodes) => {
1903
+ const parent = oldEl.parentNode;
1904
+ if (!parent) {
1905
+ return;
1906
+ }
1907
+ newNodes.forEach((node) => renderer.insertBefore(parent, node, oldEl));
1908
+ renderer.removeChild(parent, oldEl);
1909
+ };
1910
+ const collectDescendants = (node, selector) => {
1911
+ const out = [];
1912
+ node.childNodes.forEach((child) => {
1913
+ if (child instanceof HTMLElement) {
1914
+ if (child.matches(selector)) {
1915
+ out.push(child);
1916
+ }
1917
+ out.push(...collectDescendants(child, selector));
1883
1918
  }
1884
- return list.every((item) => item.checked());
1885
- }, ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
1886
- this.someSelected = computed(() => {
1887
- const list = this.items();
1888
- if (list.length === 0) {
1889
- return false;
1919
+ });
1920
+ return out;
1921
+ };
1922
+ const childrenByTag = (parent, tag) => {
1923
+ const out = [];
1924
+ Array.from(parent.children).forEach((child) => {
1925
+ if (child instanceof HTMLElement && child.tagName.toLowerCase() === tag) {
1926
+ out.push(child);
1890
1927
  }
1891
- const checkedCount = list.filter((item) => item.checked()).length;
1892
- return checkedCount > 0 && checkedCount < list.length;
1893
- }, ...(ngDevMode ? [{ debugName: "someSelected" }] : /* istanbul ignore next */ []));
1894
- this.formField?.registerControl(this);
1895
- this.destroyRef.onDestroy(() => this.formField?.unregisterControl(this));
1896
- effect(() => {
1897
- const currentValue = this.value();
1898
- const currentItems = this.items();
1899
- if (currentItems.length === 0) {
1928
+ });
1929
+ return out;
1930
+ };
1931
+ const blocksInRange = (range) => {
1932
+ const el = root();
1933
+ const blocks = [];
1934
+ el?.childNodes.forEach((child) => {
1935
+ if (range.intersectsNode(child)) {
1936
+ blocks.push(child);
1937
+ }
1938
+ });
1939
+ return blocks;
1940
+ };
1941
+ const isBlockEmpty = (el) => (el.textContent ?? '').trim().length === 0;
1942
+ // An inline wrapper must stay inside its block: extracting a range that crosses <li>/<p>
1943
+ // boundaries clones the partially covered blocks into the wrapper (an <em> holding <li>s inside
1944
+ // the list), which is invalid markup and serializes to broken markdown. Split such a range into
1945
+ // one slice per covered block so each slice can be wrapped within its own block. Whitespace-only
1946
+ // slices (e.g. an empty <li> swept up by an imprecise drag) are dropped entirely.
1947
+ const blockSlices = (range) => {
1948
+ const el = root();
1949
+ // Boundaries resolving to no block are root-level inline flow — the root is their block, so
1950
+ // two null boundaries count as the same block just like two boundaries in the same <li>/<p>.
1951
+ const startBlock = closestWithin(range.startContainer, 'li, p');
1952
+ const endBlock = closestWithin(range.endContainer, 'li, p');
1953
+ if (!el || startBlock === endBlock) {
1954
+ return [range];
1955
+ }
1956
+ const leaves = [];
1957
+ el.childNodes.forEach((child) => {
1958
+ if (!range.intersectsNode(child)) {
1900
1959
  return;
1901
1960
  }
1902
- untracked(() => {
1903
- if (this.multiple()) {
1904
- const valueArray = Array.isArray(currentValue) ? currentValue : [];
1905
- for (const item of currentItems) {
1906
- item.checked.set(valueArray.includes(item.value()));
1907
- }
1908
- }
1909
- else {
1910
- for (const item of currentItems) {
1911
- item.checked.set(item.value() === currentValue);
1961
+ if (child instanceof HTMLElement && (child.tagName === 'UL' || child.tagName === 'OL')) {
1962
+ child.childNodes.forEach((item) => {
1963
+ if (range.intersectsNode(item)) {
1964
+ leaves.push(item);
1912
1965
  }
1966
+ });
1967
+ }
1968
+ else {
1969
+ leaves.push(child);
1970
+ }
1971
+ });
1972
+ const slices = [];
1973
+ leaves.forEach((leaf) => {
1974
+ const slice = doc.createRange();
1975
+ slice.selectNodeContents(leaf);
1976
+ if (leaf.contains(range.startContainer)) {
1977
+ slice.setStart(range.startContainer, range.startOffset);
1978
+ }
1979
+ if (leaf.contains(range.endContainer)) {
1980
+ slice.setEnd(range.endContainer, range.endOffset);
1981
+ }
1982
+ trimRangeWhitespace(slice);
1983
+ if (!slice.collapsed && slice.toString().trim().length > 0) {
1984
+ slices.push(slice);
1985
+ }
1986
+ });
1987
+ return slices;
1988
+ };
1989
+ const wrapInline = (range, tag) => {
1990
+ const wrappers = [];
1991
+ blockSlices(range).forEach((slice) => {
1992
+ const wrapper = renderer.createElement(tag);
1993
+ try {
1994
+ slice.surroundContents(wrapper);
1995
+ }
1996
+ catch {
1997
+ renderer.appendChild(wrapper, slice.extractContents());
1998
+ slice.insertNode(wrapper);
1999
+ }
2000
+ collectDescendants(wrapper, tag).forEach((nested) => unwrapElement(nested));
2001
+ wrappers.push(wrapper);
2002
+ });
2003
+ const first = wrappers[0];
2004
+ const last = wrappers[wrappers.length - 1];
2005
+ if (!first || !last) {
2006
+ return;
2007
+ }
2008
+ if (first === last) {
2009
+ selectNodeContents(first);
2010
+ return;
2011
+ }
2012
+ // Anchor the restored selection inside the first/last wrapper rather than before/after them
2013
+ // (selectAcross) — markStates() resolves the active marks from the selection's start
2014
+ // container, so a boundary outside the wrapper would leave the toolbar button unpressed
2015
+ // until the user re-selects.
2016
+ const selection = doc.getSelection();
2017
+ if (!selection) {
2018
+ return;
2019
+ }
2020
+ const restored = doc.createRange();
2021
+ restored.setStart(first, 0);
2022
+ restored.setEnd(last, last.childNodes.length);
2023
+ selection.removeAllRanges();
2024
+ selection.addRange(restored);
2025
+ };
2026
+ const pathFromAncestor = (ancestor, node) => {
2027
+ const path = [];
2028
+ let current = node;
2029
+ while (current && current !== ancestor) {
2030
+ const parent = current.parentNode;
2031
+ if (!parent) {
2032
+ return null;
2033
+ }
2034
+ path.unshift(Array.from(parent.childNodes).indexOf(current));
2035
+ current = parent;
2036
+ }
2037
+ return current === ancestor ? path : null;
2038
+ };
2039
+ const resolvePath = (ancestor, path) => {
2040
+ let current = ancestor;
2041
+ for (const index of path) {
2042
+ const next = current.childNodes[index];
2043
+ if (!next) {
2044
+ return null;
2045
+ }
2046
+ current = next;
2047
+ }
2048
+ return current;
2049
+ };
2050
+ // `range.cloneContents()` collapses to plain text whenever the range's start and end share a
2051
+ // container (the common case when the whole marked run is selected) — it can't reconstruct any
2052
+ // ancestor elements in that situation, so nested marks (e.g. an <em> inside the <strong> being
2053
+ // unbolded) would be silently dropped. Work around it by trimming a clone of `markEl` down to
2054
+ // the selected span instead, which preserves every nested element other than `markEl` itself.
2055
+ const extractMarkedMiddle = (markEl, range) => {
2056
+ const startPath = pathFromAncestor(markEl, range.startContainer);
2057
+ const endPath = pathFromAncestor(markEl, range.endContainer);
2058
+ if (!startPath || !endPath) {
2059
+ return Array.from(range.cloneContents().childNodes);
2060
+ }
2061
+ const clone = markEl.cloneNode(true);
2062
+ const clonedStart = resolvePath(clone, startPath);
2063
+ const clonedEnd = resolvePath(clone, endPath);
2064
+ if (!clonedStart || !clonedEnd) {
2065
+ return Array.from(range.cloneContents().childNodes);
2066
+ }
2067
+ const trimAfter = doc.createRange();
2068
+ trimAfter.setStart(clonedEnd, range.endOffset);
2069
+ trimAfter.setEnd(clone, clone.childNodes.length);
2070
+ trimAfter.deleteContents();
2071
+ const trimBefore = doc.createRange();
2072
+ trimBefore.setStart(clone, 0);
2073
+ trimBefore.setEnd(clonedStart, range.startOffset);
2074
+ trimBefore.deleteContents();
2075
+ return Array.from(clone.childNodes);
2076
+ };
2077
+ // A mark wrapping nothing but whitespace has no markdown representation (`** **` isn't valid
2078
+ // CommonMark emphasis), so a before/after split must never leave one behind — fall through to
2079
+ // plain, unwrapped text for a whitespace-only slice instead of re-wrapping it in `tag`.
2080
+ const markSegmentNodes = (frag, tag) => {
2081
+ const text = frag.textContent ?? '';
2082
+ if (text.length === 0) {
2083
+ return [];
2084
+ }
2085
+ if (text.trim().length === 0) {
2086
+ return Array.from(frag.childNodes);
2087
+ }
2088
+ const wrapper = renderer.createElement(tag);
2089
+ renderer.appendChild(wrapper, frag);
2090
+ return [wrapper];
2091
+ };
2092
+ const unwrapInline = (range, tag) => {
2093
+ const startEl = closestWithin(range.startContainer, tag);
2094
+ const endEl = closestWithin(range.endContainer, tag);
2095
+ if (startEl && startEl === endEl) {
2096
+ const beforeRange = doc.createRange();
2097
+ beforeRange.selectNodeContents(startEl);
2098
+ beforeRange.setEnd(range.startContainer, range.startOffset);
2099
+ const afterRange = doc.createRange();
2100
+ afterRange.selectNodeContents(startEl);
2101
+ afterRange.setStart(range.endContainer, range.endOffset);
2102
+ const beforeFrag = beforeRange.cloneContents();
2103
+ const afterFrag = afterRange.cloneContents();
2104
+ const selectedNodes = extractMarkedMiddle(startEl, range);
2105
+ const replacement = [];
2106
+ replacement.push(...markSegmentNodes(beforeFrag, tag));
2107
+ selectedNodes.forEach((node) => replacement.push(node));
2108
+ replacement.push(...markSegmentNodes(afterFrag, tag));
2109
+ replaceWith(startEl, replacement);
2110
+ const first = selectedNodes[0];
2111
+ const last = selectedNodes[selectedNodes.length - 1];
2112
+ if (first && last) {
2113
+ selectAcross(first, last);
2114
+ }
2115
+ return;
2116
+ }
2117
+ const affected = new Set();
2118
+ if (startEl)
2119
+ affected.add(startEl);
2120
+ if (endEl)
2121
+ affected.add(endEl);
2122
+ const el = root();
2123
+ if (el) {
2124
+ collectDescendants(el, tag).forEach((marked) => {
2125
+ if (range.intersectsNode(marked)) {
2126
+ affected.add(marked);
1913
2127
  }
1914
2128
  });
2129
+ }
2130
+ affected.forEach((marked) => unwrapElement(marked));
2131
+ };
2132
+ const unwrapList = (list) => {
2133
+ const paragraphs = [];
2134
+ childrenByTag(list, 'li').forEach((li) => {
2135
+ const paragraph = renderer.createElement('p');
2136
+ while (li.firstChild) {
2137
+ renderer.appendChild(paragraph, li.firstChild);
2138
+ }
2139
+ paragraphs.push(paragraph);
1915
2140
  });
1916
- }
1917
- registerItem(item) {
1918
- this.items.update((items) => [...items, item]);
1919
- }
1920
- unregisterItem(item) {
1921
- this.items.update((items) => items.filter((i) => i !== item));
1922
- }
1923
- markTouched() {
1924
- this.touched.set(true);
1925
- }
1926
- select(item) {
1927
- if (this.disabled() || item.disabled()) {
2141
+ replaceWith(list, paragraphs);
2142
+ const first = paragraphs[0];
2143
+ const last = paragraphs[paragraphs.length - 1];
2144
+ if (first && last) {
2145
+ selectAcross(first, last);
2146
+ }
2147
+ };
2148
+ const exitListItem = (li) => {
2149
+ const list = li.parentElement;
2150
+ const parent = list?.parentNode;
2151
+ if (!list || !parent) {
1928
2152
  return;
1929
2153
  }
1930
- if (this.multiple()) {
1931
- item.checked.update((v) => !v);
1932
- this.value.set(this.items()
1933
- .filter((i) => i.checked())
1934
- .map((i) => i.value()));
2154
+ const tag = list.tagName.toLowerCase();
2155
+ // Element siblings after the empty item move into a continuation list of the same type.
2156
+ const trailing = [];
2157
+ let sibling = li.nextElementSibling;
2158
+ while (sibling) {
2159
+ trailing.push(sibling);
2160
+ sibling = sibling.nextElementSibling;
2161
+ }
2162
+ const paragraph = renderer.createElement('p');
2163
+ const refAfterList = list.nextSibling;
2164
+ // Carry over whatever the (empty) item held — typically the <br> a browser inserts so an
2165
+ // empty line still has a caret-able line box. Without one, a bare <p> can end up with no
2166
+ // line box at all, and the caret falls through to the next focusable position instead.
2167
+ while (li.firstChild) {
2168
+ renderer.appendChild(paragraph, li.firstChild);
2169
+ }
2170
+ if (!paragraph.firstChild) {
2171
+ renderer.appendChild(paragraph, renderer.createElement('br'));
2172
+ }
2173
+ if (trailing.length > 0) {
2174
+ const continuation = renderer.createElement(tag);
2175
+ trailing.forEach((item) => renderer.appendChild(continuation, item));
2176
+ renderer.insertBefore(parent, continuation, refAfterList);
2177
+ renderer.insertBefore(parent, paragraph, continuation);
1935
2178
  }
1936
2179
  else {
1937
- for (const i of this.items()) {
1938
- i.checked.set(i === item);
2180
+ renderer.insertBefore(parent, paragraph, refAfterList);
2181
+ }
2182
+ renderer.removeChild(list, li);
2183
+ if (childrenByTag(list, 'li').length === 0) {
2184
+ renderer.removeChild(parent, list);
2185
+ }
2186
+ collapseInto(paragraph, 0);
2187
+ };
2188
+ const mergeParagraphIntoPreviousList = (paragraph) => {
2189
+ const previous = paragraph.previousElementSibling;
2190
+ const tag = previous?.tagName.toLowerCase();
2191
+ if (!previous || (tag !== 'ul' && tag !== 'ol')) {
2192
+ return false;
2193
+ }
2194
+ const items = childrenByTag(previous, 'li');
2195
+ const lastLi = items[items.length - 1];
2196
+ if (!lastLi) {
2197
+ return false;
2198
+ }
2199
+ const parent = paragraph.parentNode;
2200
+ if (parent) {
2201
+ renderer.removeChild(parent, paragraph);
2202
+ }
2203
+ const selection = doc.getSelection();
2204
+ if (selection) {
2205
+ const range = doc.createRange();
2206
+ range.selectNodeContents(lastLi);
2207
+ range.collapse(false);
2208
+ selection.removeAllRanges();
2209
+ selection.addRange(range);
2210
+ }
2211
+ return true;
2212
+ };
2213
+ // The selection may be anchored on an element boundary rather than in a text node — e.g. the
2214
+ // restored selection after a cross-block wrap starts at (wrapper, 0). Marks *below* such an
2215
+ // anchor (a <strong> inside the <em> wrapper) are invisible to an ancestor walk, so descend to
2216
+ // the deepest node at the selection's start position first.
2217
+ const resolveStartNode = (range) => {
2218
+ let node = range.startContainer;
2219
+ let offset = range.startOffset;
2220
+ while (node.nodeType === Node.ELEMENT_NODE && node.childNodes.length > 0) {
2221
+ node = node.childNodes[Math.min(offset, node.childNodes.length - 1)];
2222
+ offset = 0;
2223
+ }
2224
+ return node;
2225
+ };
2226
+ const markStates = () => {
2227
+ const editable = getSelection();
2228
+ if (!editable) {
2229
+ return null;
2230
+ }
2231
+ const node = resolveStartNode(editable.range);
2232
+ return {
2233
+ bold: !!closestWithin(node, 'strong'),
2234
+ italic: !!closestWithin(node, 'em'),
2235
+ strike: !!closestWithin(node, 'del'),
2236
+ unorderedList: !!closestWithin(node, 'ul'),
2237
+ orderedList: !!closestWithin(node, 'ol'),
2238
+ link: !!closestWithin(node, 'a'),
2239
+ };
2240
+ };
2241
+ // wrapInline's surroundContents fallback can leave behind an untouched sibling with the same
2242
+ // tag right next to the new wrapper (e.g. selecting partway into an already-bold word produces
2243
+ // two adjacent `<strong>` elements). Left unmerged, markdown serialization emits a delimiter per
2244
+ // element (duplicated `**` markers), so collapse adjacent same-tag runs back into one.
2245
+ const mergeAdjacentSameTag = (tag) => {
2246
+ const el = root();
2247
+ if (!el) {
2248
+ return;
2249
+ }
2250
+ let merged = true;
2251
+ while (merged) {
2252
+ merged = false;
2253
+ for (const node of collectDescendants(el, tag)) {
2254
+ const next = node.nextSibling;
2255
+ if (next instanceof HTMLElement && next.tagName.toLowerCase() === tag) {
2256
+ while (next.firstChild) {
2257
+ renderer.appendChild(node, next.firstChild);
2258
+ }
2259
+ renderer.removeChild(next.parentNode, next);
2260
+ merged = true;
2261
+ break;
2262
+ }
1939
2263
  }
1940
- this.value.set(item.value());
1941
2264
  }
1942
- }
1943
- focusItem(item) {
1944
- item.elementRef.nativeElement.focus();
1945
- }
1946
- toggleAll() {
1947
- if (this.disabled()) {
2265
+ };
2266
+ // wrapInline's surroundContents fallback uses Range.extractContents(), which — per spec —
2267
+ // leaves the original ancestor element in place (now empty) whenever the range's boundary
2268
+ // fully consumes that ancestor's content, since only a clone of it travels into the extracted
2269
+ // fragment. That empty shell can be of any of the three inline tags, not just the one being
2270
+ // toggled (e.g. italicizing text that starts inside a <strong> can strand an empty <strong>).
2271
+ const pruneEmptyInline = () => {
2272
+ const el = root();
2273
+ if (!el) {
1948
2274
  return;
1949
2275
  }
1950
- const shouldCheck = !this.allSelected();
1951
- for (const item of this.items()) {
1952
- if (!item.disabled()) {
1953
- item.checked.set(shouldCheck);
2276
+ const tags = ['strong', 'em', 'del'];
2277
+ let removed = true;
2278
+ while (removed) {
2279
+ removed = false;
2280
+ for (const t of tags) {
2281
+ for (const node of collectDescendants(el, t)) {
2282
+ // extractContents() fully drains a wholly-selected text node's data via replaceData
2283
+ // rather than removing the node, so an "empty" shell can still hold a zero-length
2284
+ // Text child — check textContent, not childNodes.length, to catch that case too.
2285
+ if ((node.textContent ?? '').length === 0) {
2286
+ renderer.removeChild(node.parentNode, node);
2287
+ removed = true;
2288
+ }
2289
+ }
1954
2290
  }
1955
2291
  }
1956
- this.value.set(this.items()
1957
- .filter((i) => i.checked())
1958
- .map((i) => i.value()));
1959
- }
1960
- activate() {
1961
- const firstItem = this.items().find((i) => !i.disabled());
1962
- if (firstItem) {
1963
- this.select(firstItem);
1964
- this.focusItem(firstItem);
2292
+ };
2293
+ // A mark applied to whitespace at the very edge of the selection is invisible and has no
2294
+ // markdown representation, so shrink the range inward past any leading/trailing whitespace
2295
+ // before (un)marking it — matching how most rich text editors ignore edge whitespace on toggle.
2296
+ const trimRangeWhitespace = (range) => {
2297
+ if (range.collapsed) {
2298
+ return;
1965
2299
  }
1966
- }
1967
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1968
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: SelectionListDirective, isStandalone: true, selector: "[etSelectionList]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, multipleInput: { classPropertyName: "multipleInput", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange" }, host: { properties: { "attr.role": "role()", "attr.aria-invalid": "shouldDisplayError() || null", "attr.aria-required": "required() || null", "attr.aria-describedby": "describedById() || null", "attr.aria-labelledby": "labelId() || null", "attr.data-disabled": "disabled() || null" } }, providers: [{ provide: SELECTION_LIST_TOKEN, useExisting: SelectionListDirective }], ngImport: i0 }); }
1969
- }
1970
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListDirective, decorators: [{
1971
- type: Directive,
1972
- args: [{
1973
- selector: '[etSelectionList]',
1974
- providers: [{ provide: SELECTION_LIST_TOKEN, useExisting: SelectionListDirective }],
1975
- host: {
1976
- '[attr.role]': 'role()',
1977
- '[attr.aria-invalid]': 'shouldDisplayError() || null',
1978
- '[attr.aria-required]': 'required() || null',
1979
- '[attr.aria-describedby]': 'describedById() || null',
1980
- '[attr.aria-labelledby]': 'labelId() || null',
1981
- '[attr.data-disabled]': 'disabled() || null',
1982
- },
1983
- }]
1984
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], multipleInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }] } });
1985
-
1986
- let uniqueOptionLabelId = 0;
1987
- class SelectionOptionDirective {
1988
- constructor() {
1989
- this.list = inject(SELECTION_LIST_TOKEN, { optional: true });
1990
- this.destroyRef = inject(DestroyRef);
2300
+ const { startContainer, endContainer } = range;
2301
+ if (startContainer.nodeType === Node.TEXT_NODE) {
2302
+ const data = startContainer.textContent ?? '';
2303
+ const limit = startContainer === endContainer ? range.endOffset : data.length;
2304
+ let offset = range.startOffset;
2305
+ while (offset < limit && /\s/.test(data[offset] ?? '')) {
2306
+ offset++;
2307
+ }
2308
+ range.setStart(startContainer, offset);
2309
+ }
2310
+ if (range.collapsed) {
2311
+ return;
2312
+ }
2313
+ if (endContainer.nodeType === Node.TEXT_NODE) {
2314
+ const data = endContainer.textContent ?? '';
2315
+ const limit = endContainer === startContainer ? range.startOffset : 0;
2316
+ let offset = range.endOffset;
2317
+ while (offset > limit && /\s/.test(data[offset - 1] ?? '')) {
2318
+ offset--;
2319
+ }
2320
+ range.setEnd(endContainer, offset);
2321
+ }
2322
+ };
2323
+ const toggleInline = (tag) => {
2324
+ const editable = getSelection();
2325
+ const el = root();
2326
+ if (!el || !editable || editable.range.collapsed) {
2327
+ return;
2328
+ }
2329
+ trimRangeWhitespace(editable.range);
2330
+ if (editable.range.collapsed) {
2331
+ return;
2332
+ }
2333
+ const { range } = editable;
2334
+ const fullyMarked = !!closestWithin(range.startContainer, tag) && !!closestWithin(range.endContainer, tag);
2335
+ if (fullyMarked) {
2336
+ unwrapInline(range, tag);
2337
+ }
2338
+ else {
2339
+ wrapInline(range, tag);
2340
+ }
2341
+ pruneEmptyInline();
2342
+ mergeAdjacentSameTag(tag);
2343
+ el.normalize();
2344
+ };
2345
+ const toggleList = (listTag) => {
2346
+ const editable = getSelection();
2347
+ const el = root();
2348
+ if (!el || !editable) {
2349
+ return;
2350
+ }
2351
+ const existingList = closestWithin(editable.range.startContainer, listTag);
2352
+ if (existingList) {
2353
+ unwrapList(existingList);
2354
+ el.normalize();
2355
+ return;
2356
+ }
2357
+ // Caret inside a list of the other type: switch the list's type in place. Falling through to
2358
+ // the block-wrapping path below would treat the whole list as one block and nest its <li>s
2359
+ // inside a new <li>, going one level deeper on every toggle.
2360
+ const otherList = closestWithin(editable.range.startContainer, listTag === 'ul' ? 'ol' : 'ul');
2361
+ if (otherList) {
2362
+ const converted = renderer.createElement(listTag);
2363
+ while (otherList.firstChild) {
2364
+ renderer.appendChild(converted, otherList.firstChild);
2365
+ }
2366
+ replaceWith(otherList, [converted]);
2367
+ selectNodeContents(converted);
2368
+ el.normalize();
2369
+ return;
2370
+ }
2371
+ const blocks = blocksInRange(editable.range);
2372
+ const list = renderer.createElement(listTag);
2373
+ // An empty editor has no blocks to wrap — start a fresh list with one empty item instead.
2374
+ // The <br> gives the item a line box so the caret has somewhere to land (see exitListItem).
2375
+ if (blocks.length === 0) {
2376
+ const li = renderer.createElement('li');
2377
+ renderer.appendChild(li, renderer.createElement('br'));
2378
+ renderer.appendChild(list, li);
2379
+ renderer.appendChild(el, list);
2380
+ collapseInto(li, 0);
2381
+ return;
2382
+ }
2383
+ blocks.forEach((block) => {
2384
+ // A block that is itself a list (a selection spanning a paragraph and a list of the other
2385
+ // type) contributes its items directly — wrapping it would nest its <li>s inside a new <li>.
2386
+ if (block instanceof HTMLElement && (block.tagName === 'UL' || block.tagName === 'OL')) {
2387
+ childrenByTag(block, 'li').forEach((item) => renderer.appendChild(list, item));
2388
+ return;
2389
+ }
2390
+ const li = renderer.createElement('li');
2391
+ if (block.nodeType === Node.TEXT_NODE) {
2392
+ renderer.appendChild(li, block.cloneNode(true));
2393
+ }
2394
+ else {
2395
+ while (block.firstChild) {
2396
+ renderer.appendChild(li, block.firstChild);
2397
+ }
2398
+ }
2399
+ renderer.appendChild(list, li);
2400
+ });
2401
+ renderer.insertBefore(el, list, blocks[0] ?? null);
2402
+ blocks.forEach((block) => {
2403
+ if (block.parentNode === el) {
2404
+ renderer.removeChild(el, block);
2405
+ }
2406
+ });
2407
+ selectNodeContents(list);
2408
+ el.normalize();
2409
+ };
2410
+ const applyLink = (href) => {
2411
+ const editable = getSelection();
2412
+ if (!editable) {
2413
+ return;
2414
+ }
2415
+ const existing = closestWithin(editable.range.startContainer, 'a');
2416
+ if (existing) {
2417
+ renderer.setAttribute(existing, 'href', href);
2418
+ return;
2419
+ }
2420
+ if (editable.range.collapsed) {
2421
+ return;
2422
+ }
2423
+ const el = root();
2424
+ const anchor = renderer.createElement('a');
2425
+ renderer.setAttribute(anchor, 'href', href);
2426
+ try {
2427
+ editable.range.surroundContents(anchor);
2428
+ }
2429
+ catch {
2430
+ // The range crosses an existing <a> boundary (e.g. it starts before the anchor and ends
2431
+ // inside it) — surroundContents throws, so fall back to extract + insert. That fallback can
2432
+ // pull the whole existing anchor's content into the new one (nesting an <a> inside an <a>)
2433
+ // and, per Range.extractContents()'s spec, strand the drained original anchor as an empty
2434
+ // shell — both of which produce broken markdown (nested/empty link syntax).
2435
+ renderer.appendChild(anchor, editable.range.extractContents());
2436
+ editable.range.insertNode(anchor);
2437
+ }
2438
+ collectDescendants(anchor, 'a').forEach((nested) => unwrapElement(nested));
2439
+ if (el) {
2440
+ collectDescendants(el, 'a')
2441
+ .filter((node) => (node.textContent ?? '').length === 0)
2442
+ .forEach((empty) => renderer.removeChild(empty.parentNode, empty));
2443
+ el.normalize();
2444
+ }
2445
+ selectNodeContents(anchor);
2446
+ };
2447
+ const removeLink = () => {
2448
+ const editable = getSelection();
2449
+ const anchor = editable ? closestWithin(editable.range.startContainer, 'a') : null;
2450
+ const el = root();
2451
+ if (anchor && el) {
2452
+ unwrapElement(anchor);
2453
+ el.normalize();
2454
+ }
2455
+ };
2456
+ const insertToken = (node) => {
2457
+ const editable = getSelection();
2458
+ if (!editable) {
2459
+ return;
2460
+ }
2461
+ const { selection, range } = editable;
2462
+ range.deleteContents();
2463
+ range.insertNode(node);
2464
+ range.setStartAfter(node);
2465
+ range.collapse(true);
2466
+ selection.removeAllRanges();
2467
+ selection.addRange(range);
2468
+ };
2469
+ const handleBackspace = () => {
2470
+ const editable = getSelection();
2471
+ if (!editable || !editable.range.collapsed) {
2472
+ return false;
2473
+ }
2474
+ const node = editable.range.startContainer;
2475
+ const li = closestWithin(node, 'li');
2476
+ if (li && isBlockEmpty(li)) {
2477
+ exitListItem(li);
2478
+ return true;
2479
+ }
2480
+ const paragraph = closestWithin(node, 'p');
2481
+ if (paragraph && isBlockEmpty(paragraph)) {
2482
+ return mergeParagraphIntoPreviousList(paragraph);
2483
+ }
2484
+ return false;
2485
+ };
2486
+ return {
2487
+ root,
2488
+ getSelection,
2489
+ closestWithin,
2490
+ markStates,
2491
+ toggleInline,
2492
+ toggleList,
2493
+ applyLink,
2494
+ removeLink,
2495
+ insertToken,
2496
+ handleBackspace,
2497
+ };
2498
+ };
2499
+ const [provideRichTextEditorDom, injectRichTextEditorDom] = createProvider(richTextEditorDomFactory, {
2500
+ name: 'RichTextEditorDom',
2501
+ });
2502
+
2503
+ class RichTextEditorDirective {
2504
+ constructor() {
2505
+ this.formField = inject(FORM_FIELD_TOKEN, { optional: true });
2506
+ this.destroyRef = inject(DestroyRef);
2507
+ this.value = model('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2508
+ this.touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
2509
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2510
+ this.readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
2511
+ this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
2512
+ this.invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
2513
+ this.errors = input([], ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
2514
+ this.required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
2515
+ this.name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
2516
+ this.placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
2517
+ this.shouldDisplayError = computed(() => this.touched() && this.invalid(), ...(ngDevMode ? [{ debugName: "shouldDisplayError" }] : /* istanbul ignore next */ []));
2518
+ this.hasValue = computed(() => this.value().trim().length > 0, ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
2519
+ this.describedBy = signal(null, ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
2520
+ this.controlType = signal(FORM_FIELD_CONTROL_TYPES.RICH_TEXT, ...(ngDevMode ? [{ debugName: "controlType" }] : /* istanbul ignore next */ []));
2521
+ this.focused = signal(false, ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
2522
+ this.labelId = computed(() => this.formField?.registeredLabel()?.id() ?? null, ...(ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []));
2523
+ this.describedById = computed(() => this.describedBy(), ...(ngDevMode ? [{ debugName: "describedById" }] : /* istanbul ignore next */ []));
2524
+ this.boldActive = signal(false, ...(ngDevMode ? [{ debugName: "boldActive" }] : /* istanbul ignore next */ []));
2525
+ this.italicActive = signal(false, ...(ngDevMode ? [{ debugName: "italicActive" }] : /* istanbul ignore next */ []));
2526
+ this.strikeActive = signal(false, ...(ngDevMode ? [{ debugName: "strikeActive" }] : /* istanbul ignore next */ []));
2527
+ this.unorderedListActive = signal(false, ...(ngDevMode ? [{ debugName: "unorderedListActive" }] : /* istanbul ignore next */ []));
2528
+ this.orderedListActive = signal(false, ...(ngDevMode ? [{ debugName: "orderedListActive" }] : /* istanbul ignore next */ []));
2529
+ this.linkActive = signal(false, ...(ngDevMode ? [{ debugName: "linkActive" }] : /* istanbul ignore next */ []));
2530
+ /** @internal */
2531
+ this.lastEmittedMarkdown = null;
2532
+ /** @internal */
2533
+ this.editorDom = injectRichTextEditorDom();
2534
+ this.formField?.registerControl(this);
2535
+ this.destroyRef.onDestroy(() => this.formField?.unregisterControl(this));
2536
+ }
2537
+ activate() {
2538
+ if (this.disabled())
2539
+ return;
2540
+ const el = this.editorDom.root();
2541
+ // Re-focusing a contenteditable that already holds the caret collapses the selection to its
2542
+ // start, so only focus when the editor isn't already focused (e.g. a click on the frame padding).
2543
+ if (!el || el.ownerDocument.activeElement === el)
2544
+ return;
2545
+ el.focus();
2546
+ }
2547
+ syncFromDom() {
2548
+ const root = this.editorDom.root();
2549
+ if (!root)
2550
+ return;
2551
+ // Browsers create <div> line wrappers in contenteditable; map them to <p> so htmlToMarkdown
2552
+ // treats them as paragraph breaks instead of stripping the tags and merging lines.
2553
+ const html = root.innerHTML.replace(/<div>/gi, '<p>').replace(/<\/div>/gi, '</p>');
2554
+ const markdown = htmlToMarkdown(html);
2555
+ this.lastEmittedMarkdown = markdown;
2556
+ this.value.set(markdown);
2557
+ this.refreshActiveMarks();
2558
+ }
2559
+ refreshActiveMarks() {
2560
+ const states = this.editorDom.markStates();
2561
+ this.boldActive.set(states?.bold ?? false);
2562
+ this.italicActive.set(states?.italic ?? false);
2563
+ this.strikeActive.set(states?.strike ?? false);
2564
+ this.unorderedListActive.set(states?.unorderedList ?? false);
2565
+ this.orderedListActive.set(states?.orderedList ?? false);
2566
+ this.linkActive.set(states?.link ?? false);
2567
+ }
2568
+ toggleBold() {
2569
+ this.runCommand(() => this.editorDom.toggleInline('strong'));
2570
+ }
2571
+ toggleItalic() {
2572
+ this.runCommand(() => this.editorDom.toggleInline('em'));
2573
+ }
2574
+ toggleStrikethrough() {
2575
+ this.runCommand(() => this.editorDom.toggleInline('del'));
2576
+ }
2577
+ toggleUnorderedList() {
2578
+ this.runCommand(() => this.editorDom.toggleList('ul'));
2579
+ }
2580
+ toggleOrderedList() {
2581
+ this.runCommand(() => this.editorDom.toggleList('ol'));
2582
+ }
2583
+ setLink(href) {
2584
+ const url = href.trim();
2585
+ this.runCommand(() => (url ? this.editorDom.applyLink(url) : this.editorDom.removeLink()));
2586
+ }
2587
+ handleBackspace() {
2588
+ if (this.disabled() || this.readonly() || !this.editorDom.root())
2589
+ return false;
2590
+ const handled = this.editorDom.handleBackspace();
2591
+ if (handled) {
2592
+ this.syncFromDom();
2593
+ }
2594
+ return handled;
2595
+ }
2596
+ /**
2597
+ * @internal Extension seam for the follow-up `@`/`#` autocomplete: inserts an atomic inline
2598
+ * node (a mention/placeholder token) at the caret, then re-syncs.
2599
+ */
2600
+ insertAtomicToken(node) {
2601
+ if (this.disabled() || this.readonly() || !this.editorDom.root())
2602
+ return;
2603
+ this.editorDom.insertToken(node);
2604
+ this.syncFromDom();
2605
+ }
2606
+ runCommand(command) {
2607
+ if (this.disabled() || this.readonly() || !this.editorDom.root())
2608
+ return;
2609
+ command();
2610
+ this.syncFromDom();
2611
+ }
2612
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: RichTextEditorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2613
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: RichTextEditorDirective, isStandalone: true, selector: "[etRichTextEditor]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange" }, providers: [provideRichTextEditorDom()], ngImport: i0 }); }
2614
+ }
2615
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: RichTextEditorDirective, decorators: [{
2616
+ type: Directive,
2617
+ args: [{
2618
+ selector: '[etRichTextEditor]',
2619
+ providers: [provideRichTextEditorDom()],
2620
+ }]
2621
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
2622
+
2623
+ const ARROW_OUT_UP_RIGHT_ICON = {
2624
+ name: 'et-arrow-out-up-right',
2625
+ data: `
2626
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2627
+ <path
2628
+ fill="currentColor"
2629
+ d="M5 6.75A1.75 1.75 0 0 1 6.75 5h4.5a.75.75 0 0 1 0 1.5h-4.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-4.5a.75.75 0 0 1 1.5 0v4.5A1.75 1.75 0 0 1 17.25 19H6.75A1.75 1.75 0 0 1 5 17.25V6.75Z"
2630
+ />
2631
+ <path
2632
+ fill="currentColor"
2633
+ d="M11.5 5.75c0-.414.336-.75.75-.75h6c.414 0 .75.336.75.75v6a.75.75 0 0 1-1.5 0V7.56l-6.72 6.72a.75.75 0 1 1-1.06-1.06l6.72-6.72h-4.19a.75.75 0 0 1-.75-.75Z"
2634
+ />
2635
+ </svg>
2636
+ `,
2637
+ };
2638
+
2639
+ const ARROW_RIGHT_ICON = {
2640
+ name: 'et-arrow-right',
2641
+ data: `
2642
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2643
+ <path
2644
+ d="M4 12h14"
2645
+ stroke="currentColor"
2646
+ stroke-width="1.8"
2647
+ stroke-linecap="round"
2648
+ stroke-linejoin="round"
2649
+ />
2650
+ <path
2651
+ d="M13 7l5 5-5 5"
2652
+ stroke="currentColor"
2653
+ stroke-width="1.8"
2654
+ stroke-linecap="round"
2655
+ stroke-linejoin="round"
2656
+ />
2657
+ </svg>
2658
+ `,
2659
+ };
2660
+
2661
+ // Custom icon.
2662
+ const BOLD_ICON = {
2663
+ name: 'et-bold',
2664
+ data: `
2665
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
2666
+ <text x="8" y="12" font-size="12" font-weight="700" text-anchor="middle" fill="currentColor">B</text>
2667
+ </svg>
2668
+ `,
2669
+ };
2670
+
2671
+ // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
2672
+ const CHEVRON_ICON = {
2673
+ name: 'et-chevron',
2674
+ data: `
2675
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
2676
+ <path
2677
+ fill="currentColor"
2678
+ d="M244.7 116.7c6.2-6.2 16.4-6.2 22.6 0l192 192c6.2 6.2 6.2 16.4 0 22.6s-16.4 6.2-22.6 0L256 150.6 75.3 331.3c-6.2 6.2-16.4 6.2-22.6 0s-6.2-16.4 0-22.6l192-192z"
2679
+ />
2680
+ </svg>
2681
+ `,
2682
+ };
2683
+
2684
+ const CLIPBOARD_CHECK_ICON = {
2685
+ name: 'et-clipboard-check',
2686
+ data: `
2687
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2688
+ <path
2689
+ d="M9 4.5h6"
2690
+ stroke="currentColor"
2691
+ stroke-width="1.8"
2692
+ stroke-linecap="round"
2693
+ />
2694
+ <path
2695
+ d="M9 3h6a1.5 1.5 0 0 1 1.5 1.5V6H18a2 2 0 0 1 2 2v10.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 4 18.5V8a2 2 0 0 1 2-2h1.5V4.5A1.5 1.5 0 0 1 9 3z"
2696
+ stroke="currentColor"
2697
+ stroke-width="1.8"
2698
+ stroke-linejoin="round"
2699
+ />
2700
+ <path
2701
+ d="M8.5 13l2.2 2.2 4.8-4.9"
2702
+ stroke="currentColor"
2703
+ stroke-width="1.8"
2704
+ stroke-linecap="round"
2705
+ stroke-linejoin="round"
2706
+ />
2707
+ </svg>
2708
+ `,
2709
+ };
2710
+
2711
+ const FLOPPY_DISK_ICON = {
2712
+ name: 'et-floppy-disk',
2713
+ data: `
2714
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2715
+ <path
2716
+ d="M5 3h11l3 3v13a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V3z"
2717
+ stroke="currentColor"
2718
+ stroke-width="1.8"
2719
+ stroke-linejoin="round"
2720
+ />
2721
+ <path
2722
+ d="M8 3v6h7V3"
2723
+ stroke="currentColor"
2724
+ stroke-width="1.8"
2725
+ stroke-linejoin="round"
2726
+ />
2727
+ <path
2728
+ d="M8 17h8"
2729
+ stroke="currentColor"
2730
+ stroke-width="1.8"
2731
+ stroke-linecap="round"
2732
+ />
2733
+ </svg>
2734
+ `,
2735
+ };
2736
+
2737
+ const FOCUS_FRAME_ICON = {
2738
+ name: 'et-focus-frame',
2739
+ data: `
2740
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2741
+ <path
2742
+ fill="currentColor"
2743
+ fill-rule="evenodd"
2744
+ d="M5.75 4A1.75 1.75 0 0 0 4 5.75v12.5C4 19.216 4.784 20 5.75 20h12.5A1.75 1.75 0 0 0 20 18.25V5.75A1.75 1.75 0 0 0 18.25 4H5.75Zm0 1.5a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V5.75a.25.25 0 0 0-.25-.25H5.75Z"
2745
+ clip-rule="evenodd"
2746
+ />
2747
+ <rect x="8" y="8" width="8" height="8" rx="1.25" fill="currentColor" />
2748
+ </svg>
2749
+ `,
2750
+ };
2751
+
2752
+ const GRID_2X2_ICON = {
2753
+ name: 'et-grid-2x2',
2754
+ data: `
2755
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2756
+ <path
2757
+ fill="currentColor"
2758
+ fill-rule="evenodd"
2759
+ d="M5.75 4A1.75 1.75 0 0 0 4 5.75v12.5C4 19.216 4.784 20 5.75 20h12.5A1.75 1.75 0 0 0 20 18.25V5.75A1.75 1.75 0 0 0 18.25 4H5.75Zm0 1.5a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V5.75a.25.25 0 0 0-.25-.25H5.75Z"
2760
+ clip-rule="evenodd"
2761
+ />
2762
+ <rect x="11.25" y="5.5" width="1.5" height="13" fill="currentColor" />
2763
+ <rect x="5.5" y="11.25" width="13" height="1.5" fill="currentColor" />
2764
+ </svg>
2765
+ `,
2766
+ };
2767
+
2768
+ const ICON_ERROR_CODES = {
2769
+ NO_ICONS_PROVIDED: 1800,
2770
+ ICON_NOT_FOUND: 1801,
2771
+ INVALID_SVG: 1802,
2772
+ MISSING_XMLNS: 1803,
2773
+ MISSING_DIMENSIONS: 1804,
2774
+ HARDCODED_COLOR: 1805,
2775
+ DUPLICATE_ICON_NAME: 1806,
2776
+ };
2777
+
2778
+ const ICONS_TOKEN = new InjectionToken('ET_ICONS_TOKEN');
2779
+ const provideIcons = (...icons) => {
2780
+ const map = {};
2781
+ for (const def of icons) {
2782
+ if (map[def.name]) {
2783
+ throw new RuntimeError(ICON_ERROR_CODES.DUPLICATE_ICON_NAME, `[provideIcons] Icon with name "${def.name}" already exists. Please provide unique icon names.`);
2784
+ }
2785
+ map[def.name] = def;
2786
+ }
2787
+ return {
2788
+ provide: ICONS_TOKEN,
2789
+ useValue: map,
2790
+ };
2791
+ };
2792
+
2793
+ const ICON_DIRECTIVE_TOKEN = new InjectionToken('ET_ICON_DIRECTIVE_TOKEN');
2794
+ const SVG_COLOR_ATTRIBUTES = ['fill', 'stroke', 'stop-color', 'stop-opacity'];
2795
+ class IconDirective {
2796
+ constructor() {
2797
+ this.icons = inject(ICONS_TOKEN, { optional: true });
2798
+ this.sanitizer = inject(DomSanitizer);
2799
+ this.iconNameToUse = input.required({ ...(ngDevMode ? { debugName: "iconNameToUse" } : /* istanbul ignore next */ {}), alias: 'etIcon' });
2800
+ this.allowHardcodedColor = input(false, { ...(ngDevMode ? { debugName: "allowHardcodedColor" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2801
+ this.iconSrc = computed(() => {
2802
+ if (!this.icons) {
2803
+ return null;
2804
+ }
2805
+ const icon = this.icons[this.iconNameToUse()];
2806
+ if (!icon) {
2807
+ throw new RuntimeError(ICON_ERROR_CODES.ICON_NOT_FOUND, `[IconDirective] Icon "${this.iconNameToUse()}" not found. Available icons: ${Object.keys(this.icons).join(', ')}.`);
2808
+ }
2809
+ const svg = icon.data.trim();
2810
+ if (ngDevMode) {
2811
+ if (!svg.includes('<svg')) {
2812
+ throw new RuntimeError(ICON_ERROR_CODES.INVALID_SVG, `[IconDirective] Icon "${this.iconNameToUse()}" is not a valid SVG. The data must contain an <svg> element.`);
2813
+ }
2814
+ if (!svg.includes('xmlns="http://www.w3.org/2000/svg"')) {
2815
+ throw new RuntimeError(ICON_ERROR_CODES.MISSING_XMLNS, `[IconDirective] Icon "${this.iconNameToUse()}" is missing xmlns="http://www.w3.org/2000/svg". Add the attribute to the <svg> element.`);
2816
+ }
2817
+ if (!svg.includes('width="100%"') || !svg.includes('height="100%"')) {
2818
+ throw new RuntimeError(ICON_ERROR_CODES.MISSING_DIMENSIONS, `[IconDirective] Icon "${this.iconNameToUse()}" is missing width="100%" and/or height="100%". Add both attributes to the <svg> element.`);
2819
+ }
2820
+ if (!this.allowHardcodedColor()) {
2821
+ for (const colorAttribute of SVG_COLOR_ATTRIBUTES) {
2822
+ if (svg.includes(`${colorAttribute}="`) && !svg.includes(`${colorAttribute}="currentColor"`)) {
2823
+ throw new RuntimeError(ICON_ERROR_CODES.HARDCODED_COLOR, `[IconDirective] Icon "${this.iconNameToUse()}" uses a hardcoded value for "${colorAttribute}". Use currentColor instead, or set [allowHardcodedColor]="true".`);
2824
+ }
2825
+ }
2826
+ }
2827
+ }
2828
+ return this.sanitizer.bypassSecurityTrustHtml(svg);
2829
+ }, ...(ngDevMode ? [{ debugName: "iconSrc" }] : /* istanbul ignore next */ []));
2830
+ this.hostClasses = computed(() => `et-icon et-icon--${this.iconNameToUse()}`, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2831
+ if (!this.icons) {
2832
+ throw new RuntimeError(ICON_ERROR_CODES.NO_ICONS_PROVIDED, '[IconDirective] No icons provided. Register icons via provideIcons() in the component or application providers.');
2833
+ }
2834
+ }
2835
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2836
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: IconDirective, isStandalone: true, selector: "[etIcon]", inputs: { iconNameToUse: { classPropertyName: "iconNameToUse", publicName: "etIcon", isSignal: true, isRequired: true, transformFunction: null }, allowHardcodedColor: { classPropertyName: "allowHardcodedColor", publicName: "allowHardcodedColor", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, properties: { "innerHTML": "iconSrc()", "class": "hostClasses()" }, styleAttribute: "display: flex; align-items: center; justify-content: center;" }, providers: [
2837
+ {
2838
+ provide: ICON_DIRECTIVE_TOKEN,
2839
+ useExisting: IconDirective,
2840
+ },
2841
+ ], ngImport: i0 }); }
2842
+ }
2843
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IconDirective, decorators: [{
2844
+ type: Directive,
2845
+ args: [{
2846
+ selector: '[etIcon]',
2847
+ providers: [
2848
+ {
2849
+ provide: ICON_DIRECTIVE_TOKEN,
2850
+ useExisting: IconDirective,
2851
+ },
2852
+ ],
2853
+ host: {
2854
+ '[innerHTML]': 'iconSrc()',
2855
+ 'aria-hidden': 'true',
2856
+ '[class]': 'hostClasses()',
2857
+ style: 'display: flex; align-items: center; justify-content: center;',
2858
+ },
2859
+ }]
2860
+ }], ctorParameters: () => [], propDecorators: { iconNameToUse: [{ type: i0.Input, args: [{ isSignal: true, alias: "etIcon", required: true }] }], allowHardcodedColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowHardcodedColor", required: false }] }] } });
2861
+
2862
+ // Custom icon.
2863
+ const ITALIC_ICON = {
2864
+ name: 'et-italic',
2865
+ data: `
2866
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
2867
+ <text
2868
+ x="8"
2869
+ y="12"
2870
+ font-size="12"
2871
+ font-style="italic"
2872
+ font-family="serif"
2873
+ text-anchor="middle"
2874
+ fill="currentColor"
2875
+ >I</text>
2876
+ </svg>
2877
+ `,
2878
+ };
2879
+
2880
+ // Custom icon.
2881
+ const LINK_ICON = {
2882
+ name: 'et-link',
2883
+ data: `
2884
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none">
2885
+ <path
2886
+ d="M6.5 9.5l3-3M7 4.5l1-1a2.5 2.5 0 013.5 3.5l-1 1M9 11.5l-1 1A2.5 2.5 0 014.5 9l1-1"
2887
+ stroke="currentColor"
2888
+ stroke-width="1.4"
2889
+ stroke-linecap="round"
2890
+ stroke-linejoin="round"
2891
+ />
2892
+ </svg>
2893
+ `,
2894
+ };
2895
+
2896
+ // Custom icon.
2897
+ const LIST_BULLETED_ICON = {
2898
+ name: 'et-list-bulleted',
2899
+ data: `
2900
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none">
2901
+ <circle cx="2.5" cy="4" r="1.2" fill="currentColor" />
2902
+ <circle cx="2.5" cy="8" r="1.2" fill="currentColor" />
2903
+ <circle cx="2.5" cy="12" r="1.2" fill="currentColor" />
2904
+ <path d="M6 4h8M6 8h8M6 12h8" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" />
2905
+ </svg>
2906
+ `,
2907
+ };
2908
+
2909
+ // Custom icon.
2910
+ const LIST_NUMBERED_ICON = {
2911
+ name: 'et-list-numbered',
2912
+ data: `
2913
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none">
2914
+ <path d="M6 4h8M6 8h8M6 12h8" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" />
2915
+ <text x="1" y="5.4" font-size="5" fill="currentColor">1</text>
2916
+ <text x="1" y="9.6" font-size="5" fill="currentColor">2</text>
2917
+ <text x="1" y="13.8" font-size="5" fill="currentColor">3</text>
2918
+ </svg>
2919
+ `,
2920
+ };
2921
+
2922
+ // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
2923
+ const LOCK_ICON = {
2924
+ name: 'et-lock',
2925
+ data: `
2926
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
2927
+ <path
2928
+ fill="currentColor"
2929
+ d="M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 48 0c26.5 0 48 21.5 48 48l0 224c0 26.5-21.5 48-48 48L32 512c-26.5 0-48-21.5-48-48L-16 240c0-26.5 21.5-48 48-48l48 0zm144 184c22.1 0 40-17.9 40-40s-17.9-40-40-40s-40 17.9-40 40s17.9 40 40 40z"
2930
+ />
2931
+ </svg>
2932
+ `,
2933
+ };
2934
+
2935
+ const PENCIL_ICON = {
2936
+ name: 'et-pencil',
2937
+ data: `
2938
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2939
+ <path
2940
+ d="M4 20l4.2-1 9.3-9.3a1.8 1.8 0 0 0 0-2.5l-.7-.7a1.8 1.8 0 0 0-2.5 0L5 15.8 4 20z"
2941
+ stroke="currentColor"
2942
+ stroke-width="1.8"
2943
+ stroke-linejoin="round"
2944
+ />
2945
+ <path
2946
+ d="M12.8 7.2l4 4"
2947
+ stroke="currentColor"
2948
+ stroke-width="1.8"
2949
+ stroke-linecap="round"
2950
+ />
2951
+ </svg>
2952
+ `,
2953
+ };
2954
+
2955
+ const PLUS_ICON = {
2956
+ name: 'et-plus',
2957
+ data: `
2958
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2959
+ <path
2960
+ d="M12 5v14"
2961
+ stroke="currentColor"
2962
+ stroke-width="1.8"
2963
+ stroke-linecap="round"
2964
+ />
2965
+ <path
2966
+ d="M5 12h14"
2967
+ stroke="currentColor"
2968
+ stroke-width="1.8"
2969
+ stroke-linecap="round"
2970
+ />
2971
+ </svg>
2972
+ `,
2973
+ };
2974
+
2975
+ // Custom icon.
2976
+ const STRIKETHROUGH_ICON = {
2977
+ name: 'et-strikethrough',
2978
+ data: `
2979
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
2980
+ <text
2981
+ x="8"
2982
+ y="12"
2983
+ font-size="12"
2984
+ text-decoration="line-through"
2985
+ text-anchor="middle"
2986
+ fill="currentColor"
2987
+ >S</text>
2988
+ </svg>
2989
+ `,
2990
+ };
2991
+
2992
+ // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
2993
+ const TIMES_ICON = {
2994
+ name: 'et-times',
2995
+ data: `
2996
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
2997
+ <path
2998
+ fill="currentColor"
2999
+ d="M324.5 411.1c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6L214.6 256 347.1 123.5c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0L192 233.4 59.6 100.9c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6L169.4 256 36.9 388.5c-6.2 6.2-6.2 16.4 0 22.6s16.4 6.2 22.6 0L192 278.6 324.5 411.1z"
3000
+ />
3001
+ </svg>
3002
+ `,
3003
+ };
3004
+
3005
+ // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
3006
+ const TRIANGLE_EXCLAMATION_ICON = {
3007
+ name: 'et-triangle-exclamation',
3008
+ data: `
3009
+ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
3010
+ <path
3011
+ fill="currentColor"
3012
+ d="M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S489.3 480 475.1 480H36.9c-14.3 0-27.6-7.7-34.8-20.2s-7-27.6 .2-40.1l216-368C225.6 39.5 238.7 32 252.9 32h3.1zm0 128c-13.3 0-24 10.7-24 24v112c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0-64 0 32 32 0 1 0 64 0z"
3013
+ />
3014
+ </svg>
3015
+ `,
3016
+ };
3017
+
3018
+ const ICON_IMPORTS = [IconDirective];
3019
+
3020
+ class RichTextEditorComponent {
3021
+ constructor() {
3022
+ this.dir = inject(RichTextEditorDirective);
3023
+ this.document = inject(DOCUMENT);
3024
+ this.editable = viewChild.required('editable');
3025
+ afterNextRender(() => {
3026
+ this.dir.editorDom.root.set(this.editable().nativeElement ?? null);
3027
+ this.renderExternalValue();
3028
+ });
3029
+ // Keep the toolbar's active-mark highlighting in sync with caret movement. The directive
3030
+ // ignores selection changes that land outside its editable root.
3031
+ fromEvent(this.document, 'selectionchange')
3032
+ .pipe(tap(() => this.dir.refreshActiveMarks()), takeUntilDestroyed())
3033
+ .subscribe();
3034
+ // Render programmatic (external) value changes into the DOM. Skip the user's own edits -
3035
+ // those already match `lastEmittedMarkdown`, so re-rendering would reset the caret.
3036
+ effect(() => {
3037
+ const markdown = this.dir.value();
3038
+ if (markdown === this.dir.lastEmittedMarkdown)
3039
+ return;
3040
+ this.renderExternalValue(markdown);
3041
+ });
3042
+ }
3043
+ onInput() {
3044
+ this.dir.syncFromDom();
3045
+ }
3046
+ onKeydown(event) {
3047
+ if (event.key !== 'Backspace')
3048
+ return;
3049
+ if (this.dir.handleBackspace()) {
3050
+ event.preventDefault();
3051
+ }
3052
+ }
3053
+ onBeforeInput(event) {
3054
+ // Keep keyboard shortcuts (Ctrl/Cmd+B, …) running through our Selection/Range commands
3055
+ // instead of the browser's deprecated execCommand-backed formatting.
3056
+ switch (event.inputType) {
3057
+ case 'formatBold':
3058
+ event.preventDefault();
3059
+ this.dir.toggleBold();
3060
+ break;
3061
+ case 'formatItalic':
3062
+ event.preventDefault();
3063
+ this.dir.toggleItalic();
3064
+ break;
3065
+ case 'formatStrikeThrough':
3066
+ event.preventDefault();
3067
+ this.dir.toggleStrikethrough();
3068
+ break;
3069
+ }
3070
+ }
3071
+ promptForLink() {
3072
+ // Mirror the other toolbar buttons' toggle behavior: with the caret already inside a link,
3073
+ // clicking again removes it instead of re-prompting for a URL to edit it.
3074
+ if (this.dir.linkActive()) {
3075
+ this.dir.setLink('');
3076
+ return;
3077
+ }
3078
+ const url = this.document.defaultView?.prompt('Link URL');
3079
+ if (url === null || url === undefined)
3080
+ return;
3081
+ this.dir.setLink(url);
3082
+ }
3083
+ renderExternalValue(markdown = this.dir.value()) {
3084
+ const el = this.editable()?.nativeElement;
3085
+ if (!el)
3086
+ return;
3087
+ el.innerHTML = markdownToHtml(markdown);
3088
+ this.dir.lastEmittedMarkdown = markdown;
3089
+ }
3090
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: RichTextEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3091
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.13", type: RichTextEditorComponent, isStandalone: true, selector: "et-rich-text-editor", host: { listeners: { "click": "dir.activate()" }, classAttribute: "et-rich-text-editor" }, providers: [
3092
+ provideIcons(BOLD_ICON, ITALIC_ICON, STRIKETHROUGH_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LINK_ICON),
3093
+ ], 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"], outputs: ["valueChange", "valueChange", "touchedChange", "touchedChange"] }], ngImport: i0, template: "<div class=\"et-rte-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n <button\n [pressed]=\"dir.boldActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleBold()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bold\"\n >\n <i etIcon=\"et-bold\"></i>\n </button>\n\n <button\n [pressed]=\"dir.italicActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleItalic()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Italic\"\n >\n <i etIcon=\"et-italic\"></i>\n </button>\n\n <button\n [pressed]=\"dir.strikeActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleStrikethrough()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Strikethrough\"\n >\n <i etIcon=\"et-strikethrough\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.unorderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleUnorderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bulleted list\"\n >\n <i etIcon=\"et-list-bulleted\"></i>\n </button>\n\n <button\n [pressed]=\"dir.orderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleOrderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Numbered list\"\n >\n <i etIcon=\"et-list-numbered\"></i>\n </button>\n\n <button\n [pressed]=\"dir.linkActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"promptForLink()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Link\"\n >\n <i [allowHardcodedColor]=\"true\" etIcon=\"et-link\"></i>\n </button>\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.describedById() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"onInput()\"\n (beforeinput)=\"onBeforeInput($event)\"\n (keydown)=\"onKeydown($event)\"\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: ["@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;}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;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-rich-text-editor .et-rte-toolbar .et-icon-button{border-radius:var(--et-rich-text-editor-button-radius)}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{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{margin-block-start:var(--et-rich-text-editor-content-gap)}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 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}\n"], dependencies: [{ kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "allowHardcodedColor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3094
+ }
3095
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: RichTextEditorComponent, decorators: [{
3096
+ type: Component,
3097
+ args: [{ selector: 'et-rich-text-editor', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconButtonComponent, IconDirective], providers: [
3098
+ provideIcons(BOLD_ICON, ITALIC_ICON, STRIKETHROUGH_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LINK_ICON),
3099
+ ], hostDirectives: [
3100
+ {
3101
+ directive: RichTextEditorDirective,
3102
+ inputs: ['value', 'disabled', 'readonly', 'hidden', 'invalid', 'errors', 'required', 'name', 'placeholder'],
3103
+ outputs: ['valueChange', 'touchedChange'],
3104
+ },
3105
+ ], host: {
3106
+ class: 'et-rich-text-editor',
3107
+ '(click)': 'dir.activate()',
3108
+ }, template: "<div class=\"et-rte-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n <button\n [pressed]=\"dir.boldActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleBold()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bold\"\n >\n <i etIcon=\"et-bold\"></i>\n </button>\n\n <button\n [pressed]=\"dir.italicActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleItalic()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Italic\"\n >\n <i etIcon=\"et-italic\"></i>\n </button>\n\n <button\n [pressed]=\"dir.strikeActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleStrikethrough()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Strikethrough\"\n >\n <i etIcon=\"et-strikethrough\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.unorderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleUnorderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bulleted list\"\n >\n <i etIcon=\"et-list-bulleted\"></i>\n </button>\n\n <button\n [pressed]=\"dir.orderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleOrderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Numbered list\"\n >\n <i etIcon=\"et-list-numbered\"></i>\n </button>\n\n <button\n [pressed]=\"dir.linkActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"promptForLink()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Link\"\n >\n <i [allowHardcodedColor]=\"true\" etIcon=\"et-link\"></i>\n </button>\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.describedById() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"onInput()\"\n (beforeinput)=\"onBeforeInput($event)\"\n (keydown)=\"onKeydown($event)\"\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: ["@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;}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;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-rich-text-editor .et-rte-toolbar .et-icon-button{border-radius:var(--et-rich-text-editor-button-radius)}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{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{margin-block-start:var(--et-rich-text-editor-content-gap)}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 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}\n"] }]
3109
+ }], ctorParameters: () => [], propDecorators: { editable: [{ type: i0.ViewChild, args: ['editable', { isSignal: true }] }] } });
3110
+
3111
+ const RICH_TEXT_EDITOR_IMPORTS = [RichTextEditorComponent, RichTextEditorDirective];
3112
+
3113
+ const SELECTION_LIST_TOKEN = new InjectionToken('SELECTION_LIST_TOKEN');
3114
+ const SELECTION_LIST_MULTIPLE = new InjectionToken('SELECTION_LIST_MULTIPLE');
3115
+
3116
+ class SelectionListControlDirective {
3117
+ constructor() {
3118
+ this.list = inject(SELECTION_LIST_TOKEN);
3119
+ this.checked = computed(() => this.list.allSelected(), ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
3120
+ this.indeterminate = computed(() => this.list.someSelected(), ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
3121
+ this.labelId = signal(`et-selection-list-control-label-${uniqueControlLabelId++}`, ...(ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []));
3122
+ this.ariaChecked = computed(() => {
3123
+ if (this.indeterminate()) {
3124
+ return 'mixed';
3125
+ }
3126
+ return this.checked();
3127
+ }, ...(ngDevMode ? [{ debugName: "ariaChecked" }] : /* istanbul ignore next */ []));
3128
+ }
3129
+ toggle() {
3130
+ if (this.list.disabled()) {
3131
+ return;
3132
+ }
3133
+ this.list.toggleAll();
3134
+ }
3135
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListControlDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3136
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: SelectionListControlDirective, isStandalone: true, selector: "[etSelectionListControl]", host: { listeners: { "click": "toggle()", "keydown.space": "toggle(); $event.preventDefault()", "keydown.enter": "toggle(); $event.preventDefault()" }, properties: { "attr.role": "\"option\"", "attr.aria-checked": "ariaChecked()", "attr.aria-disabled": "list.disabled() || null", "attr.tabindex": "list.disabled() ? -1 : 0" } }, ngImport: i0 }); }
3137
+ }
3138
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListControlDirective, decorators: [{
3139
+ type: Directive,
3140
+ args: [{
3141
+ selector: '[etSelectionListControl]',
3142
+ host: {
3143
+ '[attr.role]': '"option"',
3144
+ '[attr.aria-checked]': 'ariaChecked()',
3145
+ '[attr.aria-disabled]': 'list.disabled() || null',
3146
+ '[attr.tabindex]': 'list.disabled() ? -1 : 0',
3147
+ '(click)': 'toggle()',
3148
+ '(keydown.space)': 'toggle(); $event.preventDefault()',
3149
+ '(keydown.enter)': 'toggle(); $event.preventDefault()',
3150
+ },
3151
+ }]
3152
+ }] });
3153
+ let uniqueControlLabelId = 0;
3154
+
3155
+ class SelectionListDirective {
3156
+ constructor() {
3157
+ this.formField = inject(FORM_FIELD_TOKEN, { optional: true });
3158
+ this.destroyRef = inject(DestroyRef);
3159
+ this.multipleOverride = inject(SELECTION_LIST_MULTIPLE, { optional: true });
3160
+ this.value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
3161
+ this.touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
3162
+ this.multipleInput = input(false, { ...(ngDevMode ? { debugName: "multipleInput" } : /* istanbul ignore next */ {}), alias: 'multiple' });
3163
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
3164
+ this.invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
3165
+ this.errors = input([], ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
3166
+ this.required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
3167
+ this.name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
3168
+ this.multiple = computed(() => this.multipleOverride ?? this.multipleInput(), ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
3169
+ this.items = signal([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
3170
+ this.shouldDisplayError = computed(() => this.touched() && this.invalid(), ...(ngDevMode ? [{ debugName: "shouldDisplayError" }] : /* istanbul ignore next */ []));
3171
+ this.role = computed(() => (this.multiple() ? 'group' : 'radiogroup'), ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
3172
+ this.describedBy = signal(null, ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
3173
+ this.controlType = signal(FORM_FIELD_CONTROL_TYPES.SELECTION_LIST, ...(ngDevMode ? [{ debugName: "controlType" }] : /* istanbul ignore next */ []));
3174
+ this.describedById = computed(() => this.describedBy(), ...(ngDevMode ? [{ debugName: "describedById" }] : /* istanbul ignore next */ []));
3175
+ this.labelId = computed(() => this.formField?.registeredLabel()?.id() ?? null, ...(ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []));
3176
+ this.allSelected = computed(() => {
3177
+ const list = this.items();
3178
+ if (list.length === 0) {
3179
+ return false;
3180
+ }
3181
+ return list.every((item) => item.checked());
3182
+ }, ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
3183
+ this.someSelected = computed(() => {
3184
+ const list = this.items();
3185
+ if (list.length === 0) {
3186
+ return false;
3187
+ }
3188
+ const checkedCount = list.filter((item) => item.checked()).length;
3189
+ return checkedCount > 0 && checkedCount < list.length;
3190
+ }, ...(ngDevMode ? [{ debugName: "someSelected" }] : /* istanbul ignore next */ []));
3191
+ this.formField?.registerControl(this);
3192
+ this.destroyRef.onDestroy(() => this.formField?.unregisterControl(this));
3193
+ effect(() => {
3194
+ const currentValue = this.value();
3195
+ const currentItems = this.items();
3196
+ if (currentItems.length === 0) {
3197
+ return;
3198
+ }
3199
+ untracked(() => {
3200
+ if (this.multiple()) {
3201
+ const valueArray = Array.isArray(currentValue) ? currentValue : [];
3202
+ for (const item of currentItems) {
3203
+ item.checked.set(valueArray.includes(item.value()));
3204
+ }
3205
+ }
3206
+ else {
3207
+ for (const item of currentItems) {
3208
+ item.checked.set(item.value() === currentValue);
3209
+ }
3210
+ }
3211
+ });
3212
+ });
3213
+ }
3214
+ registerItem(item) {
3215
+ this.items.update((items) => [...items, item]);
3216
+ }
3217
+ unregisterItem(item) {
3218
+ this.items.update((items) => items.filter((i) => i !== item));
3219
+ }
3220
+ markTouched() {
3221
+ this.touched.set(true);
3222
+ }
3223
+ select(item) {
3224
+ if (this.disabled() || item.disabled()) {
3225
+ return;
3226
+ }
3227
+ if (this.multiple()) {
3228
+ item.checked.update((v) => !v);
3229
+ this.value.set(this.items()
3230
+ .filter((i) => i.checked())
3231
+ .map((i) => i.value()));
3232
+ }
3233
+ else {
3234
+ for (const i of this.items()) {
3235
+ i.checked.set(i === item);
3236
+ }
3237
+ this.value.set(item.value());
3238
+ }
3239
+ }
3240
+ focusItem(item) {
3241
+ item.elementRef.nativeElement.focus();
3242
+ }
3243
+ toggleAll() {
3244
+ if (this.disabled()) {
3245
+ return;
3246
+ }
3247
+ const shouldCheck = !this.allSelected();
3248
+ for (const item of this.items()) {
3249
+ if (!item.disabled()) {
3250
+ item.checked.set(shouldCheck);
3251
+ }
3252
+ }
3253
+ this.value.set(this.items()
3254
+ .filter((i) => i.checked())
3255
+ .map((i) => i.value()));
3256
+ }
3257
+ activate() {
3258
+ const firstItem = this.items().find((i) => !i.disabled());
3259
+ if (firstItem) {
3260
+ this.select(firstItem);
3261
+ this.focusItem(firstItem);
3262
+ }
3263
+ }
3264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3265
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: SelectionListDirective, isStandalone: true, selector: "[etSelectionList]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, multipleInput: { classPropertyName: "multipleInput", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange" }, host: { properties: { "attr.role": "role()", "attr.aria-invalid": "shouldDisplayError() || null", "attr.aria-required": "required() || null", "attr.aria-describedby": "describedById() || null", "attr.aria-labelledby": "labelId() || null", "attr.data-disabled": "disabled() || null" } }, providers: [{ provide: SELECTION_LIST_TOKEN, useExisting: SelectionListDirective }], ngImport: i0 }); }
3266
+ }
3267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SelectionListDirective, decorators: [{
3268
+ type: Directive,
3269
+ args: [{
3270
+ selector: '[etSelectionList]',
3271
+ providers: [{ provide: SELECTION_LIST_TOKEN, useExisting: SelectionListDirective }],
3272
+ host: {
3273
+ '[attr.role]': 'role()',
3274
+ '[attr.aria-invalid]': 'shouldDisplayError() || null',
3275
+ '[attr.aria-required]': 'required() || null',
3276
+ '[attr.aria-describedby]': 'describedById() || null',
3277
+ '[attr.aria-labelledby]': 'labelId() || null',
3278
+ '[attr.data-disabled]': 'disabled() || null',
3279
+ },
3280
+ }]
3281
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], multipleInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }] } });
3282
+
3283
+ let uniqueOptionLabelId = 0;
3284
+ class SelectionOptionDirective {
3285
+ constructor() {
3286
+ this.list = inject(SELECTION_LIST_TOKEN, { optional: true });
3287
+ this.destroyRef = inject(DestroyRef);
1991
3288
  this.el = inject(ElementRef);
1992
3289
  this.value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1993
3290
  this.checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
@@ -2141,7 +3438,7 @@ class CheckboxOptionComponent {
2141
3438
  this.canAnimate = createCanAnimateSignal();
2142
3439
  }
2143
3440
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CheckboxOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2144
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: CheckboxOptionComponent, isStandalone: true, selector: "et-checkbox-option", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-checkbox-option" }, hostDirectives: [{ directive: SelectionOptionDirective, inputs: ["value", "value", "checked", "checked", "disabled", "disabled"], outputs: ["checkedChange", "checkedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: "<div class=\"et-checkbox-option-box\">\n <svg class=\"et-checkbox-option-check\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path\n d=\"M1 5L4.5 8.5L11 1.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</div>\n<div class=\"et-checkbox-option-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-checkbox-option-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-checkbox-option-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-option-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-option-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-option-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-option-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-checkbox-option-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-checkbox-option{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:flex;align-items:flex-start;gap:var(--et-checkbox-option-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-checkbox-option .et-checkbox-option-box{flex-shrink:0;inline-size:var(--et-checkbox-option-size);block-size:var(--et-checkbox-option-size);border-radius:var(--et-checkbox-option-border-radius);border:var(--et-checkbox-option-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-checkbox-option .et-checkbox-option-check{inline-size:12px;block-size:10px;opacity:0;transform:scale(.5);color:var(--et-theme-color-on-primary-solid, white)}et-checkbox-option .et-checkbox-option-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-checkbox-option .et-checkbox-option-label{color:var(--et-surface-color-muted-solid, currentColor)}et-checkbox-option:hover .et-checkbox-option-box{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-checkbox-option:focus-visible .et-checkbox-option-box{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-checkbox-option[aria-disabled=true]{opacity:var(--et-checkbox-option-opacity-disabled);pointer-events:none;cursor:default}et-checkbox-option[aria-disabled=true] .et-checkbox-option-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box .et-checkbox-option-check{opacity:1;transform:scale(1)}et-checkbox-option[data-can-animate] .et-checkbox-option-box{transition:border-color var(--et-checkbox-option-transition-duration) ease,background-color var(--et-checkbox-option-transition-duration) ease}et-checkbox-option[data-can-animate] .et-checkbox-option-check{transition:opacity var(--et-checkbox-option-transition-duration) ease,transform var(--et-checkbox-option-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-checkbox-option{--et-checkbox-option-transition-duration: 1ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3441
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: CheckboxOptionComponent, isStandalone: true, selector: "et-checkbox-option", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-checkbox-option" }, hostDirectives: [{ directive: SelectionOptionDirective, inputs: ["value", "value", "checked", "checked", "disabled", "disabled"], outputs: ["checkedChange", "checkedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: "<div class=\"et-checkbox-option-box\">\n <svg class=\"et-checkbox-option-check\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path\n d=\"M1 5L4.5 8.5L11 1.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</div>\n<div class=\"et-checkbox-option-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-checkbox-option-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-checkbox-option-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-option-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-option-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-option-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-option-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-checkbox-option-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-checkbox-option{display:flex;align-items:flex-start;gap:var(--et-checkbox-option-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-checkbox-option .et-checkbox-option-box{flex-shrink:0;inline-size:var(--et-checkbox-option-size);block-size:var(--et-checkbox-option-size);border-radius:var(--et-checkbox-option-border-radius);border:var(--et-checkbox-option-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-checkbox-option .et-checkbox-option-check{inline-size:12px;block-size:10px;opacity:0;transform:scale(.5);color:var(--et-theme-color-on-primary-solid, white)}et-checkbox-option .et-checkbox-option-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-checkbox-option .et-checkbox-option-label{color:var(--et-surface-color-muted-solid, currentColor)}et-checkbox-option:hover .et-checkbox-option-box{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-checkbox-option:focus-visible .et-checkbox-option-box{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-checkbox-option[aria-disabled=true]{opacity:var(--et-checkbox-option-opacity-disabled);pointer-events:none;cursor:default}et-checkbox-option[aria-disabled=true] .et-checkbox-option-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box .et-checkbox-option-check{opacity:1;transform:scale(1)}et-checkbox-option[data-can-animate] .et-checkbox-option-box{transition:border-color var(--et-checkbox-option-transition-duration) ease,background-color var(--et-checkbox-option-transition-duration) ease}et-checkbox-option[data-can-animate] .et-checkbox-option-check{transition:opacity var(--et-checkbox-option-transition-duration) ease,transform var(--et-checkbox-option-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-checkbox-option{--et-checkbox-option-transition-duration: 1ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2145
3442
  }
2146
3443
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: CheckboxOptionComponent, decorators: [{
2147
3444
  type: Component,
@@ -2155,7 +3452,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
2155
3452
  ], host: {
2156
3453
  class: 'et-checkbox-option',
2157
3454
  '[attr.data-can-animate]': 'canAnimate.state() || null',
2158
- }, template: "<div class=\"et-checkbox-option-box\">\n <svg class=\"et-checkbox-option-check\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path\n d=\"M1 5L4.5 8.5L11 1.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</div>\n<div class=\"et-checkbox-option-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-checkbox-option-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-checkbox-option-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-option-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-option-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-option-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-option-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-checkbox-option-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-checkbox-option{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:flex;align-items:flex-start;gap:var(--et-checkbox-option-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-checkbox-option .et-checkbox-option-box{flex-shrink:0;inline-size:var(--et-checkbox-option-size);block-size:var(--et-checkbox-option-size);border-radius:var(--et-checkbox-option-border-radius);border:var(--et-checkbox-option-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-checkbox-option .et-checkbox-option-check{inline-size:12px;block-size:10px;opacity:0;transform:scale(.5);color:var(--et-theme-color-on-primary-solid, white)}et-checkbox-option .et-checkbox-option-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-checkbox-option .et-checkbox-option-label{color:var(--et-surface-color-muted-solid, currentColor)}et-checkbox-option:hover .et-checkbox-option-box{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-checkbox-option:focus-visible .et-checkbox-option-box{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-checkbox-option[aria-disabled=true]{opacity:var(--et-checkbox-option-opacity-disabled);pointer-events:none;cursor:default}et-checkbox-option[aria-disabled=true] .et-checkbox-option-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box .et-checkbox-option-check{opacity:1;transform:scale(1)}et-checkbox-option[data-can-animate] .et-checkbox-option-box{transition:border-color var(--et-checkbox-option-transition-duration) ease,background-color var(--et-checkbox-option-transition-duration) ease}et-checkbox-option[data-can-animate] .et-checkbox-option-check{transition:opacity var(--et-checkbox-option-transition-duration) ease,transform var(--et-checkbox-option-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-checkbox-option{--et-checkbox-option-transition-duration: 1ms}}\n"] }]
3455
+ }, template: "<div class=\"et-checkbox-option-box\">\n <svg class=\"et-checkbox-option-check\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path\n d=\"M1 5L4.5 8.5L11 1.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</div>\n<div class=\"et-checkbox-option-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-checkbox-option-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-checkbox-option-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-checkbox-option-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-checkbox-option-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 4px;}@property --et-checkbox-option-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-checkbox-option-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-checkbox-option-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-checkbox-option{display:flex;align-items:flex-start;gap:var(--et-checkbox-option-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-checkbox-option .et-checkbox-option-box{flex-shrink:0;inline-size:var(--et-checkbox-option-size);block-size:var(--et-checkbox-option-size);border-radius:var(--et-checkbox-option-border-radius);border:var(--et-checkbox-option-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-checkbox-option .et-checkbox-option-check{inline-size:12px;block-size:10px;opacity:0;transform:scale(.5);color:var(--et-theme-color-on-primary-solid, white)}et-checkbox-option .et-checkbox-option-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-checkbox-option .et-checkbox-option-label{color:var(--et-surface-color-muted-solid, currentColor)}et-checkbox-option:hover .et-checkbox-option-box{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-checkbox-option:focus-visible .et-checkbox-option-box{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-checkbox-option[aria-disabled=true]{opacity:var(--et-checkbox-option-opacity-disabled);pointer-events:none;cursor:default}et-checkbox-option[aria-disabled=true] .et-checkbox-option-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-checkbox-option[aria-checked=true] .et-checkbox-option-box .et-checkbox-option-check{opacity:1;transform:scale(1)}et-checkbox-option[data-can-animate] .et-checkbox-option-box{transition:border-color var(--et-checkbox-option-transition-duration) ease,background-color var(--et-checkbox-option-transition-duration) ease}et-checkbox-option[data-can-animate] .et-checkbox-option-check{transition:opacity var(--et-checkbox-option-transition-duration) ease,transform var(--et-checkbox-option-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-checkbox-option{--et-checkbox-option-transition-duration: 1ms}}\n"] }]
2159
3456
  }] });
2160
3457
 
2161
3458
  class RadioGroupComponent {
@@ -2199,7 +3496,7 @@ class RadioComponent {
2199
3496
  this.canAnimate = createCanAnimateSignal();
2200
3497
  }
2201
3498
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: RadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2202
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: RadioComponent, isStandalone: true, selector: "et-radio", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-radio" }, hostDirectives: [{ directive: SelectionOptionDirective, inputs: ["value", "value", "checked", "checked", "disabled", "disabled"], outputs: ["checkedChange", "checkedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: "<div class=\"et-radio-circle\"></div>\n<div class=\"et-radio-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-radio-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-radio-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-radio-dot-size{syntax: \"<length>\"; inherits: false; initial-value: 10px;}@property --et-radio-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-radio-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-radio-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-radio-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-radio{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:flex;align-items:flex-start;gap:var(--et-radio-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-radio .et-radio-circle{flex-shrink:0;inline-size:var(--et-radio-size);block-size:var(--et-radio-size);border-radius:50%;border:var(--et-radio-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-radio .et-radio-circle:after{content:\"\";inline-size:var(--et-radio-dot-size);block-size:var(--et-radio-dot-size);border-radius:50%;background-color:var(--et-theme-color-primary-solid, currentColor);transform:scale(0)}et-radio .et-radio-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-radio .et-radio-label{color:var(--et-surface-color-muted-solid, currentColor)}et-radio:hover .et-radio-circle{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-radio:focus-visible .et-radio-circle{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-radio[aria-disabled=true]{opacity:var(--et-radio-opacity-disabled);pointer-events:none;cursor:default}et-radio[aria-disabled=true] .et-radio-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle{border-color:var(--et-theme-color-primary-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle:after{transform:scale(1)}et-radio[data-can-animate] .et-radio-circle{transition:border-color var(--et-radio-transition-duration) ease}et-radio[data-can-animate] .et-radio-circle:after{transition:transform var(--et-radio-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-radio{--et-radio-transition-duration: 1ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3499
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: RadioComponent, isStandalone: true, selector: "et-radio", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-radio" }, hostDirectives: [{ directive: SelectionOptionDirective, inputs: ["value", "value", "checked", "checked", "disabled", "disabled"], outputs: ["checkedChange", "checkedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: "<div class=\"et-radio-circle\"></div>\n<div class=\"et-radio-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-radio-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-radio-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-radio-dot-size{syntax: \"<length>\"; inherits: false; initial-value: 10px;}@property --et-radio-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-radio-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-radio-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-radio-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-radio{display:flex;align-items:flex-start;gap:var(--et-radio-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-radio .et-radio-circle{flex-shrink:0;inline-size:var(--et-radio-size);block-size:var(--et-radio-size);border-radius:50%;border:var(--et-radio-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-radio .et-radio-circle:after{content:\"\";inline-size:var(--et-radio-dot-size);block-size:var(--et-radio-dot-size);border-radius:50%;background-color:var(--et-theme-color-primary-solid, currentColor);transform:scale(0)}et-radio .et-radio-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-radio .et-radio-label{color:var(--et-surface-color-muted-solid, currentColor)}et-radio:hover .et-radio-circle{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-radio:focus-visible .et-radio-circle{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-radio[aria-disabled=true]{opacity:var(--et-radio-opacity-disabled);pointer-events:none;cursor:default}et-radio[aria-disabled=true] .et-radio-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle{border-color:var(--et-theme-color-primary-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle:after{transform:scale(1)}et-radio[data-can-animate] .et-radio-circle{transition:border-color var(--et-radio-transition-duration) ease}et-radio[data-can-animate] .et-radio-circle:after{transition:transform var(--et-radio-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-radio{--et-radio-transition-duration: 1ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2203
3500
  }
2204
3501
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: RadioComponent, decorators: [{
2205
3502
  type: Component,
@@ -2213,7 +3510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
2213
3510
  ], host: {
2214
3511
  class: 'et-radio',
2215
3512
  '[attr.data-can-animate]': 'canAnimate.state() || null',
2216
- }, template: "<div class=\"et-radio-circle\"></div>\n<div class=\"et-radio-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-radio-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-radio-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-radio-dot-size{syntax: \"<length>\"; inherits: false; initial-value: 10px;}@property --et-radio-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-radio-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-radio-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-radio-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-radio{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:flex;align-items:flex-start;gap:var(--et-radio-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-radio .et-radio-circle{flex-shrink:0;inline-size:var(--et-radio-size);block-size:var(--et-radio-size);border-radius:50%;border:var(--et-radio-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-radio .et-radio-circle:after{content:\"\";inline-size:var(--et-radio-dot-size);block-size:var(--et-radio-dot-size);border-radius:50%;background-color:var(--et-theme-color-primary-solid, currentColor);transform:scale(0)}et-radio .et-radio-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-radio .et-radio-label{color:var(--et-surface-color-muted-solid, currentColor)}et-radio:hover .et-radio-circle{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-radio:focus-visible .et-radio-circle{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-radio[aria-disabled=true]{opacity:var(--et-radio-opacity-disabled);pointer-events:none;cursor:default}et-radio[aria-disabled=true] .et-radio-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle{border-color:var(--et-theme-color-primary-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle:after{transform:scale(1)}et-radio[data-can-animate] .et-radio-circle{transition:border-color var(--et-radio-transition-duration) ease}et-radio[data-can-animate] .et-radio-circle:after{transition:transform var(--et-radio-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-radio{--et-radio-transition-duration: 1ms}}\n"] }]
3513
+ }, template: "<div class=\"et-radio-circle\"></div>\n<div class=\"et-radio-content\">\n <span [attr.id]=\"optionDirective.labelId()\" class=\"et-radio-label\">\n <ng-content />\n </span>\n <ng-content select=\"et-description\" />\n</div>\n", styles: ["@property --et-radio-size{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-radio-dot-size{syntax: \"<length>\"; inherits: false; initial-value: 10px;}@property --et-radio-border-width{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-radio-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-radio-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}@property --et-radio-gap{syntax: \"<length>\"; inherits: false; initial-value: 8px;}et-radio{display:flex;align-items:flex-start;gap:var(--et-radio-gap);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}et-radio .et-radio-circle{flex-shrink:0;inline-size:var(--et-radio-size);block-size:var(--et-radio-size);border-radius:50%;border:var(--et-radio-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));display:grid;place-items:center;margin-block-start:2px}et-radio .et-radio-circle:after{content:\"\";inline-size:var(--et-radio-dot-size);block-size:var(--et-radio-dot-size);border-radius:50%;background-color:var(--et-theme-color-primary-solid, currentColor);transform:scale(0)}et-radio .et-radio-content{display:flex;flex-direction:column;gap:2px;min-inline-size:0}et-radio .et-radio-label{color:var(--et-surface-color-muted-solid, currentColor)}et-radio:hover .et-radio-circle{border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-radio:focus-visible .et-radio-circle{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-radio[aria-disabled=true]{opacity:var(--et-radio-opacity-disabled);pointer-events:none;cursor:default}et-radio[aria-disabled=true] .et-radio-label{color:var(--et-surface-interaction-disabled-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle{border-color:var(--et-theme-color-primary-solid, currentColor)}et-radio[aria-checked=true] .et-radio-circle:after{transform:scale(1)}et-radio[data-can-animate] .et-radio-circle{transition:border-color var(--et-radio-transition-duration) ease}et-radio[data-can-animate] .et-radio-circle:after{transition:transform var(--et-radio-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-radio{--et-radio-transition-duration: 1ms}}\n"] }]
2217
3514
  }] });
2218
3515
 
2219
3516
  class SegmentedButtonGroupComponent {
@@ -2257,7 +3554,7 @@ class SegmentedButtonComponent {
2257
3554
  this.canAnimate = createCanAnimateSignal();
2258
3555
  }
2259
3556
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SegmentedButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2260
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: SegmentedButtonComponent, isStandalone: true, selector: "et-segmented-button", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-segmented-button" }, hostDirectives: [{ directive: SelectionOptionDirective, inputs: ["value", "value", "checked", "checked", "disabled", "disabled"], outputs: ["checkedChange", "checkedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: '<ng-content />', isInline: true, styles: ["@property --et-segmented-button-padding-x{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-segmented-button-padding-y{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-segmented-button-border-width{syntax: \"<length>\"; inherits: false; initial-value: 1px;}@property --et-segmented-button-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-segmented-button-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-segmented-button{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:inline-flex;align-items:center;justify-content:center;padding:var(--et-segmented-button-padding-y) var(--et-segmented-button-padding-x);cursor:pointer;outline:none;border:var(--et-segmented-button-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));background:transparent;color:inherit;-webkit-user-select:none;user-select:none}et-segmented-button[aria-disabled=true]{opacity:var(--et-segmented-button-opacity-disabled);pointer-events:none;cursor:default}et-segmented-button:hover:not([aria-disabled=true]){border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-segmented-button:focus-visible{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:-1px}et-segmented-button:active:not([aria-disabled=true]){transform:scale(.97)}et-segmented-button[aria-checked=true]{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor);color:var(--et-theme-color-on-primary-solid, white)}et-segmented-button[aria-checked=true]:hover{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-segmented-button[data-can-animate]{transition:background-color var(--et-segmented-button-transition-duration) ease,border-color var(--et-segmented-button-transition-duration) ease,color var(--et-segmented-button-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-segmented-button{--et-segmented-button-transition-duration: 1ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3557
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: SegmentedButtonComponent, isStandalone: true, selector: "et-segmented-button", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-segmented-button" }, hostDirectives: [{ directive: SelectionOptionDirective, inputs: ["value", "value", "checked", "checked", "disabled", "disabled"], outputs: ["checkedChange", "checkedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: '<ng-content />', isInline: true, styles: ["@property --et-segmented-button-padding-x{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-segmented-button-padding-y{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-segmented-button-border-width{syntax: \"<length>\"; inherits: false; initial-value: 1px;}@property --et-segmented-button-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-segmented-button-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-segmented-button{display:inline-flex;align-items:center;justify-content:center;padding:var(--et-segmented-button-padding-y) var(--et-segmented-button-padding-x);cursor:pointer;outline:none;border:var(--et-segmented-button-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));background:transparent;color:inherit;-webkit-user-select:none;user-select:none}et-segmented-button[aria-disabled=true]{opacity:var(--et-segmented-button-opacity-disabled);pointer-events:none;cursor:default}et-segmented-button:hover:not([aria-disabled=true]){border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-segmented-button:focus-visible{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:-1px}et-segmented-button:active:not([aria-disabled=true]){transform:scale(.97)}et-segmented-button[aria-checked=true]{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor);color:var(--et-theme-color-on-primary-solid, white)}et-segmented-button[aria-checked=true]:hover{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-segmented-button[data-can-animate]{transition:background-color var(--et-segmented-button-transition-duration) ease,border-color var(--et-segmented-button-transition-duration) ease,color var(--et-segmented-button-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-segmented-button{--et-segmented-button-transition-duration: 1ms}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2261
3558
  }
2262
3559
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SegmentedButtonComponent, decorators: [{
2263
3560
  type: Component,
@@ -2271,7 +3568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
2271
3568
  ], host: {
2272
3569
  class: 'et-segmented-button',
2273
3570
  '[attr.data-can-animate]': 'canAnimate.state() || null',
2274
- }, styles: ["@property --et-segmented-button-padding-x{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-segmented-button-padding-y{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-segmented-button-border-width{syntax: \"<length>\"; inherits: false; initial-value: 1px;}@property --et-segmented-button-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-segmented-button-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-segmented-button{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:inline-flex;align-items:center;justify-content:center;padding:var(--et-segmented-button-padding-y) var(--et-segmented-button-padding-x);cursor:pointer;outline:none;border:var(--et-segmented-button-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));background:transparent;color:inherit;-webkit-user-select:none;user-select:none}et-segmented-button[aria-disabled=true]{opacity:var(--et-segmented-button-opacity-disabled);pointer-events:none;cursor:default}et-segmented-button:hover:not([aria-disabled=true]){border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-segmented-button:focus-visible{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:-1px}et-segmented-button:active:not([aria-disabled=true]){transform:scale(.97)}et-segmented-button[aria-checked=true]{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor);color:var(--et-theme-color-on-primary-solid, white)}et-segmented-button[aria-checked=true]:hover{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-segmented-button[data-can-animate]{transition:background-color var(--et-segmented-button-transition-duration) ease,border-color var(--et-segmented-button-transition-duration) ease,color var(--et-segmented-button-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-segmented-button{--et-segmented-button-transition-duration: 1ms}}\n"] }]
3571
+ }, styles: ["@property --et-segmented-button-padding-x{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-segmented-button-padding-y{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-segmented-button-border-width{syntax: \"<length>\"; inherits: false; initial-value: 1px;}@property --et-segmented-button-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-segmented-button-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-segmented-button{display:inline-flex;align-items:center;justify-content:center;padding:var(--et-segmented-button-padding-y) var(--et-segmented-button-padding-x);cursor:pointer;outline:none;border:var(--et-segmented-button-border-width) solid var(--_et-control-border, var(--et-surface-border-solid, currentColor));background:transparent;color:inherit;-webkit-user-select:none;user-select:none}et-segmented-button[aria-disabled=true]{opacity:var(--et-segmented-button-opacity-disabled);pointer-events:none;cursor:default}et-segmented-button:hover:not([aria-disabled=true]){border-color:var(--_et-control-border, var(--et-surface-interaction-hover-solid, currentColor))}et-segmented-button:focus-visible{border-color:var(--et-theme-color-primary-solid);outline:1px solid var(--et-theme-color-primary-solid);outline-offset:-1px}et-segmented-button:active:not([aria-disabled=true]){transform:scale(.97)}et-segmented-button[aria-checked=true]{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor);color:var(--et-theme-color-on-primary-solid, white)}et-segmented-button[aria-checked=true]:hover{background-color:var(--et-theme-color-primary-solid, currentColor);border-color:var(--et-theme-color-primary-solid, currentColor)}et-segmented-button[data-can-animate]{transition:background-color var(--et-segmented-button-transition-duration) ease,border-color var(--et-segmented-button-transition-duration) ease,color var(--et-segmented-button-transition-duration) ease}@media(prefers-reduced-motion:reduce){et-segmented-button{--et-segmented-button-transition-duration: 1ms}}\n"] }]
2275
3572
  }] });
2276
3573
 
2277
3574
  class SwitchDirective {
@@ -2334,7 +3631,7 @@ class SwitchComponent {
2334
3631
  this.canAnimate = createCanAnimateSignal();
2335
3632
  }
2336
3633
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SwitchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2337
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: SwitchComponent, isStandalone: true, selector: "et-switch", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-switch" }, hostDirectives: [{ directive: SwitchDirective, inputs: ["checked", "checked", "disabled", "disabled", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name"], outputs: ["checkedChange", "checkedChange", "touchedChange", "touchedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: "<div class=\"et-switch-track\">\n <div class=\"et-switch-thumb\"></div>\n</div>\n", styles: ["@property --et-switch-track-width{syntax: \"<length>\"; inherits: false; initial-value: 36px;}@property --et-switch-track-height{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-switch-thumb-size{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-switch-thumb-offset{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-switch-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-switch-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-switch{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:inline-flex;align-items:center;cursor:pointer;outline:none}et-switch[aria-disabled=true]{opacity:var(--et-switch-opacity-disabled);pointer-events:none;cursor:default}et-switch .et-switch-track{position:relative;width:var(--et-switch-track-width);height:var(--et-switch-track-height);border-radius:calc(var(--et-switch-track-height) / 2);background-color:var(--_et-control-border, var(--et-surface-border-solid, currentColor));opacity:.4}et-switch:hover:not([aria-disabled=true]) .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch:not([aria-disabled=true]) .et-switch-track{opacity:.55}:where(et-choice-field[data-error]) et-switch:not([aria-disabled=true]) .et-switch-track{background-color:var(--et-theme-color-primary-solid);opacity:.4}et-switch:focus-visible .et-switch-track{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-switch:active:not([aria-disabled=true]) .et-switch-track{transform:scale(.95)}et-switch .et-switch-thumb{position:absolute;top:var(--et-switch-thumb-offset);left:var(--et-switch-thumb-offset);width:var(--et-switch-thumb-size);height:var(--et-switch-thumb-size);border-radius:50%;background-color:var(--et-theme-color-on-primary-solid, white)}et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[aria-checked=true] .et-switch-thumb{left:calc(var(--et-switch-track-width) - var(--et-switch-thumb-size) - var(--et-switch-thumb-offset))}et-switch[aria-checked=true]:hover .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[data-can-animate] .et-switch-track{transition:background-color var(--et-switch-transition-duration) ease,opacity var(--et-switch-transition-duration) ease}et-switch[data-can-animate] .et-switch-thumb{transition:left var(--et-switch-transition-duration) ease}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3634
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: SwitchComponent, isStandalone: true, selector: "et-switch", host: { properties: { "attr.data-can-animate": "canAnimate.state() || null" }, classAttribute: "et-switch" }, hostDirectives: [{ directive: SwitchDirective, inputs: ["checked", "checked", "disabled", "disabled", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name"], outputs: ["checkedChange", "checkedChange", "touchedChange", "touchedChange"] }, { directive: i2.ColorInteractiveDirective }], ngImport: i0, template: "<div class=\"et-switch-track\">\n <div class=\"et-switch-thumb\"></div>\n</div>\n", styles: ["@property --et-switch-track-width{syntax: \"<length>\"; inherits: false; initial-value: 36px;}@property --et-switch-track-height{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-switch-thumb-size{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-switch-thumb-offset{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-switch-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-switch-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-switch{display:inline-flex;align-items:center;cursor:pointer;outline:none}et-switch[aria-disabled=true]{opacity:var(--et-switch-opacity-disabled);pointer-events:none;cursor:default}et-switch .et-switch-track{position:relative;width:var(--et-switch-track-width);height:var(--et-switch-track-height);border-radius:calc(var(--et-switch-track-height) / 2);background-color:var(--_et-control-border, var(--et-surface-border-solid, currentColor));opacity:.4}et-switch:hover:not([aria-disabled=true]) .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch:not([aria-disabled=true]) .et-switch-track{opacity:.55}:where(et-choice-field[data-error]) et-switch:not([aria-disabled=true]) .et-switch-track{background-color:var(--et-theme-color-primary-solid);opacity:.4}et-switch:focus-visible .et-switch-track{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-switch:active:not([aria-disabled=true]) .et-switch-track{transform:scale(.95)}et-switch .et-switch-thumb{position:absolute;top:var(--et-switch-thumb-offset);left:var(--et-switch-thumb-offset);width:var(--et-switch-thumb-size);height:var(--et-switch-thumb-size);border-radius:50%;background-color:var(--et-theme-color-on-primary-solid, white)}et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[aria-checked=true] .et-switch-thumb{left:calc(var(--et-switch-track-width) - var(--et-switch-thumb-size) - var(--et-switch-thumb-offset))}et-switch[aria-checked=true]:hover .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[data-can-animate] .et-switch-track{transition:background-color var(--et-switch-transition-duration) ease,opacity var(--et-switch-transition-duration) ease}et-switch[data-can-animate] .et-switch-thumb{transition:left var(--et-switch-transition-duration) ease}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2338
3635
  }
2339
3636
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: SwitchComponent, decorators: [{
2340
3637
  type: Component,
@@ -2348,7 +3645,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
2348
3645
  ], host: {
2349
3646
  class: 'et-switch',
2350
3647
  '[attr.data-can-animate]': 'canAnimate.state() || null',
2351
- }, template: "<div class=\"et-switch-track\">\n <div class=\"et-switch-thumb\"></div>\n</div>\n", styles: ["@property --et-switch-track-width{syntax: \"<length>\"; inherits: false; initial-value: 36px;}@property --et-switch-track-height{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-switch-thumb-size{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-switch-thumb-offset{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-switch-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-switch-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-switch{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));display:inline-flex;align-items:center;cursor:pointer;outline:none}et-switch[aria-disabled=true]{opacity:var(--et-switch-opacity-disabled);pointer-events:none;cursor:default}et-switch .et-switch-track{position:relative;width:var(--et-switch-track-width);height:var(--et-switch-track-height);border-radius:calc(var(--et-switch-track-height) / 2);background-color:var(--_et-control-border, var(--et-surface-border-solid, currentColor));opacity:.4}et-switch:hover:not([aria-disabled=true]) .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch:not([aria-disabled=true]) .et-switch-track{opacity:.55}:where(et-choice-field[data-error]) et-switch:not([aria-disabled=true]) .et-switch-track{background-color:var(--et-theme-color-primary-solid);opacity:.4}et-switch:focus-visible .et-switch-track{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-switch:active:not([aria-disabled=true]) .et-switch-track{transform:scale(.95)}et-switch .et-switch-thumb{position:absolute;top:var(--et-switch-thumb-offset);left:var(--et-switch-thumb-offset);width:var(--et-switch-thumb-size);height:var(--et-switch-thumb-size);border-radius:50%;background-color:var(--et-theme-color-on-primary-solid, white)}et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[aria-checked=true] .et-switch-thumb{left:calc(var(--et-switch-track-width) - var(--et-switch-thumb-size) - var(--et-switch-thumb-offset))}et-switch[aria-checked=true]:hover .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[data-can-animate] .et-switch-track{transition:background-color var(--et-switch-transition-duration) ease,opacity var(--et-switch-transition-duration) ease}et-switch[data-can-animate] .et-switch-thumb{transition:left var(--et-switch-transition-duration) ease}\n"] }]
3648
+ }, template: "<div class=\"et-switch-track\">\n <div class=\"et-switch-thumb\"></div>\n</div>\n", styles: ["@property --et-switch-track-width{syntax: \"<length>\"; inherits: false; initial-value: 36px;}@property --et-switch-track-height{syntax: \"<length>\"; inherits: false; initial-value: 20px;}@property --et-switch-thumb-size{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-switch-thumb-offset{syntax: \"<length>\"; inherits: false; initial-value: 2px;}@property --et-switch-transition-duration{syntax: \"<time>\"; inherits: false; initial-value: .15s;}@property --et-switch-opacity-disabled{syntax: \"<number>\"; inherits: false; initial-value: .5;}et-switch{display:inline-flex;align-items:center;cursor:pointer;outline:none}et-switch[aria-disabled=true]{opacity:var(--et-switch-opacity-disabled);pointer-events:none;cursor:default}et-switch .et-switch-track{position:relative;width:var(--et-switch-track-width);height:var(--et-switch-track-height);border-radius:calc(var(--et-switch-track-height) / 2);background-color:var(--_et-control-border, var(--et-surface-border-solid, currentColor));opacity:.4}et-switch:hover:not([aria-disabled=true]) .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch:not([aria-disabled=true]) .et-switch-track{opacity:.55}:where(et-choice-field[data-error]) et-switch:not([aria-disabled=true]) .et-switch-track{background-color:var(--et-theme-color-primary-solid);opacity:.4}et-switch:focus-visible .et-switch-track{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:2px}et-switch:active:not([aria-disabled=true]) .et-switch-track{transform:scale(.95)}et-switch .et-switch-thumb{position:absolute;top:var(--et-switch-thumb-offset);left:var(--et-switch-thumb-offset);width:var(--et-switch-thumb-size);height:var(--et-switch-thumb-size);border-radius:50%;background-color:var(--et-theme-color-on-primary-solid, white)}et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[aria-checked=true] .et-switch-thumb{left:calc(var(--et-switch-track-width) - var(--et-switch-thumb-size) - var(--et-switch-thumb-offset))}et-switch[aria-checked=true]:hover .et-switch-track,:where(et-choice-field:has(.et-choice-field-label-area:hover)) et-switch[aria-checked=true] .et-switch-track{background-color:var(--et-theme-color-primary-solid, currentColor);opacity:1}et-switch[data-can-animate] .et-switch-track{transition:background-color var(--et-switch-transition-duration) ease,opacity var(--et-switch-transition-duration) ease}et-switch[data-can-animate] .et-switch-thumb{transition:left var(--et-switch-transition-duration) ease}\n"] }]
2352
3649
  }] });
2353
3650
 
2354
3651
  const SWITCH_IMPORTS = [SwitchComponent, SwitchDirective];
@@ -2384,14 +3681,38 @@ const itemsCollide = (a, b) => {
2384
3681
  * Returns the first item that collides with the given position, or undefined if none.
2385
3682
  */
2386
3683
  const findCollision = (options) => options.entries.find((entry) => entry.id !== options.excludeId && itemsCollide(entry.position, options.position));
3684
+ /**
3685
+ * Clamps a position so it fits horizontally within the given column count.
3686
+ * Reduces an over-wide span and slides an out-of-bounds column back in range.
3687
+ */
3688
+ const clampToColumns = (position, columns) => {
3689
+ const colSpan = Math.max(1, Math.min(position.colSpan, columns));
3690
+ const col = Math.max(0, Math.min(position.col, columns - colSpan));
3691
+ return { ...position, col, colSpan };
3692
+ };
2387
3693
  /**
2388
3694
  * Compacts the layout vertically (moves items up as far as possible without collision).
3695
+ *
3696
+ * Also acts as a self-healing normaliser: positions that overflow the grid horizontally
3697
+ * (e.g. stale data from a wider breakpoint clamped into a narrower one — a colSpan of 12
3698
+ * or a col of 8 in a 6-column grid) are first clamped back into bounds, then any items
3699
+ * left overlapping are pushed down before the upward compaction runs. This guarantees the
3700
+ * returned layout is always in-bounds and overlap-free regardless of the input — clamping
3701
+ * a column alone is not enough, because it can drop an item on top of an existing one.
2389
3702
  */
2390
- const compactLayout = (entries, _columns) => {
2391
- const sorted = [...entries].sort((a, b) => a.position.row - b.position.row || a.position.col - b.position.col);
3703
+ const compactLayout = (entries, columns) => {
3704
+ const sorted = [...entries]
3705
+ .map((entry) => ({ ...entry, position: clampToColumns(entry.position, columns) }))
3706
+ .sort((a, b) => a.position.row - b.position.row || a.position.col - b.position.col);
2392
3707
  const compacted = [];
2393
3708
  for (const entry of sorted) {
2394
3709
  const candidate = { ...entry, position: { ...entry.position } };
3710
+ // Push down past any already-placed item it overlaps. This resolves overlaps introduced
3711
+ // by clamping out-of-bounds columns (which the upward pass below cannot fix on its own).
3712
+ while (findCollision({ entries: compacted, position: candidate.position, excludeId: candidate.id })) {
3713
+ candidate.position.row += 1;
3714
+ }
3715
+ // Then pull up as far as possible without colliding.
2395
3716
  while (candidate.position.row > 0) {
2396
3717
  const moved = { ...candidate, position: { ...candidate.position, row: candidate.position.row - 1 } };
2397
3718
  if (findCollision({ entries: compacted, position: moved.position, excludeId: candidate.id })) {
@@ -2620,6 +3941,17 @@ const deserializeGridLayout = (state, breakpointMinWidths) => {
2620
3941
  return { breakpoints, items, rowHeight: state.rowHeight };
2621
3942
  };
2622
3943
 
3944
+ const positionsEqual = (a, b) => a.col === b.col && a.row === b.row && a.colSpan === b.colSpan && a.rowSpan === b.rowSpan;
3945
+ const layoutsEqual = (a, b) => {
3946
+ const aKeys = Object.keys(a);
3947
+ if (aKeys.length !== Object.keys(b).length)
3948
+ return false;
3949
+ return aKeys.every((k) => {
3950
+ const ap = a[k];
3951
+ const bp = b[k];
3952
+ return ap !== undefined && bp !== undefined && positionsEqual(ap, bp);
3953
+ });
3954
+ };
2623
3955
  const DEFAULT_CONSTRAINTS = {
2624
3956
  minColSpan: 1,
2625
3957
  maxColSpan: 12,
@@ -2719,14 +4051,41 @@ class GridDirective {
2719
4051
  this.itemConfigs.set(initial);
2720
4052
  return;
2721
4053
  }
2722
- const currentIds = new Set(current.map((c) => c.id));
2723
- const newItems = initial.filter((item) => !currentIds.has(item.id));
4054
+ const currentById = new Map(current.map((c) => [c.id, c]));
4055
+ const initialIds = new Set(initial.map((i) => i.id));
4056
+ const newItems = initial.filter((item) => !currentById.has(item.id));
4057
+ const removedIds = current.filter((c) => !initialIds.has(c.id)).map((c) => c.id);
4058
+ // Pure layout update — same item set but positions changed (e.g. the host
4059
+ // reset its signal to a saved snapshot after the user cancelled edits).
4060
+ // A structural add/remove takes precedence and is handled below.
4061
+ if (newItems.length === 0 && removedIds.length === 0) {
4062
+ const anyLayoutChanged = initial.some((incoming) => {
4063
+ const existing = currentById.get(incoming.id);
4064
+ return existing && !layoutsEqual(existing.layout, incoming.layout);
4065
+ });
4066
+ if (anyLayoutChanged) {
4067
+ // Restore itemConfigs from the incoming snapshot.
4068
+ this.itemConfigs.set(initial);
4069
+ // Rebuild layoutOverrides for every breakpoint that has already been
4070
+ // visited so the grid renders the restored positions immediately without
4071
+ // waiting for a breakpoint switch.
4072
+ const visitedBps = Object.keys(this.layoutOverrides());
4073
+ if (visitedBps.length > 0) {
4074
+ const restored = {};
4075
+ for (const bp of visitedBps) {
4076
+ restored[bp] = initial.map((item) => ({
4077
+ id: item.id,
4078
+ position: item.layout[bp] ?? { col: 0, row: 0, colSpan: 1, rowSpan: 1 },
4079
+ }));
4080
+ }
4081
+ this.layoutOverrides.set(restored);
4082
+ }
4083
+ }
4084
+ return;
4085
+ }
2724
4086
  for (const item of newItems) {
2725
4087
  this.placeItem(item);
2726
4088
  }
2727
- // Remove items no longer in initial
2728
- const initialIds = new Set(initial.map((i) => i.id));
2729
- const removedIds = current.filter((c) => !initialIds.has(c.id)).map((c) => c.id);
2730
4089
  for (const id of removedIds) {
2731
4090
  this.removeItem(id);
2732
4091
  }
@@ -2799,27 +4158,33 @@ class GridDirective {
2799
4158
  // On first registration the item may have been auto-placed with 1×1 defaults
2800
4159
  // (because addItem runs before the GridItemDirective initialises). If so,
2801
4160
  // re-place it now at the correct minimum size.
2802
- const breakpoint = this.activeBreakpoint();
2803
- const existing = this.layoutOverrides()[breakpoint];
2804
- if (!existing)
2805
- return;
2806
- const entry = existing.find((e) => e.id === id);
2807
- if (!entry)
2808
- return;
2809
- const pos = entry.position;
2810
- if (pos.colSpan >= constraints.minColSpan && pos.rowSpan >= constraints.minRowSpan)
2811
- return;
2812
- const cols = this.activeColumns();
2813
- const others = existing.filter((e) => e.id !== id);
2814
- const newPosition = autoPlace({
2815
- entries: others,
2816
- colSpan: Math.max(pos.colSpan, constraints.minColSpan),
2817
- rowSpan: Math.max(pos.rowSpan, constraints.minRowSpan),
2818
- columns: cols,
4161
+ // All signal reads are wrapped in untracked() to prevent this method from
4162
+ // inadvertently becoming a dependency of the caller's reactive context
4163
+ // (e.g. GridItemDirective's registration effect), which would cause the
4164
+ // layoutOverrides.update() write below to re-trigger that effect in a loop.
4165
+ untracked(() => {
4166
+ const breakpoint = this.activeBreakpoint();
4167
+ const existing = this.layoutOverrides()[breakpoint];
4168
+ if (!existing)
4169
+ return;
4170
+ const entry = existing.find((e) => e.id === id);
4171
+ if (!entry)
4172
+ return;
4173
+ const pos = entry.position;
4174
+ if (pos.colSpan >= constraints.minColSpan && pos.rowSpan >= constraints.minRowSpan)
4175
+ return;
4176
+ const cols = this.activeColumns();
4177
+ const others = existing.filter((e) => e.id !== id);
4178
+ const newPosition = autoPlace({
4179
+ entries: others,
4180
+ colSpan: Math.max(pos.colSpan, constraints.minColSpan),
4181
+ rowSpan: Math.max(pos.rowSpan, constraints.minRowSpan),
4182
+ columns: cols,
4183
+ });
4184
+ const updated = existing.map((e) => (e.id === id ? { ...e, position: newPosition } : e));
4185
+ const compacted = compactLayout(updated, cols);
4186
+ this.layoutOverrides.update((prev) => ({ ...prev, [breakpoint]: compacted }));
2819
4187
  });
2820
- const updated = existing.map((e) => (e.id === id ? { ...e, position: newPosition } : e));
2821
- const compacted = compactLayout(updated, cols);
2822
- this.layoutOverrides.update((prev) => ({ ...prev, [breakpoint]: compacted }));
2823
4188
  }
2824
4189
  registerItem(id, options) {
2825
4190
  this.itemElements.set(id, options.el);
@@ -2960,6 +4325,7 @@ class GridDirective {
2960
4325
  const currentLayout = this.baseLayout().filter((e) => e.id !== id);
2961
4326
  const compacted = compactLayout(currentLayout, columns);
2962
4327
  this.updateLayoutForCurrentBreakpoint(compacted);
4328
+ this.compactOtherBreakpoints(id);
2963
4329
  this.emitLayoutChange();
2964
4330
  this.animateLayoutTransition({ excludeIds: new Set([id]) });
2965
4331
  };
@@ -2970,6 +4336,7 @@ class GridDirective {
2970
4336
  const currentLayout = this.baseLayout().filter((e) => e.id !== id);
2971
4337
  const compacted = compactLayout(currentLayout, columns);
2972
4338
  this.updateLayoutForCurrentBreakpoint(compacted);
4339
+ this.compactOtherBreakpoints(id);
2973
4340
  this.emitLayoutChange();
2974
4341
  }
2975
4342
  }
@@ -3022,8 +4389,22 @@ class GridDirective {
3022
4389
  this.resizeBaseLayout.set(null);
3023
4390
  }
3024
4391
  getSerializedState() {
4392
+ const overrides = this.layoutOverrides();
4393
+ // layoutOverrides is the authoritative source for any breakpoint that has been visited.
4394
+ // itemConfigs.layout[bp] lags behind for breakpoints that haven't been written back
4395
+ // yet (e.g. items pushed by moveItem/resizeItem collision resolution, or items whose
4396
+ // non-current-breakpoint positions haven't been visited since the last change).
4397
+ const items = this.itemConfigs().map((item) => {
4398
+ const layout = { ...item.layout };
4399
+ for (const [bp, entries] of Object.entries(overrides)) {
4400
+ const entry = entries.find((e) => e.id === item.id);
4401
+ if (entry)
4402
+ layout[bp] = entry.position;
4403
+ }
4404
+ return { ...item, layout };
4405
+ });
3025
4406
  return serializeGridLayout({
3026
- items: this.itemConfigs(),
4407
+ items,
3027
4408
  breakpoints: this.breakpoints(),
3028
4409
  rowHeight: this.rowHeight(),
3029
4410
  });
@@ -3052,24 +4433,45 @@ class GridDirective {
3052
4433
  this.layoutOverrides.set(overrides);
3053
4434
  }
3054
4435
  placeItem(config) {
3055
- const breakpoint = this.activeBreakpoint();
4436
+ const activeBp = this.activeBreakpoint();
3056
4437
  const columns = this.activeColumns();
3057
4438
  const currentLayout = this.baseLayout();
3058
4439
  const constraints = this.getConstraints(config.id);
3059
- const position = config.layout[breakpoint] ??
4440
+ const allBreakpoints = this.breakpoints();
4441
+ const overrides = this.layoutOverrides();
4442
+ const existingItems = this.itemConfigs();
4443
+ // Start from any layouts already in the config (e.g. when re-adding from API data).
4444
+ const layout = { ...config.layout };
4445
+ // Place on the active breakpoint first so other breakpoints can use it as a reference.
4446
+ const position = layout[activeBp] ??
3060
4447
  autoPlace({
3061
4448
  entries: currentLayout,
3062
4449
  colSpan: constraints.minColSpan,
3063
4450
  rowSpan: constraints.minRowSpan,
3064
4451
  columns,
3065
4452
  });
3066
- const itemWithLayout = {
3067
- ...config,
3068
- layout: {
3069
- ...config.layout,
3070
- [breakpoint]: position,
3071
- },
3072
- };
4453
+ layout[activeBp] = position;
4454
+ // Auto-place on every other breakpoint that has no position yet.
4455
+ // This ensures the emitted layoutChange always carries all breakpoints so
4456
+ // the host's gridItems signal never loses sm/md positions for new items.
4457
+ for (const bp of allBreakpoints) {
4458
+ if (bp.name === activeBp || layout[bp.name])
4459
+ continue;
4460
+ // Effective layout for this breakpoint: prefer layoutOverrides (already visited),
4461
+ // fall back to itemConfigs.layout[bp] (original API positions).
4462
+ const bpEntries = overrides[bp.name] ??
4463
+ existingItems.map((item) => ({
4464
+ id: item.id,
4465
+ position: item.layout[bp.name] ?? { col: 0, row: 0, colSpan: 1, rowSpan: 1 },
4466
+ }));
4467
+ layout[bp.name] = autoPlace({
4468
+ entries: bpEntries,
4469
+ colSpan: Math.min(constraints.minColSpan, bp.columns),
4470
+ rowSpan: constraints.minRowSpan,
4471
+ columns: bp.columns,
4472
+ });
4473
+ }
4474
+ const itemWithLayout = { ...config, layout };
3073
4475
  this.itemConfigs.update((items) => [...items, itemWithLayout]);
3074
4476
  this.updateLayoutForCurrentBreakpoint([...currentLayout, { id: config.id, position }]);
3075
4477
  this.emitLayoutChange();
@@ -3153,6 +4555,19 @@ class GridDirective {
3153
4555
  return collides ? original : entry;
3154
4556
  });
3155
4557
  }
4558
+ /** Compact all visited breakpoints (layoutOverrides entries) after an item is removed. */
4559
+ compactOtherBreakpoints(removedId) {
4560
+ const activeBp = this.activeBreakpoint();
4561
+ const bpColumns = new Map(this.breakpoints().map((b) => [b.name, b.columns]));
4562
+ for (const [bp, entries] of Object.entries(this.layoutOverrides())) {
4563
+ if (bp === activeBp)
4564
+ continue;
4565
+ const withoutItem = entries.filter((e) => e.id !== removedId);
4566
+ const cols = bpColumns.get(bp) ?? 1;
4567
+ const compacted = compactLayout(withoutItem, cols);
4568
+ this.layoutOverrides.update((prev) => ({ ...prev, [bp]: compacted }));
4569
+ }
4570
+ }
3156
4571
  updateLayoutForCurrentBreakpoint(entries) {
3157
4572
  const breakpoint = this.activeBreakpoint();
3158
4573
  this.layoutOverrides.update((prev) => ({ ...prev, [breakpoint]: entries }));
@@ -3207,10 +4622,8 @@ class GridItemDirective {
3207
4622
  this.currentRow = computed(() => this.renderPosition()?.row ?? 0, ...(ngDevMode ? [{ debugName: "currentRow" }] : /* istanbul ignore next */ []));
3208
4623
  this.currentColSpan = computed(() => this.renderPosition()?.colSpan ?? 1, ...(ngDevMode ? [{ debugName: "currentColSpan" }] : /* istanbul ignore next */ []));
3209
4624
  this.currentRowSpan = computed(() => this.renderPosition()?.rowSpan ?? 1, ...(ngDevMode ? [{ debugName: "currentRowSpan" }] : /* istanbul ignore next */ []));
3210
- this.hostStyles = signalHostStyles({
3211
- 'grid-column': computed(() => `${this.currentCol() + 1} / span ${this.currentColSpan()}`),
3212
- 'grid-row': computed(() => `${this.currentRow() + 1} / span ${this.currentRowSpan()}`),
3213
- });
4625
+ this.gridColumn = computed(() => `${this.currentCol() + 1} / span ${this.currentColSpan()}`, ...(ngDevMode ? [{ debugName: "gridColumn" }] : /* istanbul ignore next */ []));
4626
+ this.gridRow = computed(() => `${this.currentRow() + 1} / span ${this.currentRowSpan()}`, ...(ngDevMode ? [{ debugName: "gridRow" }] : /* istanbul ignore next */ []));
3214
4627
  effect((onCleanup) => {
3215
4628
  const id = this.itemId();
3216
4629
  const el = this.hostElement.nativeElement;
@@ -3241,7 +4654,7 @@ class GridItemDirective {
3241
4654
  });
3242
4655
  }
3243
4656
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3244
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: GridItemDirective, isStandalone: true, selector: "[etGridItem]", inputs: { itemId: { classPropertyName: "itemId", publicName: "itemId", isSignal: true, isRequired: true, transformFunction: null }, minColSpan: { classPropertyName: "minColSpan", publicName: "minColSpan", isSignal: true, isRequired: false, transformFunction: null }, maxColSpan: { classPropertyName: "maxColSpan", publicName: "maxColSpan", isSignal: true, isRequired: false, transformFunction: null }, minRowSpan: { classPropertyName: "minRowSpan", publicName: "minRowSpan", isSignal: true, isRequired: false, transformFunction: null }, maxRowSpan: { classPropertyName: "maxRowSpan", publicName: "maxRowSpan", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-grid-item" }, exportAs: ["etGridItem"], ngImport: i0 }); }
4657
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: GridItemDirective, isStandalone: true, selector: "[etGridItem]", inputs: { itemId: { classPropertyName: "itemId", publicName: "itemId", isSignal: true, isRequired: true, transformFunction: null }, minColSpan: { classPropertyName: "minColSpan", publicName: "minColSpan", isSignal: true, isRequired: false, transformFunction: null }, maxColSpan: { classPropertyName: "maxColSpan", publicName: "maxColSpan", isSignal: true, isRequired: false, transformFunction: null }, minRowSpan: { classPropertyName: "minRowSpan", publicName: "minRowSpan", isSignal: true, isRequired: false, transformFunction: null }, maxRowSpan: { classPropertyName: "maxRowSpan", publicName: "maxRowSpan", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.grid-column": "gridColumn()", "style.grid-row": "gridRow()" }, classAttribute: "et-grid-item" }, exportAs: ["etGridItem"], ngImport: i0 }); }
3245
4658
  }
3246
4659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridItemDirective, decorators: [{
3247
4660
  type: Directive,
@@ -3250,6 +4663,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
3250
4663
  exportAs: 'etGridItem',
3251
4664
  host: {
3252
4665
  class: 'et-grid-item',
4666
+ '[style.grid-column]': 'gridColumn()',
4667
+ '[style.grid-row]': 'gridRow()',
3253
4668
  },
3254
4669
  }]
3255
4670
  }], ctorParameters: () => [], propDecorators: { itemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemId", required: true }] }], minColSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "minColSpan", required: false }] }], maxColSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxColSpan", required: false }] }], minRowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "minRowSpan", required: false }] }], maxRowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxRowSpan", required: false }] }] } });
@@ -3264,12 +4679,10 @@ class GridDragDirective {
3264
4679
  this.renderer = injectRenderer();
3265
4680
  this.dragStartClient = signal(null, ...(ngDevMode ? [{ debugName: "dragStartClient" }] : /* istanbul ignore next */ []));
3266
4681
  this.dragPixelOffset = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "dragPixelOffset" }] : /* istanbul ignore next */ []));
3267
- this.hostStyles = signalHostStyles({
3268
- transform: computed(() => {
3269
- const offset = this.dragPixelOffset();
3270
- return `translate(${offset.x}px, ${offset.y}px)`;
3271
- }),
3272
- });
4682
+ this.dragTransform = computed(() => {
4683
+ const offset = this.dragPixelOffset();
4684
+ return `translate(${offset.x}px, ${offset.y}px)`;
4685
+ }, ...(ngDevMode ? [{ debugName: "dragTransform" }] : /* istanbul ignore next */ []));
3273
4686
  outputToObservable(this.dragHandle.dragStarted)
3274
4687
  .pipe(filter(() => !this.grid.readOnly()), tap(() => {
3275
4688
  this.dragPixelOffset.set({ x: 0, y: 0 });
@@ -3383,7 +4796,7 @@ class GridDragDirective {
3383
4796
  this.renderer.removeStyles(el, 'position', 'left', 'top', 'width', 'height');
3384
4797
  }
3385
4798
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridDragDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3386
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: GridDragDirective, isStandalone: true, selector: "[etGridDrag]", host: { properties: { "class.et-grid-drag--active": "!grid.readOnly() && dragHandle.isDragging()", "attr.aria-grabbed": "!grid.readOnly() && dragHandle.isDragging()" }, classAttribute: "et-grid-drag" }, hostDirectives: [{ directive: i2.DragHandleDirective, outputs: ["dragStarted", "dragStarted", "dragMoved", "dragMoved", "dragEnded", "dragEnded"] }], ngImport: i0 }); }
4799
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: GridDragDirective, isStandalone: true, selector: "[etGridDrag]", host: { properties: { "class.et-grid-drag--active": "!grid.readOnly() && dragHandle.isDragging()", "attr.aria-grabbed": "!grid.readOnly() && dragHandle.isDragging()", "style.transform": "dragTransform()" }, classAttribute: "et-grid-drag" }, hostDirectives: [{ directive: i2.DragHandleDirective, outputs: ["dragStarted", "dragStarted", "dragMoved", "dragMoved", "dragEnded", "dragEnded"] }], ngImport: i0 }); }
3387
4800
  }
3388
4801
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridDragDirective, decorators: [{
3389
4802
  type: Directive,
@@ -3399,6 +4812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
3399
4812
  class: 'et-grid-drag',
3400
4813
  '[class.et-grid-drag--active]': '!grid.readOnly() && dragHandle.isDragging()',
3401
4814
  '[attr.aria-grabbed]': '!grid.readOnly() && dragHandle.isDragging()',
4815
+ '[style.transform]': 'dragTransform()',
3402
4816
  },
3403
4817
  }]
3404
4818
  }], ctorParameters: () => [] });
@@ -3518,75 +4932,37 @@ const fromGridPosition = (pos) => ({
3518
4932
  rows: pos.rowSpan,
3519
4933
  });
3520
4934
 
3521
- class GridComponent {
3522
- constructor() {
3523
- this.grid = inject(GridDirective);
3524
- this.ghostRef = viewChild('ghostRef', ...(ngDevMode ? [{ debugName: "ghostRef" }] : /* istanbul ignore next */ []));
3525
- this.gridConfig = injectGridConfig();
3526
- this.locale = injectLocale();
3527
- this.ariaLabel = computed(() => {
3528
- const label = this.grid.readOnly() ? this.gridConfig.readonlyAriaLabel : this.gridConfig.interactiveAriaLabel;
3529
- return this.gridConfig.transformer(label, this.locale.currentLocale());
3530
- }, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
3531
- this.hostStyles = signalHostStyles({
3532
- '--_et-grid-columns': computed(() => `${this.grid.activeColumns()}`),
3533
- '--et-grid-gap': computed(() => `${this.grid.gap()}px`),
3534
- '--et-grid-row-height': computed(() => `${this.grid.rowHeight()}px`),
3535
- });
3536
- effect(() => {
3537
- this.grid.setGhostElement(this.ghostRef()?.nativeElement ?? null);
3538
- });
3539
- }
3540
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3541
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: GridComponent, isStandalone: true, selector: "et-grid, [et-grid]", host: { attributes: { "role": "region" }, properties: { "attr.aria-label": "ariaLabel()" }, classAttribute: "et-grid" }, viewQueries: [{ propertyName: "ghostRef", first: true, predicate: ["ghostRef"], descendants: true, isSignal: true }], hostDirectives: [{ directive: GridDirective, inputs: ["breakpoints", "breakpoints", "rowHeight", "rowHeight", "gap", "gap", "initialItems", "initialItems", "readOnly", "readOnly"], outputs: ["layoutChange", "layoutChange"] }], ngImport: i0, template: `
3542
- <ng-content />
3543
- @if (grid.ghostPosition(); as ghost) {
3544
- <div
3545
- #ghostRef
3546
- [style.grid-column]="ghost.col + 1 + ' / span ' + ghost.colSpan"
3547
- [style.grid-row]="ghost.row + 1 + ' / span ' + ghost.rowSpan"
3548
- class="et-grid-ghost"
3549
- ></div>
3550
- }
3551
- `, isInline: true, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__drag-handle{cursor:default;pointer-events:none}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3552
- }
3553
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridComponent, decorators: [{
3554
- type: Component,
3555
- args: [{ selector: 'et-grid, [et-grid]', template: `
3556
- <ng-content />
3557
- @if (grid.ghostPosition(); as ghost) {
3558
- <div
3559
- #ghostRef
3560
- [style.grid-column]="ghost.col + 1 + ' / span ' + ghost.colSpan"
3561
- [style.grid-row]="ghost.row + 1 + ' / span ' + ghost.rowSpan"
3562
- class="et-grid-ghost"
3563
- ></div>
3564
- }
3565
- `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, hostDirectives: [
3566
- {
3567
- directive: GridDirective,
3568
- inputs: ['breakpoints', 'rowHeight', 'gap', 'initialItems', 'readOnly'],
3569
- outputs: ['layoutChange'],
3570
- },
3571
- ], host: {
3572
- class: 'et-grid',
3573
- role: 'region',
3574
- '[attr.aria-label]': 'ariaLabel()',
3575
- }, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__drag-handle{cursor:default;pointer-events:none}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"] }]
3576
- }], ctorParameters: () => [], propDecorators: { ghostRef: [{ type: i0.ViewChild, args: ['ghostRef', { isSignal: true }] }] } });
3577
-
3578
4935
  class GridItemComponent {
3579
4936
  constructor() {
3580
4937
  this.grid = inject(GRID_TOKEN);
3581
4938
  this.gridItem = inject(GridItemDirective);
4939
+ this.provideSurface = inject(ProvideSurfaceDirective);
4940
+ this.parentSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
3582
4941
  this.gridDrag = inject(GridDragDirective);
3583
4942
  this.gridResize = inject(GridResizeDirective);
3584
4943
  this.ariaLabel = input('Grid item', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
3585
4944
  this.removed = output();
4945
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
3586
4946
  this.gridConfig = injectGridConfig();
3587
4947
  this.locale = injectLocale();
3588
4948
  this.isReadOnly = computed(() => this.grid.readOnly(), ...(ngDevMode ? [{ debugName: "isReadOnly" }] : /* istanbul ignore next */ []));
3589
4949
  this.dragHandleAriaLabel = computed(() => this.gridConfig.transformer(this.gridConfig.dragHandleAriaLabel, this.locale.currentLocale()), ...(ngDevMode ? [{ debugName: "dragHandleAriaLabel" }] : /* istanbul ignore next */ []));
4950
+ this.resolvedSurface = computed(() => {
4951
+ const themes = this.surfaceThemes;
4952
+ const parent = this.parentSurfaceProvider;
4953
+ if (!themes || !parent)
4954
+ return null;
4955
+ return resolveSurfaceByElevation(themes, parent.surfaceType() ?? 'dark', parent.elevation() + 1);
4956
+ }, ...(ngDevMode ? [{ debugName: "resolvedSurface" }] : /* istanbul ignore next */ []));
4957
+ effect(() => {
4958
+ const surface = this.resolvedSurface();
4959
+ if (surface) {
4960
+ this.provideSurface.forceSurface(surface.name);
4961
+ }
4962
+ else {
4963
+ this.provideSurface.clearForcedSurface();
4964
+ }
4965
+ });
3590
4966
  }
3591
4967
  applyKeyboardShortcut(event) {
3592
4968
  if (this.isReadOnly())
@@ -3650,7 +5026,7 @@ class GridItemComponent {
3650
5026
  }
3651
5027
  }
3652
5028
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3653
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.13", type: GridItemComponent, isStandalone: true, selector: "et-grid-item, [et-grid-item]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { listeners: { "keydown": "applyKeyboardShortcut($event)" }, properties: { "class.et-grid-item--dragging": "!isReadOnly() && gridDrag.dragHandle.isDragging()", "class.et-grid-item--resizing": "gridResize.isResizing()", "attr.role": "\"group\"", "attr.aria-label": "ariaLabel()", "attr.tabindex": "\"0\"" }, classAttribute: "et-grid-item" }, hostDirectives: [{ directive: GridItemDirective, inputs: ["itemId", "itemId", "minColSpan", "minColSpan", "maxColSpan", "maxColSpan", "minRowSpan", "minRowSpan", "maxRowSpan", "maxRowSpan"] }, { directive: GridDragDirective }, { directive: GridResizeDirective }], ngImport: i0, template: `
5029
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.13", type: GridItemComponent, isStandalone: true, selector: "et-grid-item, [et-grid-item]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { listeners: { "keydown": "applyKeyboardShortcut($event)" }, properties: { "class.et-grid-item--dragging": "!isReadOnly() && gridDrag.dragHandle.isDragging()", "class.et-grid-item--resizing": "gridResize.isResizing()", "attr.role": "\"group\"", "attr.aria-label": "ariaLabel()", "attr.tabindex": "\"0\"" }, classAttribute: "et-grid-item" }, hostDirectives: [{ directive: GridItemDirective, inputs: ["itemId", "itemId", "minColSpan", "minColSpan", "maxColSpan", "maxColSpan", "minRowSpan", "minRowSpan", "maxRowSpan", "maxRowSpan"] }, { directive: GridDragDirective }, { directive: GridResizeDirective }, { directive: i2.ProvideSurfaceDirective }], ngImport: i0, template: `
3654
5030
  <div [attr.aria-label]="dragHandleAriaLabel()" class="et-grid-item__drag-handle">
3655
5031
  <ng-content select="[etGridItemDragHandle]" />
3656
5032
  </div>
@@ -3671,7 +5047,7 @@ class GridItemComponent {
3671
5047
  <div (pointerdown)="$event.stopPropagation()" class="et-grid-item__actions">
3672
5048
  <ng-content select="[etGridItemAction]" />
3673
5049
  </div>
3674
- `, isInline: true, styles: ["@property --et-grid-item-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-grid-item-bg{syntax: \"<color>\"; inherits: false; initial-value: rgb(var(--et-surface-background, 255 255 255));}@property --et-grid-item-shadow{syntax: \"*\"; inherits: false; initial-value: 0 1px 3px rgba(0,0,0,.12);}@property --et-grid-item-drag-handle-height{syntax: \"<length>\"; inherits: false; initial-value: 32px;}.et-grid-item{position:relative;border-radius:var(--et-grid-item-border-radius);background:var(--et-grid-item-bg);box-shadow:var(--et-grid-item-shadow);border:1px solid rgb(var(--et-surface-border, 229 229 229));color:rgb(var(--et-surface-color, 23 23 23));overflow:hidden;display:flex;flex-direction:column;outline:none;will-change:transform}.et-grid-item:focus-visible{box-shadow:0 0 0 2px var(--et-grid-item-focus-ring-color, #2563eb)}.et-grid-item:is(.et-grid-item--dragging){z-index:100;box-shadow:0 12px 32px #0003;opacity:.95;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:rgb(var(--et-surface-color, 23 23 23) / .2);transition:opacity .15s ease}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{height:var(--et-grid-item-drag-handle-height);cursor:grab;display:flex;align-items:center;padding-inline:8px;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;overflow:hidden;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"], dependencies: [{ kind: "component", type: ResizeHandlesComponent, selector: "et-resize-handles", inputs: ["edges", "disabled"], outputs: ["resizeStarted", "resizeMoved", "resizeEnded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5050
+ `, isInline: true, styles: [".et-grid-item{position:relative;display:flex;flex-direction:column;outline:none;will-change:transform;border-radius:var(--et-grid-item-radius, 0);background:var(--et-grid-item-bg, var(--et-surface-background-solid))}.et-grid-item:is(.et-grid-item--dragging){z-index:100;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:var(--et-grid-item-resize-handle-color, var(--et-surface-color-solid));opacity:.2}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{cursor:grab;display:flex;align-items:center;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"], dependencies: [{ kind: "component", type: ResizeHandlesComponent, selector: "et-resize-handles", inputs: ["edges", "disabled"], outputs: ["resizeStarted", "resizeMoved", "resizeEnded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3675
5051
  }
3676
5052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridItemComponent, decorators: [{
3677
5053
  type: Component,
@@ -3703,6 +5079,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
3703
5079
  },
3704
5080
  GridDragDirective,
3705
5081
  GridResizeDirective,
5082
+ ProvideSurfaceDirective,
3706
5083
  ], host: {
3707
5084
  class: 'et-grid-item',
3708
5085
  '[class.et-grid-item--dragging]': '!isReadOnly() && gridDrag.dragHandle.isDragging()',
@@ -3711,327 +5088,467 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
3711
5088
  '[attr.aria-label]': 'ariaLabel()',
3712
5089
  '[attr.tabindex]': '"0"',
3713
5090
  '(keydown)': 'applyKeyboardShortcut($event)',
3714
- }, styles: ["@property --et-grid-item-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-grid-item-bg{syntax: \"<color>\"; inherits: false; initial-value: rgb(var(--et-surface-background, 255 255 255));}@property --et-grid-item-shadow{syntax: \"*\"; inherits: false; initial-value: 0 1px 3px rgba(0,0,0,.12);}@property --et-grid-item-drag-handle-height{syntax: \"<length>\"; inherits: false; initial-value: 32px;}.et-grid-item{position:relative;border-radius:var(--et-grid-item-border-radius);background:var(--et-grid-item-bg);box-shadow:var(--et-grid-item-shadow);border:1px solid rgb(var(--et-surface-border, 229 229 229));color:rgb(var(--et-surface-color, 23 23 23));overflow:hidden;display:flex;flex-direction:column;outline:none;will-change:transform}.et-grid-item:focus-visible{box-shadow:0 0 0 2px var(--et-grid-item-focus-ring-color, #2563eb)}.et-grid-item:is(.et-grid-item--dragging){z-index:100;box-shadow:0 12px 32px #0003;opacity:.95;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:rgb(var(--et-surface-color, 23 23 23) / .2);transition:opacity .15s ease}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{height:var(--et-grid-item-drag-handle-height);cursor:grab;display:flex;align-items:center;padding-inline:8px;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;overflow:hidden;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"] }]
3715
- }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
3716
-
3717
- const GRID_ERROR_CODES = {
3718
- MISSING_GRID: 1900,
3719
- MISSING_GRID_ITEM: 1901,
3720
- DUPLICATE_ITEM_ID: 1902,
3721
- INVALID_LAYOUT_STATE: 1903,
3722
- };
3723
-
3724
- const GridImports = [GridComponent, GridItemComponent];
3725
-
3726
- const ARROW_OUT_UP_RIGHT_ICON = {
3727
- name: 'et-arrow-out-up-right',
3728
- data: `
3729
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3730
- <path
3731
- fill="currentColor"
3732
- d="M5 6.75A1.75 1.75 0 0 1 6.75 5h4.5a.75.75 0 0 1 0 1.5h-4.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-4.5a.75.75 0 0 1 1.5 0v4.5A1.75 1.75 0 0 1 17.25 19H6.75A1.75 1.75 0 0 1 5 17.25V6.75Z"
3733
- />
3734
- <path
3735
- fill="currentColor"
3736
- d="M11.5 5.75c0-.414.336-.75.75-.75h6c.414 0 .75.336.75.75v6a.75.75 0 0 1-1.5 0V7.56l-6.72 6.72a.75.75 0 1 1-1.06-1.06l6.72-6.72h-4.19a.75.75 0 0 1-.75-.75Z"
3737
- />
3738
- </svg>
3739
- `,
3740
- };
3741
-
3742
- const ARROW_RIGHT_ICON = {
3743
- name: 'et-arrow-right',
3744
- data: `
3745
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3746
- <path
3747
- d="M4 12h14"
3748
- stroke="currentColor"
3749
- stroke-width="1.8"
3750
- stroke-linecap="round"
3751
- stroke-linejoin="round"
3752
- />
3753
- <path
3754
- d="M13 7l5 5-5 5"
3755
- stroke="currentColor"
3756
- stroke-width="1.8"
3757
- stroke-linecap="round"
3758
- stroke-linejoin="round"
3759
- />
3760
- </svg>
3761
- `,
3762
- };
3763
-
3764
- // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
3765
- const CHEVRON_ICON = {
3766
- name: 'et-chevron',
3767
- data: `
3768
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
3769
- <path
3770
- fill="currentColor"
3771
- d="M244.7 116.7c6.2-6.2 16.4-6.2 22.6 0l192 192c6.2 6.2 6.2 16.4 0 22.6s-16.4 6.2-22.6 0L256 150.6 75.3 331.3c-6.2 6.2-16.4 6.2-22.6 0s-6.2-16.4 0-22.6l192-192z"
3772
- />
3773
- </svg>
3774
- `,
3775
- };
3776
-
3777
- const CLIPBOARD_CHECK_ICON = {
3778
- name: 'et-clipboard-check',
3779
- data: `
3780
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3781
- <path
3782
- d="M9 4.5h6"
3783
- stroke="currentColor"
3784
- stroke-width="1.8"
3785
- stroke-linecap="round"
3786
- />
3787
- <path
3788
- d="M9 3h6a1.5 1.5 0 0 1 1.5 1.5V6H18a2 2 0 0 1 2 2v10.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 4 18.5V8a2 2 0 0 1 2-2h1.5V4.5A1.5 1.5 0 0 1 9 3z"
3789
- stroke="currentColor"
3790
- stroke-width="1.8"
3791
- stroke-linejoin="round"
3792
- />
3793
- <path
3794
- d="M8.5 13l2.2 2.2 4.8-4.9"
3795
- stroke="currentColor"
3796
- stroke-width="1.8"
3797
- stroke-linecap="round"
3798
- stroke-linejoin="round"
3799
- />
3800
- </svg>
3801
- `,
3802
- };
3803
-
3804
- const FLOPPY_DISK_ICON = {
3805
- name: 'et-floppy-disk',
3806
- data: `
3807
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3808
- <path
3809
- d="M5 3h11l3 3v13a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V3z"
3810
- stroke="currentColor"
3811
- stroke-width="1.8"
3812
- stroke-linejoin="round"
3813
- />
3814
- <path
3815
- d="M8 3v6h7V3"
3816
- stroke="currentColor"
3817
- stroke-width="1.8"
3818
- stroke-linejoin="round"
3819
- />
3820
- <path
3821
- d="M8 17h8"
3822
- stroke="currentColor"
3823
- stroke-width="1.8"
3824
- stroke-linecap="round"
3825
- />
3826
- </svg>
3827
- `,
3828
- };
5091
+ }, styles: [".et-grid-item{position:relative;display:flex;flex-direction:column;outline:none;will-change:transform;border-radius:var(--et-grid-item-radius, 0);background:var(--et-grid-item-bg, var(--et-surface-background-solid))}.et-grid-item:is(.et-grid-item--dragging){z-index:100;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:var(--et-grid-item-resize-handle-color, var(--et-surface-color-solid));opacity:.2}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{cursor:grab;display:flex;align-items:center;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"] }]
5092
+ }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
3829
5093
 
3830
- const FOCUS_FRAME_ICON = {
3831
- name: 'et-focus-frame',
3832
- data: `
3833
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3834
- <path
3835
- fill="currentColor"
3836
- fill-rule="evenodd"
3837
- d="M5.75 4A1.75 1.75 0 0 0 4 5.75v12.5C4 19.216 4.784 20 5.75 20h12.5A1.75 1.75 0 0 0 20 18.25V5.75A1.75 1.75 0 0 0 18.25 4H5.75Zm0 1.5a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V5.75a.25.25 0 0 0-.25-.25H5.75Z"
3838
- clip-rule="evenodd"
3839
- />
3840
- <rect x="8" y="8" width="8" height="8" rx="1.25" fill="currentColor" />
3841
- </svg>
3842
- `,
3843
- };
5094
+ class GridComponent {
5095
+ constructor() {
5096
+ this.grid = inject(GridDirective);
5097
+ this.ghostRef = viewChild('ghostRef', ...(ngDevMode ? [{ debugName: "ghostRef" }] : /* istanbul ignore next */ []));
5098
+ this.gridConfig = injectGridConfig();
5099
+ this.locale = injectLocale();
5100
+ this.isReadOnly = computed(() => this.grid.readOnly(), ...(ngDevMode ? [{ debugName: "isReadOnly" }] : /* istanbul ignore next */ []));
5101
+ this.dragHandleComponent = computed(() => this.gridConfig.dragHandleComponent, ...(ngDevMode ? [{ debugName: "dragHandleComponent" }] : /* istanbul ignore next */ []));
5102
+ this.actionsComponent = computed(() => this.gridConfig.actionsComponent, ...(ngDevMode ? [{ debugName: "actionsComponent" }] : /* istanbul ignore next */ []));
5103
+ this.registeredItems = computed(() => {
5104
+ const registrations = this.gridConfig.registrations;
5105
+ return this.grid.items().flatMap((item) => {
5106
+ const reg = registrations.find((r) => r.type === item.type);
5107
+ return reg ? [{ item, reg }] : [];
5108
+ });
5109
+ }, ...(ngDevMode ? [{ debugName: "registeredItems" }] : /* istanbul ignore next */ []));
5110
+ this.ariaLabel = computed(() => {
5111
+ const label = this.grid.readOnly() ? this.gridConfig.readonlyAriaLabel : this.gridConfig.interactiveAriaLabel;
5112
+ return this.gridConfig.transformer(label, this.locale.currentLocale());
5113
+ }, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
5114
+ this.gridColumns = computed(() => this.grid.activeColumns(), ...(ngDevMode ? [{ debugName: "gridColumns" }] : /* istanbul ignore next */ []));
5115
+ this.gridGap = computed(() => `${this.grid.gap()}px`, ...(ngDevMode ? [{ debugName: "gridGap" }] : /* istanbul ignore next */ []));
5116
+ this.gridRowHeight = computed(() => `${this.grid.rowHeight()}px`, ...(ngDevMode ? [{ debugName: "gridRowHeight" }] : /* istanbul ignore next */ []));
5117
+ effect(() => {
5118
+ this.grid.setGhostElement(this.ghostRef()?.nativeElement ?? null);
5119
+ });
5120
+ }
5121
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5122
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: GridComponent, isStandalone: true, selector: "et-grid, [et-grid]", host: { attributes: { "role": "region" }, properties: { "attr.aria-label": "ariaLabel()", "style.--_et-grid-columns": "gridColumns()", "style.--et-grid-gap": "gridGap()", "style.--et-grid-row-height": "gridRowHeight()" }, classAttribute: "et-grid" }, viewQueries: [{ propertyName: "ghostRef", first: true, predicate: ["ghostRef"], descendants: true, isSignal: true }], hostDirectives: [{ directive: GridDirective, inputs: ["breakpoints", "breakpoints", "rowHeight", "rowHeight", "gap", "gap", "initialItems", "initialItems", "readOnly", "readOnly"], outputs: ["layoutChange", "layoutChange"] }], ngImport: i0, template: `
5123
+ @for (entry of registeredItems(); track entry.item.id) {
5124
+ <et-grid-item
5125
+ [itemId]="entry.item.id"
5126
+ [minColSpan]="entry.reg.constraints?.minColSpan ?? 1"
5127
+ [maxColSpan]="entry.reg.constraints?.maxColSpan ?? 12"
5128
+ [minRowSpan]="entry.reg.constraints?.minRowSpan ?? 1"
5129
+ [maxRowSpan]="entry.reg.constraints?.maxRowSpan ?? 4"
5130
+ >
5131
+ @if (dragHandleComponent()) {
5132
+ <div etGridItemDragHandle>
5133
+ <ng-container
5134
+ [ngComponentOutlet]="dragHandleComponent()!"
5135
+ [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5136
+ />
5137
+ </div>
5138
+ } @else {
5139
+ <div etGridItemDragHandle></div>
5140
+ }
5141
+ <ng-container [ngComponentOutlet]="entry.reg.component" [ngComponentOutletInputs]="{ data: entry.item.data }" />
5142
+ @if (actionsComponent()) {
5143
+ <div etGridItemAction>
5144
+ <ng-container
5145
+ [ngComponentOutlet]="actionsComponent()!"
5146
+ [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5147
+ />
5148
+ </div>
5149
+ } @else if (!isReadOnly()) {
5150
+ <button (click)="grid.removeItem(entry.item.id)" etGridItemAction>✕</button>
5151
+ }
5152
+ </et-grid-item>
5153
+ }
5154
+ <ng-content />
5155
+ @if (grid.ghostPosition(); as ghost) {
5156
+ <div
5157
+ #ghostRef
5158
+ [style.grid-column]="ghost.col + 1 + ' / span ' + ghost.colSpan"
5159
+ [style.grid-row]="ghost.row + 1 + ' / span ' + ghost.rowSpan"
5160
+ class="et-grid-ghost"
5161
+ ></div>
5162
+ }
5163
+ `, isInline: true, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__drag-handle{cursor:default;pointer-events:none}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"], dependencies: [{ kind: "component", type: GridItemComponent, selector: "et-grid-item, [et-grid-item]", inputs: ["ariaLabel"], outputs: ["removed"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5164
+ }
5165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridComponent, decorators: [{
5166
+ type: Component,
5167
+ args: [{ selector: 'et-grid, [et-grid]', template: `
5168
+ @for (entry of registeredItems(); track entry.item.id) {
5169
+ <et-grid-item
5170
+ [itemId]="entry.item.id"
5171
+ [minColSpan]="entry.reg.constraints?.minColSpan ?? 1"
5172
+ [maxColSpan]="entry.reg.constraints?.maxColSpan ?? 12"
5173
+ [minRowSpan]="entry.reg.constraints?.minRowSpan ?? 1"
5174
+ [maxRowSpan]="entry.reg.constraints?.maxRowSpan ?? 4"
5175
+ >
5176
+ @if (dragHandleComponent()) {
5177
+ <div etGridItemDragHandle>
5178
+ <ng-container
5179
+ [ngComponentOutlet]="dragHandleComponent()!"
5180
+ [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5181
+ />
5182
+ </div>
5183
+ } @else {
5184
+ <div etGridItemDragHandle></div>
5185
+ }
5186
+ <ng-container [ngComponentOutlet]="entry.reg.component" [ngComponentOutletInputs]="{ data: entry.item.data }" />
5187
+ @if (actionsComponent()) {
5188
+ <div etGridItemAction>
5189
+ <ng-container
5190
+ [ngComponentOutlet]="actionsComponent()!"
5191
+ [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5192
+ />
5193
+ </div>
5194
+ } @else if (!isReadOnly()) {
5195
+ <button (click)="grid.removeItem(entry.item.id)" etGridItemAction>✕</button>
5196
+ }
5197
+ </et-grid-item>
5198
+ }
5199
+ <ng-content />
5200
+ @if (grid.ghostPosition(); as ghost) {
5201
+ <div
5202
+ #ghostRef
5203
+ [style.grid-column]="ghost.col + 1 + ' / span ' + ghost.colSpan"
5204
+ [style.grid-row]="ghost.row + 1 + ' / span ' + ghost.rowSpan"
5205
+ class="et-grid-ghost"
5206
+ ></div>
5207
+ }
5208
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [GridItemComponent, NgComponentOutlet], hostDirectives: [
5209
+ {
5210
+ directive: GridDirective,
5211
+ inputs: ['breakpoints', 'rowHeight', 'gap', 'initialItems', 'readOnly'],
5212
+ outputs: ['layoutChange'],
5213
+ },
5214
+ ], host: {
5215
+ class: 'et-grid',
5216
+ role: 'region',
5217
+ '[attr.aria-label]': 'ariaLabel()',
5218
+ '[style.--_et-grid-columns]': 'gridColumns()',
5219
+ '[style.--et-grid-gap]': 'gridGap()',
5220
+ '[style.--et-grid-row-height]': 'gridRowHeight()',
5221
+ }, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__drag-handle{cursor:default;pointer-events:none}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"] }]
5222
+ }], ctorParameters: () => [], propDecorators: { ghostRef: [{ type: i0.ViewChild, args: ['ghostRef', { isSignal: true }] }] } });
3844
5223
 
3845
- const GRID_2X2_ICON = {
3846
- name: 'et-grid-2x2',
3847
- data: `
3848
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3849
- <path
3850
- fill="currentColor"
3851
- fill-rule="evenodd"
3852
- d="M5.75 4A1.75 1.75 0 0 0 4 5.75v12.5C4 19.216 4.784 20 5.75 20h12.5A1.75 1.75 0 0 0 20 18.25V5.75A1.75 1.75 0 0 0 18.25 4H5.75Zm0 1.5a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V5.75a.25.25 0 0 0-.25-.25H5.75Z"
3853
- clip-rule="evenodd"
3854
- />
3855
- <rect x="11.25" y="5.5" width="1.5" height="13" fill="currentColor" />
3856
- <rect x="5.5" y="11.25" width="13" height="1.5" fill="currentColor" />
3857
- </svg>
3858
- `,
5224
+ const posEq = (a, b) => {
5225
+ if (!a && !b)
5226
+ return true;
5227
+ if (!a || !b)
5228
+ return false;
5229
+ return a.col === b.col && a.row === b.row && a.colSpan === b.colSpan && a.rowSpan === b.rowSpan;
3859
5230
  };
5231
+ /**
5232
+ * Development-only debug overlay for an `et-grid` instance.
5233
+ *
5234
+ * ```html
5235
+ * <et-grid #myGrid [initialItems]="items()" ...></et-grid>
5236
+ * <et-grid-debug [grid]="myGrid" [externalItems]="items()" />
5237
+ * ```
5238
+ *
5239
+ * Pass `externalItems` to detect divergence between the host signal
5240
+ * and the grid's internal itemConfigs. The **Copy JSON** button writes
5241
+ * a full diagnostic snapshot to the clipboard without any console output.
5242
+ */
5243
+ class GridDebugComponent {
5244
+ constructor() {
5245
+ this.destroyRef = inject(DestroyRef);
5246
+ this.grid = input.required(...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
5247
+ this.externalItems = input(null, ...(ngDevMode ? [{ debugName: "externalItems" }] : /* istanbul ignore next */ []));
5248
+ this.activeBreakpoint = computed(() => this.grid().grid.activeBreakpoint(), ...(ngDevMode ? [{ debugName: "activeBreakpoint" }] : /* istanbul ignore next */ []));
5249
+ this.containerWidth = computed(() => this.grid().grid.containerWidth(), ...(ngDevMode ? [{ debugName: "containerWidth" }] : /* istanbul ignore next */ []));
5250
+ this.breakpoints = computed(() => this.grid().grid.breakpoints(), ...(ngDevMode ? [{ debugName: "breakpoints" }] : /* istanbul ignore next */ []));
5251
+ this.items = computed(() => this.grid().grid.items(), ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
5252
+ this.layout = computed(() => this.grid().grid.layout(), ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
5253
+ this.hasDrag = computed(() => this.grid().grid.dragState() !== null, ...(ngDevMode ? [{ debugName: "hasDrag" }] : /* istanbul ignore next */ []));
5254
+ this.hasExternal = computed(() => this.externalItems() !== null, ...(ngDevMode ? [{ debugName: "hasExternal" }] : /* istanbul ignore next */ []));
5255
+ this.copied = signal(false, ...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
5256
+ this.rows = computed(() => {
5257
+ const bps = this.breakpoints().map((b) => b.name);
5258
+ const internalItems = this.items();
5259
+ const external = this.externalItems();
5260
+ const extById = external ? new Map(external.map((i) => [i.id, i])) : null;
5261
+ return internalItems.map((item) => ({
5262
+ id: item.id,
5263
+ type: item.type,
5264
+ cells: bps.map((bp) => {
5265
+ const int = item.layout[bp];
5266
+ const ext = extById?.get(item.id)?.layout[bp];
5267
+ return {
5268
+ bp,
5269
+ int,
5270
+ ext,
5271
+ intMissing: !int,
5272
+ extMissing: extById !== null && !ext,
5273
+ mismatch: extById !== null && !posEq(int, ext),
5274
+ };
5275
+ }),
5276
+ }));
5277
+ }, ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
5278
+ this.issueCount = computed(() => this.rows().reduce((n, row) => n + row.cells.filter((c) => c.intMissing || c.mismatch).length, 0), ...(ngDevMode ? [{ debugName: "issueCount" }] : /* istanbul ignore next */ []));
5279
+ }
5280
+ fmtPos(pos) {
5281
+ return pos ? `(${pos.col},${pos.row}) ${pos.colSpan}×${pos.rowSpan}` : '—';
5282
+ }
5283
+ copyJson($event) {
5284
+ $event.stopPropagation();
5285
+ const issues = [];
5286
+ for (const row of this.rows()) {
5287
+ for (const cell of row.cells) {
5288
+ if (cell.intMissing)
5289
+ issues.push({ type: 'missing-internal-layout', itemId: row.id, breakpoint: cell.bp });
5290
+ if (cell.mismatch)
5291
+ issues.push({ type: 'external-internal-mismatch', itemId: row.id, breakpoint: cell.bp });
5292
+ }
5293
+ }
5294
+ const external = this.externalItems();
5295
+ const snapshot = {
5296
+ timestamp: new Date().toISOString(),
5297
+ activeBreakpoint: this.activeBreakpoint(),
5298
+ containerWidth: this.containerWidth(),
5299
+ breakpoints: this.breakpoints(),
5300
+ internalItems: this.items().map((i) => ({ id: i.id, type: i.type, layout: i.layout })),
5301
+ activeLayout: this.layout(),
5302
+ ...(external ? { externalItems: external.map((i) => ({ id: i.id, type: i.type, layout: i.layout })) } : {}),
5303
+ issues,
5304
+ };
5305
+ navigator.clipboard.writeText(JSON.stringify(snapshot, null, 2)).catch(() => {
5306
+ /* clipboard unavailable in this context */
5307
+ });
5308
+ this.copied.set(true);
5309
+ timer(2000)
5310
+ .pipe(takeUntilDestroyed(this.destroyRef), tap$1(() => this.copied.set(false)))
5311
+ .subscribe();
5312
+ }
5313
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridDebugComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5314
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: GridDebugComponent, isStandalone: true, selector: "et-grid-debug", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: true, transformFunction: null }, externalItems: { classPropertyName: "externalItems", publicName: "externalItems", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
5315
+ <details
5316
+ style="font-family: monospace; font-size: 11px; border: 1px solid #d1d5db; border-radius: 4px; margin-top: 8px; background: #f9fafb; color: #111"
5317
+ >
5318
+ <summary
5319
+ style="padding: 6px 10px; cursor: pointer; list-style: none; display: flex; align-items: center; gap: 10px; user-select: none"
5320
+ >
5321
+ <span style="font-weight: 700; color: #6b7280">et-grid-debug</span>
3860
5322
 
3861
- const ICON_ERROR_CODES = {
3862
- NO_ICONS_PROVIDED: 1800,
3863
- ICON_NOT_FOUND: 1801,
3864
- INVALID_SVG: 1802,
3865
- MISSING_XMLNS: 1803,
3866
- MISSING_DIMENSIONS: 1804,
3867
- HARDCODED_COLOR: 1805,
3868
- DUPLICATE_ICON_NAME: 1806,
3869
- };
5323
+ <span style="color: #6b7280">
5324
+ bp: <strong style="color: #111827">{{ activeBreakpoint() }}</strong> &nbsp;·&nbsp; {{ containerWidth() }}px
5325
+ &nbsp;·&nbsp; {{ items().length }} items
5326
+ @if (hasDrag()) {
5327
+ &nbsp;·&nbsp; <span style="color: #d97706">⠿ dragging</span>
5328
+ }
5329
+ </span>
3870
5330
 
3871
- const ICONS_TOKEN = new InjectionToken('ET_ICONS_TOKEN');
3872
- const provideIcons = (...icons) => {
3873
- const map = {};
3874
- for (const def of icons) {
3875
- if (map[def.name]) {
3876
- throw new RuntimeError(ICON_ERROR_CODES.DUPLICATE_ICON_NAME, `[provideIcons] Icon with name "${def.name}" already exists. Please provide unique icon names.`);
5331
+ @if (issueCount() > 0) {
5332
+ <span style="color: #dc2626; font-weight: 700"
5333
+ >⚠ {{ issueCount() }} issue{{ issueCount() === 1 ? '' : 's' }}</span
5334
+ >
3877
5335
  }
3878
- map[def.name] = def;
3879
- }
3880
- return {
3881
- provide: ICONS_TOKEN,
3882
- useValue: map,
3883
- };
3884
- };
3885
5336
 
3886
- const ICON_DIRECTIVE_TOKEN = new InjectionToken('ET_ICON_DIRECTIVE_TOKEN');
3887
- const SVG_COLOR_ATTRIBUTES = ['fill', 'stroke', 'stop-color', 'stop-opacity'];
3888
- class IconDirective {
3889
- constructor() {
3890
- this.icons = inject(ICONS_TOKEN, { optional: true });
3891
- this.sanitizer = inject(DomSanitizer);
3892
- this.iconNameToUse = input.required({ ...(ngDevMode ? { debugName: "iconNameToUse" } : /* istanbul ignore next */ {}), alias: 'etIcon' });
3893
- this.allowHardcodedColor = input(false, { ...(ngDevMode ? { debugName: "allowHardcodedColor" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3894
- this.iconSrc = computed(() => {
3895
- if (!this.icons) {
3896
- return null;
3897
- }
3898
- const icon = this.icons[this.iconNameToUse()];
3899
- if (!icon) {
3900
- throw new RuntimeError(ICON_ERROR_CODES.ICON_NOT_FOUND, `[IconDirective] Icon "${this.iconNameToUse()}" not found. Available icons: ${Object.keys(this.icons).join(', ')}.`);
3901
- }
3902
- const svg = icon.data.trim();
3903
- if (ngDevMode) {
3904
- if (!svg.includes('<svg')) {
3905
- throw new RuntimeError(ICON_ERROR_CODES.INVALID_SVG, `[IconDirective] Icon "${this.iconNameToUse()}" is not a valid SVG. The data must contain an <svg> element.`);
3906
- }
3907
- if (!svg.includes('xmlns="http://www.w3.org/2000/svg"')) {
3908
- throw new RuntimeError(ICON_ERROR_CODES.MISSING_XMLNS, `[IconDirective] Icon "${this.iconNameToUse()}" is missing xmlns="http://www.w3.org/2000/svg". Add the attribute to the <svg> element.`);
3909
- }
3910
- if (!svg.includes('width="100%"') || !svg.includes('height="100%"')) {
3911
- throw new RuntimeError(ICON_ERROR_CODES.MISSING_DIMENSIONS, `[IconDirective] Icon "${this.iconNameToUse()}" is missing width="100%" and/or height="100%". Add both attributes to the <svg> element.`);
5337
+ <button
5338
+ (click)="copyJson($event)"
5339
+ style="margin-left: auto; padding: 2px 8px; border: 1px solid #d1d5db; border-radius: 3px; background: #fff; cursor: pointer; font-size: 11px; color: #374151"
5340
+ >
5341
+ Copy JSON
5342
+ </button>
5343
+
5344
+ @if (copied()) {
5345
+ <span style="color: #16a34a; font-size: 10px">✓ copied</span>
5346
+ }
5347
+ </summary>
5348
+
5349
+ <div style="padding: 8px 10px; overflow-x: auto; border-top: 1px solid #e5e7eb">
5350
+ <!-- Breakpoint legend -->
5351
+ <div style="display: flex; gap: 6px; margin-bottom: 8px; flex-wrap: wrap">
5352
+ @for (bp of breakpoints(); track bp.name) {
5353
+ <span
5354
+ [style.fontWeight]="bp.name === activeBreakpoint() ? '700' : '400'"
5355
+ [style.color]="bp.name === activeBreakpoint() ? '#1d4ed8' : '#9ca3af'"
5356
+ style="padding: 1px 7px; border: 1px solid currentColor; border-radius: 99px"
5357
+ >{{ bp.name }}&nbsp;{{ bp.columns }}col&nbsp;≥{{ bp.minWidth }}px</span
5358
+ >
5359
+ }
5360
+ </div>
5361
+
5362
+ <!-- Layout table -->
5363
+ <table style="border-collapse: collapse; white-space: nowrap">
5364
+ <thead>
5365
+ <tr style="background: #f3f4f6">
5366
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">id</th>
5367
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">type</th>
5368
+ @for (bp of breakpoints(); track bp.name) {
5369
+ <th
5370
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
5371
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb"
5372
+ >
5373
+ {{ bp.name }}{{ hasExternal() ? ' int' : '' }}
5374
+ </th>
5375
+ @if (hasExternal()) {
5376
+ <th
5377
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
5378
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb; opacity: .65"
5379
+ >
5380
+ {{ bp.name }} ext
5381
+ </th>
3912
5382
  }
3913
- if (!this.allowHardcodedColor()) {
3914
- for (const colorAttribute of SVG_COLOR_ATTRIBUTES) {
3915
- if (svg.includes(`${colorAttribute}="`) && !svg.includes(`${colorAttribute}="currentColor"`)) {
3916
- throw new RuntimeError(ICON_ERROR_CODES.HARDCODED_COLOR, `[IconDirective] Icon "${this.iconNameToUse()}" uses a hardcoded value for "${colorAttribute}". Use currentColor instead, or set [allowHardcodedColor]="true".`);
3917
- }
3918
- }
5383
+ }
5384
+ </tr>
5385
+ </thead>
5386
+ <tbody>
5387
+ @for (row of rows(); track row.id) {
5388
+ <tr>
5389
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #6b7280">{{ row.id }}</td>
5390
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #9ca3af">{{ row.type }}</td>
5391
+ @for (cell of row.cells; track cell.bp) {
5392
+ <td
5393
+ [style.color]="cell.intMissing ? '#dc2626' : '#111'"
5394
+ [title]="cell.intMissing ? 'MISSING — layout.' + cell.bp + ' undefined in internal state' : ''"
5395
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
5396
+ >
5397
+ {{ fmtPos(cell.int) }}
5398
+ </td>
5399
+ @if (hasExternal()) {
5400
+ <td
5401
+ [style.color]="cell.extMissing ? '#dc2626' : cell.mismatch ? '#d97706' : '#9ca3af'"
5402
+ [title]="cell.mismatch ? 'MISMATCH — ext=' + fmtPos(cell.ext) + ' int=' + fmtPos(cell.int) : ''"
5403
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
5404
+ >
5405
+ {{ fmtPos(cell.ext) }}
5406
+ </td>
5407
+ }
3919
5408
  }
5409
+ </tr>
3920
5410
  }
3921
- return this.sanitizer.bypassSecurityTrustHtml(svg);
3922
- }, ...(ngDevMode ? [{ debugName: "iconSrc" }] : /* istanbul ignore next */ []));
3923
- this.hostClasses = computed(() => `et-icon et-icon--${this.iconNameToUse()}`, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
3924
- if (!this.icons) {
3925
- throw new RuntimeError(ICON_ERROR_CODES.NO_ICONS_PROVIDED, '[IconDirective] No icons provided. Register icons via provideIcons() in the component or application providers.');
5411
+ </tbody>
5412
+ </table>
5413
+
5414
+ @if (hasExternal()) {
5415
+ <p style="margin-top: 6px; color: #9ca3af; font-size: 10px">
5416
+ int = grid.items() (internal) &nbsp;·&nbsp; ext = externalItems input &nbsp;·&nbsp;
5417
+ <span style="color: #dc2626">red = undefined</span> &nbsp;·&nbsp;
5418
+ <span style="color: #d97706">orange = mismatch</span>
5419
+ </p>
3926
5420
  }
3927
- }
3928
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3929
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: IconDirective, isStandalone: true, selector: "[etIcon]", inputs: { iconNameToUse: { classPropertyName: "iconNameToUse", publicName: "etIcon", isSignal: true, isRequired: true, transformFunction: null }, allowHardcodedColor: { classPropertyName: "allowHardcodedColor", publicName: "allowHardcodedColor", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, properties: { "innerHTML": "iconSrc()", "class": "hostClasses()" }, styleAttribute: "display: flex; align-items: center; justify-content: center;" }, providers: [
3930
- {
3931
- provide: ICON_DIRECTIVE_TOKEN,
3932
- useExisting: IconDirective,
3933
- },
3934
- ], ngImport: i0 }); }
5421
+ </div>
5422
+ </details>
5423
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3935
5424
  }
3936
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: IconDirective, decorators: [{
3937
- type: Directive,
5425
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridDebugComponent, decorators: [{
5426
+ type: Component,
3938
5427
  args: [{
3939
- selector: '[etIcon]',
3940
- providers: [
3941
- {
3942
- provide: ICON_DIRECTIVE_TOKEN,
3943
- useExisting: IconDirective,
3944
- },
3945
- ],
3946
- host: {
3947
- '[innerHTML]': 'iconSrc()',
3948
- 'aria-hidden': 'true',
3949
- '[class]': 'hostClasses()',
3950
- style: 'display: flex; align-items: center; justify-content: center;',
3951
- },
3952
- }]
3953
- }], ctorParameters: () => [], propDecorators: { iconNameToUse: [{ type: i0.Input, args: [{ isSignal: true, alias: "etIcon", required: true }] }], allowHardcodedColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowHardcodedColor", required: false }] }] } });
5428
+ selector: 'et-grid-debug',
5429
+ template: `
5430
+ <details
5431
+ style="font-family: monospace; font-size: 11px; border: 1px solid #d1d5db; border-radius: 4px; margin-top: 8px; background: #f9fafb; color: #111"
5432
+ >
5433
+ <summary
5434
+ style="padding: 6px 10px; cursor: pointer; list-style: none; display: flex; align-items: center; gap: 10px; user-select: none"
5435
+ >
5436
+ <span style="font-weight: 700; color: #6b7280">et-grid-debug</span>
3954
5437
 
3955
- // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
3956
- const LOCK_ICON = {
3957
- name: 'et-lock',
3958
- data: `
3959
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
3960
- <path
3961
- fill="currentColor"
3962
- d="M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 48 0c26.5 0 48 21.5 48 48l0 224c0 26.5-21.5 48-48 48L32 512c-26.5 0-48-21.5-48-48L-16 240c0-26.5 21.5-48 48-48l48 0zm144 184c22.1 0 40-17.9 40-40s-17.9-40-40-40s-40 17.9-40 40s17.9 40 40 40z"
3963
- />
3964
- </svg>
3965
- `,
3966
- };
5438
+ <span style="color: #6b7280">
5439
+ bp: <strong style="color: #111827">{{ activeBreakpoint() }}</strong> &nbsp;·&nbsp; {{ containerWidth() }}px
5440
+ &nbsp;·&nbsp; {{ items().length }} items
5441
+ @if (hasDrag()) {
5442
+ &nbsp;·&nbsp; <span style="color: #d97706">⠿ dragging</span>
5443
+ }
5444
+ </span>
3967
5445
 
3968
- const PENCIL_ICON = {
3969
- name: 'et-pencil',
3970
- data: `
3971
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3972
- <path
3973
- d="M4 20l4.2-1 9.3-9.3a1.8 1.8 0 0 0 0-2.5l-.7-.7a1.8 1.8 0 0 0-2.5 0L5 15.8 4 20z"
3974
- stroke="currentColor"
3975
- stroke-width="1.8"
3976
- stroke-linejoin="round"
3977
- />
3978
- <path
3979
- d="M12.8 7.2l4 4"
3980
- stroke="currentColor"
3981
- stroke-width="1.8"
3982
- stroke-linecap="round"
3983
- />
3984
- </svg>
3985
- `,
3986
- };
5446
+ @if (issueCount() > 0) {
5447
+ <span style="color: #dc2626; font-weight: 700"
5448
+ >⚠ {{ issueCount() }} issue{{ issueCount() === 1 ? '' : 's' }}</span
5449
+ >
5450
+ }
3987
5451
 
3988
- const PLUS_ICON = {
3989
- name: 'et-plus',
3990
- data: `
3991
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3992
- <path
3993
- d="M12 5v14"
3994
- stroke="currentColor"
3995
- stroke-width="1.8"
3996
- stroke-linecap="round"
3997
- />
3998
- <path
3999
- d="M5 12h14"
4000
- stroke="currentColor"
4001
- stroke-width="1.8"
4002
- stroke-linecap="round"
4003
- />
4004
- </svg>
4005
- `,
4006
- };
5452
+ <button
5453
+ (click)="copyJson($event)"
5454
+ style="margin-left: auto; padding: 2px 8px; border: 1px solid #d1d5db; border-radius: 3px; background: #fff; cursor: pointer; font-size: 11px; color: #374151"
5455
+ >
5456
+ Copy JSON
5457
+ </button>
5458
+
5459
+ @if (copied()) {
5460
+ <span style="color: #16a34a; font-size: 10px">✓ copied</span>
5461
+ }
5462
+ </summary>
5463
+
5464
+ <div style="padding: 8px 10px; overflow-x: auto; border-top: 1px solid #e5e7eb">
5465
+ <!-- Breakpoint legend -->
5466
+ <div style="display: flex; gap: 6px; margin-bottom: 8px; flex-wrap: wrap">
5467
+ @for (bp of breakpoints(); track bp.name) {
5468
+ <span
5469
+ [style.fontWeight]="bp.name === activeBreakpoint() ? '700' : '400'"
5470
+ [style.color]="bp.name === activeBreakpoint() ? '#1d4ed8' : '#9ca3af'"
5471
+ style="padding: 1px 7px; border: 1px solid currentColor; border-radius: 99px"
5472
+ >{{ bp.name }}&nbsp;{{ bp.columns }}col&nbsp;≥{{ bp.minWidth }}px</span
5473
+ >
5474
+ }
5475
+ </div>
4007
5476
 
4008
- // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
4009
- const TIMES_ICON = {
4010
- name: 'et-times',
4011
- data: `
4012
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
4013
- <path
4014
- fill="currentColor"
4015
- d="M324.5 411.1c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6L214.6 256 347.1 123.5c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0L192 233.4 59.6 100.9c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6L169.4 256 36.9 388.5c-6.2 6.2-6.2 16.4 0 22.6s16.4 6.2 22.6 0L192 278.6 324.5 411.1z"
4016
- />
4017
- </svg>
4018
- `,
4019
- };
5477
+ <!-- Layout table -->
5478
+ <table style="border-collapse: collapse; white-space: nowrap">
5479
+ <thead>
5480
+ <tr style="background: #f3f4f6">
5481
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">id</th>
5482
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">type</th>
5483
+ @for (bp of breakpoints(); track bp.name) {
5484
+ <th
5485
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
5486
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb"
5487
+ >
5488
+ {{ bp.name }}{{ hasExternal() ? ' int' : '' }}
5489
+ </th>
5490
+ @if (hasExternal()) {
5491
+ <th
5492
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
5493
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb; opacity: .65"
5494
+ >
5495
+ {{ bp.name }} ext
5496
+ </th>
5497
+ }
5498
+ }
5499
+ </tr>
5500
+ </thead>
5501
+ <tbody>
5502
+ @for (row of rows(); track row.id) {
5503
+ <tr>
5504
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #6b7280">{{ row.id }}</td>
5505
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #9ca3af">{{ row.type }}</td>
5506
+ @for (cell of row.cells; track cell.bp) {
5507
+ <td
5508
+ [style.color]="cell.intMissing ? '#dc2626' : '#111'"
5509
+ [title]="cell.intMissing ? 'MISSING — layout.' + cell.bp + ' undefined in internal state' : ''"
5510
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
5511
+ >
5512
+ {{ fmtPos(cell.int) }}
5513
+ </td>
5514
+ @if (hasExternal()) {
5515
+ <td
5516
+ [style.color]="cell.extMissing ? '#dc2626' : cell.mismatch ? '#d97706' : '#9ca3af'"
5517
+ [title]="cell.mismatch ? 'MISMATCH — ext=' + fmtPos(cell.ext) + ' int=' + fmtPos(cell.int) : ''"
5518
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
5519
+ >
5520
+ {{ fmtPos(cell.ext) }}
5521
+ </td>
5522
+ }
5523
+ }
5524
+ </tr>
5525
+ }
5526
+ </tbody>
5527
+ </table>
4020
5528
 
4021
- // Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.
4022
- const TRIANGLE_EXCLAMATION_ICON = {
4023
- name: 'et-triangle-exclamation',
4024
- data: `
4025
- <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
4026
- <path
4027
- fill="currentColor"
4028
- d="M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S489.3 480 475.1 480H36.9c-14.3 0-27.6-7.7-34.8-20.2s-7-27.6 .2-40.1l216-368C225.6 39.5 238.7 32 252.9 32h3.1zm0 128c-13.3 0-24 10.7-24 24v112c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0-64 0 32 32 0 1 0 64 0z"
4029
- />
4030
- </svg>
5529
+ @if (hasExternal()) {
5530
+ <p style="margin-top: 6px; color: #9ca3af; font-size: 10px">
5531
+ int = grid.items() (internal) &nbsp;·&nbsp; ext = externalItems input &nbsp;·&nbsp;
5532
+ <span style="color: #dc2626">red = undefined</span> &nbsp;·&nbsp;
5533
+ <span style="color: #d97706">orange = mismatch</span>
5534
+ </p>
5535
+ }
5536
+ </div>
5537
+ </details>
4031
5538
  `,
5539
+ encapsulation: ViewEncapsulation.None,
5540
+ changeDetection: ChangeDetectionStrategy.OnPush,
5541
+ }]
5542
+ }], propDecorators: { grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: true }] }], externalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "externalItems", required: false }] }] } });
5543
+
5544
+ const GRID_ERROR_CODES = {
5545
+ MISSING_GRID: 1900,
5546
+ MISSING_GRID_ITEM: 1901,
5547
+ DUPLICATE_ITEM_ID: 1902,
5548
+ INVALID_LAYOUT_STATE: 1903,
4032
5549
  };
4033
5550
 
4034
- const ICON_IMPORTS = [IconDirective];
5551
+ const GridImports = [GridComponent, GridItemComponent, GridDebugComponent];
4035
5552
 
4036
5553
  const NOTIFICATION_ERROR_CODES = {
4037
5554
  ACTION_OUTSIDE_NOTIFICATION: 1700,
@@ -4525,7 +6042,7 @@ const [provideNotificationManagerInstance, injectNotificationManager] = createRo
4525
6042
  const appRef = inject(ApplicationRef);
4526
6043
  const envInjector = inject(EnvironmentInjector);
4527
6044
  const destroyRef = inject(DestroyRef);
4528
- const document = inject(DOCUMENT);
6045
+ const document = inject(DOCUMENT$1);
4529
6046
  const renderer = injectRenderer();
4530
6047
  const notifications = signal([], ...(ngDevMode ? [{ debugName: "notifications" }] : /* istanbul ignore next */ []));
4531
6048
  const visibleNotifications = computed(() => {
@@ -6102,7 +7619,7 @@ const DEFAULT_PIP_CHROME_CONFIG = {
6102
7619
  };
6103
7620
 
6104
7621
  const [provideStreamManager, injectStreamManager] = createRootProvider(() => {
6105
- const document = inject(DOCUMENT);
7622
+ const document = inject(DOCUMENT$1);
6106
7623
  const renderer = injectRenderer();
6107
7624
  const container = renderer.createElement('div');
6108
7625
  renderer.addClass(container, 'et-stream-manager');
@@ -6257,7 +7774,7 @@ const [provideStreamManager, injectStreamManager] = createRootProvider(() => {
6257
7774
  }, { name: 'Stream Manager' });
6258
7775
 
6259
7776
  const [providePipManager, injectPipManager] = createRootProvider(() => {
6260
- const document = inject(DOCUMENT);
7777
+ const document = inject(DOCUMENT$1);
6261
7778
  const renderer = injectRenderer();
6262
7779
  const streamManager = injectStreamManager();
6263
7780
  const viewportSize = injectViewportSize();
@@ -6868,7 +8385,7 @@ const PIP_WINDOW_ASPECT_RATIO_TOKEN = new InjectionToken('PIP_WINDOW_ASPECT_RATI
6868
8385
 
6869
8386
  class PipPlayerComponent {
6870
8387
  constructor() {
6871
- this.document = inject(DOCUMENT);
8388
+ this.document = inject(DOCUMENT$1);
6872
8389
  this.el = inject(ElementRef);
6873
8390
  this.pipCell = inject(PipCellDirective, { optional: true });
6874
8391
  this.entry = input(...(ngDevMode ? [undefined, { debugName: "entry" }] : /* istanbul ignore next */ []));
@@ -7092,7 +8609,7 @@ const createPipWindowPosition = (options) => {
7092
8609
  const { params, titleBarH, size, resizeHandles, dragHandle, forcedTitleBar } = options;
7093
8610
  const el = inject(ElementRef);
7094
8611
  const renderer = injectRenderer();
7095
- const document = inject(DOCUMENT);
8612
+ const document = inject(DOCUMENT$1);
7096
8613
  const destroyRef = inject(DestroyRef);
7097
8614
  const viewportSize = injectViewportSize();
7098
8615
  const isDragging = computed(() => dragHandle().isDragging(), ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
@@ -7688,7 +9205,7 @@ const [providePipChromeManager, injectPipChromeManager] = createRootProvider(()
7688
9205
  const appRef = inject(ApplicationRef);
7689
9206
  const envInjector = inject(EnvironmentInjector);
7690
9207
  const destroyRef = inject(DestroyRef);
7691
- const document = inject(DOCUMENT);
9208
+ const document = inject(DOCUMENT$1);
7692
9209
  const renderer = injectRenderer();
7693
9210
  let pipChromeRef = null;
7694
9211
  const destroyPipChrome = () => {
@@ -8269,7 +9786,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
8269
9786
  }], propDecorators: { videoId: [{ type: i0.Input, args: [{ isSignal: true, alias: "videoId", required: true }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
8270
9787
 
8271
9788
  const [, injectStreamScriptLoader] = createRootProvider(() => {
8272
- const document = inject(DOCUMENT);
9789
+ const document = inject(DOCUMENT$1);
8273
9790
  const cache = new Map();
8274
9791
  const mountedScripts = new Set();
8275
9792
  const renderer = injectRenderer();
@@ -8312,7 +9829,7 @@ const FACEBOOK_PLAYER_TOKEN = new InjectionToken('FACEBOOK_PLAYER_TOKEN');
8312
9829
  class FacebookPlayerDirective {
8313
9830
  constructor() {
8314
9831
  this.platformId = inject(PLATFORM_ID);
8315
- this.document = inject(DOCUMENT);
9832
+ this.document = inject(DOCUMENT$1);
8316
9833
  this.params = inject(FacebookPlayerParamsDirective);
8317
9834
  this.el = injectHostElement();
8318
9835
  this.scriptLoader = injectStreamScriptLoader();
@@ -8557,7 +10074,7 @@ const KICK_PLAYER_TOKEN = new InjectionToken('KICK_PLAYER_TOKEN');
8557
10074
  class KickPlayerDirective {
8558
10075
  constructor() {
8559
10076
  this.platformId = inject(PLATFORM_ID);
8560
- this.document = inject(DOCUMENT);
10077
+ this.document = inject(DOCUMENT$1);
8561
10078
  this.params = inject(KickPlayerParamsDirective);
8562
10079
  this.el = injectHostElement();
8563
10080
  this.renderer = injectRenderer();
@@ -9186,7 +10703,7 @@ const TWITCH_PLAYER_TOKEN = new InjectionToken('TWITCH_PLAYER_TOKEN');
9186
10703
  class TwitchPlayerDirective {
9187
10704
  constructor() {
9188
10705
  this.platformId = inject(PLATFORM_ID);
9189
- this.document = inject(DOCUMENT);
10706
+ this.document = inject(DOCUMENT$1);
9190
10707
  this.params = inject(TwitchPlayerParamsDirective);
9191
10708
  this.el = injectHostElement();
9192
10709
  this.scriptLoader = injectStreamScriptLoader();
@@ -9441,7 +10958,7 @@ const VIMEO_PLAYER_TOKEN = new InjectionToken('VIMEO_PLAYER_TOKEN');
9441
10958
  class VimeoPlayerDirective {
9442
10959
  constructor() {
9443
10960
  this.platformId = inject(PLATFORM_ID);
9444
- this.document = inject(DOCUMENT);
10961
+ this.document = inject(DOCUMENT$1);
9445
10962
  this.params = inject(VimeoPlayerParamsDirective);
9446
10963
  this.el = injectHostElement();
9447
10964
  this.scriptLoader = injectStreamScriptLoader();
@@ -9697,7 +11214,7 @@ const waitForYtReady = (win) => {
9697
11214
  class YoutubePlayerDirective {
9698
11215
  constructor() {
9699
11216
  this.platformId = inject(PLATFORM_ID);
9700
- this.document = inject(DOCUMENT);
11217
+ this.document = inject(DOCUMENT$1);
9701
11218
  this.params = inject(YoutubePlayerParamsDirective);
9702
11219
  this.el = injectHostElement();
9703
11220
  this.scriptLoader = injectStreamScriptLoader();
@@ -11323,7 +12840,7 @@ const createTooltipId = (prefix = 'et-tooltip') => {
11323
12840
  const DEFAULT_TOOLTIP_DELAY = 300;
11324
12841
  class TooltipDirective {
11325
12842
  constructor() {
11326
- this.document = inject(DOCUMENT);
12843
+ this.document = inject(DOCUMENT$1);
11327
12844
  this.destroyRef = inject(DestroyRef);
11328
12845
  this.elementRef = inject(ElementRef);
11329
12846
  this.colorProvider = inject(COLOR_PROVIDER, { optional: true });
@@ -11538,5 +13055,5 @@ const TOOLTIP_IMPORTS = [TooltipDirective, TooltipComponent];
11538
13055
  * Generated bundle index. Do not edit.
11539
13056
  */
11540
13057
 
11541
- export { ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BrandLoaderComponent, ButtonComponent, ButtonDirective, ButtonStylesDirective, CHECKBOX_IMPORTS, CHEVRON_ICON, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChoiceFieldComponent, DAILYMOTION_PLAYER_TOKEN, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_STREAM_PLAYER_STATE, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DescriptionComponent, FACEBOOK_PLAYER_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_TOKEN, GridComponent, GridDirective, GridDragDirective, GridImports, GridItemComponent, GridItemDirective, GridItemRef, GridResizeDirective, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, INPUT_IMPORTS, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LOCK_ICON, LabelDirective, NAV_TABS_TOKEN, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NavTabImports, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, OVERLAY_ERROR_CODES, OVERLAY_IMPORTS, OVERLAY_REF, OverlayAnchorDirective, OverlayDirective, OverlaySurfaceDirective, OverlayTriggerDirective, PENCIL_ICON, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLUS_ICON, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, RadioComponent, RadioGroupComponent, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SOOP_PLAYER_TOKEN, STREAM_CONSENT_TOKEN, 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_USER_CONSENT_PROVIDER_TOKEN, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableErrorCode, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamImports, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_PANEL_TOKEN, TAB_SIZES, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabImports, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TextButtonComponent, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, 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, createGridAdapter, createNotificationRef, createOverlayRef, createPipChromeAnimations, createPipChromeState, createStreamConfig, createStreamPlayerSlot, fromGridPosition, injectFormSupport, injectGridConfig, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, provideFormSupport, provideGridConfig, provideIcons, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlayManager, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, toGridPosition };
13058
+ export { ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, BOLD_ICON, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BrandLoaderComponent, ButtonComponent, ButtonDirective, ButtonStylesDirective, CHECKBOX_IMPORTS, CHEVRON_ICON, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChoiceFieldComponent, DAILYMOTION_PLAYER_TOKEN, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_STREAM_PLAYER_STATE, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DescriptionComponent, FACEBOOK_PLAYER_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridImports, GridItemComponent, GridItemDirective, GridItemRef, GridResizeDirective, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, INPUT_IMPORTS, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOCK_ICON, LabelDirective, NAV_TABS_TOKEN, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NavTabImports, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, OVERLAY_ERROR_CODES, OVERLAY_IMPORTS, OVERLAY_REF, OverlayAnchorDirective, OverlayDirective, OverlaySurfaceDirective, OverlayTriggerDirective, PENCIL_ICON, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLUS_ICON, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, RICH_TEXT_EDITOR_IMPORTS, RadioComponent, RadioGroupComponent, RichTextEditorComponent, RichTextEditorDirective, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SOOP_PLAYER_TOKEN, STREAM_CONSENT_TOKEN, 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_USER_CONSENT_PROVIDER_TOKEN, STRIKETHROUGH_ICON, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableErrorCode, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamImports, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_PANEL_TOKEN, TAB_SIZES, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabImports, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TextButtonComponent, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, 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, createGridAdapter, createNotificationRef, createOverlayRef, createPipChromeAnimations, createPipChromeState, createStreamConfig, createStreamPlayerSlot, fromGridPosition, injectFormSupport, injectGridConfig, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, provideFormSupport, provideGridConfig, provideIcons, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlayManager, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, toGridPosition };
11542
13059
  //# sourceMappingURL=ethlete-components.mjs.map