@ethlete/components 1.0.0-next.72 → 1.0.0-next.73

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,14 +1,14 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, input, booleanAttribute, signal, inject, ElementRef, computed, effect, untracked, Directive, afterNextRender, DestroyRef, TemplateRef, model, linkedSignal, ViewEncapsulation, Component, ErrorHandler, numberAttribute, contentChildren, HostAttributeToken, Renderer2, output, viewChild, contentChild, NgZone, afterRenderEffect, ApplicationRef, DOCUMENT, ViewContainerRef, runInInjectionContext, createEnvironmentInjector, PLATFORM_ID, reflectComponentType, inputBinding, EnvironmentInjector, isSignal, Injector, createComponent, assertInInjectionContext, isDevMode as isDevMode$1, provideEnvironmentInitializer, viewChildren, outputBinding, afterEveryRender, CSP_NONCE } from '@angular/core';
3
3
  import * as i1 from '@ethlete/core';
4
- import { signalElementMutations, RuntimeError, injectHostElement, createComponentId, injectStyleManager, defineLabels, toProvideFn, toInjectFn, toToken, ProvideColorDirective, SurfaceInteractiveDirective, createCanAnimateSignal, ColorInteractiveDirective, injectSemanticColorTheme, injectColorThemes, injectLocale, defineStaticRootProvider, optionalBooleanAttribute as optionalBooleanAttribute$1, inferMimeType, mountVisuallyHidden, injectRenderer, ProvideSurfaceDirective, COLOR_PROVIDER, SURFACE_PROVIDER, injectSurfaceThemes, injectSurfaceThemesPrefix, injectSurfaceContextTracker, injectBoundaryElement, injectRootSurfaceTheme, ANIMATED_LIFECYCLE_TOKEN, injectDefaultSurfaceTheme, resolveAppRootColorProvider, resolveSurfaceByElevation, createCssSurfaceName, provideBoundaryElement, AnimatedLifecycleDirective, isElement, isHTMLElement, injectBreakpointObserver, hasAnchoredOverlayPositionExtras, equal, nextFrame, animationDebugLog, resolveOverlayLayer, defineRootProvider, injectOverlayRuntime, anchoredOverlayPosition, injectQueryParam, injectUrl, randomId, ScrollObserverDirective, signalElementScrollState, ScrollObserverStartDirective, ScrollObserverEndDirective, enableAnchoredOverlayPositionExtras, forceReflow, elementCanScroll, matchesReducedMotion, createSwipeTracker, applyHostListener, defineProvider, fromNextFrame, injectRoute, createUnsavedChangesTracker, createDocumentElementSignal, AnimatedIfDirective, signalElementDimensions, applyInitialFocus, syncSignal, AutoSurfaceDirective, setInputSignal, injectTemplateRef, signalHostElementScrollState, applyStructuredDataBinding, injectIsDocumentVisible, mountEasingTokens, typedBreakpointTransform, signalElementChildren, signalElementIntersection, signalHostAttributes, signalHostClasses, signalHostStyles, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, signalClasses, useCursorDragScroll, signalStyles, getScrollSnapTarget, injectPrefersReducedMotion, signalHostElementIntersection, clamp as clamp$1, signalHostElementDimensions, injectSurfaceColorPalette, injectFocusVisibleTracker, isOnHigherOverlayLayer, copyToClipboard, getFocusableElements, injectAnimatedBlockSize, injectObserveBreakpoint, applyHostListeners, dragGestureFrom, signalDeferredLoading, AnimatableDirective, ColorInteractiveContainerDirective, ColorInteractiveExcludeDirective, injectParentSurface, ColorInteractiveHasFocusDirective, createFlipAnimation, createFlipAnimationGroup, focusElement, isFocusable, htmlToMarkdown, isSafeLinkUrl, markdownToHtml, MARKDOWN_VERBATIM_ATTR, injectHasTouchInput, isSafeUrl, signalHostElementMutations, DragHandleDirective, ResizeHandlesComponent, numberBreakpointTransform, DEFAULT_OVERLAY_LAYER, injectSurfaceType, applyLinkBinding, applyHeadTitleBinding, injectColorPalette, injectViewportSize, injectFileDownload, injectRouterEvent, canUseSessionMemory, createSessionMemory, provideUnsavedChangesConfirm } from '@ethlete/core';
4
+ import { signalElementMutations, RuntimeError, injectHostElement, createComponentId, injectStyleManager, defineLabels, toProvideFn, toInjectFn, toToken, ProvideColorDirective, SurfaceInteractiveDirective, createCanAnimateSignal, ColorInteractiveDirective, injectSemanticColorTheme, injectColorThemes, injectLocale, defineStaticRootProvider, optionalBooleanAttribute as optionalBooleanAttribute$1, inferMimeType, mountVisuallyHidden, injectRenderer, ProvideSurfaceDirective, COLOR_PROVIDER, SURFACE_PROVIDER, injectSurfaceThemes, injectSurfaceThemesPrefix, injectSurfaceContextTracker, injectBoundaryElement, injectRootSurfaceTheme, ANIMATED_LIFECYCLE_TOKEN, injectDefaultSurfaceTheme, resolveAppRootColorProvider, resolveSurfaceByElevation, createCssSurfaceName, provideBoundaryElement, AnimatedLifecycleDirective, isElement, isHTMLElement, injectBreakpointObserver, hasAnchoredOverlayPositionExtras, equal, nextFrame, animationDebugLog, resolveOverlayLayer, defineRootProvider, injectOverlayRuntime, anchoredOverlayPosition, injectQueryParam, injectUrl, randomId, ScrollObserverDirective, signalElementScrollState, ScrollObserverStartDirective, ScrollObserverEndDirective, enableAnchoredOverlayPositionExtras, forceReflow, elementCanScroll, matchesReducedMotion, createSwipeTracker, injectHasTouchInput, applyHostListener, defineProvider, fromNextFrame, injectRoute, createUnsavedChangesTracker, createDocumentElementSignal, AnimatedIfDirective, signalElementDimensions, applyInitialFocus, syncSignal, AutoSurfaceDirective, setInputSignal, injectTemplateRef, signalHostElementScrollState, applyStructuredDataBinding, injectIsDocumentVisible, mountEasingTokens, typedBreakpointTransform, signalElementChildren, signalElementIntersection, signalHostAttributes, signalHostClasses, signalHostStyles, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, signalClasses, useCursorDragScroll, signalStyles, getScrollSnapTarget, injectPrefersReducedMotion, signalHostElementIntersection, clamp as clamp$1, signalHostElementDimensions, injectSurfaceColorPalette, injectFocusVisibleTracker, isOnHigherOverlayLayer, copyToClipboard, getFocusableElements, injectAnimatedBlockSize, injectObserveBreakpoint, applyHostListeners, dragGestureFrom, signalDeferredLoading, AnimatableDirective, ColorInteractiveContainerDirective, ColorInteractiveExcludeDirective, injectParentSurface, ColorInteractiveHasFocusDirective, createFlipAnimation, createFlipAnimationGroup, focusElement, isFocusable, htmlToMarkdown, isSafeLinkUrl, markdownToHtml, MARKDOWN_VERBATIM_ATTR, isSafeUrl, signalHostElementMutations, DragHandleDirective, ResizeHandlesComponent, numberBreakpointTransform, DEFAULT_OVERLAY_LAYER, injectSurfaceType, applyLinkBinding, applyHeadTitleBinding, injectColorPalette, injectViewportSize, injectFileDownload, injectRouterEvent, canUseSessionMemory, createSessionMemory, provideUnsavedChangesConfirm } from '@ethlete/core';
5
5
  import { NgTemplateOutlet, NgComponentOutlet, isPlatformServer, Location, DOCUMENT as DOCUMENT$1, isPlatformBrowser } from '@angular/common';
6
6
  import { DomSanitizer } from '@angular/platform-browser';
7
7
  import { queryStateSignal, isQueryStateLoading, withArgs, createQueryErrorResponse, isQueryStateSuccess, isQueryStateFailure, executeUntilSettled$, extractQuery, createPagedQueryStack, queryComputed, isLegacyQuery, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleEn, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToTitleDe, queryErrorMessages } from '@ethlete/query';
8
8
  import { DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, COMMON_BRACKET_ROUND_TYPE, BracketRuntimeError, BRACKET_ERROR_CODES, SWISS_BRACKET_ROUND_TYPE, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, TOURNAMENT_MODE, BRACKET_DATA_LAYOUT, resolveBracketLayout as resolveBracketLayout$1, createBracket, createPlaceholderBracketSource, drawMan, createDoubleEliminationGrid, ɵcreateStackedDoubleEliminationGrid as _createStackedDoubleEliminationGrid, createSingleEliminationGrid, generateBracketRoundSwissGroupMaps, createSwissGrid, drawSwissMan, standingPickStartOrder } from '@ethlete/bracket';
9
9
  export { BRACKET_DATA_LAYOUT, BRACKET_ERROR_CODES, BRACKET_ROUND_MIRROR_TYPE, BRACKET_SWISS_GROUP_COLOR_TYPE, BracketMap, BracketRuntimeError, COMMON_BRACKET_ROUND_TYPE, DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE, GROUP_BRACKET_ROUND_TYPE, SINGLE_ELIMINATION_BRACKET_ROUND_TYPE, SWISS_BRACKET_ROUND_TYPE, TOURNAMENT_MODE, bracketSlot, createBracket, createPlaceholderBracketSource, isBracketSlotPredictable, migrateBracketPicks, resolveBracketSlot, standingRankSides, swapStandingRank, validateBracketSource } from '@ethlete/bracket';
10
10
  import { isValid, format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, setYear, parse, setSeconds, setMinutes, setHours, subDays, subWeeks, subMonths, endOfDay, setMilliseconds, differenceInCalendarDays, getDaysInMonth, eachDayOfInterval, addHours } from 'date-fns';
11
- import { tap, Subject, take, filter, defer, map, finalize, timer, takeUntil, fromEvent, switchMap, observeOn, asapScheduler, combineLatest, distinctUntilChanged, EMPTY, startWith, debounceTime, merge, catchError, of, delay, isObservable, from, share, scan, concat, firstValueFrom, defaultIfEmpty, Subscription, Observable, interval, ignoreElements, skip, animationFrameScheduler, EmptyError, exhaustMap, shareReplay, throwError, expand, toArray, takeWhile, mergeMap } from 'rxjs';
11
+ import { tap, Subject, take, filter, defer, map, finalize, Observable, merge, fromEvent, EMPTY, ignoreElements, timer, takeUntil, interval, switchMap, observeOn, asapScheduler, combineLatest, distinctUntilChanged, startWith, debounceTime, catchError, of, delay, isObservable, from, share, scan, concat, firstValueFrom, defaultIfEmpty, Subscription, skip, animationFrameScheduler, EmptyError, exhaustMap, shareReplay, throwError, expand, toArray, takeWhile, mergeMap } from 'rxjs';
12
12
  import { takeUntilDestroyed, toSignal, toObservable, outputFromObservable, outputToObservable, rxResource } from '@angular/core/rxjs-interop';
13
13
  import * as i1$1 from '@angular/router';
14
14
  import { ROUTES, Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError, NavigationSkipped, RouterLink, ActivatedRoute, RouterLinkActive } from '@angular/router';
@@ -9231,6 +9231,110 @@ const anchoredDialogOverlayStrategy = (options = {}) => {
9231
9231
  };
9232
9232
  };
9233
9233
 
9234
+ /**
9235
+ * Tracks the gap between where `position: fixed; bottom: 0` renders and the top of the soft
9236
+ * keyboard. Never emits; subscribing starts the tracking and unsubscribing stops it.
9237
+ */
9238
+ const observeKeyboardInset = (tracking) => new Observable((subscriber) => {
9239
+ const viewport = tracking.view.visualViewport;
9240
+ if (!viewport)
9241
+ return;
9242
+ return trackKeyboardInset(tracking, viewport).subscribe(subscriber);
9243
+ });
9244
+ const trackKeyboardInset = ({ view, renderer, onInset, poll$ = EMPTY }, viewport) => {
9245
+ // In a same-origin iframe (Storybook, docs story embeds) the frame's own visualViewport never
9246
+ // reflects the soft keyboard - only the top window's does. Track the top viewport plus the
9247
+ // frame's position to compute how much of THIS frame the keyboard covers. A cross-origin
9248
+ // parent exposes neither (`frameElement` is null / viewport access throws), so those frames
9249
+ // keep the local metrics - the status quo of not seeing the keyboard at all.
9250
+ let frameElement = null;
9251
+ let topViewport = null;
9252
+ try {
9253
+ // no instanceof here - frameElement belongs to the PARENT document's realm, so it is never
9254
+ // an instance of this window's HTMLElement constructor
9255
+ frameElement = view.frameElement;
9256
+ topViewport = frameElement ? (view.top?.visualViewport ?? null) : null;
9257
+ }
9258
+ catch {
9259
+ frameElement = null;
9260
+ topViewport = null;
9261
+ }
9262
+ // Where "position: fixed; bottom: 0" actually lands is NOT derivable from window/visualViewport
9263
+ // on iOS: with the soft keyboard open (and focus zoom active), WebKit positions fixed elements
9264
+ // against an internal rect that tracks the visual viewport and is clamped to the document - its
9265
+ // bottom sits well below where `innerHeight` says. Measure it with a zero-size fixed probe
9266
+ // instead of assuming layout-viewport math; on engines without the quirk the probe bottom IS
9267
+ // `innerHeight`, so this degenerates to the plain `innerHeight - height - offsetTop`.
9268
+ const probe = renderer.createElement('div');
9269
+ renderer.setCssProperties(probe, {
9270
+ position: 'fixed',
9271
+ 'inset-block-end': '0',
9272
+ 'inline-size': '0',
9273
+ 'block-size': '0',
9274
+ visibility: 'hidden',
9275
+ });
9276
+ renderer.appendChild(view.document.body, probe);
9277
+ let lastApplied = -1;
9278
+ const apply = () => {
9279
+ const fixedBottom = probe.getBoundingClientRect().bottom;
9280
+ let keyboardTop;
9281
+ if (frameElement && topViewport) {
9282
+ const covered = frameElement.getBoundingClientRect().bottom - (topViewport.offsetTop + topViewport.height);
9283
+ keyboardTop = view.innerHeight - Math.max(0, covered);
9284
+ }
9285
+ else {
9286
+ keyboardTop = viewport.offsetTop + viewport.height;
9287
+ }
9288
+ const inset = Math.max(0, fixedBottom - keyboardTop);
9289
+ if (inset === lastApplied)
9290
+ return false;
9291
+ lastApplied = inset;
9292
+ onInset(inset);
9293
+ return true;
9294
+ };
9295
+ // iOS moves its fixed-position rect ASYNCHRONOUSLY while scrolling with the keyboard open (and
9296
+ // fires few or no visualViewport events mid-scroll, including when the scroll itself dismisses
9297
+ // the keyboard) - a single synchronous re-measure per event reads a stale probe rect. So each
9298
+ // event kicks a rAF loop that keeps re-measuring until the inset has been stable for a few
9299
+ // frames, then stops - continuous tracking while anything moves, zero per-frame work at rest.
9300
+ let rafId = null;
9301
+ let quietFrames = 0;
9302
+ const settle = () => {
9303
+ quietFrames = apply() ? 0 : quietFrames + 1;
9304
+ // ~30 quiet frames (≈500ms) so the loop outlasts the keyboard show/hide animation - iOS can
9305
+ // fire its last viewport event right at the animation's start while the fixed-position rect
9306
+ // keeps moving until the end
9307
+ rafId = quietFrames < 30 ? view.requestAnimationFrame(settle) : null;
9308
+ };
9309
+ const kick = () => {
9310
+ quietFrames = 0;
9311
+ apply();
9312
+ rafId ??= view.requestAnimationFrame(settle);
9313
+ };
9314
+ kick();
9315
+ const viewports = topViewport ? [viewport, topViewport] : [viewport];
9316
+ // window scroll too: a root scroll pans the keyboard-tracking fixed rect without necessarily
9317
+ // firing any visualViewport event (top window as well when embedded in an iframe)
9318
+ const scrollTargets = [...viewports, view];
9319
+ try {
9320
+ if (frameElement && view.top)
9321
+ scrollTargets.push(view.top);
9322
+ }
9323
+ catch {
9324
+ // cross-origin top - its scrolls are invisible to us; the frame keeps local tracking
9325
+ }
9326
+ const viewportChange$ = merge(...viewports.map((v) => fromEvent(v, 'resize')),
9327
+ // These are ancestor viewports/windows (visualViewport, iframe top), not a component-owned
9328
+ // scroll container - signalElementScrollState targets a known elementRef and doesn't apply.
9329
+ // eslint-disable-next-line ethlete/prefer-scroll-state
9330
+ ...scrollTargets.map((t) => fromEvent(t, 'scroll', { passive: true }))).pipe(tap(() => kick()));
9331
+ return merge(poll$.pipe(tap(() => apply())), viewportChange$).pipe(ignoreElements(), finalize(() => {
9332
+ if (rafId !== null)
9333
+ view.cancelAnimationFrame(rafId);
9334
+ probe.remove();
9335
+ }));
9336
+ };
9337
+
9234
9338
  /** Elements whose own pointer handling wins over a drag gesture on an ancestor. */
9235
9339
  const isInteractivePointerTarget = (target) => {
9236
9340
  const tag = target.tagName.toLowerCase();
@@ -9584,6 +9688,8 @@ const MIN_LEAVE_DURATION_MS = 100;
9584
9688
  const MAX_LEAVE_DURATION_MS = 350;
9585
9689
  /** Below this release speed the swipe carries no momentum worth handing off. */
9586
9690
  const MIN_LEAVE_SPEED = 50;
9691
+ /** How often a sheet lifted above the soft keyboard re-checks the keyboard, to recover a missed viewport event. */
9692
+ const KEYBOARD_POLL_MS = 500;
9587
9693
  /**
9588
9694
  * Gives the leave transition the speed the swipe had when it let go, instead of the fixed duration
9589
9695
  * the stylesheet uses for every other close. Only the duration is overridden - position is already
@@ -9597,9 +9703,40 @@ const applyDismissMomentum = ({ el, momentum }, renderer) => {
9597
9703
  renderer.setStyle(el, { transitionDuration: `${duration}ms` });
9598
9704
  };
9599
9705
  /** Shared strategy shape for all sheet variants: default enter/leave animations plus drag-to-dismiss. */
9600
- const createSheetStrategy = (config, renderer) => {
9706
+ const createSheetStrategy = (config, { renderer, liftAboveKeyboard }) => {
9601
9707
  let dragToDismissRef;
9602
9708
  let dismissMomentum = null;
9709
+ let keyboardLift;
9710
+ const applyKeyboardLift = (pane, inset) => renderer.setCssProperties(pane, {
9711
+ 'margin-block-end': inset ? `${inset}px` : null,
9712
+ '--et-overlay-max-height': inset ? `calc(100% - ${inset}px)` : null,
9713
+ });
9714
+ const stopKeyboardLift = (context) => {
9715
+ if (!keyboardLift)
9716
+ return;
9717
+ keyboardLift.unsubscribe();
9718
+ keyboardLift = undefined;
9719
+ applyKeyboardLift(context.containerEl, 0);
9720
+ };
9721
+ const startKeyboardLift = (context) => {
9722
+ stopKeyboardLift(context);
9723
+ const view = context.containerEl.ownerDocument.defaultView;
9724
+ if (!view || !liftAboveKeyboard?.())
9725
+ return;
9726
+ let inset = 0;
9727
+ const lift = () => applyKeyboardLift(context.containerEl, inset);
9728
+ keyboardLift = observeKeyboardInset({
9729
+ view,
9730
+ renderer,
9731
+ onInset: (next) => {
9732
+ inset = next;
9733
+ lift();
9734
+ },
9735
+ // re-asserts the lift too: a strategy switch re-positions the pane after onSwitchedTo, which
9736
+ // clears `--et-overlay-max-height`
9737
+ poll$: interval(KEYBOARD_POLL_MS).pipe(tap(lift)),
9738
+ }).subscribe();
9739
+ };
9603
9740
  const attachDragToDismiss = (context) => {
9604
9741
  if (!config.dragToDismiss)
9605
9742
  return;
@@ -9623,11 +9760,18 @@ const createSheetStrategy = (config, renderer) => {
9623
9760
  // A close interrupted by a re-open must not inherit the previous swipe's duration.
9624
9761
  renderer.setStyle(context.containerEl, { transitionDuration: null });
9625
9762
  dismissMomentum = null;
9763
+ startKeyboardLift(context);
9626
9764
  context.lifecycle.enter();
9627
9765
  },
9628
9766
  onAfterEnter: (context) => attachDragToDismiss(context),
9629
- onSwitchedTo: attachDragToDismiss,
9630
- onSwitchedAwayFrom: detachDragToDismiss,
9767
+ onSwitchedTo: (context) => {
9768
+ attachDragToDismiss(context);
9769
+ startKeyboardLift(context);
9770
+ },
9771
+ onSwitchedAwayFrom: (context) => {
9772
+ detachDragToDismiss();
9773
+ stopKeyboardLift(context);
9774
+ },
9631
9775
  onBeforeLeave: (context) => {
9632
9776
  detachDragToDismiss();
9633
9777
  if (dismissMomentum) {
@@ -9636,6 +9780,7 @@ const createSheetStrategy = (config, renderer) => {
9636
9780
  }
9637
9781
  context.lifecycle.leave();
9638
9782
  },
9783
+ onAfterLeave: stopKeyboardLift,
9639
9784
  };
9640
9785
  };
9641
9786
 
@@ -9674,7 +9819,11 @@ const injectBottomSheetStrategyDefaults = /* @__PURE__ */ toInjectFn(BOTTOM_SHEE
9674
9819
  const BOTTOM_SHEET_STRATEGY_DEF = /* @__PURE__ */ defineRootProvider(() => {
9675
9820
  const defaults = injectBottomSheetStrategyDefaults();
9676
9821
  const renderer = injectRenderer();
9677
- const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), renderer);
9822
+ const hasTouchInput = injectHasTouchInput();
9823
+ const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), {
9824
+ renderer,
9825
+ liftAboveKeyboard: hasTouchInput,
9826
+ });
9678
9827
  return {
9679
9828
  build,
9680
9829
  };
@@ -10366,7 +10515,7 @@ const injectLeftSheetStrategyDefaults = /* @__PURE__ */ toInjectFn(LEFT_SHEET_ST
10366
10515
  const LEFT_SHEET_STRATEGY_DEF = /* @__PURE__ */ defineRootProvider(() => {
10367
10516
  const defaults = injectLeftSheetStrategyDefaults();
10368
10517
  const renderer = injectRenderer();
10369
- const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), renderer);
10518
+ const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), { renderer });
10370
10519
  return {
10371
10520
  build,
10372
10521
  };
@@ -10404,7 +10553,7 @@ const injectRightSheetStrategyDefaults = /* @__PURE__ */ toInjectFn(RIGHT_SHEET_
10404
10553
  const RIGHT_SHEET_STRATEGY_DEF = /* @__PURE__ */ defineRootProvider(() => {
10405
10554
  const defaults = injectRightSheetStrategyDefaults();
10406
10555
  const renderer = injectRenderer();
10407
- const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), renderer);
10556
+ const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), { renderer });
10408
10557
  return {
10409
10558
  build,
10410
10559
  };
@@ -10488,7 +10637,7 @@ const injectTopSheetStrategyDefaults = /* @__PURE__ */ toInjectFn(TOP_SHEET_STRA
10488
10637
  const TOP_SHEET_STRATEGY_DEF = /* @__PURE__ */ defineRootProvider(() => {
10489
10638
  const defaults = injectTopSheetStrategyDefaults();
10490
10639
  const renderer = injectRenderer();
10491
- const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), renderer);
10640
+ const build = (config = {}) => createSheetStrategy(mergeOverlayBreakpointConfigs(defaults, config), { renderer });
10492
10641
  return {
10493
10642
  build,
10494
10643
  };
@@ -15780,11 +15929,11 @@ const SCROLLABLE_DARKEN_IMPORTS = [ScrollableDarkenDirective];
15780
15929
 
15781
15930
  class CarouselAutoplayStylesComponent {
15782
15931
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CarouselAutoplayStylesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15783
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: CarouselAutoplayStylesComponent, isStandalone: true, selector: "et-carousel-autoplay-styles", ngImport: i0, template: '', isInline: true, styles: ["@layer components{@property --et-carousel-dot-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 18px;}@property --et-carousel-dot-ring-width{syntax: \"<length>\"; inherits: true; initial-value: 2.5px;}.et-carousel-dot-progress{position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border-radius:50%;opacity:0;scale:.55;-webkit-mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)));mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)))}.et-carousel-dot-progress-half{position:absolute;inset-block:0;inline-size:50%;overflow:hidden}.et-carousel-dot-progress-half:before{content:\"\";position:absolute;inset:0;background:var(--et-theme-color-primary-solid, currentColor);rotate:-180deg}.et-carousel-dot-progress-half:first-child{inset-inline-start:50%}.et-carousel-dot-progress-half:first-child:before{border-radius:0 100% 100% 0/0 50% 50% 0;transform-origin:0 50%}.et-carousel-dot-progress-half:last-child{inset-inline-start:0}.et-carousel-dot-progress-half:last-child:before{border-radius:100% 0 0 100%/50% 0 0 50%;transform-origin:100% 50%}@keyframes et-carousel-autoplay-sweep{0%{rotate:-180deg}to{rotate:0deg}}.et-carousel-dot{position:relative}.et-carousel-dot:after{content:\"\";position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border:var(--et-carousel-dot-ring-width) solid color-mix(in srgb,var(--et-surface-interaction-solid, gray) 30%,transparent);border-radius:50%;opacity:0;scale:.55}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress{opacity:1;scale:1}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:before{animation:et-carousel-autoplay-sweep calc(var(--_et-carousel-autoplay-duration, 5s) / 2) linear forwards}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:last-child:before{animation-delay:calc(var(--_et-carousel-autoplay-duration, 5s) / 2)}.et-carousel-dot:where([data-counting]):after{opacity:1;scale:1}.et-carousel-dot:where([data-counting]):before{scale:.75}.et-carousel .et-carousel-play-toggle .et-icon-button-icon{display:grid;place-items:center}.et-carousel-play-toggle .et-carousel-play-toggle-icon{grid-area:1 / 1;opacity:0;scale:.55;rotate:-35deg}.et-carousel-play-toggle:not([data-playing]) .et-icon--et-play,.et-carousel-play-toggle:where([data-playing]) .et-icon--et-pause{opacity:1;scale:1;rotate:0deg}.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot-progress,.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot:after{transition:opacity .22s var(--ease-3, ease-out),scale .22s var(--ease-3, ease-out)}.et-carousel:where(.et-carousel--can-animate) .et-carousel-play-toggle-icon{transition:opacity .18s var(--ease-3, ease-out),scale .18s var(--ease-3, ease-out),rotate .22s var(--ease-3, ease-out)}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
15932
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: CarouselAutoplayStylesComponent, isStandalone: true, selector: "et-carousel-autoplay-styles", ngImport: i0, template: '', isInline: true, styles: ["@layer components{@property --et-carousel-dot-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 18px;}@property --et-carousel-dot-ring-width{syntax: \"<length>\"; inherits: true; initial-value: 2.5px;}.et-carousel-dot-progress{position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border-radius:50%;opacity:0;scale:.55;-webkit-mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)));mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)))}.et-carousel-dot-progress-half{position:absolute;inset-block:0;inline-size:50%;overflow:hidden}.et-carousel-dot-progress-half:before{content:\"\";position:absolute;inset:0;background:var(--et-theme-color-primary-solid, currentColor);rotate:-180deg;opacity:0}.et-carousel-dot-progress-half:first-child{inset-inline-start:50%}.et-carousel-dot-progress-half:first-child:before{border-radius:0 100% 100% 0/0 50% 50% 0;transform-origin:0 50%}.et-carousel-dot-progress-half:last-child{inset-inline-start:0}.et-carousel-dot-progress-half:last-child:before{border-radius:100% 0 0 100%/50% 0 0 50%;transform-origin:100% 50%}@keyframes et-carousel-autoplay-sweep{0%{rotate:-180deg;opacity:1}to{rotate:0deg;opacity:1}}.et-carousel-dot{position:relative}.et-carousel-dot:after{content:\"\";position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border:var(--et-carousel-dot-ring-width) solid color-mix(in srgb,var(--et-surface-interaction-solid, gray) 30%,transparent);border-radius:50%;opacity:0;scale:.55}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress{opacity:1;scale:1}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:before{animation:et-carousel-autoplay-sweep calc(var(--_et-carousel-autoplay-duration, 5s) / 2) linear forwards}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:last-child:before{animation-delay:calc(var(--_et-carousel-autoplay-duration, 5s) / 2)}.et-carousel-dot:where([data-counting]):after{opacity:1;scale:1}.et-carousel-dot:where([data-counting]):before{scale:.75}.et-carousel .et-carousel-play-toggle .et-icon-button-icon{display:grid;place-items:center}.et-carousel-play-toggle .et-carousel-play-toggle-icon{grid-area:1 / 1;opacity:0;scale:.55;rotate:-35deg}.et-carousel-play-toggle:not([data-playing]) .et-icon--et-play,.et-carousel-play-toggle:where([data-playing]) .et-icon--et-pause{opacity:1;scale:1;rotate:0deg}.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot-progress,.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot:after{transition:opacity .22s var(--ease-3, ease-out),scale .22s var(--ease-3, ease-out)}.et-carousel:where(.et-carousel--can-animate) .et-carousel-play-toggle-icon{transition:opacity .18s var(--ease-3, ease-out),scale .18s var(--ease-3, ease-out),rotate .22s var(--ease-3, ease-out)}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
15784
15933
  }
15785
15934
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CarouselAutoplayStylesComponent, decorators: [{
15786
15935
  type: Component,
15787
- args: [{ selector: 'et-carousel-autoplay-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{@property --et-carousel-dot-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 18px;}@property --et-carousel-dot-ring-width{syntax: \"<length>\"; inherits: true; initial-value: 2.5px;}.et-carousel-dot-progress{position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border-radius:50%;opacity:0;scale:.55;-webkit-mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)));mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)))}.et-carousel-dot-progress-half{position:absolute;inset-block:0;inline-size:50%;overflow:hidden}.et-carousel-dot-progress-half:before{content:\"\";position:absolute;inset:0;background:var(--et-theme-color-primary-solid, currentColor);rotate:-180deg}.et-carousel-dot-progress-half:first-child{inset-inline-start:50%}.et-carousel-dot-progress-half:first-child:before{border-radius:0 100% 100% 0/0 50% 50% 0;transform-origin:0 50%}.et-carousel-dot-progress-half:last-child{inset-inline-start:0}.et-carousel-dot-progress-half:last-child:before{border-radius:100% 0 0 100%/50% 0 0 50%;transform-origin:100% 50%}@keyframes et-carousel-autoplay-sweep{0%{rotate:-180deg}to{rotate:0deg}}.et-carousel-dot{position:relative}.et-carousel-dot:after{content:\"\";position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border:var(--et-carousel-dot-ring-width) solid color-mix(in srgb,var(--et-surface-interaction-solid, gray) 30%,transparent);border-radius:50%;opacity:0;scale:.55}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress{opacity:1;scale:1}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:before{animation:et-carousel-autoplay-sweep calc(var(--_et-carousel-autoplay-duration, 5s) / 2) linear forwards}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:last-child:before{animation-delay:calc(var(--_et-carousel-autoplay-duration, 5s) / 2)}.et-carousel-dot:where([data-counting]):after{opacity:1;scale:1}.et-carousel-dot:where([data-counting]):before{scale:.75}.et-carousel .et-carousel-play-toggle .et-icon-button-icon{display:grid;place-items:center}.et-carousel-play-toggle .et-carousel-play-toggle-icon{grid-area:1 / 1;opacity:0;scale:.55;rotate:-35deg}.et-carousel-play-toggle:not([data-playing]) .et-icon--et-play,.et-carousel-play-toggle:where([data-playing]) .et-icon--et-pause{opacity:1;scale:1;rotate:0deg}.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot-progress,.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot:after{transition:opacity .22s var(--ease-3, ease-out),scale .22s var(--ease-3, ease-out)}.et-carousel:where(.et-carousel--can-animate) .et-carousel-play-toggle-icon{transition:opacity .18s var(--ease-3, ease-out),scale .18s var(--ease-3, ease-out),rotate .22s var(--ease-3, ease-out)}}\n"] }]
15936
+ args: [{ selector: 'et-carousel-autoplay-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{@property --et-carousel-dot-ring-size{syntax: \"<length>\"; inherits: true; initial-value: 18px;}@property --et-carousel-dot-ring-width{syntax: \"<length>\"; inherits: true; initial-value: 2.5px;}.et-carousel-dot-progress{position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border-radius:50%;opacity:0;scale:.55;-webkit-mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)));mask:radial-gradient(closest-side,transparent calc(100% - var(--et-carousel-dot-ring-width)),black calc(100% - var(--et-carousel-dot-ring-width)))}.et-carousel-dot-progress-half{position:absolute;inset-block:0;inline-size:50%;overflow:hidden}.et-carousel-dot-progress-half:before{content:\"\";position:absolute;inset:0;background:var(--et-theme-color-primary-solid, currentColor);rotate:-180deg;opacity:0}.et-carousel-dot-progress-half:first-child{inset-inline-start:50%}.et-carousel-dot-progress-half:first-child:before{border-radius:0 100% 100% 0/0 50% 50% 0;transform-origin:0 50%}.et-carousel-dot-progress-half:last-child{inset-inline-start:0}.et-carousel-dot-progress-half:last-child:before{border-radius:100% 0 0 100%/50% 0 0 50%;transform-origin:100% 50%}@keyframes et-carousel-autoplay-sweep{0%{rotate:-180deg;opacity:1}to{rotate:0deg;opacity:1}}.et-carousel-dot{position:relative}.et-carousel-dot:after{content:\"\";position:absolute;inline-size:var(--et-carousel-dot-ring-size);block-size:var(--et-carousel-dot-ring-size);border:var(--et-carousel-dot-ring-width) solid color-mix(in srgb,var(--et-surface-interaction-solid, gray) 30%,transparent);border-radius:50%;opacity:0;scale:.55}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress{opacity:1;scale:1}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:before{animation:et-carousel-autoplay-sweep calc(var(--_et-carousel-autoplay-duration, 5s) / 2) linear forwards}.et-carousel-dot:where([data-counting]) .et-carousel-dot-progress-half:last-child:before{animation-delay:calc(var(--_et-carousel-autoplay-duration, 5s) / 2)}.et-carousel-dot:where([data-counting]):after{opacity:1;scale:1}.et-carousel-dot:where([data-counting]):before{scale:.75}.et-carousel .et-carousel-play-toggle .et-icon-button-icon{display:grid;place-items:center}.et-carousel-play-toggle .et-carousel-play-toggle-icon{grid-area:1 / 1;opacity:0;scale:.55;rotate:-35deg}.et-carousel-play-toggle:not([data-playing]) .et-icon--et-play,.et-carousel-play-toggle:where([data-playing]) .et-icon--et-pause{opacity:1;scale:1;rotate:0deg}.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot-progress,.et-carousel:where(.et-carousel--can-animate) .et-carousel-dot:after{transition:opacity .22s var(--ease-3, ease-out),scale .22s var(--ease-3, ease-out)}.et-carousel:where(.et-carousel--can-animate) .et-carousel-play-toggle-icon{transition:opacity .18s var(--ease-3, ease-out),scale .18s var(--ease-3, ease-out),rotate .22s var(--ease-3, ease-out)}}\n"] }]
15788
15937
  }] });
15789
15938
 
15790
15939
  const CAROUSEL_TOKEN = new InjectionToken('CAROUSEL_TOKEN');
@@ -15795,8 +15944,8 @@ const MAX_TIMER_DELAY = 2_147_483_647;
15795
15944
  * Advances the carousel on its own. Opt-in - put it on the same element as `[etCarousel]` - so a carousel
15796
15945
  * that doesn't move by itself carries none of this.
15797
15946
  *
15798
- * It pauses whenever moving the page under the user would be rude: pointer over the carousel, focus
15799
- * inside it, the carousel scrolled off screen, or the user having asked for reduced motion (in which case
15947
+ * It pauses whenever moving the page under the user would be rude: a finger or the pointer on the
15948
+ * carousel, focus inside it, the carousel scrolled off screen, or the user having asked for reduced motion (in which case
15800
15949
  * it never starts at all). It also stops at the last slide when the carousel doesn't `loop`, rather than
15801
15950
  * jumping back to the start forever.
15802
15951
  *
@@ -15860,6 +16009,9 @@ class CarouselAutoplayDirective {
15860
16009
  this.isHovered = signal(false, /* @ts-ignore */
15861
16010
  ...(ngDevMode ? [{ debugName: "isHovered" }] : /* istanbul ignore next */ []));
15862
16011
  /** @internal */
16012
+ this.isTouched = signal(false, /* @ts-ignore */
16013
+ ...(ngDevMode ? [{ debugName: "isTouched" }] : /* istanbul ignore next */ []));
16014
+ /** @internal */
15863
16015
  this.isFocusWithin = signal(false, /* @ts-ignore */
15864
16016
  ...(ngDevMode ? [{ debugName: "isFocusWithin" }] : /* istanbul ignore next */ []));
15865
16017
  /**
@@ -15901,6 +16053,8 @@ class CarouselAutoplayDirective {
15901
16053
  if (!isOnScreen)
15902
16054
  return 'off-screen';
15903
16055
  }
16056
+ if (this.isTouched())
16057
+ return 'touch';
15904
16058
  if (this.pauseOnHover() && this.isHovered() && !this.isPointerOnPauseControl())
15905
16059
  return 'hover';
15906
16060
  if (this.pauseOnFocus() && this.isFocusWithin() && !this.isFocusOnPauseControl())
@@ -15966,6 +16120,9 @@ class CarouselAutoplayDirective {
15966
16120
  return;
15967
16121
  this.isHovered.set(isHovered);
15968
16122
  }
16123
+ setTouched(event) {
16124
+ this.isTouched.set(event.touches.length > 0);
16125
+ }
15969
16126
  advance() {
15970
16127
  const carousel = this.carousel;
15971
16128
  if (!carousel)
@@ -15977,7 +16134,7 @@ class CarouselAutoplayDirective {
15977
16134
  carousel.next();
15978
16135
  }
15979
16136
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CarouselAutoplayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
15980
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: CarouselAutoplayDirective, isStandalone: true, selector: "[etCarouselAutoplay]", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, autoplayTime: { classPropertyName: "autoplayTime", publicName: "autoplayTime", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null }, pauseOnFocus: { classPropertyName: "pauseOnFocus", publicName: "pauseOnFocus", isSignal: true, isRequired: false, transformFunction: null }, pauseOnOffScreen: { classPropertyName: "pauseOnOffScreen", publicName: "pauseOnOffScreen", isSignal: true, isRequired: false, transformFunction: null }, playOnInit: { classPropertyName: "playOnInit", publicName: "playOnInit", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerenter": "setHovered($event, true)", "pointerleave": "setHovered($event, false)", "focusin": "isFocusWithin.set(true)", "focusout": "isFocusWithin.set(false)" }, properties: { "attr.data-autoplaying": "isPlaying() ? \"\" : null" } }, providers: [{ provide: CAROUSEL_AUTOPLAY_TOKEN, useExisting: CarouselAutoplayDirective }], exportAs: ["etCarouselAutoplay"], ngImport: i0 }); }
16137
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: CarouselAutoplayDirective, isStandalone: true, selector: "[etCarouselAutoplay]", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, autoplayTime: { classPropertyName: "autoplayTime", publicName: "autoplayTime", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null }, pauseOnFocus: { classPropertyName: "pauseOnFocus", publicName: "pauseOnFocus", isSignal: true, isRequired: false, transformFunction: null }, pauseOnOffScreen: { classPropertyName: "pauseOnOffScreen", publicName: "pauseOnOffScreen", isSignal: true, isRequired: false, transformFunction: null }, playOnInit: { classPropertyName: "playOnInit", publicName: "playOnInit", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerenter": "setHovered($event, true)", "pointerleave": "setHovered($event, false)", "touchstart": "isTouched.set(true)", "touchend": "setTouched($event)", "touchcancel": "setTouched($event)", "focusin": "isFocusWithin.set(true)", "focusout": "isFocusWithin.set(false)" }, properties: { "attr.data-autoplaying": "isPlaying() ? \"\" : null" } }, providers: [{ provide: CAROUSEL_AUTOPLAY_TOKEN, useExisting: CarouselAutoplayDirective }], exportAs: ["etCarouselAutoplay"], ngImport: i0 }); }
15981
16138
  }
15982
16139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CarouselAutoplayDirective, decorators: [{
15983
16140
  type: Directive,
@@ -15989,6 +16146,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
15989
16146
  '[attr.data-autoplaying]': 'isPlaying() ? "" : null',
15990
16147
  '(pointerenter)': 'setHovered($event, true)',
15991
16148
  '(pointerleave)': 'setHovered($event, false)',
16149
+ '(touchstart)': 'isTouched.set(true)',
16150
+ '(touchend)': 'setTouched($event)',
16151
+ '(touchcancel)': 'setTouched($event)',
15992
16152
  '(focusin)': 'isFocusWithin.set(true)',
15993
16153
  '(focusout)': 'isFocusWithin.set(false)',
15994
16154
  },
@@ -28027,7 +28187,7 @@ class FormFieldComponent {
28027
28187
  this.formFieldDir.activate();
28028
28188
  }
28029
28189
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28030
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: FormFieldComponent, isStandalone: true, selector: "et-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, labelMode: { classPropertyName: "labelMode", publicName: "labelMode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, busy: { classPropertyName: "busy", publicName: "busy", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "formFieldDir.isHidden() ? \"none\" : null", "attr.data-can-animate": "canAnimate.state() || null", "attr.data-control-type": "formFieldDir.controlType()", "attr.data-error": "support.displaysError() || null", "attr.data-warning": "support.displaysWarning() || null", "attr.aria-busy": "isBusy() ? \"true\" : null", "attr.data-busy": "isBusy() || null", "attr.data-expanded": "formFieldDir.usesTextFieldShell() && formFieldDir.expanded() ? \"\" : null", "attr.data-focused": "formFieldDir.usesTextFieldShell() && formFieldDir.focused() ? \"\" : null", "attr.data-readonly": "formFieldDir.usesTextFieldShell() && formFieldDir.isReadonly() ? \"\" : null", "attr.data-disabled": "formFieldDir.usesTextFieldShell() && formFieldDir.isDisabled() ? \"\" : null", "attr.data-appearance": "formFieldDir.usesTextFieldShell() ? appearance() : null", "attr.data-fill": "formFieldDir.usesTextFieldShell() ? fill() : null", "attr.data-label-floated": "hasFloatingTextLabel() && formFieldDir.shouldFloatLabel() ? \"\" : null", "attr.data-has-label": "formFieldDir.registeredLabel() ? \"\" : null", "attr.data-label-mode": "formFieldDir.usesTextFieldShell() ? labelMode() : null", "attr.data-size": "formFieldDir.usesTextFieldShell() ? size() : null", "attr.data-text-shell": "formFieldDir.usesTextFieldShell() || null", "style.--_et-form-field-prefix-offset": "prefixOffset()" }, classAttribute: "et-form-field" }, providers: [provideFormSupport()], queries: [{ propertyName: "description", first: true, predicate: DescriptionComponent, isSignal: true }], viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "warningContent", first: true, predicate: ["warningContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "counterContent", first: true, predicate: ["counterContent"], descendants: true, isSignal: true }, { propertyName: "controlFrame", first: true, predicate: ["controlFrame"], descendants: true, isSignal: true }, { propertyName: "prefixEl", first: true, predicate: ["prefixEl"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "warningAnimatable", first: true, predicate: ["warningAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: FormFieldDirective }, { directive: i1.ProvideColorDirective, inputs: ["etProvideColor", "color"] }, { directive: i1.ProvideSurfaceDirective, inputs: ["etProvideSurface", "surface"] }, { directive: i1.ColorInteractiveHasFocusDirective }], ngImport: i0, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div\n [style.block-size.px]=\"support.supportHeight()\"\n [attr.data-can-animate]=\"support.supportCanAnimate() || null\"\n class=\"et-form-field-support\"\n etColorInteractiveExclude\n >\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-support[data-can-animate]{transition:block-size var(--et-form-field-support-duration) ease}et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}}\n"], dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "directive", type: ColorInteractiveExcludeDirective, selector: "[etColorInteractiveExclude]" }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "component", type: FormWarningComponent, selector: "et-form-warning", inputs: ["warning"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
28190
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: FormFieldComponent, isStandalone: true, selector: "et-form-field", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, labelMode: { classPropertyName: "labelMode", publicName: "labelMode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, busy: { classPropertyName: "busy", publicName: "busy", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "formFieldDir.isHidden() ? \"none\" : null", "attr.data-can-animate": "canAnimate.state() || null", "attr.data-control-type": "formFieldDir.controlType()", "attr.data-error": "support.displaysError() || null", "attr.data-warning": "support.displaysWarning() || null", "attr.aria-busy": "isBusy() ? \"true\" : null", "attr.data-busy": "isBusy() || null", "attr.data-expanded": "formFieldDir.usesTextFieldShell() && formFieldDir.expanded() ? \"\" : null", "attr.data-focused": "formFieldDir.usesTextFieldShell() && formFieldDir.focused() ? \"\" : null", "attr.data-readonly": "formFieldDir.usesTextFieldShell() && formFieldDir.isReadonly() ? \"\" : null", "attr.data-disabled": "formFieldDir.usesTextFieldShell() && formFieldDir.isDisabled() ? \"\" : null", "attr.data-appearance": "formFieldDir.usesTextFieldShell() ? appearance() : null", "attr.data-fill": "formFieldDir.usesTextFieldShell() ? fill() : null", "attr.data-label-floated": "hasFloatingTextLabel() && formFieldDir.shouldFloatLabel() ? \"\" : null", "attr.data-has-label": "formFieldDir.registeredLabel() ? \"\" : null", "attr.data-label-mode": "formFieldDir.usesTextFieldShell() ? labelMode() : null", "attr.data-size": "formFieldDir.usesTextFieldShell() ? size() : null", "attr.data-text-shell": "formFieldDir.usesTextFieldShell() || null", "style.--_et-form-field-prefix-offset": "prefixOffset()" }, classAttribute: "et-form-field" }, providers: [provideFormSupport()], queries: [{ propertyName: "description", first: true, predicate: DescriptionComponent, isSignal: true }], viewQueries: [{ propertyName: "errorContent", first: true, predicate: ["errorContent"], descendants: true, isSignal: true }, { propertyName: "warningContent", first: true, predicate: ["warningContent"], descendants: true, isSignal: true }, { propertyName: "hintContent", first: true, predicate: ["hintContent"], descendants: true, isSignal: true }, { propertyName: "counterContent", first: true, predicate: ["counterContent"], descendants: true, isSignal: true }, { propertyName: "controlFrame", first: true, predicate: ["controlFrame"], descendants: true, isSignal: true }, { propertyName: "prefixEl", first: true, predicate: ["prefixEl"], descendants: true, isSignal: true }, { propertyName: "errorAnimatable", first: true, predicate: ["errorAnimatable"], descendants: true, isSignal: true }, { propertyName: "warningAnimatable", first: true, predicate: ["warningAnimatable"], descendants: true, isSignal: true }, { propertyName: "hintAnimatable", first: true, predicate: ["hintAnimatable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: FormFieldDirective }, { directive: i1.ProvideColorDirective, inputs: ["etProvideColor", "color"] }, { directive: i1.ProvideSurfaceDirective, inputs: ["etProvideSurface", "surface"] }, { directive: i1.ColorInteractiveHasFocusDirective }], ngImport: i0, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div\n [style.block-size.px]=\"support.supportHeight()\"\n [attr.data-can-animate]=\"support.supportCanAnimate() || null\"\n class=\"et-form-field-support\"\n etColorInteractiveExclude\n >\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-support[data-can-animate]{transition:block-size var(--et-form-field-support-duration) ease}et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}@media(pointer:coarse){et-form-field :is(input:not([type=checkbox],[type=radio],[type=range]),textarea){font-size:max(1em,16px)}}}\n"], dependencies: [{ kind: "directive", type: AnimatableDirective, selector: "[etAnimatable]", exportAs: ["etAnimatable"] }, { kind: "directive", type: ColorInteractiveExcludeDirective, selector: "[etColorInteractiveExclude]" }, { kind: "component", type: FormErrorComponent, selector: "et-form-error", inputs: ["error"] }, { kind: "component", type: FormWarningComponent, selector: "et-form-warning", inputs: ["warning"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
28031
28191
  }
28032
28192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormFieldComponent, decorators: [{
28033
28193
  type: Component,
@@ -28067,7 +28227,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
28067
28227
  '[attr.data-size]': 'formFieldDir.usesTextFieldShell() ? size() : null',
28068
28228
  '[attr.data-text-shell]': 'formFieldDir.usesTextFieldShell() || null',
28069
28229
  '[style.--_et-form-field-prefix-offset]': 'prefixOffset()',
28070
- }, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div\n [style.block-size.px]=\"support.supportHeight()\"\n [attr.data-can-animate]=\"support.supportCanAnimate() || null\"\n class=\"et-form-field-support\"\n etColorInteractiveExclude\n >\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-support[data-can-animate]{transition:block-size var(--et-form-field-support-duration) ease}et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}}\n"] }]
28230
+ }, template: "<div class=\"et-form-field-shell\">\n <div #controlFrame (mousedown)=\"handleFramePointerDown($event)\" class=\"et-form-field-control-frame\">\n <div #prefixEl class=\"et-form-field-affix et-form-field-prefix\">\n <ng-content select=\"[etInputPrefix]\" />\n </div>\n\n <div class=\"et-form-field-control-area\">\n <div\n [class.et-form-field-label-area--floating]=\"hasFloatingTextLabel()\"\n [class.et-form-field-label-area--inline]=\"hasInlineLabel()\"\n class=\"et-form-field-label-area\"\n >\n <ng-content select=\"et-label\" />\n </div>\n\n <div class=\"et-form-field-control-slot\">\n <ng-content />\n </div>\n </div>\n\n <div class=\"et-form-field-affix et-form-field-suffix\">\n <!-- Before the consumer's suffix: nothing may come between a control's own affordances and\n the field they belong to. -->\n @if (formFieldDir.registeredControlSuffix(); as controlSuffix) {\n <ng-template [ngTemplateOutlet]=\"controlSuffix.templateRef\" />\n }\n\n <ng-content select=\"[etInputSuffix]\" />\n\n <!-- After the consumer's own suffix, never instead of it. -->\n @if (showBusySpinner()) {\n <et-spinner class=\"et-form-field-busy-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n }\n </div>\n </div>\n</div>\n\n<ng-content select=\"et-description\" />\n\n@if (support.shouldRenderSupport()) {\n <div\n [style.block-size.px]=\"support.supportHeight()\"\n [attr.data-can-animate]=\"support.supportCanAnimate() || null\"\n class=\"et-form-field-support\"\n etColorInteractiveExclude\n >\n <div class=\"et-form-field-support-row\">\n <div class=\"et-form-field-support-stack\">\n @if (support.shouldRenderError()) {\n <div\n #errorContent\n #errorAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.errorId()\"\n [attr.aria-atomic]=\"support.errorActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.errorActive() ? 'true' : null\"\n [attr.aria-live]=\"support.errorActive() ? 'polite' : null\"\n [attr.data-active]=\"support.errorActive() || null\"\n [attr.data-direction]=\"support.errorDirection()\"\n [attr.data-state]=\"support.errorState()\"\n [etProvideColor]=\"support.errorColorTheme()\"\n class=\"et-form-field-support-content et-form-field-errors\"\n etAnimatable\n >\n @for (error of support.visibleErrors(); track $index) {\n <et-form-error [error]=\"error\" />\n }\n </div>\n }\n\n @if (support.shouldRenderWarning()) {\n <div\n #warningContent\n #warningAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.warningId()\"\n [attr.aria-atomic]=\"support.warningActive() ? 'true' : null\"\n [attr.aria-hidden]=\"!support.warningActive() ? 'true' : null\"\n [attr.aria-live]=\"support.warningActive() ? 'polite' : null\"\n [attr.data-active]=\"support.warningActive() || null\"\n [attr.data-direction]=\"support.warningDirection()\"\n [attr.data-state]=\"support.warningState()\"\n [etProvideColor]=\"support.warningColorTheme()\"\n class=\"et-form-field-support-content et-form-field-warnings\"\n etAnimatable\n >\n @for (warning of support.visibleWarnings(); track $index) {\n <et-form-warning [warning]=\"warning\" />\n }\n </div>\n }\n\n @if (support.shouldRenderHint()) {\n <div\n #hintContent\n #hintAnimatable=\"etAnimatable\"\n [id]=\"formFieldDir.hintId()\"\n [attr.aria-hidden]=\"!support.hintActive() ? 'true' : null\"\n [attr.data-active]=\"support.hintActive() || null\"\n [attr.data-direction]=\"support.hintDirection()\"\n [attr.data-state]=\"support.hintState()\"\n class=\"et-form-field-support-content et-form-field-hint\"\n etAnimatable\n >\n <ng-content select=\"et-hint\" />\n </div>\n }\n </div>\n\n <!-- Carries the error theme so the counter's own over-limit styling can reach the semantic\n error color even before the field shows an error. -->\n <div\n #counterContent\n [etProvideColor]=\"support.errorColorTheme()\"\n [hidden]=\"!formFieldDir.registeredCounter()\"\n class=\"et-form-field-support-counter\"\n >\n <ng-content select=\"et-counter\" />\n </div>\n </div>\n </div>\n}\n", styles: ["@layer components{@property --et-form-field-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-form-field-control-border-width{syntax: \"<length>\"; inherits: true; initial-value: 1px;}@property --et-form-field-control-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-control-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-control-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-control-line-height{syntax: \"<number>\"; inherits: true; initial-value: 1.5;}@property --et-form-field-control-affix-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-form-field-affix-icon-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}@property --et-form-field-control-disabled-opacity{syntax: \"<number>\"; inherits: true; initial-value: .5;}@property --et-form-field-control-min-height{syntax: \"<length>\"; inherits: true; initial-value: 40px;}@property --et-form-field-label-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-form-field-error-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-warning-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-hint-font-size{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-form-field-support-duration{syntax: \"<time>\"; inherits: true; initial-value: .18s;}et-form-field{--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--_et-form-field-control-background: transparent;--_et-form-field-control-focus-ring: color-mix(in srgb, var(--et-theme-color-primary-solid) 18%, transparent);--_et-form-field-floating-label-scale: .75;display:flex;flex-direction:column;gap:var(--et-form-field-gap);color:var(--et-surface-color-solid, currentColor)}et-form-field .et-form-field-shell{display:flex;flex-direction:column;gap:var(--et-form-field-gap);min-inline-size:0;overflow:visible}et-form-field .et-form-field-label-area{display:flex;align-items:center;font-size:var(--et-form-field-label-font-size);font-weight:500;line-height:1.2;letter-spacing:-.01em;color:var(--et-surface-color-muted-solid, currentColor);cursor:text;-webkit-user-select:none;user-select:none;min-inline-size:0;transition:color .15s ease,opacity .15s ease}et-form-field .et-form-field-label-area et-label{display:inline;min-inline-size:0}et-form-field .et-form-field-label-area--floating{position:absolute;inset-block-start:50%;inset-inline-start:0;z-index:1;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:translateY(-50%);transform-origin:left top;pointer-events:none}et-form-field[data-can-animate] .et-form-field-label-area--floating{transition:color .15s ease,opacity .15s ease,inset-block-start .15s ease,inset-inline-start .15s ease,transform .15s ease}et-form-field .et-form-field-control-frame{position:relative;display:flex;align-items:center;box-sizing:border-box;gap:var(--et-form-field-control-affix-gap);min-inline-size:0;min-block-size:var(--et-form-field-control-min-height);padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);border:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor);border-radius:var(--et-form-field-control-border-radius, var(--_et-form-field-control-border-radius, 4px));background:var(--_et-form-field-control-background);font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease;cursor:text}et-form-field .et-form-field-affix{display:flex;align-items:center;justify-content:center;flex-shrink:0;gap:var(--et-form-field-control-affix-gap);color:var(--et-surface-color-muted-solid, currentColor);pointer-events:none;transition:color .15s ease}et-form-field .et-form-field-affix:empty{display:none}et-form-field .et-form-field-affix>*{pointer-events:none}et-form-field .et-form-field-affix>:is([etInputPrefix],[etInputSuffix],.et-form-field-busy-spinner){opacity:.78;transition:opacity .15s ease}et-form-field .et-form-field-affix>.et-icon{flex:none;inline-size:var(--et-form-field-affix-icon-size);block-size:var(--et-form-field-affix-icon-size)}et-form-field .et-form-field-affix>:is(button,a[href],input,select,textarea,summary,label,[role=button],[tabindex]:not([tabindex=\"-1\"])){pointer-events:auto}et-form-field .et-form-field-affix button{font:inherit;color:inherit;border:none;background:transparent;padding:0;cursor:pointer}et-form-field .et-form-field-control-area{position:relative;display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-control-area>*{min-inline-size:0}et-form-field .et-form-field-control-slot{display:flex;align-items:center;flex:1;min-inline-size:0}et-form-field .et-form-field-support{overflow:clip}et-form-field .et-form-field-support-row{display:flex;align-items:flex-start;gap:var(--et-form-field-support-gap, .8rem)}et-form-field .et-form-field-support-stack{position:relative;display:grid;flex:1 1 auto;min-inline-size:0}et-form-field .et-form-field-support-content{grid-area:1 / 1;min-inline-size:0;opacity:0}et-form-field .et-form-field-support-content[data-active]{opacity:1}et-form-field .et-form-field-support-content[data-state=leaving]{position:absolute;inset:0;pointer-events:none}et-form-field .et-form-field-errors{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-error-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-warnings{display:flex;flex-direction:column;gap:2px;font-size:var(--et-form-field-warning-font-size);color:var(--et-theme-color-ink-solid);padding-inline-start:calc(var(--et-form-field-control-padding-inline) + var(--et-form-field-control-border-width))}et-form-field .et-form-field-support[data-can-animate]{transition:block-size var(--et-form-field-support-duration) ease}et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content{transition:opacity var(--et-form-field-support-duration) ease}@starting-style{et-form-field .et-form-field-support[data-can-animate] .et-form-field-support-content[data-active]{opacity:0}}@media(prefers-reduced-motion:reduce){et-form-field{--et-form-field-support-duration: 1ms}}@media(pointer:coarse){et-form-field :is(input:not([type=checkbox],[type=radio],[type=range]),textarea){font-size:max(1em,16px)}}}\n"] }]
28071
28231
  }], ctorParameters: () => [], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], labelMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelMode", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], busy: [{ type: i0.Input, args: [{ isSignal: true, alias: "busy", required: false }] }], errorContent: [{ type: i0.ViewChild, args: ['errorContent', { isSignal: true }] }], warningContent: [{ type: i0.ViewChild, args: ['warningContent', { isSignal: true }] }], hintContent: [{ type: i0.ViewChild, args: ['hintContent', { isSignal: true }] }], counterContent: [{ type: i0.ViewChild, args: ['counterContent', { isSignal: true }] }], controlFrame: [{ type: i0.ViewChild, args: ['controlFrame', { isSignal: true }] }], prefixEl: [{ type: i0.ViewChild, args: ['prefixEl', { isSignal: true }] }], errorAnimatable: [{ type: i0.ViewChild, args: ['errorAnimatable', { isSignal: true }] }], warningAnimatable: [{ type: i0.ViewChild, args: ['warningAnimatable', { isSignal: true }] }], hintAnimatable: [{ type: i0.ViewChild, args: ['hintAnimatable', { isSignal: true }] }], description: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DescriptionComponent), { ...{ descendants: false }, isSignal: true }] }] } });
28072
28232
 
28073
28233
  const INPUT_MASK_HOST = new InjectionToken('INPUT_MASK_HOST');
@@ -46773,121 +46933,21 @@ class RichTextEditorComponent {
46773
46933
  .subscribe();
46774
46934
  }
46775
46935
  /**
46776
- * Keeps `--_et-rte-keyboard-inset` at the gap between where `position: fixed; bottom: 0` renders
46777
- * and the top of the soft keyboard, so the docked toolbar sits on the keyboard. Written straight to
46778
- * the host, not through a signal, so scrolling never schedules change detection.
46936
+ * Keeps `--_et-rte-keyboard-inset` at the soft keyboard's inset, so the docked toolbar sits on the
46937
+ * keyboard. Written straight to the host, not through a signal, so scrolling never schedules change
46938
+ * detection.
46779
46939
  */
46780
46940
  keyboardInset$() {
46781
- return new Observable((subscriber) => {
46782
- const view = this.document.defaultView;
46783
- const viewport = view?.visualViewport;
46784
- if (!view || !viewport)
46785
- return;
46786
- return this.observeKeyboardInset(view, viewport).subscribe(subscriber);
46787
- });
46788
- }
46789
- observeKeyboardInset(view, viewport) {
46941
+ const view = this.document.defaultView;
46942
+ if (!view)
46943
+ return EMPTY;
46790
46944
  const host = this.host.nativeElement;
46791
- // In a same-origin iframe (Storybook, docs story embeds) the frame's own visualViewport never
46792
- // reflects the soft keyboard - only the top window's does. Track the top viewport plus the
46793
- // frame's position to compute how much of THIS frame the keyboard covers. A cross-origin
46794
- // parent exposes neither (`frameElement` is null / viewport access throws), so those frames
46795
- // keep the local metrics - the status quo of not seeing the keyboard at all.
46796
- let frameElement = null;
46797
- let topViewport = null;
46798
- try {
46799
- // no instanceof here - frameElement belongs to the PARENT document's realm, so it is never
46800
- // an instance of this window's HTMLElement constructor
46801
- frameElement = view.frameElement;
46802
- topViewport = frameElement ? (view.top?.visualViewport ?? null) : null;
46803
- }
46804
- catch {
46805
- frameElement = null;
46806
- topViewport = null;
46807
- }
46808
- // Where "position: fixed; bottom: 0" actually lands is NOT derivable from window/visualViewport
46809
- // on iOS: with the soft keyboard open (and focus zoom active), WebKit positions fixed elements
46810
- // against an internal rect that tracks the visual viewport and is clamped to the document - its
46811
- // bottom sits well below where `innerHeight` says. Measure it with a zero-size fixed probe
46812
- // instead of assuming layout-viewport math; on engines without the quirk the probe bottom IS
46813
- // `innerHeight`, so this degenerates to the plain `innerHeight - height - offsetTop`.
46814
- const probe = this.renderer.createElement('div');
46815
- this.renderer.setCssProperties(probe, {
46816
- position: 'fixed',
46817
- 'inset-block-end': '0',
46818
- 'inline-size': '0',
46819
- 'block-size': '0',
46820
- visibility: 'hidden',
46945
+ return observeKeyboardInset({
46946
+ view,
46947
+ renderer: this.renderer,
46948
+ onInset: (inset) => this.renderer.setCssProperty(host, '--_et-rte-keyboard-inset', `${inset}px`),
46949
+ poll$: toObservable(this.dockedToolbar, { injector: this.injector }).pipe(switchMap((docked) => (docked ? interval(DOCKED_TOOLBAR_POLL_MS) : EMPTY))),
46821
46950
  });
46822
- this.renderer.appendChild(this.document.body, probe);
46823
- let lastApplied = -1;
46824
- const apply = () => {
46825
- const fixedBottom = probe.getBoundingClientRect().bottom;
46826
- let keyboardTop;
46827
- if (frameElement && topViewport) {
46828
- // keyboard overlap of this frame, in the frame's own client coordinates
46829
- const covered = frameElement.getBoundingClientRect().bottom - (topViewport.offsetTop + topViewport.height);
46830
- keyboardTop = view.innerHeight - Math.max(0, covered);
46831
- }
46832
- else {
46833
- keyboardTop = viewport.offsetTop + viewport.height;
46834
- }
46835
- const inset = Math.max(0, fixedBottom - keyboardTop);
46836
- if (inset === lastApplied)
46837
- return false;
46838
- lastApplied = inset;
46839
- this.renderer.setCssProperty(host, '--_et-rte-keyboard-inset', `${inset}px`);
46840
- return true;
46841
- };
46842
- // iOS moves its fixed-position rect ASYNCHRONOUSLY while scrolling with the keyboard open (and
46843
- // fires few or no visualViewport events mid-scroll, including when the scroll itself dismisses
46844
- // the keyboard) - a single synchronous re-measure per event reads a stale probe rect and the
46845
- // toolbar drifts under the keyboard. So each event kicks a rAF loop that keeps re-measuring
46846
- // until the inset has been stable for a few frames, then stops - continuous tracking while
46847
- // anything moves, zero per-frame work at rest.
46848
- let rafId = null;
46849
- let quietFrames = 0;
46850
- const settle = () => {
46851
- quietFrames = apply() ? 0 : quietFrames + 1;
46852
- // ~30 quiet frames (≈500ms) so the loop outlasts the keyboard show/hide animation - iOS can
46853
- // fire its last viewport event right at the animation's start while the fixed-position rect
46854
- // keeps moving until the end
46855
- rafId = quietFrames < 30 ? view.requestAnimationFrame(settle) : null;
46856
- };
46857
- const kick = () => {
46858
- quietFrames = 0;
46859
- apply();
46860
- rafId ??= view.requestAnimationFrame(settle);
46861
- };
46862
- kick();
46863
- // The event stream is not guaranteed to be complete: a soft keyboard can change height without a
46864
- // viewport event (Gboard switching layout, a suggestion row appearing), and inside an embedded
46865
- // frame the event may land while the ancestor layout is still moving. Either leaves the bar parked
46866
- // for a keyboard that is no longer there - floating over the content instead of sitting on it. So
46867
- // re-measure on a slow timer for as long as the bar is actually docked: one rect read every
46868
- // POLL_MS, no rAF loop and no change detection, and a stale position heals within half a second.
46869
- const poll$ = toObservable(this.dockedToolbar, { injector: this.injector }).pipe(switchMap((docked) => (docked ? interval(DOCKED_TOOLBAR_POLL_MS) : EMPTY)), tap(() => apply()));
46870
- const viewports = topViewport ? [viewport, topViewport] : [viewport];
46871
- // window scroll too: a root scroll pans the keyboard-tracking fixed rect without necessarily
46872
- // firing any visualViewport event (top window as well when embedded in an iframe)
46873
- const scrollTargets = [...viewports, view];
46874
- try {
46875
- if (frameElement && view.top)
46876
- scrollTargets.push(view.top);
46877
- }
46878
- catch {
46879
- // cross-origin top - its scrolls are invisible to us; the frame keeps local tracking
46880
- }
46881
- const viewportChange$ = merge(...viewports.map((v) => fromEvent(v, 'resize')),
46882
- // These are ancestor viewports/windows (visualViewport, iframe top), not a component-owned
46883
- // scroll container - signalElementScrollState targets a known elementRef and doesn't apply.
46884
- // eslint-disable-next-line ethlete/prefer-scroll-state
46885
- ...scrollTargets.map((t) => fromEvent(t, 'scroll', { passive: true }))).pipe(tap(() => kick()));
46886
- return merge(poll$, viewportChange$).pipe(ignoreElements(), finalize(() => {
46887
- if (rafId !== null)
46888
- view.cancelAnimationFrame(rafId);
46889
- probe.remove();
46890
- }));
46891
46951
  }
46892
46952
  /** `editingActive` follows the editor's focus, but lingers ~400ms after a blur so a menu/link
46893
46953
  * editor opened from the docked toolbar (which takes focus into an overlay) keeps the bar up. */
@@ -77177,7 +77237,7 @@ const provideUnsavedChangesAlertDialog = () => provideUnsavedChangesConfirm(() =
77177
77237
 
77178
77238
  // Generated from package.json by tools/scripts/generate-version.js - do not edit.
77179
77239
  /** The version of `@ethlete/components` this build was cut from. */
77180
- const COMPONENTS_VERSION = '1.0.0-next.72';
77240
+ const COMPONENTS_VERSION = '1.0.0-next.73';
77181
77241
 
77182
77242
  /**
77183
77243
  * Generated bundle index. Do not edit.