@ethlete/components 1.0.0-next.68 → 1.0.0-next.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/design/button.ts +57 -0
- package/design/form-field.ts +210 -0
- package/design/select.ts +110 -0
- package/fesm2022/ethlete-components-testing.mjs +3 -1
- package/fesm2022/ethlete-components-testing.mjs.map +1 -1
- package/fesm2022/ethlete-components.mjs +1543 -352
- package/fesm2022/ethlete-components.mjs.map +1 -1
- package/package.json +20 -14
- package/src/lib/accordion/accordion-group.component.css +12 -0
- package/src/lib/accordion/accordion.component.css +185 -0
- package/src/lib/avatar/avatar-group.component.css +31 -0
- package/src/lib/avatar/avatar.component.css +75 -0
- package/src/lib/badge/badge.component.css +111 -0
- package/src/lib/banner/banner.component.css +94 -0
- package/src/lib/bracket/bracket-default-continue.component.css +29 -0
- package/src/lib/bracket/bracket-default-final-match.component.css +76 -0
- package/src/lib/bracket/bracket-default-match.component.css +21 -0
- package/src/lib/bracket/bracket-default-round-header.component.css +36 -0
- package/src/lib/bracket/bracket-participants.component.css +13 -0
- package/src/lib/bracket/bracket-pick-card.component.css +232 -0
- package/src/lib/bracket/bracket-rounds-list.component.css +75 -0
- package/src/lib/bracket/bracket-skeleton.component.css +55 -0
- package/src/lib/bracket/bracket.component.css +102 -0
- package/src/lib/bracket/layouts/swiss/bracket-swiss-styles.component.css +10 -0
- package/src/lib/breadcrumb/breadcrumb-overflow.component.css +38 -0
- package/src/lib/breadcrumb/breadcrumb.component.css +120 -0
- package/src/lib/button/button-properties-styles.component.css +143 -0
- package/src/lib/button/button.component.css +196 -0
- package/src/lib/button/fab.component.css +252 -0
- package/src/lib/button/icon-button.component.css +143 -0
- package/src/lib/button/split-button.component.css +77 -0
- package/src/lib/button/text-button.component.css +140 -0
- package/src/lib/button/window-control-button.component.css +158 -0
- package/src/lib/calendar/calendar-coarse-grid-styles.component.css +29 -0
- package/src/lib/calendar/calendar-comparison-band-styles.component.css +36 -0
- package/src/lib/calendar/calendar-week-numbers-styles.component.css +32 -0
- package/src/lib/calendar/calendar.component.css +366 -0
- package/src/lib/card/card.component.css +39 -0
- package/src/lib/carousel/carousel-autoplay-styles.component.css +166 -0
- package/src/lib/carousel/carousel-transition-styles.component.css +179 -0
- package/src/lib/carousel/carousel.component.css +142 -0
- package/src/lib/chart/bar-chart.component.css +176 -0
- package/src/lib/chart/chart-axis.component.css +40 -0
- package/src/lib/chart/chart-grid.component.css +6 -0
- package/src/lib/chart/chart-legend.component.css +46 -0
- package/src/lib/chart/chart-tooltip.component.css +34 -0
- package/src/lib/chart/line-chart-tooltip.component.css +51 -0
- package/src/lib/chart/line-chart.component.css +234 -0
- package/src/lib/chart/pie-chart.component.css +176 -0
- package/src/lib/chart/sankey-chart.component.css +221 -0
- package/src/lib/chip/chip.component.css +155 -0
- package/src/lib/command-palette/command-palette-item.component.css +94 -0
- package/src/lib/command-palette/command-palette.component.css +100 -0
- package/src/lib/description-list/description-list.component.css +77 -0
- package/src/lib/divider/divider.component.css +36 -0
- package/src/lib/empty-state/empty-state.component.css +73 -0
- package/src/lib/floating-action/floating-action-styles.component.css +78 -0
- package/src/lib/focus-ring/focus-ring-styles.component.css +13 -0
- package/src/lib/forms/cascader/cascader-breadcrumb-styles.component.css +98 -0
- package/src/lib/forms/cascader/cascader-panel.component.css +386 -0
- package/src/lib/forms/cascader/cascader-sheet-styles.component.css +241 -0
- package/src/lib/forms/cascader/cascader.component.css +52 -0
- package/src/lib/forms/checkbox/checkbox.component.css +247 -0
- package/src/lib/forms/choice-field/choice-field-card-styles.component.css +59 -0
- package/src/lib/forms/choice-field/choice-field.component.css +186 -0
- package/src/lib/forms/color-input/color-input.component.css +108 -0
- package/src/lib/forms/color-input/color-picker-panel.component.css +349 -0
- package/src/lib/forms/date-time/date-input/date-input.component.css +35 -0
- package/src/lib/forms/date-time/date-picker-panel.component.css +115 -0
- package/src/lib/forms/date-time/date-range-input/date-range-input.component.css +16 -0
- package/src/lib/forms/date-time/date-range-presets.component.css +60 -0
- package/src/lib/forms/date-time/date-time-input/date-time-input.component.css +151 -0
- package/src/lib/forms/date-time/date-time-range-input/date-time-range-input.component.css +121 -0
- package/src/lib/forms/date-time/duration-input/duration-input.component.css +88 -0
- package/src/lib/forms/date-time/range-input-shell-styles.component.css +55 -0
- package/src/lib/forms/date-time/time-input/time-input.component.css +35 -0
- package/src/lib/forms/date-time/time-range-input/time-range-input.component.css +16 -0
- package/src/lib/forms/dropzone/dropzone-item.component.css +51 -0
- package/src/lib/forms/dropzone/dropzone-preview-styles.component.css +67 -0
- package/src/lib/forms/dropzone/dropzone-readonly-styles.component.css +34 -0
- package/src/lib/forms/dropzone/dropzone.component.css +267 -0
- package/src/lib/forms/form-field/counter.component.css +25 -0
- package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +116 -0
- package/src/lib/forms/form-field/form-field-rich-text-styles.component.css +31 -0
- package/src/lib/forms/form-field/form-field-suffix-overlap-styles.component.css +66 -0
- package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +312 -0
- package/src/lib/forms/form-field/form-field-textarea-styles.component.css +32 -0
- package/src/lib/forms/form-field/form-field.component.css +328 -0
- package/src/lib/forms/form-field/form-support-styles.component.css +102 -0
- package/src/lib/forms/form-field/headless/label.directive.css +25 -0
- package/src/lib/forms/form-field/hint.component.css +20 -0
- package/src/lib/forms/input/input.component.css +49 -0
- package/src/lib/forms/input/number-input.component.css +128 -0
- package/src/lib/forms/input/password-input.component.css +103 -0
- package/src/lib/forms/multi-language-rich-text-editor/multi-language-rich-text-editor.component.css +8 -0
- package/src/lib/forms/multi-language-rich-text-editor/tools/multi-language-rich-text-editor-language-tool.component.css +104 -0
- package/src/lib/forms/otp-input/otp-input.component.css +194 -0
- package/src/lib/forms/phone-input/phone-input.component.css +126 -0
- package/src/lib/forms/rating/rating.component.css +197 -0
- package/src/lib/forms/rich-text-editor/rich-text-content-styles.component.css +234 -0
- package/src/lib/forms/rich-text-editor/rich-text-editor-floating-toolbar.component.css +90 -0
- package/src/lib/forms/rich-text-editor/rich-text-editor-image-editor.component.css +172 -0
- package/src/lib/forms/rich-text-editor/rich-text-editor-link-editor.component.css +149 -0
- package/src/lib/forms/rich-text-editor/rich-text-editor-token-palette.component.css +18 -0
- package/src/lib/forms/rich-text-editor/rich-text-editor-token-popup.component.css +199 -0
- package/src/lib/forms/rich-text-editor/rich-text-editor.component.css +175 -0
- package/src/lib/forms/rich-text-editor/rich-text-viewer.component.css +6 -0
- package/src/lib/forms/rich-text-editor/tools/rich-text-editor-align-tool.component.css +5 -0
- package/src/lib/forms/rich-text-editor/tools/rich-text-editor-heading-tool.component.css +5 -0
- package/src/lib/forms/rich-text-editor/tools/rich-text-editor-image-styles.component.css +109 -0
- package/src/lib/forms/rich-text-editor/tools/rich-text-editor-table-styles.component.css +21 -0
- package/src/lib/forms/rich-text-editor/tools/rich-text-editor-table-tool.component.css +44 -0
- package/src/lib/forms/select/select-all-option.component.css +14 -0
- package/src/lib/forms/select/select-extras-styles.component.css +143 -0
- package/src/lib/forms/select/select-option-group.component.css +35 -0
- package/src/lib/forms/select/select-option-styles.component.css +137 -0
- package/src/lib/forms/select/select-panel.component.css +112 -0
- package/src/lib/forms/select/select.component.css +180 -0
- package/src/lib/forms/selection-card-styles.component.css +136 -0
- package/src/lib/forms/selection-list/checkbox-group/checkbox-group-select-all.component.css +89 -0
- package/src/lib/forms/selection-list/checkbox-group/checkbox-group.component.css +142 -0
- package/src/lib/forms/selection-list/checkbox-group/checkbox-option.component.css +153 -0
- package/src/lib/forms/selection-list/radio-group/radio-group.component.css +134 -0
- package/src/lib/forms/selection-list/radio-group/radio.component.css +137 -0
- package/src/lib/forms/selection-list/segmented-button-group/segmented-button-group.component.css +149 -0
- package/src/lib/forms/selection-list/segmented-button-group/segmented-button.component.css +180 -0
- package/src/lib/forms/slider/range-slider.component.css +348 -0
- package/src/lib/forms/slider/slider.component.css +342 -0
- package/src/lib/forms/switch/switch.component.css +187 -0
- package/src/lib/forms/tag-input/tag-input.component.css +54 -0
- package/src/lib/forms/textarea/textarea-autosize-styles.component.css +17 -0
- package/src/lib/forms/textarea/textarea.component.css +40 -0
- package/src/lib/grid/grid-debug.component.css +130 -0
- package/src/lib/grid/grid-item-default-actions.component.css +11 -0
- package/src/lib/grid/grid-item.component.css +172 -0
- package/src/lib/grid/grid.component.css +56 -0
- package/src/lib/icon/headless/icon-styles.component.css +7 -0
- package/src/lib/kbd/kbd.component.css +62 -0
- package/src/lib/loader/brand-loader/brand-loader.component.css +130 -0
- package/src/lib/loader/progress-bar/progress-bar.component.css +176 -0
- package/src/lib/loader/spinner/spinner.component.css +216 -0
- package/src/lib/masonry/masonry-styles.component.css +84 -0
- package/src/lib/match/match-card.component.css +441 -0
- package/src/lib/match/match-participant.component.css +137 -0
- package/src/lib/match/match-score.component.css +74 -0
- package/src/lib/menu/menu-group-label.component.css +12 -0
- package/src/lib/menu/menu-item-shortcut.component.css +10 -0
- package/src/lib/menu/menu-item-submenu-icon.component.css +18 -0
- package/src/lib/menu/menu-item.component.css +32 -0
- package/src/lib/menu/menu-search-styles.component.css +56 -0
- package/src/lib/menu/menu-selection-item.component.css +88 -0
- package/src/lib/menu/menu-separator.component.css +9 -0
- package/src/lib/menu/menu.component.css +296 -0
- package/src/lib/notification/notification-stack.component.css +114 -0
- package/src/lib/notification/notification.component.css +271 -0
- package/src/lib/overlay/alert-dialog/alert-dialog.component.css +45 -0
- package/src/lib/overlay/floating-panel-styles.component.css +71 -0
- package/src/lib/overlay/floating-tip-styles.component.css +78 -0
- package/src/lib/overlay/overlay-container.component.css +167 -0
- package/src/lib/overlay/overlay-main-styles.component.css +105 -0
- package/src/lib/overlay/overlay-template-host.component.css +7 -0
- package/src/lib/overlay/routing/overlay-route-header-template-outlet.component.css +36 -0
- package/src/lib/overlay/routing/overlay-router-outlet.component.css +207 -0
- package/src/lib/overlay/routing/overlay-shared-route-template-outlet.component.css +5 -0
- package/src/lib/overlay/sidebar/overlay-sidebar.component.css +16 -0
- package/src/lib/overlay/strategies/anchored-dialog-styles.component.css +51 -0
- package/src/lib/overlay/strategies/dialog-styles.component.css +50 -0
- package/src/lib/overlay/strategies/full-screen-dialog-styles.component.css +83 -0
- package/src/lib/overlay/strategies/overlay-arrow-styles.component.css +112 -0
- package/src/lib/overlay/strategies/overlay-origin-clone.component.css +63 -0
- package/src/lib/overlay/strategies/sheet-styles.component.css +143 -0
- package/src/lib/pagination/page-size-select.component.css +102 -0
- package/src/lib/pagination/pagination.component.css +192 -0
- package/src/lib/picture/picture.component.css +66 -0
- package/src/lib/progress-steps/progress-step.component.css +187 -0
- package/src/lib/progress-steps/progress-steps.component.css +26 -0
- package/src/lib/query-error/query-error.component.css +21 -0
- package/src/lib/scheduler/scheduler-agenda-view.component.css +97 -0
- package/src/lib/scheduler/scheduler-appointment-drag-styles.component.css +56 -0
- package/src/lib/scheduler/scheduler-appointment-styles.component.css +111 -0
- package/src/lib/scheduler/scheduler-edit-color.component.css +16 -0
- package/src/lib/scheduler/scheduler-edit-surface-actions.component.css +14 -0
- package/src/lib/scheduler/scheduler-edit-surface-breadcrumb.component.css +26 -0
- package/src/lib/scheduler/scheduler-edit-surface-children.component.css +57 -0
- package/src/lib/scheduler/scheduler-edit-surface-fields.component.css +11 -0
- package/src/lib/scheduler/scheduler-edit-surface-footer.component.css +7 -0
- package/src/lib/scheduler/scheduler-edit-surface-header.component.css +15 -0
- package/src/lib/scheduler/scheduler-edit-time-range.component.css +11 -0
- package/src/lib/scheduler/scheduler-month-view.component.css +143 -0
- package/src/lib/scheduler/scheduler-time-grid-view.component.css +260 -0
- package/src/lib/scheduler/scheduler.component.css +87 -0
- package/src/lib/scrollable/headless/scrollable-buttons.component.css +122 -0
- package/src/lib/scrollable/headless/scrollable-footer.css +25 -0
- package/src/lib/scrollable/headless/scrollable-masks.component.css +112 -0
- package/src/lib/scrollable/headless/scrollable-navigation.component.css +94 -0
- package/src/lib/scrollable/scrollable.component.css +192 -0
- package/src/lib/scrollbar/scrollbar.component.css +110 -0
- package/src/lib/skeleton/skeleton.component.css +108 -0
- package/src/lib/standings/standings-pick.component.css +172 -0
- package/src/lib/standings/standings.component.css +201 -0
- package/src/lib/stat-tile/stat-tile-sparkline.component.css +49 -0
- package/src/lib/stat-tile/stat-tile.component.css +111 -0
- package/src/lib/stream/pip/pip-chrome.component.css +96 -0
- package/src/lib/stream/pip/pip-player.component.css +40 -0
- package/src/lib/stream/pip/pip-window.component.css +222 -0
- package/src/lib/stream/stream-manager-styles.component.css +10 -0
- package/src/lib/stream/stream-overlay-card-styles.component.css +43 -0
- package/src/lib/stream/stream-player-slot-styles.component.css +14 -0
- package/src/lib/table/table-column-chooser.component.css +17 -0
- package/src/lib/table/table-column-menu-trigger.component.css +31 -0
- package/src/lib/table/table-detail-styles.component.css +103 -0
- package/src/lib/table/table-drag-scroll-styles.component.css +18 -0
- package/src/lib/table/table-expander-cell.component.css +58 -0
- package/src/lib/table/table-filter-trigger.component.css +44 -0
- package/src/lib/table/table-group-header-row.component.css +38 -0
- package/src/lib/table/table-inline-edit-styles.component.css +20 -0
- package/src/lib/table/table-page-sticky-header-styles.component.css +77 -0
- package/src/lib/table/table-reorder-overlay.component.css +42 -0
- package/src/lib/table/table-resize-grip.component.css +65 -0
- package/src/lib/table/table-row-box-styles.component.css +260 -0
- package/src/lib/table/table-select-cell.component.css +89 -0
- package/src/lib/table/table-skeleton-rows.component.css +19 -0
- package/src/lib/table/table-sort-priority-styles.component.css +15 -0
- package/src/lib/table/table-sticky-columns-styles.component.css +80 -0
- package/src/lib/table/table-virtual-scroll-styles.component.css +9 -0
- package/src/lib/table/table.component.css +829 -0
- package/src/lib/tabs/nav-tabs/nav-tab-link-styles.component.css +33 -0
- package/src/lib/tabs/tab-bar-styles.component.css +173 -0
- package/src/lib/tabs/tab-scale-styles.component.css +61 -0
- package/src/lib/time-picker/time-picker.component.css +220 -0
- package/src/lib/timeline/timeline-item.component.css +116 -0
- package/src/lib/timeline/timeline.component.css +7 -0
- package/src/lib/toggletip/toggletip.component.css +83 -0
- package/src/lib/toolbar/toolbar.component.css +40 -0
- package/src/lib/tooltip/tooltip.component.css +64 -0
- package/src/lib/tree/tree.component.css +221 -0
- package/types/ethlete-components-testing.d.ts +1 -1
- package/types/ethlete-components.d.ts +275 -36
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
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, reflectComponentType, inputBinding, EnvironmentInjector, isSignal, Injector, createComponent, assertInInjectionContext, isDevMode as isDevMode$1, provideEnvironmentInitializer, viewChildren,
|
|
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,
|
|
5
|
-
import { NgTemplateOutlet, NgComponentOutlet, Location, DOCUMENT as DOCUMENT$1, isPlatformBrowser } from '@angular/common';
|
|
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';
|
|
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
|
-
import { isValid, format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, setYear, parse, setSeconds, setMinutes, setHours, subDays, subWeeks, subMonths, setMilliseconds, differenceInCalendarDays,
|
|
10
|
+
import { isValid, format, startOfWeek, startOfDay, endOfWeek, isBefore, addDays, endOfMonth, startOfMonth, isSameYear, isSameMonth, isSameDay, startOfYear, isAfter, addYears, addMonths, setMonth, getDate, setDate, lastDayOfMonth, getWeek, endOfYear, setYear, parse, setSeconds, setMinutes, setHours, subDays, subWeeks, subMonths, endOfDay, setMilliseconds, differenceInCalendarDays, getDaysInMonth, eachDayOfInterval, addHours } from 'date-fns';
|
|
11
11
|
import { tap, Subject, take, filter, defer, map, finalize, timer, takeUntil, fromEvent, switchMap, observeOn, asapScheduler, combineLatest, distinctUntilChanged, EMPTY, startWith, debounceTime, merge, catchError, of, delay, isObservable, from, share, scan, concat, firstValueFrom, defaultIfEmpty, Subscription, Observable, interval, ignoreElements, skip, animationFrameScheduler, EmptyError, exhaustMap, shareReplay, throwError, expand, toArray, takeWhile, mergeMap } from 'rxjs';
|
|
12
12
|
import { takeUntilDestroyed, toSignal, toObservable, outputFromObservable, outputToObservable, rxResource } from '@angular/core/rxjs-interop';
|
|
13
13
|
import * as i1$1 from '@angular/router';
|
|
@@ -16,6 +16,7 @@ import { createMetadataKey, metadata, FORM_FIELD, validate, createManagedMetadat
|
|
|
16
16
|
import { tz, TZDate } from '@date-fns/tz';
|
|
17
17
|
import { enUS } from 'date-fns/locale/en-US';
|
|
18
18
|
import { tap as tap$1 } from 'rxjs/operators';
|
|
19
|
+
import { HttpEventType } from '@angular/common/http';
|
|
19
20
|
|
|
20
21
|
// codes 3600-3699
|
|
21
22
|
const ACCORDION_ERROR_CODES = {
|
|
@@ -1790,7 +1791,13 @@ const ACCORDION_IMPORTS = [
|
|
|
1790
1791
|
const DEFAULT_AVATAR_LABELS = {
|
|
1791
1792
|
more: (count) => `${count} more`,
|
|
1792
1793
|
};
|
|
1793
|
-
|
|
1794
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
1795
|
+
const GERMAN_AVATAR_LABELS = {
|
|
1796
|
+
more: (count) => `${count} weitere`,
|
|
1797
|
+
};
|
|
1798
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideAvatarLabels}. */
|
|
1799
|
+
const avatarLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_AVATAR_LABELS : DEFAULT_AVATAR_LABELS;
|
|
1800
|
+
const AVATAR_LABELS_DEF = /* @__PURE__ */ defineLabels('AVATAR_LABELS', avatarLabelsForLocale);
|
|
1794
1801
|
/**
|
|
1795
1802
|
* Localize an avatar group's strings for everything below this injector, and read the set in effect here as a
|
|
1796
1803
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_AVATAR_LABELS} value. See {@link defineLabels}
|
|
@@ -2039,7 +2046,7 @@ class BadgeComponent {
|
|
|
2039
2046
|
<ng-template #iconTpl>
|
|
2040
2047
|
<ng-content select="[etIcon]" />
|
|
2041
2048
|
</ng-template>
|
|
2042
|
-
`, isInline: true, styles: ["@layer components{@property --et-badge-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-badge-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-badge-min-block-size{syntax: \"<length>\"; inherits: true; initial-value: 20px;}@property --et-badge-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 999px;}@property --et-badge-font-size{syntax: \"<length>\"; inherits: true; initial-value: 11px;}@property --et-badge-font-weight{syntax: \"<number>\"; inherits: true; initial-value: 600;}.et-badge{--_et-badge-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-badge-color: var(--et-theme-color-ink-solid);--_et-badge-border-color: transparent;display:inline-flex;align-items:center;justify-content:center;gap:var(--et-badge-gap);padding-inline:var(--et-badge-padding-inline);min-block-size:var(--et-badge-min-block-size);border-radius:var(--et-badge-border-radius);font-size:var(--et-badge-font-size);font-weight:var(--et-badge-font-weight);line-height:1.4;box-sizing:border-box;max-inline-size:100%;background:var(--_et-badge-background);color:var(--_et-badge-color);border:1px solid var(--_et-badge-border-color);white-space:nowrap;-webkit-user-select:none;user-select:none}.et-badge:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-badge-color: var(--et-theme-color-on-primary);--_et-badge-border-color: transparent}.et-badge:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-badge-border-color: transparent}.et-badge:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-badge-border-color: var(--et-theme-color-ink-solid)}.et-badge:where([data-size=sm]){--et-badge-gap: 3px;--et-badge-padding-inline: 6px;--et-badge-min-block-size: 16px;--et-badge-font-size: 10px}.et-badge:where([data-size=lg]){--et-badge-gap: 5px;--et-badge-padding-inline: 10px;--et-badge-min-block-size: 24px;--et-badge-font-size: 12px}.et-badge .et-badge-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.et-badge .et-badge-icon:empty{display:none}.et-badge .et-badge-icon .et-icon{inline-size:1em;block-size:1em}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2049
|
+
`, isInline: true, styles: ["@layer components{@property --et-badge-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-badge-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-badge-min-block-size{syntax: \"<length>\"; inherits: true; initial-value: 20px;}@property --et-badge-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 999px;}@property --et-badge-font-size{syntax: \"<length>\"; inherits: true; initial-value: 11px;}@property --et-badge-font-weight{syntax: \"<number>\"; inherits: true; initial-value: 600;}.et-badge{--_et-badge-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-badge-color: var(--et-theme-color-ink-solid);--_et-badge-border-color: transparent;display:inline-flex;align-self:start;justify-self:start;align-items:center;justify-content:center;gap:var(--et-badge-gap);padding-inline:var(--et-badge-padding-inline);min-block-size:var(--et-badge-min-block-size);border-radius:var(--et-badge-border-radius);font-size:var(--et-badge-font-size);font-weight:var(--et-badge-font-weight);line-height:1.4;box-sizing:border-box;max-inline-size:100%;background:var(--_et-badge-background);color:var(--_et-badge-color);border:1px solid var(--_et-badge-border-color);white-space:nowrap;-webkit-user-select:none;user-select:none}.et-badge:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-badge-color: var(--et-theme-color-on-primary);--_et-badge-border-color: transparent}.et-badge:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-badge-border-color: transparent}.et-badge:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-badge-border-color: var(--et-theme-color-ink-solid)}.et-badge:where([data-size=sm]){--et-badge-gap: 3px;--et-badge-padding-inline: 6px;--et-badge-min-block-size: 16px;--et-badge-font-size: 10px}.et-badge:where([data-size=lg]){--et-badge-gap: 5px;--et-badge-padding-inline: 10px;--et-badge-min-block-size: 24px;--et-badge-font-size: 12px}.et-badge .et-badge-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.et-badge .et-badge-icon:empty{display:none}.et-badge .et-badge-icon .et-icon{inline-size:1em;block-size:1em}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2043
2050
|
}
|
|
2044
2051
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BadgeComponent, decorators: [{
|
|
2045
2052
|
type: Component,
|
|
@@ -2071,7 +2078,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
2071
2078
|
'[attr.data-variant]': 'variant()',
|
|
2072
2079
|
'[attr.data-size]': 'size()',
|
|
2073
2080
|
'[attr.data-icon-alignment]': 'iconAlignment()',
|
|
2074
|
-
}, styles: ["@layer components{@property --et-badge-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-badge-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-badge-min-block-size{syntax: \"<length>\"; inherits: true; initial-value: 20px;}@property --et-badge-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 999px;}@property --et-badge-font-size{syntax: \"<length>\"; inherits: true; initial-value: 11px;}@property --et-badge-font-weight{syntax: \"<number>\"; inherits: true; initial-value: 600;}.et-badge{--_et-badge-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-badge-color: var(--et-theme-color-ink-solid);--_et-badge-border-color: transparent;display:inline-flex;align-items:center;justify-content:center;gap:var(--et-badge-gap);padding-inline:var(--et-badge-padding-inline);min-block-size:var(--et-badge-min-block-size);border-radius:var(--et-badge-border-radius);font-size:var(--et-badge-font-size);font-weight:var(--et-badge-font-weight);line-height:1.4;box-sizing:border-box;max-inline-size:100%;background:var(--_et-badge-background);color:var(--_et-badge-color);border:1px solid var(--_et-badge-border-color);white-space:nowrap;-webkit-user-select:none;user-select:none}.et-badge:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-badge-color: var(--et-theme-color-on-primary);--_et-badge-border-color: transparent}.et-badge:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-badge-border-color: transparent}.et-badge:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-badge-border-color: var(--et-theme-color-ink-solid)}.et-badge:where([data-size=sm]){--et-badge-gap: 3px;--et-badge-padding-inline: 6px;--et-badge-min-block-size: 16px;--et-badge-font-size: 10px}.et-badge:where([data-size=lg]){--et-badge-gap: 5px;--et-badge-padding-inline: 10px;--et-badge-min-block-size: 24px;--et-badge-font-size: 12px}.et-badge .et-badge-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.et-badge .et-badge-icon:empty{display:none}.et-badge .et-badge-icon .et-icon{inline-size:1em;block-size:1em}}\n"] }]
|
|
2081
|
+
}, styles: ["@layer components{@property --et-badge-gap{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-badge-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-badge-min-block-size{syntax: \"<length>\"; inherits: true; initial-value: 20px;}@property --et-badge-border-radius{syntax: \"<length>\"; inherits: true; initial-value: 999px;}@property --et-badge-font-size{syntax: \"<length>\"; inherits: true; initial-value: 11px;}@property --et-badge-font-weight{syntax: \"<number>\"; inherits: true; initial-value: 600;}.et-badge{--_et-badge-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-badge-color: var(--et-theme-color-ink-solid);--_et-badge-border-color: transparent;display:inline-flex;align-self:start;justify-self:start;align-items:center;justify-content:center;gap:var(--et-badge-gap);padding-inline:var(--et-badge-padding-inline);min-block-size:var(--et-badge-min-block-size);border-radius:var(--et-badge-border-radius);font-size:var(--et-badge-font-size);font-weight:var(--et-badge-font-weight);line-height:1.4;box-sizing:border-box;max-inline-size:100%;background:var(--_et-badge-background);color:var(--_et-badge-color);border:1px solid var(--_et-badge-border-color);white-space:nowrap;-webkit-user-select:none;user-select:none}.et-badge:where([data-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-badge-color: var(--et-theme-color-on-primary);--_et-badge-border-color: transparent}.et-badge:where([data-variant=tonal]){--et-theme-color-primary-opacity: .16;--_et-badge-border-color: transparent}.et-badge:where([data-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-badge-border-color: var(--et-theme-color-ink-solid)}.et-badge:where([data-size=sm]){--et-badge-gap: 3px;--et-badge-padding-inline: 6px;--et-badge-min-block-size: 16px;--et-badge-font-size: 10px}.et-badge:where([data-size=lg]){--et-badge-gap: 5px;--et-badge-padding-inline: 10px;--et-badge-min-block-size: 24px;--et-badge-font-size: 12px}.et-badge .et-badge-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.et-badge .et-badge-icon:empty{display:none}.et-badge .et-badge-icon .et-icon{inline-size:1em;block-size:1em}}\n"] }]
|
|
2075
2082
|
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], iconAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconAlignment", required: false }] }] } });
|
|
2076
2083
|
|
|
2077
2084
|
const BADGE_IMPORTS = [BadgeComponent];
|
|
@@ -2080,7 +2087,13 @@ const BADGE_IMPORTS = [BadgeComponent];
|
|
|
2080
2087
|
const DEFAULT_BANNER_LABELS = {
|
|
2081
2088
|
dismiss: 'Dismiss',
|
|
2082
2089
|
};
|
|
2083
|
-
|
|
2090
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
2091
|
+
const GERMAN_BANNER_LABELS = {
|
|
2092
|
+
dismiss: 'Schließen',
|
|
2093
|
+
};
|
|
2094
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideBannerLabels}. */
|
|
2095
|
+
const bannerLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_BANNER_LABELS : DEFAULT_BANNER_LABELS;
|
|
2096
|
+
const BANNER_LABELS_DEF = /* @__PURE__ */ defineLabels('BANNER_LABELS', bannerLabelsForLocale);
|
|
2084
2097
|
/**
|
|
2085
2098
|
* Localize a banner's strings for everything below this injector, and read the set in effect here as a
|
|
2086
2099
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_BANNER_LABELS} value. See {@link defineLabels}
|
|
@@ -2144,7 +2157,14 @@ const DEFAULT_LOADER_LABELS = {
|
|
|
2144
2157
|
loading: 'Loading',
|
|
2145
2158
|
loadingContent: 'Loading…',
|
|
2146
2159
|
};
|
|
2147
|
-
|
|
2160
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
2161
|
+
const GERMAN_LOADER_LABELS = {
|
|
2162
|
+
loading: 'Lädt',
|
|
2163
|
+
loadingContent: 'Lade…',
|
|
2164
|
+
};
|
|
2165
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideLoaderLabels}. */
|
|
2166
|
+
const loaderLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_LOADER_LABELS : DEFAULT_LOADER_LABELS;
|
|
2167
|
+
const LOADER_LABELS_DEF = /* @__PURE__ */ defineLabels('LOADER_LABELS', loaderLabelsForLocale);
|
|
2148
2168
|
/**
|
|
2149
2169
|
* Localize what loaders announce for everything below this injector, and read the set in effect here as
|
|
2150
2170
|
* a signal. Partial - whatever you leave out keeps its {@link DEFAULT_LOADER_LABELS} value. See
|
|
@@ -3194,21 +3214,42 @@ const TIME_FORMAT = new InjectionToken('TIME_FORMAT', {
|
|
|
3194
3214
|
providedIn: 'root',
|
|
3195
3215
|
factory: () => 'HH:mm',
|
|
3196
3216
|
});
|
|
3217
|
+
const DATE_LOCALE_SOURCE = new InjectionToken('DATE_LOCALE_SOURCE', {
|
|
3218
|
+
providedIn: 'root',
|
|
3219
|
+
factory: () => null,
|
|
3220
|
+
});
|
|
3221
|
+
const resolveDateLocale = (source, locale) => typeof source === 'function' ? source(locale) : source;
|
|
3197
3222
|
/**
|
|
3198
3223
|
* The date-fns `Locale` used for display formatting and calendar labels.
|
|
3199
3224
|
* `null` falls back to date-fns' built-in default (en-US).
|
|
3200
3225
|
*
|
|
3201
|
-
*
|
|
3202
|
-
* `
|
|
3226
|
+
* With a static `provideDateLocale(de)` it does not follow `provideLocale()`: an app that sets
|
|
3227
|
+
* `provideLocale('de')` must also `provideDateLocale(de)`, or pass a function to `provideDateLocale`.
|
|
3228
|
+
* {@link injectDateLocale} warns in dev mode when neither is set. For a function source this token holds
|
|
3229
|
+
* the locale resolved at first read; use {@link injectDateLocaleSignal} to follow later changes.
|
|
3203
3230
|
*/
|
|
3204
3231
|
const DATE_LOCALE = new InjectionToken('DATE_LOCALE', {
|
|
3205
3232
|
providedIn: 'root',
|
|
3206
|
-
factory: () =>
|
|
3233
|
+
factory: () => {
|
|
3234
|
+
const source = inject(DATE_LOCALE_SOURCE);
|
|
3235
|
+
const { currentLocale } = injectLocale();
|
|
3236
|
+
return untracked(() => resolveDateLocale(source, currentLocale()));
|
|
3237
|
+
},
|
|
3207
3238
|
});
|
|
3208
3239
|
const provideDateFormat = (format) => ({ provide: DATE_FORMAT, useValue: format });
|
|
3209
3240
|
const provideDateTimeFormat = (format) => ({ provide: DATE_TIME_FORMAT, useValue: format });
|
|
3210
3241
|
const provideTimeFormat = (format) => ({ provide: TIME_FORMAT, useValue: format });
|
|
3211
|
-
|
|
3242
|
+
/**
|
|
3243
|
+
* Sets the date-fns locale of every date control. Pass a `Locale`, or a function `(locale) => Locale` that
|
|
3244
|
+
* is re-run whenever `injectLocale().currentLocale` changes so dates follow a live language switch.
|
|
3245
|
+
* A control's own `locale` input wins.
|
|
3246
|
+
*
|
|
3247
|
+
* @example
|
|
3248
|
+
* provideDateLocale((locale) => (locale.startsWith('de') ? de : enUS));
|
|
3249
|
+
*/
|
|
3250
|
+
const provideDateLocale = (locale) => [
|
|
3251
|
+
{ provide: DATE_LOCALE_SOURCE, useValue: locale },
|
|
3252
|
+
];
|
|
3212
3253
|
const DATE_TIME_ZONE_DEF = /* @__PURE__ */ defineStaticRootProvider(null, { name: 'DateTimeZone' });
|
|
3213
3254
|
const provideDateTimeZoneValue = /* @__PURE__ */ toProvideFn(DATE_TIME_ZONE_DEF);
|
|
3214
3255
|
/**
|
|
@@ -3223,13 +3264,17 @@ const injectDateFormat = () => inject(DATE_FORMAT);
|
|
|
3223
3264
|
const injectDateTimeFormat = () => inject(DATE_TIME_FORMAT);
|
|
3224
3265
|
const injectTimeFormat = () => inject(TIME_FORMAT);
|
|
3225
3266
|
let warnedAboutMissingDateLocale = false;
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3267
|
+
/** The date-fns locale as a signal that follows `injectLocale().currentLocale` for a function source. */
|
|
3268
|
+
const injectDateLocaleSignal = () => {
|
|
3269
|
+
const source = inject(DATE_LOCALE_SOURCE);
|
|
3270
|
+
const direct = inject(DATE_LOCALE);
|
|
3271
|
+
const { currentLocale } = injectLocale();
|
|
3272
|
+
const dateLocale = computed(() => (source === null ? direct : resolveDateLocale(source, currentLocale())), /* @ts-ignore */
|
|
3273
|
+
...(ngDevMode ? [{ debugName: "dateLocale" }] : /* istanbul ignore next */ []));
|
|
3274
|
+
if (ngDevMode) {
|
|
3230
3275
|
effect(() => {
|
|
3231
3276
|
const locale = currentLocale();
|
|
3232
|
-
if (warnedAboutMissingDateLocale || locale.toLowerCase().startsWith('en'))
|
|
3277
|
+
if (dateLocale() || warnedAboutMissingDateLocale || locale.toLowerCase().startsWith('en'))
|
|
3233
3278
|
return;
|
|
3234
3279
|
warnedAboutMissingDateLocale = true;
|
|
3235
3280
|
console.warn(`[ethlete] provideLocale('${locale}') is set but DATE_LOCALE is not, so dates and calendar ` +
|
|
@@ -3239,6 +3284,10 @@ const injectDateLocale = () => {
|
|
|
3239
3284
|
}
|
|
3240
3285
|
return dateLocale;
|
|
3241
3286
|
};
|
|
3287
|
+
const injectDateLocale = () => {
|
|
3288
|
+
const dateLocale = injectDateLocaleSignal();
|
|
3289
|
+
return untracked(dateLocale);
|
|
3290
|
+
};
|
|
3242
3291
|
|
|
3243
3292
|
const NATIVELY_INTERACTIVE_TAGS = ['A', 'BUTTON'];
|
|
3244
3293
|
const isNativelyInteractiveElement = (element) => NATIVELY_INTERACTIVE_TAGS.includes(element.tagName);
|
|
@@ -3275,7 +3324,39 @@ const DEFAULT_MATCH_LABELS = {
|
|
|
3275
3324
|
gameScores: 'Games',
|
|
3276
3325
|
gameScore: (game, score) => `Game ${game}: ${score}`,
|
|
3277
3326
|
};
|
|
3278
|
-
|
|
3327
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
3328
|
+
const GERMAN_MATCH_LABELS = {
|
|
3329
|
+
tbd: 'Offen',
|
|
3330
|
+
live: 'Live',
|
|
3331
|
+
finished: 'Beendet',
|
|
3332
|
+
scheduled: 'Angesetzt',
|
|
3333
|
+
scoreSeparator: ' : ',
|
|
3334
|
+
resultName: ({ home, away, kind, winner, separator }) => {
|
|
3335
|
+
if (home === null || away === null)
|
|
3336
|
+
return winner ? `${winner} hat gewonnen` : 'Unentschieden';
|
|
3337
|
+
const pair = `${home}${separator}${away}`;
|
|
3338
|
+
return kind === 'points' ? `${pair} Punkte` : pair;
|
|
3339
|
+
},
|
|
3340
|
+
versus: 'gegen',
|
|
3341
|
+
outcomeWin: 'S',
|
|
3342
|
+
outcomeLoss: 'N',
|
|
3343
|
+
outcomeDraw: 'U',
|
|
3344
|
+
emblemAlt: (participant) => `Wappen von ${participant}`,
|
|
3345
|
+
seed: (seed) => `Setzplatz ${seed}`,
|
|
3346
|
+
matchNumber: (number) => `Spiel ${number}`,
|
|
3347
|
+
matchName: ({ home, away, result, startTime, status, label, labels }) => {
|
|
3348
|
+
const kickOff = status === 'live' ? null : startTime;
|
|
3349
|
+
const state = status === 'live' ? labels.live : status === 'finished' ? labels.finished : null;
|
|
3350
|
+
const pairing = `${home} ${labels.versus} ${away}`;
|
|
3351
|
+
const matchUp = label ? `${label}: ${pairing}` : pairing;
|
|
3352
|
+
return [matchUp, result, kickOff, state].filter(Boolean).join(', ');
|
|
3353
|
+
},
|
|
3354
|
+
gameScores: 'Spiele',
|
|
3355
|
+
gameScore: (game, score) => `Spiel ${game}: ${score}`,
|
|
3356
|
+
};
|
|
3357
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideMatchLabels}. */
|
|
3358
|
+
const matchLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_MATCH_LABELS : DEFAULT_MATCH_LABELS;
|
|
3359
|
+
const MATCH_LABELS_DEF = /* @__PURE__ */ defineLabels('MATCH_LABELS', matchLabelsForLocale);
|
|
3279
3360
|
/**
|
|
3280
3361
|
* Localize the match components' strings for everything below this injector, and read the set in
|
|
3281
3362
|
* effect here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_MATCH_LABELS}
|
|
@@ -3356,7 +3437,7 @@ class MatchCardDirective {
|
|
|
3356
3437
|
constructor() {
|
|
3357
3438
|
this.elementRef = inject(ElementRef);
|
|
3358
3439
|
this.injectedLabels = injectMatchLabels();
|
|
3359
|
-
this.dateLocale =
|
|
3440
|
+
this.dateLocale = injectDateLocaleSignal();
|
|
3360
3441
|
/** The match to draw, already normalized - see {@link NormalizedMatch} and the `integrations/` adapters. */
|
|
3361
3442
|
this.match = input.required(/* @ts-ignore */
|
|
3362
3443
|
...(ngDevMode ? [{ debugName: "match" }] : /* istanbul ignore next */ []));
|
|
@@ -3539,7 +3620,7 @@ class MatchCardDirective {
|
|
|
3539
3620
|
if (!startTime || !isValid(startTime))
|
|
3540
3621
|
return null;
|
|
3541
3622
|
return format(startTime, this.startTimeFormat() ?? DEFAULT_MATCH_CARD_START_TIME_FORMAT, {
|
|
3542
|
-
locale: this.dateLocale ?? undefined,
|
|
3623
|
+
locale: this.dateLocale() ?? undefined,
|
|
3543
3624
|
});
|
|
3544
3625
|
}, /* @ts-ignore */
|
|
3545
3626
|
...(ngDevMode ? [{ debugName: "formattedStartTime" }] : /* istanbul ignore next */ []));
|
|
@@ -4879,7 +4960,37 @@ const DEFAULT_BRACKET_LABELS = {
|
|
|
4879
4960
|
pickCardPicked: 'Your pick',
|
|
4880
4961
|
pickCardPredicted: 'Prediction',
|
|
4881
4962
|
};
|
|
4882
|
-
|
|
4963
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
4964
|
+
const GERMAN_BRACKET_LABELS = {
|
|
4965
|
+
roundMatchCount: (matches) => `${matches} ${matches === 1 ? 'Spiel' : 'Spiele'}`,
|
|
4966
|
+
winnersAdvance: (winners) => `${winners} ${winners === 1 ? 'Gewinner kommt weiter' : 'Gewinner kommen weiter'}`,
|
|
4967
|
+
continueLabel: (winners) => `${winners} ${winners === 1 ? 'Gewinner kommt' : 'Gewinner kommen'} in die nächste Runde`,
|
|
4968
|
+
champion: (participant) => `Turniersieger: ${participant}`,
|
|
4969
|
+
championPending: 'Turniersieger steht noch nicht fest',
|
|
4970
|
+
upperBracketSection: 'Winner Bracket',
|
|
4971
|
+
lowerBracketSection: 'Loser Bracket',
|
|
4972
|
+
finalsSection: 'Finale',
|
|
4973
|
+
slotMatchWinner: 'Sieger eines früheren Spiels',
|
|
4974
|
+
slotMatchLoser: 'Verlierer eines früheren Spiels',
|
|
4975
|
+
slotStandingRank: (standing, rank) => {
|
|
4976
|
+
if (standing && rank !== null)
|
|
4977
|
+
return `${standing} Platz ${rank}`;
|
|
4978
|
+
return standing ?? (rank === null ? 'Ein Tabellenplatz' : `Tabellenplatz ${rank}`);
|
|
4979
|
+
},
|
|
4980
|
+
slotSeed: (seed) => (seed === null ? 'Ein gesetzter Platz' : `Setzplatz ${seed}`),
|
|
4981
|
+
slotSwissBucket: 'Wird gelost, sobald die Runde angesetzt ist',
|
|
4982
|
+
slotBye: 'Freilos',
|
|
4983
|
+
slotExternal: 'Kommt aus einem anderen Wettbewerb',
|
|
4984
|
+
slotUnknown: 'Noch nicht bekannt',
|
|
4985
|
+
slotPredictEarlierRound: 'Zuerst die frühere Runde tippen',
|
|
4986
|
+
slotNotPredicted: 'Nicht getippt',
|
|
4987
|
+
participantsLegend: 'Teilnehmer',
|
|
4988
|
+
pickCardPicked: 'Auswahl',
|
|
4989
|
+
pickCardPredicted: 'Tipp',
|
|
4990
|
+
};
|
|
4991
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideBracketLabels}. */
|
|
4992
|
+
const bracketLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_BRACKET_LABELS : DEFAULT_BRACKET_LABELS;
|
|
4993
|
+
const BRACKET_LABELS_DEF = /* @__PURE__ */ defineLabels('BRACKET_LABELS', bracketLabelsForLocale);
|
|
4883
4994
|
/**
|
|
4884
4995
|
* Localize the bracket's default cards for everything below this injector, and read the set in effect
|
|
4885
4996
|
* here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_BRACKET_LABELS} value.
|
|
@@ -4976,7 +5087,7 @@ class ButtonComponent {
|
|
|
4976
5087
|
<ng-template #iconTpl>
|
|
4977
5088
|
<ng-content select="[etIcon]" />
|
|
4978
5089
|
</ng-template>
|
|
4979
|
-
`, isInline: true, styles: ["@layer components{.et-button{--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:manipulation;-webkit-tap-highlight-color:transparent;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-hover-delta)}}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-focus-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-active-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:var(--et-button-icon-size, 1em);transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
5090
|
+
`, isInline: true, styles: ["@layer components{.et-button{--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;--_et-button-gap: var(--et-button-gap);display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:manipulation;-webkit-tap-highlight-color:transparent;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-hover-delta)}}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-focus-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-active-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:var(--et-button-icon-size, 1em);transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;gap:var(--_et-button-gap);min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
4980
5091
|
}
|
|
4981
5092
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ButtonComponent, decorators: [{
|
|
4982
5093
|
type: Component,
|
|
@@ -5031,7 +5142,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
5031
5142
|
'[attr.data-size]': 'size()',
|
|
5032
5143
|
'[attr.data-pressed-variant]': 'pressedVariant()',
|
|
5033
5144
|
'[attr.data-can-animate]': 'canAnimate.state() || null',
|
|
5034
|
-
}, styles: ["@layer components{.et-button{--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:manipulation;-webkit-tap-highlight-color:transparent;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-hover-delta)}}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-focus-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-active-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:var(--et-button-icon-size, 1em);transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}}\n"] }]
|
|
5145
|
+
}, styles: ["@layer components{.et-button{--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent;--_et-button-gap: var(--et-button-gap);display:inline-flex;position:relative;align-items:center;justify-content:center;gap:var(--et-button-gap);background:var(--_et-button-background);color:var(--_et-button-color);border-radius:var(--et-button-border-radius);padding:var(--et-button-padding);font-size:var(--et-button-font-size);font-weight:var(--et-button-font-weight);border:var(--et-button-border-width, .1rem) solid var(--_et-button-border-color);box-shadow:var(--et-button-shadow, 0 0 #0000);cursor:var(--et-button-cursor);text-decoration:none;appearance:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:manipulation;-webkit-tap-highlight-color:transparent;line-height:var(--et-button-line-height);white-space:nowrap}.et-button[data-can-animate]{transition:background .12s ease,color .12s ease,border-color .12s ease,box-shadow .12s ease,outline-color .12s ease,opacity .12s ease}.et-button:where([data-size=xs]){--et-button-padding: .2rem .8rem;--et-button-font-size: 1.2rem;--et-button-border-radius: .3rem;--et-button-gap: .4rem}.et-button:where([data-size=sm]){--et-button-padding: .4rem 1.2rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .5rem}.et-button:where([data-size=md]){--et-button-padding: .8rem 1.6rem;--et-button-font-size: 1.4rem;--et-button-border-radius: .4rem;--et-button-gap: .6rem}.et-button:where([data-size=lg]){--et-button-padding: 1rem 2rem;--et-button-font-size: 1.6rem;--et-button-border-radius: .6rem;--et-button-gap: .7rem}.et-button:where([data-size=xl]){--et-button-padding: 1.4rem 2.8rem;--et-button-font-size: 1.8rem;--et-button-border-radius: .8rem;--et-button-gap: .8rem}.et-button:where([disabled]),.et-button:where([aria-disabled=true]){cursor:not-allowed;pointer-events:none}.et-button:where([disabled],[aria-disabled=true]):where([data-variant=outline]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=tonal]),.et-button:where([disabled],[aria-disabled=true]):where([data-variant=transparent]),.et-button:where([disabled],[aria-disabled=true])[data-pressed=true]{opacity:var(--et-button-opacity-disabled)}.et-button:where([data-variant=outline]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]){--et-theme-color-primary-opacity: 0;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: var(--et-theme-color-ink-solid)}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=outline]):hover{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-hover-delta)}}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):focus-visible{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-focus-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline]):active{--et-theme-color-primary-opacity: var(--et-button-variant-opacity-active-delta)}.et-button[data-pressed=true]:where([data-pressed-variant=outline])[data-loading=true]:not([disabled],[aria-disabled=true]){--_et-button-color: var(--et-theme-color-primary-solid);--_et-button-border-color: var(--et-theme-color-primary-solid)}.et-button:where([data-variant=tonal]),.et-button[data-pressed=true]:where([data-pressed-variant=tonal]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button:where([data-variant=transparent]){--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-ink-solid);--_et-button-border-color: transparent}.et-button[data-pressed=true]:where([data-pressed-variant=filled]){--et-theme-color-primary-opacity: 1;--_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));--_et-button-color: var(--et-theme-color-on-primary);--_et-button-border-color: transparent}@media(hover:hover){.et-button[data-pressed=true]:where([data-pressed-variant=filled]):hover{--et-theme-color-primary-opacity: 1}}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):focus-visible{--et-theme-color-primary-opacity: 1}.et-button[data-pressed=true]:where([data-pressed-variant=filled]):active{--et-theme-color-primary-opacity: 1}.et-button .et-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:var(--et-button-icon-size, 1em);transition:opacity .12s ease}.et-button .et-button-icon:empty{display:none}.et-button .et-button-icon .et-icon{width:1em;height:1em}.et-button .et-button-contents{display:inline-flex;align-items:center;gap:var(--_et-button-gap);min-width:0;transition:opacity .12s ease}.et-button[data-loading=true] .et-button-icon,.et-button[data-loading=true] .et-button-contents{opacity:0}.et-button[data-loading=true] .et-button-loader{opacity:1}}\n"] }]
|
|
5035
5146
|
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], iconAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconAlignment", required: false }] }] } });
|
|
5036
5147
|
|
|
5037
5148
|
/**
|
|
@@ -6915,7 +7026,15 @@ const DEFAULT_ALERT_DIALOG_LABELS = {
|
|
|
6915
7026
|
cancel: 'Cancel',
|
|
6916
7027
|
acknowledge: 'OK',
|
|
6917
7028
|
};
|
|
6918
|
-
|
|
7029
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
7030
|
+
const GERMAN_ALERT_DIALOG_LABELS = {
|
|
7031
|
+
confirm: 'Bestätigen',
|
|
7032
|
+
cancel: 'Abbrechen',
|
|
7033
|
+
acknowledge: 'OK',
|
|
7034
|
+
};
|
|
7035
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideAlertDialogLabels}. */
|
|
7036
|
+
const alertDialogLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_ALERT_DIALOG_LABELS : DEFAULT_ALERT_DIALOG_LABELS;
|
|
7037
|
+
const ALERT_DIALOG_LABELS_DEF = /* @__PURE__ */ defineLabels('ALERT_DIALOG_LABELS', alertDialogLabelsForLocale);
|
|
6919
7038
|
/**
|
|
6920
7039
|
* Localize the confirm and alert dialog actions for everything below this injector, and read the set in effect here
|
|
6921
7040
|
* as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_ALERT_DIALOG_LABELS} value. See
|
|
@@ -6942,6 +7061,7 @@ const OVERLAY_ERROR_CODES = {
|
|
|
6942
7061
|
MISSING_ANIMATION_ORIGIN: 1209,
|
|
6943
7062
|
EMPTY_STRATEGIES: 1210,
|
|
6944
7063
|
STRATEGY_ONLY_OPTION: 1211,
|
|
7064
|
+
ARROW_WITHOUT_POSITION_EXTRAS: 1212,
|
|
6945
7065
|
};
|
|
6946
7066
|
|
|
6947
7067
|
const OVERLAY_REF = new InjectionToken('OverlayRef');
|
|
@@ -7103,6 +7223,7 @@ class OverlayContainerComponent {
|
|
|
7103
7223
|
this.document = inject(DOCUMENT);
|
|
7104
7224
|
this.renderer = injectRenderer();
|
|
7105
7225
|
this.rootBoundary = injectBoundaryElement();
|
|
7226
|
+
this.rootSurfaceTheme = injectRootSurfaceTheme();
|
|
7106
7227
|
this.component = input.required(/* @ts-ignore */
|
|
7107
7228
|
...(ngDevMode ? [{ debugName: "component" }] : /* istanbul ignore next */ []));
|
|
7108
7229
|
this.componentBindings = input(undefined, /* @ts-ignore */
|
|
@@ -7122,30 +7243,52 @@ class OverlayContainerComponent {
|
|
|
7122
7243
|
this.ownColorProvider.syncWithProvider(contextColorProvider);
|
|
7123
7244
|
}
|
|
7124
7245
|
if (this.surfaceThemes) {
|
|
7125
|
-
const
|
|
7126
|
-
|
|
7246
|
+
const readParentSurface = () => {
|
|
7247
|
+
const surface = this.resolveOriginSurface() ?? this.parentDiSurface();
|
|
7248
|
+
return { type: surface?.type ?? this.rootSurfaceType(), elevation: surface?.elevation ?? null };
|
|
7249
|
+
};
|
|
7250
|
+
const parentSurface = signal(readParentSurface(), { ...(ngDevMode ? { debugName: "parentSurface" } : /* istanbul ignore next */ {}), equal: (a, b) => a.type === b.type && a.elevation === b.elevation });
|
|
7127
7251
|
const surfaceThemes = this.surfaceThemes;
|
|
7128
7252
|
const hasBackdrop = computed(() => this.mountedHasBackdrop?.() ?? resolveOverlayHasBackdrop(this.overlayRef.config), /* @ts-ignore */
|
|
7129
7253
|
...(ngDevMode ? [{ debugName: "hasBackdrop" }] : /* istanbul ignore next */ []));
|
|
7130
|
-
const
|
|
7131
|
-
|
|
7254
|
+
const placement = computed(() => {
|
|
7255
|
+
const { type, elevation } = parentSurface();
|
|
7256
|
+
return { type, level: hasBackdrop() || elevation === null ? 1 : elevation + 1 };
|
|
7257
|
+
}, /* @ts-ignore */
|
|
7258
|
+
...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
|
|
7132
7259
|
let unregister = null;
|
|
7133
|
-
const
|
|
7134
|
-
const resolved = resolveSurfaceByElevation(surfaceThemes,
|
|
7260
|
+
const applyPlacement = ({ type, level }) => {
|
|
7261
|
+
const resolved = resolveSurfaceByElevation(surfaceThemes, type, level);
|
|
7135
7262
|
if (resolved) {
|
|
7136
7263
|
this.ownSurfaceProvider.forceSurface(resolved.name);
|
|
7137
7264
|
}
|
|
7138
7265
|
unregister?.();
|
|
7139
|
-
unregister = this.surfaceContextTracker.register(
|
|
7266
|
+
unregister = this.surfaceContextTracker.register(type, level, this.elementRef.nativeElement);
|
|
7140
7267
|
};
|
|
7141
|
-
let
|
|
7142
|
-
|
|
7268
|
+
let applied = untracked(placement);
|
|
7269
|
+
applyPlacement(applied);
|
|
7143
7270
|
effect(() => {
|
|
7144
|
-
const
|
|
7145
|
-
if (level ===
|
|
7271
|
+
const next = placement();
|
|
7272
|
+
if (next.type === applied.type && next.level === applied.level)
|
|
7146
7273
|
return;
|
|
7147
|
-
|
|
7148
|
-
untracked(() =>
|
|
7274
|
+
applied = next;
|
|
7275
|
+
untracked(() => applyPlacement(next));
|
|
7276
|
+
});
|
|
7277
|
+
const originClassChanges = signal(0, /* @ts-ignore */
|
|
7278
|
+
...(ngDevMode ? [{ debugName: "originClassChanges" }] : /* istanbul ignore next */ []));
|
|
7279
|
+
const originSurfaceElement = this.resolveOriginSurface()?.element;
|
|
7280
|
+
if (originSurfaceElement) {
|
|
7281
|
+
// eslint-disable-next-line ethlete/no-native-observers -- signalElementMutations adds ~0.9 kB gz to every overlay bundle
|
|
7282
|
+
const observer = new MutationObserver(() => originClassChanges.update((count) => count + 1));
|
|
7283
|
+
observer.observe(originSurfaceElement, { attributes: true, attributeFilter: ['class'] });
|
|
7284
|
+
this.destroyRef.onDestroy(() => observer.disconnect());
|
|
7285
|
+
}
|
|
7286
|
+
// The origin surface is read from DOM classes, which only reflect a provider change after the render.
|
|
7287
|
+
afterRenderEffect(() => {
|
|
7288
|
+
this.parentSurfaceProvider?.activeTheme();
|
|
7289
|
+
this.rootSurfaceTheme();
|
|
7290
|
+
originClassChanges();
|
|
7291
|
+
untracked(() => parentSurface.set(readParentSurface()));
|
|
7149
7292
|
});
|
|
7150
7293
|
this.destroyRef.onDestroy(() => unregister?.());
|
|
7151
7294
|
}
|
|
@@ -7235,11 +7378,11 @@ class OverlayContainerComponent {
|
|
|
7235
7378
|
for (const theme of themes) {
|
|
7236
7379
|
themeByClass.set(`${prefix}-surface--${createCssSurfaceName(theme.name)}`, theme);
|
|
7237
7380
|
}
|
|
7238
|
-
for (let el = origin; el; el = el.parentElement) {
|
|
7381
|
+
for (let el = origin instanceof HTMLElement ? origin : origin.parentElement; el; el = el.parentElement) {
|
|
7239
7382
|
for (const cls of Array.from(el.classList)) {
|
|
7240
7383
|
const theme = themeByClass.get(cls);
|
|
7241
7384
|
if (theme)
|
|
7242
|
-
return { elevation: theme.elevation, type: theme.type };
|
|
7385
|
+
return { elevation: theme.elevation, type: theme.type, element: el };
|
|
7243
7386
|
}
|
|
7244
7387
|
}
|
|
7245
7388
|
return null;
|
|
@@ -7287,14 +7430,14 @@ class OverlayContainerComponent {
|
|
|
7287
7430
|
return findPainted(content, 1) ?? host;
|
|
7288
7431
|
}
|
|
7289
7432
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: OverlayContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7290
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: OverlayContainerComponent, isStandalone: true, selector: "et-overlay-container", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, componentBindings: { classPropertyName: "componentBindings", publicName: "componentBindings", isSignal: true, isRequired: false, transformFunction: null }, componentDirectives: { classPropertyName: "componentDirectives", publicName: "componentDirectives", isSignal: true, isRequired: false, transformFunction: null }, renderArrow: { classPropertyName: "renderArrow", publicName: "renderArrow", isSignal: true, isRequired: false, transformFunction: null }, renderDragHandle: { classPropertyName: "renderDragHandle", publicName: "renderDragHandle", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.et-with-default-animation": "!overlayRef.config.customAnimated" }, classAttribute: "et-overlay" }, providers: [provideBoundaryElement()], viewQueries: [{ propertyName: "contentOutlet", first: true, predicate: ["contentOutlet"], descendants: true, read: ViewContainerRef, isSignal: true }], hostDirectives: [{ directive: i1.AnimatedLifecycleDirective }, { directive: i1.ProvideColorDirective }, { directive: i1.ProvideSurfaceDirective }], ngImport: i0, template: "@if (renderDragHandle()) {\n <div class=\"et-overlay-container-drag-handle\"></div>\n}\n<ng-container #contentOutlet />\n@if (renderArrow()) {\n <div class=\"et-overlay-arrow\" et-floating-arrow></div>\n}\n", styles: ["@layer components{.et-overlay{--et-overlay-padding-inline: 16px;--et-overlay-padding-block: 16px;--et-overlay-header-padding-block-end: 16px;--et-overlay-body-padding-block: 0;--et-overlay-footer-padding-block-start: 16px;--et-overlay-body-divider-color: var(--et-surface-border-solid, #565656);--et-overlay-body-min-block-size: 100px;--et-overlay-surface-background: var(--et-surface-background-solid, rgb(32 32 32));--et-overlay-surface-color: var(--et-surface-color-solid, rgb(244 244 245));--et-overlay-surface-border-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));--et-overlay-surface-border-width: .1rem;--_et-overlay-radius: var(--et-overlay-radius, 1.6rem);position:relative;display:grid;grid-template-rows:minmax(0,1fr);overflow:hidden;pointer-events:all;outline:none;box-sizing:border-box}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){overflow:auto;border-radius:inherit}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main){display:grid}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-router-outlet-host){grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr)}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-sidebar--visible){grid-template-columns:auto minmax(0,1fr)}.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered{overflow:visible;background:transparent}:is(.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered)>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){display:block;overflow:visible}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog,.et-overlay.et-overlay--full-screen-dialog,.et-overlay.et-overlay--bottom-sheet,.et-overlay.et-overlay--top-sheet,.et-overlay.et-overlay--left-sheet,.et-overlay.et-overlay--right-sheet{background-color:var(--et-overlay-surface-background);color:var(--et-overlay-surface-color)}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--anchored-dialog{--_et-overlay-radius: var(--et-overlay-radius, 1.2rem)}.et-overlay.et-overlay--bottom-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-end:none;border-start-start-radius:var(--_et-overlay-radius);border-start-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--top-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-start:none;border-end-start-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--left-sheet{border-inline-end:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-end-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--right-sheet{border-inline-start:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-start-radius:var(--_et-overlay-radius);border-end-start-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--bottom-sheet
|
|
7433
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: OverlayContainerComponent, isStandalone: true, selector: "et-overlay-container", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, componentBindings: { classPropertyName: "componentBindings", publicName: "componentBindings", isSignal: true, isRequired: false, transformFunction: null }, componentDirectives: { classPropertyName: "componentDirectives", publicName: "componentDirectives", isSignal: true, isRequired: false, transformFunction: null }, renderArrow: { classPropertyName: "renderArrow", publicName: "renderArrow", isSignal: true, isRequired: false, transformFunction: null }, renderDragHandle: { classPropertyName: "renderDragHandle", publicName: "renderDragHandle", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.et-with-default-animation": "!overlayRef.config.customAnimated" }, classAttribute: "et-overlay" }, providers: [provideBoundaryElement()], viewQueries: [{ propertyName: "contentOutlet", first: true, predicate: ["contentOutlet"], descendants: true, read: ViewContainerRef, isSignal: true }], hostDirectives: [{ directive: i1.AnimatedLifecycleDirective }, { directive: i1.ProvideColorDirective }, { directive: i1.ProvideSurfaceDirective }], ngImport: i0, template: "@if (renderDragHandle()) {\n <div class=\"et-overlay-container-drag-handle\"></div>\n}\n<ng-container #contentOutlet />\n@if (renderArrow()) {\n <div class=\"et-overlay-arrow\" et-floating-arrow></div>\n}\n", styles: ["@layer components{.et-overlay{--et-overlay-padding-inline: 16px;--et-overlay-padding-block: 16px;--et-overlay-header-padding-block-end: 16px;--et-overlay-body-padding-block: 0;--et-overlay-footer-padding-block-start: 16px;--et-overlay-body-divider-color: var(--et-surface-border-solid, #565656);--et-overlay-body-min-block-size: 100px;--et-overlay-surface-background: var(--et-surface-background-solid, rgb(32 32 32));--et-overlay-surface-color: var(--et-surface-color-solid, rgb(244 244 245));--et-overlay-surface-border-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));--et-overlay-surface-border-width: .1rem;--_et-overlay-radius: var(--et-overlay-radius, 1.6rem);position:relative;display:grid;grid-template-rows:minmax(0,1fr);overflow:hidden;pointer-events:all;outline:none;box-sizing:border-box}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){overflow:auto;border-radius:inherit}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main){display:grid}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-router-outlet-host){grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr)}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-sidebar--visible){grid-template-columns:auto minmax(0,1fr)}.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered{overflow:visible;background:transparent}:is(.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered)>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){display:block;overflow:visible}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog,.et-overlay.et-overlay--full-screen-dialog,.et-overlay.et-overlay--bottom-sheet,.et-overlay.et-overlay--top-sheet,.et-overlay.et-overlay--left-sheet,.et-overlay.et-overlay--right-sheet{background-color:var(--et-overlay-surface-background);color:var(--et-overlay-surface-color)}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--anchored-dialog{--_et-overlay-radius: var(--et-overlay-radius, 1.2rem)}.et-overlay.et-overlay--bottom-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-end:none;border-start-start-radius:var(--_et-overlay-radius);border-start-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--top-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-start:none;border-end-start-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--left-sheet{border-inline-end:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-end-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--right-sheet{border-inline-start:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-start-radius:var(--_et-overlay-radius);border-end-start-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--bottom-sheet:has(>.et-overlay-container-drag-handle){grid-template-rows:auto minmax(0,1fr)}.et-overlay.et-overlay--bottom-sheet .et-overlay-container-drag-handle{display:flex}.et-overlay:has(.et-overlay-main){overflow:visible}.et-overlay-container-drag-handle{block-size:var(--_et-overlay-drag-handle-block-size);margin-block:var(--_et-overlay-drag-handle-block-margin);display:none;justify-content:center}.et-overlay-container-drag-handle:before{content:\"\";position:static;inline-size:var(--_et-overlay-drag-handle-inline-size);block-size:var(--_et-overlay-drag-handle-block-size);background-color:var(--_et-overlay-drag-handle-color);border-radius:var(--_et-overlay-drag-handle-radius)}.et-overlay-runtime-backdrop{--et-overlay-backdrop-color: rgb(var(--et-scrim-color-rgb, 0 0 0) / .32);background-color:var(--et-overlay-backdrop-color);opacity:0;transition:opacity .2s linear}.et-overlay-runtime-backdrop.et-overlay-backdrop--visible{opacity:1}.et-overlay-backdrop--hidden{display:none!important}.et-force-invisible{visibility:hidden!important}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
7291
7434
|
}
|
|
7292
7435
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: OverlayContainerComponent, decorators: [{
|
|
7293
7436
|
type: Component,
|
|
7294
7437
|
args: [{ selector: 'et-overlay-container', encapsulation: ViewEncapsulation.None, providers: [provideBoundaryElement()], hostDirectives: [AnimatedLifecycleDirective, ProvideColorDirective, ProvideSurfaceDirective], host: {
|
|
7295
7438
|
class: 'et-overlay',
|
|
7296
7439
|
'[class.et-with-default-animation]': '!overlayRef.config.customAnimated',
|
|
7297
|
-
}, template: "@if (renderDragHandle()) {\n <div class=\"et-overlay-container-drag-handle\"></div>\n}\n<ng-container #contentOutlet />\n@if (renderArrow()) {\n <div class=\"et-overlay-arrow\" et-floating-arrow></div>\n}\n", styles: ["@layer components{.et-overlay{--et-overlay-padding-inline: 16px;--et-overlay-padding-block: 16px;--et-overlay-header-padding-block-end: 16px;--et-overlay-body-padding-block: 0;--et-overlay-footer-padding-block-start: 16px;--et-overlay-body-divider-color: var(--et-surface-border-solid, #565656);--et-overlay-body-min-block-size: 100px;--et-overlay-surface-background: var(--et-surface-background-solid, rgb(32 32 32));--et-overlay-surface-color: var(--et-surface-color-solid, rgb(244 244 245));--et-overlay-surface-border-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));--et-overlay-surface-border-width: .1rem;--_et-overlay-radius: var(--et-overlay-radius, 1.6rem);position:relative;display:grid;grid-template-rows:minmax(0,1fr);overflow:hidden;pointer-events:all;outline:none;box-sizing:border-box}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){overflow:auto;border-radius:inherit}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main){display:grid}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-router-outlet-host){grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr)}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-sidebar--visible){grid-template-columns:auto minmax(0,1fr)}.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered{overflow:visible;background:transparent}:is(.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered)>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){display:block;overflow:visible}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog,.et-overlay.et-overlay--full-screen-dialog,.et-overlay.et-overlay--bottom-sheet,.et-overlay.et-overlay--top-sheet,.et-overlay.et-overlay--left-sheet,.et-overlay.et-overlay--right-sheet{background-color:var(--et-overlay-surface-background);color:var(--et-overlay-surface-color)}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--anchored-dialog{--_et-overlay-radius: var(--et-overlay-radius, 1.2rem)}.et-overlay.et-overlay--bottom-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-end:none;border-start-start-radius:var(--_et-overlay-radius);border-start-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--top-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-start:none;border-end-start-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--left-sheet{border-inline-end:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-end-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--right-sheet{border-inline-start:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-start-radius:var(--_et-overlay-radius);border-end-start-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--bottom-sheet
|
|
7440
|
+
}, template: "@if (renderDragHandle()) {\n <div class=\"et-overlay-container-drag-handle\"></div>\n}\n<ng-container #contentOutlet />\n@if (renderArrow()) {\n <div class=\"et-overlay-arrow\" et-floating-arrow></div>\n}\n", styles: ["@layer components{.et-overlay{--et-overlay-padding-inline: 16px;--et-overlay-padding-block: 16px;--et-overlay-header-padding-block-end: 16px;--et-overlay-body-padding-block: 0;--et-overlay-footer-padding-block-start: 16px;--et-overlay-body-divider-color: var(--et-surface-border-solid, #565656);--et-overlay-body-min-block-size: 100px;--et-overlay-surface-background: var(--et-surface-background-solid, rgb(32 32 32));--et-overlay-surface-color: var(--et-surface-color-solid, rgb(244 244 245));--et-overlay-surface-border-color: var(--et-surface-border-solid, rgb(255 255 255 / .1));--et-overlay-surface-border-width: .1rem;--_et-overlay-radius: var(--et-overlay-radius, 1.6rem);position:relative;display:grid;grid-template-rows:minmax(0,1fr);overflow:hidden;pointer-events:all;outline:none;box-sizing:border-box}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){overflow:auto;border-radius:inherit}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main){display:grid}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-router-outlet-host){grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr)}.et-overlay>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow):not(.et-overlay-main):has(.et-overlay-sidebar--visible){grid-template-columns:auto minmax(0,1fr)}.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered{overflow:visible;background:transparent}:is(.et-overlay.et-overlay--anchored,.et-overlay.et-overlay--centered)>:not(.et-overlay-container-drag-handle):not(.et-overlay-arrow){display:block;overflow:visible}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog,.et-overlay.et-overlay--full-screen-dialog,.et-overlay.et-overlay--bottom-sheet,.et-overlay.et-overlay--top-sheet,.et-overlay.et-overlay--left-sheet,.et-overlay.et-overlay--right-sheet{background-color:var(--et-overlay-surface-background);color:var(--et-overlay-surface-color)}.et-overlay.et-overlay--dialog,.et-overlay.et-overlay--anchored-dialog{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--anchored-dialog{--_et-overlay-radius: var(--et-overlay-radius, 1.2rem)}.et-overlay.et-overlay--bottom-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-end:none;border-start-start-radius:var(--_et-overlay-radius);border-start-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--top-sheet{border:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-block-start:none;border-end-start-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--left-sheet{border-inline-end:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-end-radius:var(--_et-overlay-radius);border-end-end-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--right-sheet{border-inline-start:var(--et-overlay-surface-border-width) solid var(--et-overlay-surface-border-color);border-start-start-radius:var(--_et-overlay-radius);border-end-start-radius:var(--_et-overlay-radius)}.et-overlay.et-overlay--bottom-sheet:has(>.et-overlay-container-drag-handle){grid-template-rows:auto minmax(0,1fr)}.et-overlay.et-overlay--bottom-sheet .et-overlay-container-drag-handle{display:flex}.et-overlay:has(.et-overlay-main){overflow:visible}.et-overlay-container-drag-handle{block-size:var(--_et-overlay-drag-handle-block-size);margin-block:var(--_et-overlay-drag-handle-block-margin);display:none;justify-content:center}.et-overlay-container-drag-handle:before{content:\"\";position:static;inline-size:var(--_et-overlay-drag-handle-inline-size);block-size:var(--_et-overlay-drag-handle-block-size);background-color:var(--_et-overlay-drag-handle-color);border-radius:var(--_et-overlay-drag-handle-radius)}.et-overlay-runtime-backdrop{--et-overlay-backdrop-color: rgb(var(--et-scrim-color-rgb, 0 0 0) / .32);background-color:var(--et-overlay-backdrop-color);opacity:0;transition:opacity .2s linear}.et-overlay-runtime-backdrop.et-overlay-backdrop--visible{opacity:1}.et-overlay-backdrop--hidden{display:none!important}.et-force-invisible{visibility:hidden!important}}\n"] }]
|
|
7298
7441
|
}], ctorParameters: () => [], propDecorators: { component: [{ type: i0.Input, args: [{ isSignal: true, alias: "component", required: true }] }], componentBindings: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentBindings", required: false }] }], componentDirectives: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentDirectives", required: false }] }], renderArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderArrow", required: false }] }], renderDragHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderDragHandle", required: false }] }], contentOutlet: [{ type: i0.ViewChild, args: ['contentOutlet', { ...{ read: ViewContainerRef }, isSignal: true }] }] } });
|
|
7299
7442
|
|
|
7300
7443
|
const INTERNALS = /* @__PURE__ */ new WeakMap();
|
|
@@ -7311,6 +7454,10 @@ const createOverlayRef = (config) => {
|
|
|
7311
7454
|
...(ngDevMode ? [{ debugName: "_headerTemplates" }] : /* istanbul ignore next */ []));
|
|
7312
7455
|
const headerTemplate = computed(() => _headerTemplates().at(-1) ?? null, /* @ts-ignore */
|
|
7313
7456
|
...(ngDevMode ? [{ debugName: "headerTemplate" }] : /* istanbul ignore next */ []));
|
|
7457
|
+
const layoutSource = signal(null, /* @ts-ignore */
|
|
7458
|
+
...(ngDevMode ? [{ debugName: "layoutSource" }] : /* istanbul ignore next */ []));
|
|
7459
|
+
const layout = computed(() => layoutSource()?.() ?? null, /* @ts-ignore */
|
|
7460
|
+
...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
|
|
7314
7461
|
const afterOpened$ = new Subject();
|
|
7315
7462
|
const beforeClosed$ = new Subject();
|
|
7316
7463
|
const beforeClosedEvent$ = new Subject();
|
|
@@ -7361,6 +7508,7 @@ const createOverlayRef = (config) => {
|
|
|
7361
7508
|
.pipe(take(1), tap((rawEvent) => {
|
|
7362
7509
|
const event = withDismissResult(rawEvent);
|
|
7363
7510
|
busyAttributeEffect.destroy();
|
|
7511
|
+
afterOpened$.complete();
|
|
7364
7512
|
afterClosed$.next(event.result);
|
|
7365
7513
|
afterClosed$.complete();
|
|
7366
7514
|
afterClosedEvent$.next(event);
|
|
@@ -7377,6 +7525,7 @@ const createOverlayRef = (config) => {
|
|
|
7377
7525
|
},
|
|
7378
7526
|
config,
|
|
7379
7527
|
headerTemplate,
|
|
7528
|
+
layout,
|
|
7380
7529
|
componentInstance: () => {
|
|
7381
7530
|
if (_componentInstanceOverride) {
|
|
7382
7531
|
return _componentInstanceOverride();
|
|
@@ -7403,6 +7552,11 @@ const createOverlayRef = (config) => {
|
|
|
7403
7552
|
_componentInstanceOverride = getter;
|
|
7404
7553
|
},
|
|
7405
7554
|
closeVia: (source, result) => _runtimeRef?.close(result, source),
|
|
7555
|
+
isClosing: () => {
|
|
7556
|
+
const state = _runtimeRef?.state();
|
|
7557
|
+
return state === 'closing' || state === 'closed';
|
|
7558
|
+
},
|
|
7559
|
+
attachLayout: (source) => layoutSource.set(source),
|
|
7406
7560
|
registerHeaderTemplate: (template) => {
|
|
7407
7561
|
_headerTemplates.update((templates) => [...templates.filter((t) => t !== template), template]);
|
|
7408
7562
|
return () => _headerTemplates.update((templates) => templates.filter((t) => t !== template));
|
|
@@ -7495,9 +7649,19 @@ const sharedClassCounts = /* @__PURE__ */ new WeakMap();
|
|
|
7495
7649
|
const coerceCssPixelValue = (value) => {
|
|
7496
7650
|
return typeof value === 'number' ? `${value}px` : value;
|
|
7497
7651
|
};
|
|
7652
|
+
const LAYOUT_CLASS_PATTERN = /^et-overlay--([a-z][a-z0-9-]*)$/;
|
|
7653
|
+
const resolveOverlayLayout = (containerClass) => {
|
|
7654
|
+
for (const name of normalizeClassList(containerClass).flatMap((value) => value.split(/\s+/))) {
|
|
7655
|
+
const match = LAYOUT_CLASS_PATTERN.exec(name);
|
|
7656
|
+
if (match)
|
|
7657
|
+
return match[1];
|
|
7658
|
+
}
|
|
7659
|
+
return null;
|
|
7660
|
+
};
|
|
7498
7661
|
const createOverlayStrategyController = (config, parentInjector) => {
|
|
7499
7662
|
const childInjector = createEnvironmentInjector([], parentInjector);
|
|
7500
7663
|
const renderer = runInInjectionContext(childInjector, () => injectRenderer());
|
|
7664
|
+
const isServer = isPlatformServer(childInjector.get(PLATFORM_ID));
|
|
7501
7665
|
const breakpointObserver = runInInjectionContext(childInjector, () => injectBreakpointObserver());
|
|
7502
7666
|
const styleManager = runInInjectionContext(childInjector, () => injectStyleManager());
|
|
7503
7667
|
/** The strategy's CSS ships with the strategy, so it has to be in the document before it renders. */
|
|
@@ -7506,6 +7670,9 @@ const createOverlayStrategyController = (config, parentInjector) => {
|
|
|
7506
7670
|
styleManager.mount(strategyConfig.stylesComponent);
|
|
7507
7671
|
}
|
|
7508
7672
|
if (strategyConfig.arrow) {
|
|
7673
|
+
if (ngDevMode && !hasAnchoredOverlayPositionExtras()) {
|
|
7674
|
+
throw new RuntimeError(OVERLAY_ERROR_CODES.ARROW_WITHOUT_POSITION_EXTRAS, '[Overlay] A strategy sets `arrow`, but the floating-ui arrow middleware is not installed. Add `enableAnchoredOverlayPositionExtras()` from @ethlete/core to `strategies`, or call it once during app setup.');
|
|
7675
|
+
}
|
|
7509
7676
|
styleManager.mount(OverlayArrowStylesComponent);
|
|
7510
7677
|
}
|
|
7511
7678
|
};
|
|
@@ -7585,6 +7752,9 @@ const createOverlayStrategyController = (config, parentInjector) => {
|
|
|
7585
7752
|
return `min(${cssValue}, var(${cssVar}, ${cssValue}))`;
|
|
7586
7753
|
};
|
|
7587
7754
|
const applySizingStyles = (paneElement, strategyConfig) => {
|
|
7755
|
+
renderer.setCssProperties(paneElement, {
|
|
7756
|
+
'--et-overlay-width': strategyConfig.width ? coerceCssPixelValue(strategyConfig.width) : null,
|
|
7757
|
+
});
|
|
7588
7758
|
renderer.setStyle(paneElement, {
|
|
7589
7759
|
maxWidth: composeMaxSize(strategyConfig.maxWidth, '--et-overlay-max-width'),
|
|
7590
7760
|
maxHeight: composeMaxSize(strategyConfig.maxHeight, '--et-overlay-max-height'),
|
|
@@ -7730,6 +7900,9 @@ const createOverlayStrategyController = (config, parentInjector) => {
|
|
|
7730
7900
|
const backdropElement = runtimeRef.elements.backdropElement();
|
|
7731
7901
|
if (backdropElement) {
|
|
7732
7902
|
applyClassChange(backdropElement, { curr: activeStrategy.config.backdropClass });
|
|
7903
|
+
if (isServer) {
|
|
7904
|
+
renderer.addClass(backdropElement, BACKDROP_VISIBLE_CLASS);
|
|
7905
|
+
}
|
|
7733
7906
|
}
|
|
7734
7907
|
retainSharedClasses(document.documentElement, normalizeClassList(activeStrategy.config.documentClass));
|
|
7735
7908
|
retainSharedClasses(document.body, normalizeClassList(activeStrategy.config.bodyClass));
|
|
@@ -7785,6 +7958,7 @@ const createOverlayStrategyController = (config, parentInjector) => {
|
|
|
7785
7958
|
renderArrow: computed(() => activeStrategyConfig().arrow ?? false),
|
|
7786
7959
|
renderDragHandle: computed(() => !!activeStrategyConfig().dragToDismiss),
|
|
7787
7960
|
hasBackdrop: computed(() => resolveOverlayHasBackdrop(config, activeStrategyConfig())),
|
|
7961
|
+
layout: computed(() => resolveOverlayLayout(activeStrategyConfig().containerClass)),
|
|
7788
7962
|
attach,
|
|
7789
7963
|
destroy,
|
|
7790
7964
|
};
|
|
@@ -7917,6 +8091,7 @@ const OVERLAY_MANAGER_DEF = /* @__PURE__ */ defineRootProvider(() => {
|
|
|
7917
8091
|
};
|
|
7918
8092
|
const { ref: overlayRef, internals } = createOverlayRef(resolvedConfig);
|
|
7919
8093
|
const controller = createOverlayStrategyController(resolvedConfig, injector);
|
|
8094
|
+
internals.attachLayout(controller.layout);
|
|
7920
8095
|
const modal = resolvedConfig.mode !== 'non-modal';
|
|
7921
8096
|
const role = resolvedConfig.role ?? (modal ? 'dialog' : undefined);
|
|
7922
8097
|
const disableClose = resolvedConfig.disableClose ?? false;
|
|
@@ -10322,6 +10497,7 @@ class OverlayDirective {
|
|
|
10322
10497
|
this.destroyRef = inject(DestroyRef);
|
|
10323
10498
|
this.overlayManager = injectOverlayManager();
|
|
10324
10499
|
this.hostElement = injectHostElement();
|
|
10500
|
+
this.renderer = injectRenderer();
|
|
10325
10501
|
this.mode = input('non-modal', /* @ts-ignore */
|
|
10326
10502
|
...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
10327
10503
|
// eslint-disable-next-line ethlete/no-native-html-input-name -- deliberately sets the overlay's ARIA role
|
|
@@ -10382,6 +10558,8 @@ class OverlayDirective {
|
|
|
10382
10558
|
/** @internal */
|
|
10383
10559
|
this.overlayRef = signal(null, /* @ts-ignore */
|
|
10384
10560
|
...(ngDevMode ? [{ debugName: "overlayRef" }] : /* istanbul ignore next */ []));
|
|
10561
|
+
/** The `id` of the mounted overlay element, referenced by the trigger's `aria-controls`. */
|
|
10562
|
+
this.panelId = createComponentId('et-overlay-panel');
|
|
10385
10563
|
this.isMounted = computed(() => this.overlayRef() !== null, /* @ts-ignore */
|
|
10386
10564
|
...(ngDevMode ? [{ debugName: "isMounted" }] : /* istanbul ignore next */ []));
|
|
10387
10565
|
this.isClosing = false;
|
|
@@ -10487,6 +10665,7 @@ class OverlayDirective {
|
|
|
10487
10665
|
enableAnchoredOverlayPositionExtras();
|
|
10488
10666
|
}
|
|
10489
10667
|
const config = {
|
|
10668
|
+
id: this.panelId,
|
|
10490
10669
|
autoFocus: this.autoFocus(),
|
|
10491
10670
|
backdropClass: this.backdropClass(),
|
|
10492
10671
|
closeOnEscape: this.closeOnEscape(),
|
|
@@ -10520,6 +10699,10 @@ class OverlayDirective {
|
|
|
10520
10699
|
role: this.role(),
|
|
10521
10700
|
};
|
|
10522
10701
|
const overlayRef = this.overlayManager.open(OverlayTemplateHostComponent, config);
|
|
10702
|
+
const overlayHost = overlayRef.elements?.hostElement;
|
|
10703
|
+
if (overlayHost) {
|
|
10704
|
+
this.renderer.setAttribute(overlayHost, 'id', this.panelId);
|
|
10705
|
+
}
|
|
10523
10706
|
this.overlayRef.set(overlayRef);
|
|
10524
10707
|
overlayRef
|
|
10525
10708
|
.beforeClosed()
|
|
@@ -10542,7 +10725,7 @@ class OverlayDirective {
|
|
|
10542
10725
|
.subscribe();
|
|
10543
10726
|
}
|
|
10544
10727
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: OverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
10545
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: OverlayDirective, isStandalone: true, selector: "[etOverlay]", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disableClose: { classPropertyName: "disableClose", publicName: "disableClose", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, restoreFocus: { classPropertyName: "restoreFocus", publicName: "restoreFocus", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsidePointer: { classPropertyName: "closeOnOutsidePointer", publicName: "closeOnOutsidePointer", isSignal: true, isRequired: false, transformFunction: null }, closeOnNavigation: { classPropertyName: "closeOnNavigation", publicName: "closeOnNavigation", isSignal: true, isRequired: false, transformFunction: null }, hostClass: { classPropertyName: "hostClass", publicName: "hostClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, fallbackPlacements: { classPropertyName: "fallbackPlacements", publicName: "fallbackPlacements", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, viewportPadding: { classPropertyName: "viewportPadding", publicName: "viewportPadding", isSignal: true, isRequired: false, transformFunction: null }, autoResize: { classPropertyName: "autoResize", publicName: "autoResize", isSignal: true, isRequired: false, transformFunction: null }, minAvailableSpace: { classPropertyName: "minAvailableSpace", publicName: "minAvailableSpace", isSignal: true, isRequired: false, transformFunction: null }, shift: { classPropertyName: "shift", publicName: "shift", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "autoHide", isSignal: true, isRequired: false, transformFunction: null }, autoCloseIfReferenceHidden: { classPropertyName: "autoCloseIfReferenceHidden", publicName: "autoCloseIfReferenceHidden", isSignal: true, isRequired: false, transformFunction: null }, mirrorWidth: { classPropertyName: "mirrorWidth", publicName: "mirrorWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { properties: { "attr.data-overlay-open": "open() || null", "attr.data-overlay-mode": "mode()" } }, exportAs: ["etOverlay"], ngImport: i0 }); }
|
|
10728
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: OverlayDirective, isStandalone: true, selector: "[etOverlay]", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disableClose: { classPropertyName: "disableClose", publicName: "disableClose", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, restoreFocus: { classPropertyName: "restoreFocus", publicName: "restoreFocus", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsidePointer: { classPropertyName: "closeOnOutsidePointer", publicName: "closeOnOutsidePointer", isSignal: true, isRequired: false, transformFunction: null }, closeOnNavigation: { classPropertyName: "closeOnNavigation", publicName: "closeOnNavigation", isSignal: true, isRequired: false, transformFunction: null }, hostClass: { classPropertyName: "hostClass", publicName: "hostClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, fallbackPlacements: { classPropertyName: "fallbackPlacements", publicName: "fallbackPlacements", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, viewportPadding: { classPropertyName: "viewportPadding", publicName: "viewportPadding", isSignal: true, isRequired: false, transformFunction: null }, autoResize: { classPropertyName: "autoResize", publicName: "autoResize", isSignal: true, isRequired: false, transformFunction: null }, minAvailableSpace: { classPropertyName: "minAvailableSpace", publicName: "minAvailableSpace", isSignal: true, isRequired: false, transformFunction: null }, shift: { classPropertyName: "shift", publicName: "shift", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "autoHide", isSignal: true, isRequired: false, transformFunction: null }, autoCloseIfReferenceHidden: { classPropertyName: "autoCloseIfReferenceHidden", publicName: "autoCloseIfReferenceHidden", isSignal: true, isRequired: false, transformFunction: null }, mirrorWidth: { classPropertyName: "mirrorWidth", publicName: "mirrorWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { properties: { "attr.data-overlay-open": "open() || null", "attr.data-overlay-mode": "mode()", "attr.data-overlay-placement": "placement()" } }, exportAs: ["etOverlay"], ngImport: i0 }); }
|
|
10546
10729
|
}
|
|
10547
10730
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: OverlayDirective, decorators: [{
|
|
10548
10731
|
type: Directive,
|
|
@@ -10552,6 +10735,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
10552
10735
|
host: {
|
|
10553
10736
|
'[attr.data-overlay-open]': 'open() || null',
|
|
10554
10737
|
'[attr.data-overlay-mode]': 'mode()',
|
|
10738
|
+
'[attr.data-overlay-placement]': 'placement()',
|
|
10555
10739
|
},
|
|
10556
10740
|
}]
|
|
10557
10741
|
}], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], disableClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableClose", required: false }] }], autoFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFocus", required: false }] }], restoreFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "restoreFocus", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], closeOnOutsidePointer: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnOutsidePointer", required: false }] }], closeOnNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnNavigation", required: false }] }], hostClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "hostClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], fallbackPlacements: [{ type: i0.Input, args: [{ isSignal: true, alias: "fallbackPlacements", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], viewportPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportPadding", required: false }] }], autoResize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoResize", required: false }] }], minAvailableSpace: [{ type: i0.Input, args: [{ isSignal: true, alias: "minAvailableSpace", required: false }] }], shift: [{ type: i0.Input, args: [{ isSignal: true, alias: "shift", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHide", required: false }] }], autoCloseIfReferenceHidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoCloseIfReferenceHidden", required: false }] }], mirrorWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorWidth", required: false }] }] } });
|
|
@@ -10644,7 +10828,7 @@ class OverlayTriggerDirective {
|
|
|
10644
10828
|
return this.overlay.role() || this.overlay.mode() === 'modal' ? 'dialog' : null;
|
|
10645
10829
|
}
|
|
10646
10830
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: OverlayTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
10647
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: OverlayTriggerDirective, isStandalone: true, selector: "[etOverlayTrigger]", host: { listeners: { "click": "toggle()" }, properties: { "attr.aria-expanded": "expanded()", "attr.aria-haspopup": "hasPopup()", "attr.aria-disabled": "overlay?.disabled() || null", "attr.data-overlay-open": "isOpen() || null" } }, exportAs: ["etOverlayTrigger"], ngImport: i0 }); }
|
|
10831
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: OverlayTriggerDirective, isStandalone: true, selector: "[etOverlayTrigger]", host: { listeners: { "click": "toggle()" }, properties: { "attr.aria-expanded": "expanded()", "attr.aria-haspopup": "hasPopup()", "attr.aria-controls": "overlay?.panelId ?? null", "attr.aria-disabled": "overlay?.disabled() || null", "attr.data-overlay-open": "isOpen() || null" } }, exportAs: ["etOverlayTrigger"], ngImport: i0 }); }
|
|
10648
10832
|
}
|
|
10649
10833
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: OverlayTriggerDirective, decorators: [{
|
|
10650
10834
|
type: Directive,
|
|
@@ -10655,6 +10839,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
10655
10839
|
'(click)': 'toggle()',
|
|
10656
10840
|
'[attr.aria-expanded]': 'expanded()',
|
|
10657
10841
|
'[attr.aria-haspopup]': 'hasPopup()',
|
|
10842
|
+
'[attr.aria-controls]': 'overlay?.panelId ?? null',
|
|
10658
10843
|
'[attr.aria-disabled]': 'overlay?.disabled() || null',
|
|
10659
10844
|
'[attr.data-overlay-open]': 'isOpen() || null',
|
|
10660
10845
|
},
|
|
@@ -11278,7 +11463,7 @@ const OVERLAY_SCROLL_BLOCKER_DEF = /* @__PURE__ */ defineRootProvider(() => {
|
|
|
11278
11463
|
}
|
|
11279
11464
|
return documents;
|
|
11280
11465
|
}, { ...(ngDevMode ? { debugName: "blockedDocuments" } : /* istanbul ignore next */ {}), equal: (a, b) => a.size === b.size && [...a].every((entry) => b.has(entry)) });
|
|
11281
|
-
const
|
|
11466
|
+
const savedOffsets = new Map();
|
|
11282
11467
|
const canScrollVertically = (target, mainDocumentCanScroll) => {
|
|
11283
11468
|
if (target === document)
|
|
11284
11469
|
return mainDocumentCanScroll;
|
|
@@ -11287,20 +11472,21 @@ const OVERLAY_SCROLL_BLOCKER_DEF = /* @__PURE__ */ defineRootProvider(() => {
|
|
|
11287
11472
|
};
|
|
11288
11473
|
const lock = (target) => {
|
|
11289
11474
|
const top = target.defaultView?.scrollY ?? 0;
|
|
11290
|
-
|
|
11475
|
+
const left = target.defaultView?.scrollX ?? 0;
|
|
11476
|
+
savedOffsets.set(target, { top, left });
|
|
11291
11477
|
renderer.setStyle(target.documentElement, {
|
|
11292
11478
|
position: 'fixed',
|
|
11293
11479
|
top: `-${top}px`,
|
|
11294
|
-
left:
|
|
11295
|
-
right:
|
|
11480
|
+
left: `${-left}px`,
|
|
11481
|
+
right: `${left}px`,
|
|
11296
11482
|
overflowY: 'scroll',
|
|
11297
11483
|
});
|
|
11298
11484
|
};
|
|
11299
11485
|
const unlock = (target) => {
|
|
11300
|
-
const
|
|
11301
|
-
if (
|
|
11486
|
+
const offsets = savedOffsets.get(target);
|
|
11487
|
+
if (!offsets)
|
|
11302
11488
|
return;
|
|
11303
|
-
|
|
11489
|
+
savedOffsets.delete(target);
|
|
11304
11490
|
const root = target.documentElement;
|
|
11305
11491
|
renderer.setStyle(root, {
|
|
11306
11492
|
position: null,
|
|
@@ -11310,18 +11496,18 @@ const OVERLAY_SCROLL_BLOCKER_DEF = /* @__PURE__ */ defineRootProvider(() => {
|
|
|
11310
11496
|
overflowY: null,
|
|
11311
11497
|
scrollBehavior: 'auto',
|
|
11312
11498
|
});
|
|
11313
|
-
target.defaultView?.scrollTo(
|
|
11499
|
+
target.defaultView?.scrollTo(offsets.left, offsets.top);
|
|
11314
11500
|
renderer.setStyle(root, { scrollBehavior: null });
|
|
11315
11501
|
};
|
|
11316
|
-
inject(DestroyRef).onDestroy(() => [...
|
|
11502
|
+
inject(DestroyRef).onDestroy(() => [...savedOffsets.keys()].forEach(unlock));
|
|
11317
11503
|
combineLatest([toObservable(blockedDocuments), toObservable(documentScrollState)])
|
|
11318
11504
|
.pipe(tap(([blocked, scrollState]) => {
|
|
11319
|
-
for (const target of [...
|
|
11505
|
+
for (const target of [...savedOffsets.keys()]) {
|
|
11320
11506
|
if (!blocked.has(target))
|
|
11321
11507
|
unlock(target);
|
|
11322
11508
|
}
|
|
11323
11509
|
for (const target of blocked) {
|
|
11324
|
-
if (!
|
|
11510
|
+
if (!savedOffsets.has(target) && canScrollVertically(target, scrollState.canScrollVertically)) {
|
|
11325
11511
|
lock(target);
|
|
11326
11512
|
}
|
|
11327
11513
|
}
|
|
@@ -12576,7 +12762,14 @@ const DEFAULT_BREADCRUMB_LABELS = {
|
|
|
12576
12762
|
navigation: 'Breadcrumb',
|
|
12577
12763
|
overflow: 'Show hidden levels',
|
|
12578
12764
|
};
|
|
12579
|
-
|
|
12765
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
12766
|
+
const GERMAN_BREADCRUMB_LABELS = {
|
|
12767
|
+
navigation: 'Brotkrumennavigation',
|
|
12768
|
+
overflow: 'Ausgeblendete Ebenen anzeigen',
|
|
12769
|
+
};
|
|
12770
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideBreadcrumbLabels}. */
|
|
12771
|
+
const breadcrumbLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_BREADCRUMB_LABELS : DEFAULT_BREADCRUMB_LABELS;
|
|
12772
|
+
const BREADCRUMB_LABELS_DEF = /* @__PURE__ */ defineLabels('BREADCRUMB_LABELS', breadcrumbLabelsForLocale);
|
|
12580
12773
|
/**
|
|
12581
12774
|
* Localize the breadcrumb's strings for everything below this injector, and read the set in effect
|
|
12582
12775
|
* here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_BREADCRUMB_LABELS}
|
|
@@ -13112,7 +13305,22 @@ const DEFAULT_CALENDAR_LABELS = {
|
|
|
13112
13305
|
switchToMonthView: 'Choose date',
|
|
13113
13306
|
week: 'Week',
|
|
13114
13307
|
};
|
|
13115
|
-
|
|
13308
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
13309
|
+
const GERMAN_CALENDAR_LABELS = {
|
|
13310
|
+
previousMonth: 'Vorheriger Monat',
|
|
13311
|
+
nextMonth: 'Nächster Monat',
|
|
13312
|
+
previousYear: 'Vorheriges Jahr',
|
|
13313
|
+
nextYear: 'Nächstes Jahr',
|
|
13314
|
+
previousYearRange: 'Vorherige Jahre',
|
|
13315
|
+
nextYearRange: 'Nächste Jahre',
|
|
13316
|
+
switchToYearView: 'Monat und Jahr auswählen',
|
|
13317
|
+
switchToMultiYearView: 'Jahr auswählen',
|
|
13318
|
+
switchToMonthView: 'Datum auswählen',
|
|
13319
|
+
week: 'Woche',
|
|
13320
|
+
};
|
|
13321
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideCalendarLabels}. */
|
|
13322
|
+
const calendarLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_CALENDAR_LABELS : DEFAULT_CALENDAR_LABELS;
|
|
13323
|
+
const CALENDAR_LABELS_DEF = /* @__PURE__ */ defineLabels('CALENDAR_LABELS', calendarLabelsForLocale);
|
|
13116
13324
|
/**
|
|
13117
13325
|
* Localize the calendar's strings for everything below this injector, and read the set in effect here as a
|
|
13118
13326
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_CALENDAR_LABELS} value. See {@link defineLabels}
|
|
@@ -13492,7 +13700,7 @@ const createCalendarSelectionReader = (state) => {
|
|
|
13492
13700
|
*/
|
|
13493
13701
|
class CalendarDirective {
|
|
13494
13702
|
constructor() {
|
|
13495
|
-
this.defaultLocale =
|
|
13703
|
+
this.defaultLocale = injectDateLocaleSignal();
|
|
13496
13704
|
this.today = injectToday();
|
|
13497
13705
|
this.mode = input('single', /* @ts-ignore */
|
|
13498
13706
|
...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
@@ -13585,7 +13793,7 @@ class CalendarDirective {
|
|
|
13585
13793
|
/** The finest grid this calendar shows - the one whose cells hold {@link precision}'s unit. */
|
|
13586
13794
|
this.selectionView = computed(() => CALENDAR_PRECISION_VIEW[this.precision()], /* @ts-ignore */
|
|
13587
13795
|
...(ngDevMode ? [{ debugName: "selectionView" }] : /* istanbul ignore next */ []));
|
|
13588
|
-
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale, /* @ts-ignore */
|
|
13796
|
+
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale(), /* @ts-ignore */
|
|
13589
13797
|
...(ngDevMode ? [{ debugName: "effectiveLocale" }] : /* istanbul ignore next */ []));
|
|
13590
13798
|
this.effectiveFirstDayOfWeek = computed(() => this.firstDayOfWeek() ?? this.effectiveLocale()?.options?.weekStartsOn ?? 1, /* @ts-ignore */
|
|
13591
13799
|
...(ngDevMode ? [{ debugName: "effectiveFirstDayOfWeek" }] : /* istanbul ignore next */ []));
|
|
@@ -13715,7 +13923,7 @@ class CalendarDirective {
|
|
|
13715
13923
|
const locale = this.effectiveLocale();
|
|
13716
13924
|
const labelOptions = locale ? { locale } : undefined;
|
|
13717
13925
|
const weekStartsOn = this.effectiveFirstDayOfWeek();
|
|
13718
|
-
const firstWeekContainsDate = locale
|
|
13926
|
+
const firstWeekContainsDate = locale ? (locale.options?.firstWeekContainsDate ?? 1) : 4;
|
|
13719
13927
|
const readSelection = this.selectionReader('month');
|
|
13720
13928
|
return Array.from({ length: this.monthsShown() }, (_, offset) => {
|
|
13721
13929
|
const month = addMonths(firstMonth, offset);
|
|
@@ -14548,7 +14756,19 @@ const DEFAULT_CAROUSEL_LABELS = {
|
|
|
14548
14756
|
pause: 'Pause automatic slide show',
|
|
14549
14757
|
goToSlide: (index) => `Go to slide ${index}`,
|
|
14550
14758
|
};
|
|
14551
|
-
|
|
14759
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
14760
|
+
const GERMAN_CAROUSEL_LABELS = {
|
|
14761
|
+
carousel: 'Karussell',
|
|
14762
|
+
slide: (index, count) => `${index} von ${count}`,
|
|
14763
|
+
previous: 'Vorherige Folie',
|
|
14764
|
+
next: 'Nächste Folie',
|
|
14765
|
+
play: 'Automatische Wiedergabe starten',
|
|
14766
|
+
pause: 'Automatische Wiedergabe pausieren',
|
|
14767
|
+
goToSlide: (index) => `Zu Folie ${index}`,
|
|
14768
|
+
};
|
|
14769
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideCarouselLabels}. */
|
|
14770
|
+
const carouselLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_CAROUSEL_LABELS : DEFAULT_CAROUSEL_LABELS;
|
|
14771
|
+
const CAROUSEL_LABELS_DEF = /* @__PURE__ */ defineLabels('CAROUSEL_LABELS', carouselLabelsForLocale);
|
|
14552
14772
|
/**
|
|
14553
14773
|
* Localize the carousel's strings for everything below this injector, and read the set in effect here
|
|
14554
14774
|
* as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_CAROUSEL_LABELS} value. See
|
|
@@ -16228,6 +16448,17 @@ const useCarouselLoop = (config) => {
|
|
|
16228
16448
|
};
|
|
16229
16449
|
|
|
16230
16450
|
const SCROLL_IDLE_DURATION = 140;
|
|
16451
|
+
const SCROLL_KEYS = /* @__PURE__ */ new Set([
|
|
16452
|
+
'ArrowLeft',
|
|
16453
|
+
'ArrowRight',
|
|
16454
|
+
'ArrowUp',
|
|
16455
|
+
'ArrowDown',
|
|
16456
|
+
'PageUp',
|
|
16457
|
+
'PageDown',
|
|
16458
|
+
'Home',
|
|
16459
|
+
'End',
|
|
16460
|
+
' ',
|
|
16461
|
+
]);
|
|
16231
16462
|
/** In its own function so the `in` check doesn't narrow the element away for everything after it. */
|
|
16232
16463
|
const supportsScrollEnd = (element) => 'onscrollend' in element;
|
|
16233
16464
|
/**
|
|
@@ -16236,7 +16467,9 @@ const supportsScrollEnd = (element) => 'onscrollend' in element;
|
|
|
16236
16467
|
* `scrollend` is the right signal for it - it cannot fire mid-animation, which is exactly when a jump would
|
|
16237
16468
|
* be visible - with a quiet stretch of `scroll` events standing in where it is missing. Either way the
|
|
16238
16469
|
* callback is held back while a pointer is down: a mouse drag scrolls instantly on every move, so
|
|
16239
|
-
* `scrollend` fires throughout one, and acting on it would fight the finger.
|
|
16470
|
+
* `scrollend` fires throughout one, and acting on it would fight the finger. It is also held while snapping
|
|
16471
|
+
* is suspended: crossing the seam under the glide `etScrollableSnap` runs after a mouse drag sends that
|
|
16472
|
+
* glide back across every slide.
|
|
16240
16473
|
*
|
|
16241
16474
|
* @internal
|
|
16242
16475
|
*/
|
|
@@ -16245,8 +16478,10 @@ const useCarouselScrollSettled = (config) => {
|
|
|
16245
16478
|
const isPointerDown = signal(false, /* @ts-ignore */
|
|
16246
16479
|
...(ngDevMode ? [{ debugName: "isPointerDown" }] : /* istanbul ignore next */ []));
|
|
16247
16480
|
let isSettleDeferred = false;
|
|
16481
|
+
const isHeld = computed(() => isPointerDown() || !!config.scrollable()?.isSnapSuspended(), /* @ts-ignore */
|
|
16482
|
+
...(ngDevMode ? [{ debugName: "isHeld" }] : /* istanbul ignore next */ []));
|
|
16248
16483
|
const settle = () => {
|
|
16249
|
-
if (
|
|
16484
|
+
if (isHeld()) {
|
|
16250
16485
|
isSettleDeferred = true;
|
|
16251
16486
|
return;
|
|
16252
16487
|
}
|
|
@@ -16255,6 +16490,14 @@ const useCarouselScrollSettled = (config) => {
|
|
|
16255
16490
|
};
|
|
16256
16491
|
const container = computed(() => config.scrollable()?.scrollContainerRef()?.nativeElement ?? null, /* @ts-ignore */
|
|
16257
16492
|
...(ngDevMode ? [{ debugName: "container" }] : /* istanbul ignore next */ []));
|
|
16493
|
+
effect(() => {
|
|
16494
|
+
if (isHeld())
|
|
16495
|
+
return;
|
|
16496
|
+
untracked(() => {
|
|
16497
|
+
if (isSettleDeferred)
|
|
16498
|
+
settle();
|
|
16499
|
+
});
|
|
16500
|
+
});
|
|
16258
16501
|
toObservable(container)
|
|
16259
16502
|
.pipe(switchMap((scrollContainer) => {
|
|
16260
16503
|
if (!scrollContainer)
|
|
@@ -16264,14 +16507,13 @@ const useCarouselScrollSettled = (config) => {
|
|
|
16264
16507
|
: // a debounced scroll is standing in for `scrollend`; the offset itself is read on the spot
|
|
16265
16508
|
// eslint-disable-next-line ethlete/prefer-scroll-state
|
|
16266
16509
|
fromEvent(scrollContainer, 'scroll', { passive: true }).pipe(debounceTime(SCROLL_IDLE_DURATION));
|
|
16267
|
-
const release = () =>
|
|
16268
|
-
isPointerDown.set(false);
|
|
16269
|
-
if (isSettleDeferred)
|
|
16270
|
-
settle();
|
|
16271
|
-
};
|
|
16510
|
+
const release = () => isPointerDown.set(false);
|
|
16272
16511
|
return merge(settled$.pipe(tap(() => settle())), fromEvent(scrollContainer, 'pointerdown', { passive: true }).pipe(tap(() => {
|
|
16273
16512
|
isPointerDown.set(true);
|
|
16274
16513
|
config.onPointerDown?.();
|
|
16514
|
+
})), fromEvent(scrollContainer, 'wheel', { passive: true }).pipe(tap(() => config.onScrollInput?.())), fromEvent(scrollContainer, 'keydown').pipe(tap((event) => {
|
|
16515
|
+
if (SCROLL_KEYS.has(event.key))
|
|
16516
|
+
config.onScrollInput?.();
|
|
16275
16517
|
})),
|
|
16276
16518
|
// on the document, because a drag that starts on the track routinely ends off it
|
|
16277
16519
|
fromEvent(document, 'pointerup', { passive: true }).pipe(tap(release)), fromEvent(document, 'pointercancel', { passive: true }).pipe(tap(release)));
|
|
@@ -16583,6 +16825,7 @@ class CarouselDirective {
|
|
|
16583
16825
|
*/
|
|
16584
16826
|
this.requestedDomIndex = signal(null, /* @ts-ignore */
|
|
16585
16827
|
...(ngDevMode ? [{ debugName: "requestedDomIndex" }] : /* istanbul ignore next */ []));
|
|
16828
|
+
this.readSettled = null;
|
|
16586
16829
|
/** @internal Which child the intersections say is in view - the truth, a frame or two late. */
|
|
16587
16830
|
this.observedDomIndex = computed(() => {
|
|
16588
16831
|
const scrollable = this.scrollable();
|
|
@@ -16677,7 +16920,9 @@ class CarouselDirective {
|
|
|
16677
16920
|
slideProgress.flush();
|
|
16678
16921
|
},
|
|
16679
16922
|
onPointerDown: () => this.requestedDomIndex.set(null),
|
|
16923
|
+
onScrollInput: () => this.requestedDomIndex.set(null),
|
|
16680
16924
|
});
|
|
16925
|
+
this.readSettled = loop.readSettled;
|
|
16681
16926
|
let agreedIndex = null;
|
|
16682
16927
|
effect(() => {
|
|
16683
16928
|
const current = this.currentIndex();
|
|
@@ -16779,6 +17024,12 @@ class CarouselDirective {
|
|
|
16779
17024
|
const scrollable = this.scrollable();
|
|
16780
17025
|
if (!scrollable || domIndex < 0 || domIndex >= this.domCount())
|
|
16781
17026
|
return;
|
|
17027
|
+
// The track does not scroll to where it already rests, so no settle would ever clear this request.
|
|
17028
|
+
if (this.requestedDomIndex() === null &&
|
|
17029
|
+
domIndex === this.observedDomIndex() &&
|
|
17030
|
+
this.readSettled?.()?.restsOn(domIndex)) {
|
|
17031
|
+
return;
|
|
17032
|
+
}
|
|
16782
17033
|
const from = this.activeDomIndex();
|
|
16783
17034
|
const origin = this.scrollOriginOf(scrollable);
|
|
16784
17035
|
const distance = from < 0 ? 0 : domIndex - from;
|
|
@@ -17300,7 +17551,34 @@ const DEFAULT_CHART_LABELS = {
|
|
|
17300
17551
|
sankeyLinkSeparator: 'to',
|
|
17301
17552
|
sankeyLinkKeyHint: defaultSankeyChartLinkKeyHint,
|
|
17302
17553
|
};
|
|
17303
|
-
|
|
17554
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
17555
|
+
const GERMAN_CHART_LABELS = {
|
|
17556
|
+
barCategoryHeader: 'Kategorie',
|
|
17557
|
+
barValueHeader: 'Wert',
|
|
17558
|
+
lineCategoryHeader: 'Kategorie',
|
|
17559
|
+
lineDateHeader: 'Datum',
|
|
17560
|
+
lineValueHeader: 'Wert',
|
|
17561
|
+
pieCategoryHeader: 'Kategorie',
|
|
17562
|
+
pieValueHeader: 'Wert',
|
|
17563
|
+
pieShareHeader: 'Anteil',
|
|
17564
|
+
pieTotal: 'Gesamt',
|
|
17565
|
+
sankeySourceHeader: 'Quelle',
|
|
17566
|
+
sankeyTargetHeader: 'Ziel',
|
|
17567
|
+
sankeyValueHeader: 'Wert',
|
|
17568
|
+
sankeyIncoming: 'Eingang',
|
|
17569
|
+
sankeyOutgoing: 'Ausgang',
|
|
17570
|
+
sankeyLinkSeparator: 'nach',
|
|
17571
|
+
sankeyLinkKeyHint: ({ position, count, sourceLabel, direction }) => [
|
|
17572
|
+
`${position} von ${count}`,
|
|
17573
|
+
count > 1 ? `${direction === 'vertical' ? '←→' : '↑↓'} nächste Verbindung` : null,
|
|
17574
|
+
`Esc zurück zu ${sourceLabel}`,
|
|
17575
|
+
]
|
|
17576
|
+
.filter((part) => part !== null)
|
|
17577
|
+
.join(' · '),
|
|
17578
|
+
};
|
|
17579
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideChartLabels}. */
|
|
17580
|
+
const chartLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_CHART_LABELS : DEFAULT_CHART_LABELS;
|
|
17581
|
+
const CHART_LABELS_DEF = /* @__PURE__ */ defineLabels('CHART_LABELS', chartLabelsForLocale);
|
|
17304
17582
|
/**
|
|
17305
17583
|
* Localize the charts' strings for everything below this injector, and read the set in effect here as
|
|
17306
17584
|
* a signal. Partial - whatever you leave out keeps its {@link DEFAULT_CHART_LABELS} value. See
|
|
@@ -20580,7 +20858,13 @@ const CHART_IMPORTS = [
|
|
|
20580
20858
|
const DEFAULT_CHIP_LABELS = {
|
|
20581
20859
|
remove: 'Remove',
|
|
20582
20860
|
};
|
|
20583
|
-
|
|
20861
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
20862
|
+
const GERMAN_CHIP_LABELS = {
|
|
20863
|
+
remove: 'Entfernen',
|
|
20864
|
+
};
|
|
20865
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideChipLabels}. */
|
|
20866
|
+
const chipLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_CHIP_LABELS : DEFAULT_CHIP_LABELS;
|
|
20867
|
+
const CHIP_LABELS_DEF = /* @__PURE__ */ defineLabels('CHIP_LABELS', chipLabelsForLocale);
|
|
20584
20868
|
/**
|
|
20585
20869
|
* Localize a chip's strings for everything below this injector, and read the set in effect here as a
|
|
20586
20870
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_CHIP_LABELS} value. See {@link defineLabels}
|
|
@@ -21386,7 +21670,32 @@ const DEFAULT_KBD_LABELS = {
|
|
|
21386
21670
|
end: /* @__PURE__ */ everywhere('End'),
|
|
21387
21671
|
plus: /* @__PURE__ */ everywhere('+', 'Plus'),
|
|
21388
21672
|
};
|
|
21389
|
-
|
|
21673
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
21674
|
+
const GERMAN_KBD_LABELS = {
|
|
21675
|
+
mod: { apple: { label: '⌘', name: 'Befehlstaste' }, other: { label: 'Strg', name: 'Steuerung' } },
|
|
21676
|
+
meta: { apple: { label: '⌘', name: 'Befehlstaste' }, other: { label: 'Meta', name: 'Meta' } },
|
|
21677
|
+
ctrl: { apple: { label: '⌃', name: 'Control' }, other: { label: 'Strg', name: 'Steuerung' } },
|
|
21678
|
+
alt: { apple: { label: '⌥', name: 'Wahltaste' }, other: { label: 'Alt', name: 'Alt' } },
|
|
21679
|
+
shift: { apple: { label: '⇧', name: 'Umschalttaste' }, other: { label: 'Umschalt', name: 'Umschalttaste' } },
|
|
21680
|
+
enter: { apple: { label: '↵', name: 'Eingabetaste' }, other: { label: 'Eingabe', name: 'Eingabetaste' } },
|
|
21681
|
+
tab: { apple: { label: '⇥', name: 'Tabulator' }, other: { label: 'Tab', name: 'Tabulator' } },
|
|
21682
|
+
backspace: { apple: { label: '⌫', name: 'Rücktaste' }, other: { label: 'Rück', name: 'Rücktaste' } },
|
|
21683
|
+
delete: { apple: { label: '⌦', name: 'Entfernen' }, other: { label: 'Entf', name: 'Entfernen' } },
|
|
21684
|
+
esc: /* @__PURE__ */ everywhere('Esc', 'Escape'),
|
|
21685
|
+
space: /* @__PURE__ */ everywhere('Leer', 'Leertaste'),
|
|
21686
|
+
up: /* @__PURE__ */ everywhere('↑', 'Pfeil nach oben'),
|
|
21687
|
+
down: /* @__PURE__ */ everywhere('↓', 'Pfeil nach unten'),
|
|
21688
|
+
left: /* @__PURE__ */ everywhere('←', 'Pfeil nach links'),
|
|
21689
|
+
right: /* @__PURE__ */ everywhere('→', 'Pfeil nach rechts'),
|
|
21690
|
+
pageup: /* @__PURE__ */ everywhere('Bild↑', 'Bild nach oben'),
|
|
21691
|
+
pagedown: /* @__PURE__ */ everywhere('Bild↓', 'Bild nach unten'),
|
|
21692
|
+
home: /* @__PURE__ */ everywhere('Pos1'),
|
|
21693
|
+
end: /* @__PURE__ */ everywhere('Ende'),
|
|
21694
|
+
plus: /* @__PURE__ */ everywhere('+', 'Plus'),
|
|
21695
|
+
};
|
|
21696
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideKbdLabels}. */
|
|
21697
|
+
const kbdLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_KBD_LABELS : DEFAULT_KBD_LABELS;
|
|
21698
|
+
const KBD_LABELS_DEF = /* @__PURE__ */ defineLabels('KBD_LABELS', kbdLabelsForLocale);
|
|
21390
21699
|
/**
|
|
21391
21700
|
* Localize the printed labels and spoken names of `et-kbd` keys for everything below this injector. Partial
|
|
21392
21701
|
* per key - a key you leave out keeps its {@link DEFAULT_KBD_LABELS} entry; a key you give replaces both platforms.
|
|
@@ -21825,7 +22134,8 @@ class CommandPaletteShortcutDirective {
|
|
|
21825
22134
|
toggle() {
|
|
21826
22135
|
const openPalette = this.overlayManager
|
|
21827
22136
|
.openOverlays()
|
|
21828
|
-
.find((overlayRef) => overlayRef.componentInstance() instanceof CommandPaletteComponent
|
|
22137
|
+
.find((overlayRef) => overlayRef.componentInstance() instanceof CommandPaletteComponent &&
|
|
22138
|
+
!getOverlayRefInternals(overlayRef)?.isClosing());
|
|
21829
22139
|
if (openPalette) {
|
|
21830
22140
|
openPalette.close();
|
|
21831
22141
|
return;
|
|
@@ -21855,7 +22165,14 @@ const DEFAULT_COPY_BUTTON_LABELS = {
|
|
|
21855
22165
|
copied: 'Copied',
|
|
21856
22166
|
copyFailed: 'Copy failed',
|
|
21857
22167
|
};
|
|
21858
|
-
|
|
22168
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
22169
|
+
const GERMAN_COPY_BUTTON_LABELS = {
|
|
22170
|
+
copied: 'Kopiert',
|
|
22171
|
+
copyFailed: 'Kopieren fehlgeschlagen',
|
|
22172
|
+
};
|
|
22173
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideCopyButtonLabels}. */
|
|
22174
|
+
const copyButtonLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_COPY_BUTTON_LABELS : DEFAULT_COPY_BUTTON_LABELS;
|
|
22175
|
+
const COPY_BUTTON_LABELS_DEF = /* @__PURE__ */ defineLabels('COPY_BUTTON_LABELS', copyButtonLabelsForLocale);
|
|
21859
22176
|
/**
|
|
21860
22177
|
* Localize a copy button's strings for everything below this injector, and read the set in effect here as a
|
|
21861
22178
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_COPY_BUTTON_LABELS} value. See
|
|
@@ -22003,14 +22320,14 @@ class DescriptionListComponent {
|
|
|
22003
22320
|
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
22004
22321
|
}
|
|
22005
22322
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: DescriptionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
22006
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: DescriptionListComponent, isStandalone: true, selector: "dl[et-description-list]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-variant": "variant()" }, classAttribute: "et-description-list" }, ngImport: i0, template: '<ng-content />', isInline: true, styles: ["@layer components{@property --et-description-list-row-gap{syntax: \"<length>\"; inherits:
|
|
22323
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: DescriptionListComponent, isStandalone: true, selector: "dl[et-description-list]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-variant": "variant()" }, classAttribute: "et-description-list" }, ngImport: i0, template: '<ng-content />', isInline: true, styles: ["@layer components{@property --et-description-list-row-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-description-list-column-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-description-list-stacked-term-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-description-list-term-min-width{syntax: \"<length>\"; inherits: false; initial-value: 120px;}@property --et-description-list-term-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-description-list-detail-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}.et-description-list{display:grid;grid-template-columns:minmax(var(--et-description-list-term-min-width),max-content) 1fr;row-gap:var(--et-description-list-row-gap);column-gap:var(--et-description-list-column-gap);margin:0}.et-description-list>div{display:contents}.et-description-list dt{grid-column:1;font-size:var(--et-description-list-term-font-size);color:var(--et-surface-color-muted-solid, currentColor)}.et-description-list dd{grid-column:2;margin:0;font-size:var(--et-description-list-detail-font-size);color:var(--et-surface-color-solid, currentColor)}.et-description-list:where([data-variant=stacked]){grid-template-columns:1fr;row-gap:var(--et-description-list-stacked-term-gap)}.et-description-list:where([data-variant=stacked]) dt,.et-description-list:where([data-variant=stacked]) dd{grid-column:1}.et-description-list:where([data-variant=stacked]) :is(dd,div)+dt,.et-description-list:where([data-variant=stacked]) :is(dd,div)+div>dt:first-child{margin-block-start:max(0px,var(--et-description-list-row-gap) - var(--et-description-list-stacked-term-gap))}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
22007
22324
|
}
|
|
22008
22325
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: DescriptionListComponent, decorators: [{
|
|
22009
22326
|
type: Component,
|
|
22010
22327
|
args: [{ selector: 'dl[et-description-list]', template: '<ng-content />', encapsulation: ViewEncapsulation.None, host: {
|
|
22011
22328
|
class: 'et-description-list',
|
|
22012
22329
|
'[attr.data-variant]': 'variant()',
|
|
22013
|
-
}, styles: ["@layer components{@property --et-description-list-row-gap{syntax: \"<length>\"; inherits:
|
|
22330
|
+
}, styles: ["@layer components{@property --et-description-list-row-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}@property --et-description-list-column-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-description-list-stacked-term-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-description-list-term-min-width{syntax: \"<length>\"; inherits: false; initial-value: 120px;}@property --et-description-list-term-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}@property --et-description-list-detail-font-size{syntax: \"<length>\"; inherits: true; initial-value: 14px;}.et-description-list{display:grid;grid-template-columns:minmax(var(--et-description-list-term-min-width),max-content) 1fr;row-gap:var(--et-description-list-row-gap);column-gap:var(--et-description-list-column-gap);margin:0}.et-description-list>div{display:contents}.et-description-list dt{grid-column:1;font-size:var(--et-description-list-term-font-size);color:var(--et-surface-color-muted-solid, currentColor)}.et-description-list dd{grid-column:2;margin:0;font-size:var(--et-description-list-detail-font-size);color:var(--et-surface-color-solid, currentColor)}.et-description-list:where([data-variant=stacked]){grid-template-columns:1fr;row-gap:var(--et-description-list-stacked-term-gap)}.et-description-list:where([data-variant=stacked]) dt,.et-description-list:where([data-variant=stacked]) dd{grid-column:1}.et-description-list:where([data-variant=stacked]) :is(dd,div)+dt,.et-description-list:where([data-variant=stacked]) :is(dd,div)+div>dt:first-child{margin-block-start:max(0px,var(--et-description-list-row-gap) - var(--et-description-list-stacked-term-gap))}}\n"] }]
|
|
22014
22331
|
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
|
|
22015
22332
|
|
|
22016
22333
|
const DESCRIPTION_LIST_IMPORTS = [DescriptionListComponent];
|
|
@@ -22722,7 +23039,20 @@ const DEFAULT_CASCADER_LABELS = {
|
|
|
22722
23039
|
search: 'Search',
|
|
22723
23040
|
error: 'Something went wrong',
|
|
22724
23041
|
};
|
|
22725
|
-
|
|
23042
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
23043
|
+
const GERMAN_CASCADER_LABELS = {
|
|
23044
|
+
loading: 'Lade…',
|
|
23045
|
+
noMatches: 'Keine Treffer',
|
|
23046
|
+
noOptions: 'Keine Optionen',
|
|
23047
|
+
retry: 'Erneut versuchen',
|
|
23048
|
+
options: 'Optionen',
|
|
23049
|
+
back: 'Zurück',
|
|
23050
|
+
search: 'Suchen',
|
|
23051
|
+
error: 'Etwas ist schiefgelaufen',
|
|
23052
|
+
};
|
|
23053
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideCascaderLabels}. */
|
|
23054
|
+
const cascaderLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_CASCADER_LABELS : DEFAULT_CASCADER_LABELS;
|
|
23055
|
+
const CASCADER_LABELS_DEF = /* @__PURE__ */ defineLabels('CASCADER_LABELS', cascaderLabelsForLocale);
|
|
22726
23056
|
/**
|
|
22727
23057
|
* Localize the cascader's strings for everything below this injector, and read the set in effect here as a
|
|
22728
23058
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_CASCADER_LABELS} value. See {@link defineLabels}
|
|
@@ -23838,7 +24168,7 @@ class LabelDirective {
|
|
|
23838
24168
|
@if (requiredMarkerVisible()) {
|
|
23839
24169
|
<span class="et-label-required-marker" aria-hidden="true">*</span>
|
|
23840
24170
|
}
|
|
23841
|
-
`, isInline: true, styles: ["@layer components{et-label{display:inline;min-inline-size:0}.et-label-content{min-inline-size:0}.et-label-required-marker{display:inline-block;color:var(--et-theme-color-primary-solid);margin-inline-start:.45ch;transition:color .15s ease}et-label[data-disabled] .et-label-required-marker{color:var(--et-surface-interaction-disabled-solid, currentColor)}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
24171
|
+
`, isInline: true, styles: ["@layer components{et-label{display:inline;min-inline-size:0}et-label[hidden]{display:none}.et-label-content{min-inline-size:0}.et-label-required-marker{display:inline-block;color:var(--et-theme-color-primary-solid);margin-inline-start:.45ch;transition:color .15s ease}et-label[data-disabled] .et-label-required-marker{color:var(--et-surface-interaction-disabled-solid, currentColor)}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
23842
24172
|
}
|
|
23843
24173
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: LabelDirective, decorators: [{
|
|
23844
24174
|
type: Component,
|
|
@@ -23854,7 +24184,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
23854
24184
|
'[attr.id]': 'id()',
|
|
23855
24185
|
'[attr.data-disabled]': 'effectiveDisabled() || null',
|
|
23856
24186
|
'(click)': 'handleClick($event)',
|
|
23857
|
-
}, styles: ["@layer components{et-label{display:inline;min-inline-size:0}.et-label-content{min-inline-size:0}.et-label-required-marker{display:inline-block;color:var(--et-theme-color-primary-solid);margin-inline-start:.45ch;transition:color .15s ease}et-label[data-disabled] .et-label-required-marker{color:var(--et-surface-interaction-disabled-solid, currentColor)}}\n"] }]
|
|
24187
|
+
}, styles: ["@layer components{et-label{display:inline;min-inline-size:0}et-label[hidden]{display:none}.et-label-content{min-inline-size:0}.et-label-required-marker{display:inline-block;color:var(--et-theme-color-primary-solid);margin-inline-start:.45ch;transition:color .15s ease}et-label[data-disabled] .et-label-required-marker{color:var(--et-surface-interaction-disabled-solid, currentColor)}}\n"] }]
|
|
23858
24188
|
}], ctorParameters: () => [] });
|
|
23859
24189
|
|
|
23860
24190
|
/**
|
|
@@ -23914,7 +24244,27 @@ const DEFAULT_FORM_FIELD_LABELS = {
|
|
|
23914
24244
|
errorPattern: () => 'Invalid format',
|
|
23915
24245
|
errorEmail: 'Enter a valid email address',
|
|
23916
24246
|
};
|
|
23917
|
-
|
|
24247
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
24248
|
+
const GERMAN_FORM_FIELD_LABELS = {
|
|
24249
|
+
mixed: 'Gemischt',
|
|
24250
|
+
clear: 'Leeren',
|
|
24251
|
+
selectAll: 'Alle auswählen',
|
|
24252
|
+
ratingEmpty: 'Keine Bewertung',
|
|
24253
|
+
ratingValue: (value, max) => `${value} von ${max}`,
|
|
24254
|
+
counterRemaining: (remaining) => `Noch ${remaining} Zeichen`,
|
|
24255
|
+
counterLimitReached: (max) => `Zeichenlimit von ${max} erreicht`,
|
|
24256
|
+
counterOverLimit: (over, max) => `${over} Zeichen über dem Limit von ${max}`,
|
|
24257
|
+
errorRequired: 'Dieses Feld ist erforderlich',
|
|
24258
|
+
errorMin: (error) => `Muss mindestens ${error.min} sein`,
|
|
24259
|
+
errorMax: (error) => `Darf höchstens ${error.max} sein`,
|
|
24260
|
+
errorMinLength: (error) => `Muss mindestens ${error.minLength} Zeichen lang sein`,
|
|
24261
|
+
errorMaxLength: (error) => `Darf höchstens ${error.maxLength} Zeichen lang sein`,
|
|
24262
|
+
errorPattern: () => 'Ungültiges Format',
|
|
24263
|
+
errorEmail: 'Gültige E-Mail-Adresse eingeben',
|
|
24264
|
+
};
|
|
24265
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideFormFieldLabels}. */
|
|
24266
|
+
const formFieldLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_FORM_FIELD_LABELS : DEFAULT_FORM_FIELD_LABELS;
|
|
24267
|
+
const FORM_FIELD_LABELS_DEF = /* @__PURE__ */ defineLabels('FORM_FIELD_LABELS', formFieldLabelsForLocale);
|
|
23918
24268
|
/**
|
|
23919
24269
|
* Localize the strings shared by every form control below this injector, and read the set in effect here
|
|
23920
24270
|
* as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_FORM_FIELD_LABELS} value. See
|
|
@@ -23935,11 +24285,11 @@ const FORM_FIELD_LABELS = /* @__PURE__ */ toToken(FORM_FIELD_LABELS_DEF);
|
|
|
23935
24285
|
*/
|
|
23936
24286
|
class FormFieldTextShellStylesComponent {
|
|
23937
24287
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormFieldTextShellStylesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23938
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: FormFieldTextShellStylesComponent, isStandalone: true, selector: "et-form-field-text-shell-styles", ngImport: i0, template: '', isInline: true, styles: ["@layer components{et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--_et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 42px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md],:not([data-size])){--et-form-field-gap: 5px;--_et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--_et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var( --et-surface-background-solid, var(--et-surface-base-solid, transparent) )}et-form-field[data-text-shell][data-label-mode=static][data-has-label] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field[data-text-shell][data-label-mode=static] .et-form-field-control-area{position:static}et-form-field[data-text-shell][data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field[data-text-shell][data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field[data-text-shell][data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field[data-text-shell][data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]) :is(.et-input-native,.et-number-input-native,.et-textarea-native)::placeholder{transition:color .15s ease}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]) .et-select-value[data-placeholder]{transition:color .15s ease}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]):not([data-label-floated]) :is(.et-input-native,.et-number-input-native,.et-textarea-native)::placeholder{color:transparent}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]):not([data-label-floated]) .et-select-value[data-placeholder]{color:transparent}et-form-field[data-text-shell][data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field[data-text-shell][data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=floating-outside][data-has-label] .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field[data-text-shell][data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field[data-text-shell][data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field[data-text-shell] .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-label-area,et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}}et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-control-frame,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-control-frame,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-affix,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-affix,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field[data-text-shell][data-readonly] .et-form-field-shell,et-form-field[data-text-shell][data-readonly] .et-form-field-control-frame,et-form-field[data-text-shell][data-readonly] .et-form-field-label-area,et-form-field[data-text-shell][data-readonly] .et-form-field-control,et-form-field[data-text-shell][data-readonly] input,et-form-field[data-text-shell][data-readonly] textarea,et-form-field[data-text-shell][data-readonly] [contenteditable]{cursor:default}et-form-field[data-text-shell][data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field[data-text-shell][data-error] .et-form-field-label-area{color:var(--et-theme-color-ink-solid)}et-form-field[data-text-shell][data-error] .et-form-field-affix{color:var(--et-theme-color-ink-solid);opacity:1}et-form-field[data-text-shell][data-disabled] .et-form-field-shell{cursor:not-allowed}et-form-field[data-text-shell][data-disabled] .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field[data-text-shell][data-disabled] .et-form-field-label-area{cursor:not-allowed}et-form-field[data-text-shell][data-appearance=underline]{--et-form-field-control-min-height: calc( var(--et-form-field-control-font-size) * var(--et-form-field-control-line-height) + var(--et-form-field-control-padding-block) * 2 )}et-form-field[data-text-shell][data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
24288
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: FormFieldTextShellStylesComponent, isStandalone: true, selector: "et-form-field-text-shell-styles", ngImport: i0, template: '', isInline: true, styles: ["@layer components{et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--_et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 32px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md],:not([data-size])){--et-form-field-gap: 5px;--_et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--_et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var( --et-surface-background-solid, var(--et-surface-base-solid, transparent) )}et-form-field[data-text-shell][data-label-mode=static][data-has-label]:not(:has(et-label[hidden])) .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field[data-text-shell][data-label-mode=static] .et-form-field-control-area{position:static}et-form-field[data-text-shell][data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field[data-text-shell][data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field[data-text-shell][data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field[data-text-shell][data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]) :is(.et-input-native,.et-number-input-native,.et-textarea-native)::placeholder{transition:color .15s ease}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]) .et-select-value[data-placeholder]{transition:color .15s ease}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]):not([data-label-floated]) :is(.et-input-native,.et-number-input-native,.et-textarea-native)::placeholder{color:transparent}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]):not([data-label-floated]) .et-select-value[data-placeholder]{color:transparent}et-form-field[data-text-shell][data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field[data-text-shell][data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=floating-outside][data-has-label]:not(:has(et-label[hidden])) .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field[data-text-shell][data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field[data-text-shell][data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field[data-text-shell] .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-label-area,et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}}et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-control-frame,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-control-frame,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-affix,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-affix,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field[data-text-shell][data-readonly] .et-form-field-shell,et-form-field[data-text-shell][data-readonly] .et-form-field-control-frame,et-form-field[data-text-shell][data-readonly] .et-form-field-label-area,et-form-field[data-text-shell][data-readonly] .et-form-field-control,et-form-field[data-text-shell][data-readonly] input,et-form-field[data-text-shell][data-readonly] textarea,et-form-field[data-text-shell][data-readonly] [contenteditable]{cursor:default}et-form-field[data-text-shell][data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field[data-text-shell][data-error] .et-form-field-label-area{color:var(--et-theme-color-ink-solid)}et-form-field[data-text-shell][data-error] .et-form-field-affix{color:var(--et-theme-color-ink-solid);opacity:1}et-form-field[data-text-shell][data-disabled] .et-form-field-shell{cursor:not-allowed}et-form-field[data-text-shell][data-disabled] .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field[data-text-shell][data-disabled] .et-form-field-label-area{cursor:not-allowed}et-form-field[data-text-shell][data-appearance=underline]{--et-form-field-control-min-height: calc( var(--et-form-field-control-font-size) * var(--et-form-field-control-line-height) + var(--et-form-field-control-padding-block) * 2 )}et-form-field[data-text-shell][data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
23939
24289
|
}
|
|
23940
24290
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FormFieldTextShellStylesComponent, decorators: [{
|
|
23941
24291
|
type: Component,
|
|
23942
|
-
args: [{ selector: 'et-form-field-text-shell-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--_et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height:
|
|
24292
|
+
args: [{ selector: 'et-form-field-text-shell-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{et-form-field:where([data-size=sm]){--et-form-field-gap: 4px;--_et-form-field-control-border-radius: 4px;--et-form-field-control-padding-block: 4px;--et-form-field-control-padding-inline: 10px;--et-form-field-control-affix-gap: 6px;--et-form-field-control-font-size: 12px;--et-form-field-control-min-height: 32px;--et-form-field-label-font-size: 12px}et-form-field:where([data-size=md],:not([data-size])){--et-form-field-gap: 5px;--_et-form-field-control-border-radius: 5px;--et-form-field-control-padding-block: 6px;--et-form-field-control-padding-inline: 12px;--et-form-field-control-affix-gap: 8px;--et-form-field-control-font-size: 14px;--et-form-field-control-min-height: 50px;--et-form-field-label-font-size: 13px}et-form-field:where([data-size=lg]){--et-form-field-gap: 6px;--_et-form-field-control-border-radius: 6px;--et-form-field-control-padding-block: 8px;--et-form-field-control-padding-inline: 14px;--et-form-field-control-affix-gap: 10px;--et-form-field-control-font-size: 16px;--et-form-field-control-min-height: 58px;--et-form-field-label-font-size: 14px}et-form-field[data-fill=filled]{--_et-form-field-control-background: var( --et-surface-background-solid, var(--et-surface-base-solid, transparent) )}et-form-field[data-text-shell][data-label-mode=static][data-has-label]:not(:has(et-label[hidden])) .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field[data-text-shell][data-label-mode=static] .et-form-field-control-area{position:static}et-form-field[data-text-shell][data-label-mode=static] .et-form-field-label-area{position:absolute;inset-block-start:0;inset-inline-start:var(--et-form-field-control-padding-inline);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width)))}et-form-field[data-text-shell][data-label-mode=static][data-appearance=underline][data-fill=transparent] .et-form-field-label-area{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-frame{align-items:stretch}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-area{position:static;gap:var(--et-form-field-control-affix-gap);align-items:stretch}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-control-slot{display:flex;align-items:center}et-form-field[data-text-shell][data-label-mode=inline] .et-form-field-label-area--inline{position:static;flex-shrink:0;transform:none;white-space:nowrap;pointer-events:auto;font-size:var(--et-form-field-control-font-size);line-height:var(--et-form-field-control-line-height);display:flex;align-items:center;margin-block:calc(var(--et-form-field-control-padding-block) * -1)}et-form-field[data-text-shell][data-label-mode=inline][data-appearance=underline] .et-form-field-label-area--inline:after{content:\":\"}et-form-field[data-text-shell][data-label-mode=inline][data-appearance=box] .et-form-field-label-area--inline{padding-inline-end:var(--et-form-field-control-padding-inline);margin-inline-end:calc(var(--et-form-field-control-padding-inline) - var(--et-form-field-control-affix-gap));border-inline-end:var(--et-form-field-control-border-width) solid var(--et-surface-border-solid, currentColor)}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]) :is(.et-input-native,.et-number-input-native,.et-textarea-native)::placeholder{transition:color .15s ease}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]) .et-select-value[data-placeholder]{transition:color .15s ease}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]):not([data-label-floated]) :is(.et-input-native,.et-number-input-native,.et-textarea-native)::placeholder{color:transparent}:is(et-form-field[data-text-shell][data-label-mode=floating-inside],et-form-field[data-text-shell][data-label-mode=floating-outside]):not([data-label-floated]) .et-select-value[data-placeholder]{color:transparent}et-form-field[data-text-shell][data-label-mode=floating-outside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center}et-form-field[data-text-shell][data-label-mode=floating-outside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=floating-outside][data-has-label]:not(:has(et-label[hidden])) .et-form-field-shell{padding-block-start:calc(var(--et-form-field-label-font-size) * 1.2 + var(--et-form-field-gap))}et-form-field[data-text-shell][data-label-mode=floating-outside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:0;inset-inline-start:calc(var(--_et-form-field-prefix-offset, 0px) * -1);transform:translateY(calc(-100% - var(--et-form-field-gap) - var(--et-form-field-control-border-width) - var(--et-form-field-control-padding-block)))}et-form-field[data-text-shell][data-label-mode=floating-inside]{--_et-form-field-float-inside-extra-padding: calc( var(--et-form-field-label-font-size) * var(--_et-form-field-floating-label-scale) + 2px )}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-control-area{align-self:stretch;display:flex;align-items:center;padding-block-start:var(--_et-form-field-float-inside-extra-padding)}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-label-area--floating{inset-inline-start:0}et-form-field[data-text-shell][data-label-mode=floating-inside][data-label-floated] .et-form-field-label-area--floating{inset-block-start:4px;transform:scale(var(--_et-form-field-floating-label-scale))}et-form-field[data-text-shell][data-label-mode=floating-inside] .et-form-field-control-slot{font-size:calc(var(--et-form-field-control-font-size) * .96)}et-form-field[data-text-shell] .et-form-field-label-area{max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(hover:hover){et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-control-frame{border-color:var(--et-surface-interaction-hover-solid, currentColor)}et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-label-area,et-form-field[data-text-shell]:where(:not([data-readonly]):not([data-disabled]):not(:has(.et-color-interactive-exclude:hover))):where(:has(.et-form-field-control-frame:hover),:has(.et-form-field-label-area:hover)) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}}et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-control-frame,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-control-frame,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where(:has(:focus-visible):not([data-readonly])) .et-form-field-affix,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where([data-expanded]:not([data-readonly])) .et-form-field-affix,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-label-area,et-form-field[data-text-shell]:where([data-focused]:not([data-readonly])) .et-form-field-affix{color:var(--et-surface-color-solid, currentColor);opacity:1}et-form-field[data-text-shell][data-readonly] .et-form-field-shell,et-form-field[data-text-shell][data-readonly] .et-form-field-control-frame,et-form-field[data-text-shell][data-readonly] .et-form-field-label-area,et-form-field[data-text-shell][data-readonly] .et-form-field-control,et-form-field[data-text-shell][data-readonly] input,et-form-field[data-text-shell][data-readonly] textarea,et-form-field[data-text-shell][data-readonly] [contenteditable]{cursor:default}et-form-field[data-text-shell][data-error] .et-form-field-control-frame{border-color:var(--et-theme-color-primary-solid)}et-form-field[data-text-shell][data-error] .et-form-field-label-area{color:var(--et-theme-color-ink-solid)}et-form-field[data-text-shell][data-error] .et-form-field-affix{color:var(--et-theme-color-ink-solid);opacity:1}et-form-field[data-text-shell][data-disabled] .et-form-field-shell{cursor:not-allowed}et-form-field[data-text-shell][data-disabled] .et-form-field-control-frame{opacity:var(--et-form-field-control-disabled-opacity);pointer-events:none;box-shadow:none}et-form-field[data-text-shell][data-disabled] .et-form-field-label-area{cursor:not-allowed}et-form-field[data-text-shell][data-appearance=underline]{--et-form-field-control-min-height: calc( var(--et-form-field-control-font-size) * var(--et-form-field-control-line-height) + var(--et-form-field-control-padding-block) * 2 )}et-form-field[data-text-shell][data-appearance=underline] .et-form-field-control-frame{border-top:none;border-inline:none;border-radius:0;box-shadow:none}et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-control-frame{padding-inline:0}et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-errors,et-form-field[data-text-shell][data-appearance=underline][data-fill=transparent] .et-form-field-hint{padding-inline-start:0}}\n"] }]
|
|
23943
24293
|
}] });
|
|
23944
24294
|
/**
|
|
23945
24295
|
* Mounts the text-field shell stylesheet. Call from the constructor of every control that renders
|
|
@@ -24099,12 +24449,15 @@ class TextFieldControlDirective extends TextShellControlDirective {
|
|
|
24099
24449
|
}
|
|
24100
24450
|
/** @internal For a directive placed on the native element itself - a wrapper component binds these in its template. */
|
|
24101
24451
|
mirrorOntoNativeHost(element, state) {
|
|
24102
|
-
|
|
24103
|
-
|
|
24104
|
-
|
|
24105
|
-
|
|
24106
|
-
|
|
24107
|
-
|
|
24452
|
+
const readValue = state.value;
|
|
24453
|
+
if (readValue) {
|
|
24454
|
+
effect(() => {
|
|
24455
|
+
const value = readValue();
|
|
24456
|
+
if (!state.skip?.() && element.value !== value) {
|
|
24457
|
+
this.nativeHostRenderer.setProperty(element, 'value', value);
|
|
24458
|
+
}
|
|
24459
|
+
});
|
|
24460
|
+
}
|
|
24108
24461
|
const type = state.type;
|
|
24109
24462
|
if (type) {
|
|
24110
24463
|
effect(() => this.nativeHostRenderer.setProperty(element, 'type', type()));
|
|
@@ -24224,6 +24577,7 @@ const toChildrenObservable$1 = (result) => toObservableResult(result);
|
|
|
24224
24577
|
const toSearchObservable = (result) => toObservableResult(result);
|
|
24225
24578
|
/** Normalizes a `resolvePath` result (array | null | Promise | Observable) into an Observable. */
|
|
24226
24579
|
const toPathObservable = (result) => toObservableResult(result);
|
|
24580
|
+
const isPathDisabled = (path) => path.some((node) => node.disabled);
|
|
24227
24581
|
|
|
24228
24582
|
const CASCADER_SELECTABLE_LEVELS = {
|
|
24229
24583
|
/** Only terminal leaves commit a value (default). */
|
|
@@ -25049,7 +25403,7 @@ class CascaderDirective extends FieldStateControlDirective {
|
|
|
25049
25403
|
/** Activates a search result: commits selectable nodes, jumps the browse state to branch-only matches. */
|
|
25050
25404
|
activateSearchResult(path) {
|
|
25051
25405
|
const node = path[path.length - 1];
|
|
25052
|
-
if (!node ||
|
|
25406
|
+
if (!node || isPathDisabled(path) || this.disabled() || this.readonly()) {
|
|
25053
25407
|
return;
|
|
25054
25408
|
}
|
|
25055
25409
|
if (canHaveChildren(node) && this.selectableLevels() !== CASCADER_SELECTABLE_LEVELS.ANY) {
|
|
@@ -25069,7 +25423,7 @@ class CascaderDirective extends FieldStateControlDirective {
|
|
|
25069
25423
|
/** @internal Enter in the search input activates the focused result, or the first enabled one. */
|
|
25070
25424
|
activateFocusedSearchResult() {
|
|
25071
25425
|
const results = this.searchState().results;
|
|
25072
|
-
const path = results[this.focusedSearchIndex()] ?? results.find((candidate) => !candidate
|
|
25426
|
+
const path = results[this.focusedSearchIndex()] ?? results.find((candidate) => !isPathDisabled(candidate));
|
|
25073
25427
|
if (path) {
|
|
25074
25428
|
this.activateSearchResult(path);
|
|
25075
25429
|
}
|
|
@@ -25144,7 +25498,7 @@ class CascaderDirective extends FieldStateControlDirective {
|
|
|
25144
25498
|
const results = this.searchState().results;
|
|
25145
25499
|
for (let index = from; index >= 0 && index < results.length; index += step) {
|
|
25146
25500
|
const path = results[index];
|
|
25147
|
-
if (path && !path
|
|
25501
|
+
if (path && !isPathDisabled(path)) {
|
|
25148
25502
|
return index;
|
|
25149
25503
|
}
|
|
25150
25504
|
}
|
|
@@ -25506,7 +25860,7 @@ class CascaderSearchOptionDirective {
|
|
|
25506
25860
|
/** The path's final node - the one an activation commits (or drills into). */
|
|
25507
25861
|
this.node = computed(() => this.path()[this.path().length - 1] ?? null, /* @ts-ignore */
|
|
25508
25862
|
...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
|
|
25509
|
-
this.disabled = computed(() => this.
|
|
25863
|
+
this.disabled = computed(() => isPathDisabled(this.path()), /* @ts-ignore */
|
|
25510
25864
|
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
25511
25865
|
this.selected = computed(() => {
|
|
25512
25866
|
const node = this.node();
|
|
@@ -27013,7 +27367,30 @@ const DEFAULT_COLOR_INPUT_LABELS = {
|
|
|
27013
27367
|
invalidColor: (notations) => `Enter a color as ${notations.join(' or ')}`,
|
|
27014
27368
|
contrastTooLow: (measured, required) => `Contrast is ${measured}:1, needs at least ${required}:1`,
|
|
27015
27369
|
};
|
|
27016
|
-
|
|
27370
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
27371
|
+
const GERMAN_COLOR_INPUT_LABELS = {
|
|
27372
|
+
dialog: 'Farbe auswählen',
|
|
27373
|
+
pickerTrigger: 'Farbe auswählen',
|
|
27374
|
+
area: 'Sättigung und Helligkeit',
|
|
27375
|
+
saturation: 'Sättigung',
|
|
27376
|
+
brightness: 'Helligkeit',
|
|
27377
|
+
hue: 'Farbton',
|
|
27378
|
+
alpha: 'Deckkraft',
|
|
27379
|
+
value: 'Farbwert',
|
|
27380
|
+
hex: 'Hex',
|
|
27381
|
+
rgb: 'RGB',
|
|
27382
|
+
hsl: 'HSL',
|
|
27383
|
+
notation: (currentNotation) => `Notation ändern, aktuell ${currentNotation}`,
|
|
27384
|
+
notationConverted: (targetNotation) => `In ${targetNotation} umgewandelt.`,
|
|
27385
|
+
swatches: 'Voreingestellte Farben',
|
|
27386
|
+
swatch: (color, position) => `Farbfeld ${position}, ${color}`,
|
|
27387
|
+
eyedropper: 'Farbe vom Bildschirm aufnehmen',
|
|
27388
|
+
invalidColor: (notations) => `Farbe als ${notations.join(' oder ')} eingeben`,
|
|
27389
|
+
contrastTooLow: (measured, required) => `Der Kontrast beträgt ${measured}:1, erforderlich sind mindestens ${required}:1`,
|
|
27390
|
+
};
|
|
27391
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideColorInputLabels}. */
|
|
27392
|
+
const colorInputLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_COLOR_INPUT_LABELS : DEFAULT_COLOR_INPUT_LABELS;
|
|
27393
|
+
const COLOR_INPUT_LABELS_DEF = /* @__PURE__ */ defineLabels('COLOR_INPUT_LABELS', colorInputLabelsForLocale);
|
|
27017
27394
|
/**
|
|
27018
27395
|
* Localize the color picker's strings for everything below this injector, and read the set in
|
|
27019
27396
|
* effect here as a signal. Partial - whatever you leave out keeps its
|
|
@@ -27721,6 +28098,7 @@ class InputDirective extends TextFieldControlDirective {
|
|
|
27721
28098
|
value: this.displayValue,
|
|
27722
28099
|
placeholder: this.effectivePlaceholder,
|
|
27723
28100
|
type: this.type,
|
|
28101
|
+
attributes: () => ({ autocomplete: this.autocomplete() || null }),
|
|
27724
28102
|
skip: () => this.nativeSyncSuppressed,
|
|
27725
28103
|
});
|
|
27726
28104
|
}
|
|
@@ -27787,7 +28165,18 @@ const DEFAULT_INPUT_LABELS = {
|
|
|
27787
28165
|
hidePassword: 'Hide password',
|
|
27788
28166
|
capsLockOn: 'Caps Lock might be on',
|
|
27789
28167
|
};
|
|
27790
|
-
|
|
28168
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
28169
|
+
const GERMAN_INPUT_LABELS = {
|
|
28170
|
+
increment: 'Erhöhen',
|
|
28171
|
+
decrement: 'Verringern',
|
|
28172
|
+
invalidNumber: 'Bitte eine gültige Zahl eingeben',
|
|
28173
|
+
showPassword: 'Passwort anzeigen',
|
|
28174
|
+
hidePassword: 'Passwort verbergen',
|
|
28175
|
+
capsLockOn: 'Die Feststelltaste ist möglicherweise aktiv',
|
|
28176
|
+
};
|
|
28177
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideInputLabels}. */
|
|
28178
|
+
const inputLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_INPUT_LABELS : DEFAULT_INPUT_LABELS;
|
|
28179
|
+
const INPUT_LABELS_DEF = /* @__PURE__ */ defineLabels('INPUT_LABELS', inputLabelsForLocale);
|
|
27791
28180
|
/**
|
|
27792
28181
|
* Localize the text field family's strings for everything below this injector, and read the set in effect here as a
|
|
27793
28182
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_INPUT_LABELS} value. See {@link defineLabels}
|
|
@@ -27896,16 +28285,45 @@ class NumberInputDirective extends TextFieldControlDirective {
|
|
|
27896
28285
|
this.nativeControl.set(hostElement);
|
|
27897
28286
|
this.focusTarget.set(hostElement);
|
|
27898
28287
|
this.mirrorOntoNativeHost(hostElement, {
|
|
27899
|
-
value: () => `${this.displayValue()}`,
|
|
27900
28288
|
placeholder: this.effectivePlaceholder,
|
|
27901
28289
|
attributes: () => ({
|
|
27902
28290
|
min: this.min()?.toString() ?? null,
|
|
27903
28291
|
max: this.max()?.toString() ?? null,
|
|
27904
28292
|
step: this.step()?.toString() ?? null,
|
|
27905
28293
|
inputmode: this.inputMode(),
|
|
28294
|
+
autocomplete: this.autocomplete() || null,
|
|
27906
28295
|
}),
|
|
27907
28296
|
});
|
|
27908
28297
|
}
|
|
28298
|
+
effect(() => {
|
|
28299
|
+
const element = this.nativeControl();
|
|
28300
|
+
this.displayValue();
|
|
28301
|
+
if (element)
|
|
28302
|
+
untracked(() => this.writeNativeTextUnlessInSync(element));
|
|
28303
|
+
});
|
|
28304
|
+
effect(() => {
|
|
28305
|
+
if (this.touched())
|
|
28306
|
+
return;
|
|
28307
|
+
untracked(() => this.clearParseError());
|
|
28308
|
+
});
|
|
28309
|
+
}
|
|
28310
|
+
/**
|
|
28311
|
+
* @internal Rewrites the native text in the model's own form - `2.0` becomes `2` - once the user
|
|
28312
|
+
* leaves the input. Text that is not a number stays, so the parse error can name it.
|
|
28313
|
+
*/
|
|
28314
|
+
normalizeNativeText() {
|
|
28315
|
+
const element = this.nativeControl();
|
|
28316
|
+
if (!element || this.mixed() || element.validity.badInput)
|
|
28317
|
+
return;
|
|
28318
|
+
const canonical = `${this.displayValue()}`;
|
|
28319
|
+
if (element.value !== canonical)
|
|
28320
|
+
element.value = canonical;
|
|
28321
|
+
}
|
|
28322
|
+
handleNativeBlur(event) {
|
|
28323
|
+
if (event.target !== this.focusTarget())
|
|
28324
|
+
return;
|
|
28325
|
+
super.handleNativeBlur(event);
|
|
28326
|
+
this.normalizeNativeText();
|
|
27909
28327
|
}
|
|
27910
28328
|
/**
|
|
27911
28329
|
* Steps the value by `step` (an empty or mixed value starts from `0`), clamped to `min`/`max`.
|
|
@@ -28012,6 +28430,28 @@ class NumberInputDirective extends TextFieldControlDirective {
|
|
|
28012
28430
|
this.value.set(Number.isNaN(parsed) ? null : parsed);
|
|
28013
28431
|
this.parseError.set(inputElement.validity.badInput);
|
|
28014
28432
|
}
|
|
28433
|
+
/** Writing on every keystroke would turn `2.0` into `2`, eat the `-` of `-0.5` and move the caret. */
|
|
28434
|
+
writeNativeTextUnlessInSync(element) {
|
|
28435
|
+
if (this.nativeTextMatchesModel(element))
|
|
28436
|
+
return;
|
|
28437
|
+
element.value = `${this.displayValue()}`;
|
|
28438
|
+
}
|
|
28439
|
+
nativeTextMatchesModel(element) {
|
|
28440
|
+
if (this.mixed())
|
|
28441
|
+
return element.value === '';
|
|
28442
|
+
const value = this.value();
|
|
28443
|
+
if (value === null)
|
|
28444
|
+
return element.value === '' || element.validity.badInput;
|
|
28445
|
+
return element.value !== '' && element.valueAsNumber === value;
|
|
28446
|
+
}
|
|
28447
|
+
clearParseError() {
|
|
28448
|
+
if (!this.parseError())
|
|
28449
|
+
return;
|
|
28450
|
+
const element = this.nativeControl();
|
|
28451
|
+
if (element)
|
|
28452
|
+
element.value = `${this.displayValue()}`;
|
|
28453
|
+
this.parseError.set(false);
|
|
28454
|
+
}
|
|
28015
28455
|
exceedsDecimals(text) {
|
|
28016
28456
|
const decimals = this.decimals();
|
|
28017
28457
|
if (decimals === null)
|
|
@@ -28137,6 +28577,8 @@ class PasswordInputDirective extends TextFieldControlDirective {
|
|
|
28137
28577
|
this.mirrorOntoNativeHost(hostElement, {
|
|
28138
28578
|
value: this.displayValue,
|
|
28139
28579
|
placeholder: this.effectivePlaceholder,
|
|
28580
|
+
type: this.inputType,
|
|
28581
|
+
attributes: () => ({ autocomplete: this.autocomplete() || null }),
|
|
28140
28582
|
});
|
|
28141
28583
|
}
|
|
28142
28584
|
}
|
|
@@ -29387,7 +29829,55 @@ const DEFAULT_DATE_TIME_LABELS = {
|
|
|
29387
29829
|
timeMin: (min) => `Choose a time at or after ${min}`,
|
|
29388
29830
|
timeMax: (max) => `Choose a time at or before ${max}`,
|
|
29389
29831
|
};
|
|
29390
|
-
|
|
29832
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
29833
|
+
const GERMAN_DATE_TIME_LABELS = {
|
|
29834
|
+
openCalendar: 'Kalender öffnen',
|
|
29835
|
+
openTimePicker: 'Zeitauswahl öffnen',
|
|
29836
|
+
openDateTimePicker: 'Datums- und Zeitauswahl öffnen',
|
|
29837
|
+
chooseDate: 'Datum auswählen',
|
|
29838
|
+
chooseTime: 'Uhrzeit auswählen',
|
|
29839
|
+
chooseDateTime: 'Datum und Uhrzeit auswählen',
|
|
29840
|
+
chooseDateRange: 'Zeitraum auswählen',
|
|
29841
|
+
chooseTimeRange: 'Zeitspanne auswählen',
|
|
29842
|
+
chooseDateTimeRange: 'Zeitraum mit Uhrzeit auswählen',
|
|
29843
|
+
startDate: 'Startdatum',
|
|
29844
|
+
endDate: 'Enddatum',
|
|
29845
|
+
startTime: 'Startzeit',
|
|
29846
|
+
endTime: 'Endzeit',
|
|
29847
|
+
startDateTime: 'Startdatum und -zeit',
|
|
29848
|
+
endDateTime: 'Enddatum und -zeit',
|
|
29849
|
+
dateTab: 'Datum',
|
|
29850
|
+
timeTab: 'Uhrzeit',
|
|
29851
|
+
datesTab: 'Daten',
|
|
29852
|
+
timesTab: 'Uhrzeiten',
|
|
29853
|
+
paneSwitch: 'Auswahlansicht',
|
|
29854
|
+
presets: 'Voreinstellungen',
|
|
29855
|
+
presetToday: 'Heute',
|
|
29856
|
+
presetYesterday: 'Gestern',
|
|
29857
|
+
presetLastDays: (count) => `Letzte ${count} Tage`,
|
|
29858
|
+
presetNextDays: (count) => `Nächste ${count} Tage`,
|
|
29859
|
+
presetThisWeek: 'Diese Woche',
|
|
29860
|
+
presetLastWeek: 'Letzte Woche',
|
|
29861
|
+
presetThisMonth: 'Dieser Monat',
|
|
29862
|
+
presetLastMonth: 'Letzter Monat',
|
|
29863
|
+
presetThisYear: 'Dieses Jahr',
|
|
29864
|
+
timeZoneReading: (timeZone, localTime) => `${timeZone} · ${localTime} Ortszeit`,
|
|
29865
|
+
invalidDate: 'Bitte ein gültiges Datum eingeben',
|
|
29866
|
+
invalidTime: 'Bitte eine gültige Uhrzeit eingeben',
|
|
29867
|
+
invalidDateTime: 'Bitte ein gültiges Datum mit Uhrzeit eingeben',
|
|
29868
|
+
invalidDateRange: 'Bitte einen gültigen Zeitraum eingeben',
|
|
29869
|
+
invalidTimeRange: 'Bitte eine gültige Zeitspanne eingeben',
|
|
29870
|
+
invalidDateTimeRange: 'Bitte einen gültigen Zeitraum mit Uhrzeit eingeben',
|
|
29871
|
+
invalidDuration: 'Bitte eine gültige Dauer eingeben',
|
|
29872
|
+
rangeOrder: 'Der Beginn muss vor dem Ende liegen',
|
|
29873
|
+
rangeMin: (min) => `Ein Datum ab dem ${min} auswählen`,
|
|
29874
|
+
rangeMax: (max) => `Ein Datum bis zum ${max} auswählen`,
|
|
29875
|
+
timeMin: (min) => `Eine Uhrzeit ab ${min} auswählen`,
|
|
29876
|
+
timeMax: (max) => `Eine Uhrzeit bis ${max} auswählen`,
|
|
29877
|
+
};
|
|
29878
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideDateTimeLabels}. */
|
|
29879
|
+
const dateTimeLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_DATE_TIME_LABELS : DEFAULT_DATE_TIME_LABELS;
|
|
29880
|
+
const DATE_TIME_LABELS_DEF = /* @__PURE__ */ defineLabels('DATE_TIME_LABELS', dateTimeLabelsForLocale);
|
|
29391
29881
|
/**
|
|
29392
29882
|
* Localize the date/time inputs' strings for everything below this injector, and read the set in effect
|
|
29393
29883
|
* here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_DATE_TIME_LABELS} value.
|
|
@@ -29805,7 +30295,7 @@ class PickerInputBaseDirective extends FieldStateControlDirective {
|
|
|
29805
30295
|
this.formFieldLabels = injectFormFieldLabels();
|
|
29806
30296
|
this.document = inject(DOCUMENT$1);
|
|
29807
30297
|
this.formField = inject(FORM_FIELD_TOKEN, { optional: true });
|
|
29808
|
-
this.defaultLocale =
|
|
30298
|
+
this.defaultLocale = injectDateLocaleSignal();
|
|
29809
30299
|
/**
|
|
29810
30300
|
* View state for a field whose source values disagree (bulk edit). The raw form value stays
|
|
29811
30301
|
* untouched; on a range one flag masks both sides.
|
|
@@ -29848,7 +30338,7 @@ class PickerInputBaseDirective extends FieldStateControlDirective {
|
|
|
29848
30338
|
...(ngDevMode ? [{ debugName: "resolvedMixedLabel" }] : /* istanbul ignore next */ []));
|
|
29849
30339
|
this.effectiveValueFormat = computed(() => this.valueFormat() ?? this.defaultValueFormat, /* @ts-ignore */
|
|
29850
30340
|
...(ngDevMode ? [{ debugName: "effectiveValueFormat" }] : /* istanbul ignore next */ []));
|
|
29851
|
-
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale, /* @ts-ignore */
|
|
30341
|
+
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale(), /* @ts-ignore */
|
|
29852
30342
|
...(ngDevMode ? [{ debugName: "effectiveLocale" }] : /* istanbul ignore next */ []));
|
|
29853
30343
|
this.describedBy = signal(null, /* @ts-ignore */
|
|
29854
30344
|
...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
|
|
@@ -30044,79 +30534,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
30044
30534
|
type: Directive
|
|
30045
30535
|
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
|
|
30046
30536
|
|
|
30047
|
-
/**
|
|
30048
|
-
* Strictly parses `value` against a date-fns format string. Returns `null` for
|
|
30049
|
-
* empty input, leftover characters, or anything date-fns considers invalid.
|
|
30050
|
-
*/
|
|
30051
|
-
const parseDateValue = (value, options) => {
|
|
30052
|
-
const trimmed = value.trim();
|
|
30053
|
-
if (!trimmed) {
|
|
30054
|
-
return null;
|
|
30055
|
-
}
|
|
30056
|
-
const locale = options.locale ?? undefined;
|
|
30057
|
-
const timeZone = options.timeZone ?? null;
|
|
30058
|
-
const parsed = parse(trimmed, options.format, options.referenceDate ?? new Date(), {
|
|
30059
|
-
locale,
|
|
30060
|
-
in: timeZone === null ? undefined : tz(timeZone),
|
|
30061
|
-
});
|
|
30062
|
-
if (!isValid(parsed)) {
|
|
30063
|
-
return null;
|
|
30064
|
-
}
|
|
30065
|
-
return timeZone === null ? parsed : new Date(parsed.getTime());
|
|
30066
|
-
};
|
|
30067
|
-
/** Formats a `Date` with a date-fns format string. Invalid dates yield `null`. */
|
|
30068
|
-
const formatDateValue = (date, options) => {
|
|
30069
|
-
if (!isValid(date)) {
|
|
30070
|
-
return null;
|
|
30071
|
-
}
|
|
30072
|
-
const locale = options.locale;
|
|
30073
|
-
return format(date, options.format, locale ? { locale } : undefined);
|
|
30074
|
-
};
|
|
30075
|
-
|
|
30076
|
-
/** The `displayFormat` a precision implies, when the consumer has not named one. */
|
|
30077
|
-
const displayFormatForPrecision = (precision, locale) => {
|
|
30078
|
-
if (precision === 'day') {
|
|
30079
|
-
return 'P';
|
|
30080
|
-
}
|
|
30081
|
-
if (precision === 'year') {
|
|
30082
|
-
return 'yyyy';
|
|
30083
|
-
}
|
|
30084
|
-
return monthYearFormat(locale?.formatLong?.date({ width: 'short' }) ?? 'MM/dd/yyyy');
|
|
30085
|
-
};
|
|
30086
|
-
const monthYearFormat = (shortDatePattern) => {
|
|
30087
|
-
const stripped = shortDatePattern.replace(/(?:[^a-zA-Z']+d+|d+[^a-zA-Z']+)/, '');
|
|
30088
|
-
if (stripped === shortDatePattern || /d/.test(stripped)) {
|
|
30089
|
-
return 'MM/yyyy';
|
|
30090
|
-
}
|
|
30091
|
-
return widenYearToken(stripped);
|
|
30092
|
-
};
|
|
30093
|
-
/** `y` / `yy` / `yyy` → `yyyy`, so the pattern is fixed-width and a mask can be derived from it. */
|
|
30094
|
-
const widenYearToken = (pattern) => pattern.replace(/y+/, 'yyyy');
|
|
30095
|
-
|
|
30096
|
-
const EXAMPLE_DATE = /* @__PURE__ */ new Date(2026, 6, 16, 21, 30, 0);
|
|
30097
|
-
/**
|
|
30098
|
-
* Dev mode only: warns once per control when a non-empty wire value does not parse against the
|
|
30099
|
-
* `valueFormat` in effect, since the field then renders blank. Call in an injection context.
|
|
30100
|
-
*/
|
|
30101
|
-
const warnOnUnparsedValue = (options) => {
|
|
30102
|
-
if (!ngDevMode)
|
|
30103
|
-
return;
|
|
30104
|
-
let warned = false;
|
|
30105
|
-
effect(() => {
|
|
30106
|
-
if (warned)
|
|
30107
|
-
return;
|
|
30108
|
-
const miss = options.readings().find((reading) => !!reading.value?.trim() && reading.parsed === null);
|
|
30109
|
-
if (!miss)
|
|
30110
|
-
return;
|
|
30111
|
-
warned = true;
|
|
30112
|
-
const format = options.format();
|
|
30113
|
-
const example = formatDateValue(EXAMPLE_DATE, { format, locale: options.locale() });
|
|
30114
|
-
console.warn(`[${options.selector}] The value "${miss.value}" does not match the valueFormat "${format}", so the field ` +
|
|
30115
|
-
`renders blank. A matching value looks like "${example}". Set valueFormat on the control or ` +
|
|
30116
|
-
`${options.formatProvider}() for the app.`);
|
|
30117
|
-
});
|
|
30118
|
-
};
|
|
30119
|
-
|
|
30120
30537
|
/** date-fns' own pre-pass: the `P`/`p` locale formats are expanded before the format is tokenized. */
|
|
30121
30538
|
const LONG_FORMAT_PATTERN = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
|
|
30122
30539
|
/** date-fns' formatting tokenizer. */
|
|
@@ -30191,13 +30608,15 @@ const kindOf = (token) => {
|
|
|
30191
30608
|
// `t`/`T` are whole epoch timestamps, and an unknown letter is date-fns' problem
|
|
30192
30609
|
return /[a-zA-Z]/.test(first) ? 'unsplittable' : 'literal';
|
|
30193
30610
|
};
|
|
30611
|
+
/** The format's date-fns tokens, with the `P`/`p` locale formats expanded. */
|
|
30612
|
+
const formatTokens = (format, locale) => expandLongFormats(format, locale ?? enUS).match(TOKEN_PATTERN) ?? [];
|
|
30194
30613
|
/**
|
|
30195
30614
|
* Splits a combined date & time format into the span carrying the time and the date format around
|
|
30196
30615
|
* it. `null` when the format has no time half, no date half, or interleaves the two.
|
|
30197
30616
|
*/
|
|
30198
30617
|
const splitDateTimeFormat = (format, locale) => {
|
|
30199
|
-
const tokens =
|
|
30200
|
-
if (tokens ===
|
|
30618
|
+
const tokens = formatTokens(format, locale);
|
|
30619
|
+
if (tokens.length === 0) {
|
|
30201
30620
|
return null;
|
|
30202
30621
|
}
|
|
30203
30622
|
const kinds = tokens.map(kindOf);
|
|
@@ -30216,6 +30635,88 @@ const splitDateTimeFormat = (format, locale) => {
|
|
|
30216
30635
|
};
|
|
30217
30636
|
};
|
|
30218
30637
|
|
|
30638
|
+
// date-fns' `y`/`yyyy` parsers take one to four digits as the literal year, so `1.2.26` would read as 0026
|
|
30639
|
+
const isShortYear = (parsed, { format, locale }) => {
|
|
30640
|
+
if (parsed.getFullYear() >= 1000) {
|
|
30641
|
+
return false;
|
|
30642
|
+
}
|
|
30643
|
+
const yearTokens = formatTokens(format, locale ?? null).filter((token) => token[0] === 'y');
|
|
30644
|
+
return yearTokens.length > 0 && !yearTokens.includes('yy');
|
|
30645
|
+
};
|
|
30646
|
+
/**
|
|
30647
|
+
* Strictly parses `value` against a date-fns format string. Returns `null` for
|
|
30648
|
+
* empty input, leftover characters, a year of fewer than four digits where the format
|
|
30649
|
+
* asks for a full one, or anything date-fns considers invalid.
|
|
30650
|
+
*/
|
|
30651
|
+
const parseDateValue = (value, options) => {
|
|
30652
|
+
const trimmed = value.trim();
|
|
30653
|
+
if (!trimmed) {
|
|
30654
|
+
return null;
|
|
30655
|
+
}
|
|
30656
|
+
const locale = options.locale ?? undefined;
|
|
30657
|
+
const timeZone = options.timeZone ?? null;
|
|
30658
|
+
const parsed = parse(trimmed, options.format, options.referenceDate ?? new Date(), {
|
|
30659
|
+
locale,
|
|
30660
|
+
in: timeZone === null ? undefined : tz(timeZone),
|
|
30661
|
+
});
|
|
30662
|
+
if (!isValid(parsed) || isShortYear(parsed, options)) {
|
|
30663
|
+
return null;
|
|
30664
|
+
}
|
|
30665
|
+
return timeZone === null ? parsed : new Date(parsed.getTime());
|
|
30666
|
+
};
|
|
30667
|
+
/** Formats a `Date` with a date-fns format string. Invalid dates yield `null`. */
|
|
30668
|
+
const formatDateValue = (date, options) => {
|
|
30669
|
+
if (!isValid(date)) {
|
|
30670
|
+
return null;
|
|
30671
|
+
}
|
|
30672
|
+
const locale = options.locale;
|
|
30673
|
+
return format(date, options.format, locale ? { locale } : undefined);
|
|
30674
|
+
};
|
|
30675
|
+
|
|
30676
|
+
/** The `displayFormat` a precision implies, when the consumer has not named one. */
|
|
30677
|
+
const displayFormatForPrecision = (precision, locale) => {
|
|
30678
|
+
if (precision === 'day') {
|
|
30679
|
+
return 'P';
|
|
30680
|
+
}
|
|
30681
|
+
if (precision === 'year') {
|
|
30682
|
+
return 'yyyy';
|
|
30683
|
+
}
|
|
30684
|
+
return monthYearFormat(locale?.formatLong?.date({ width: 'short' }) ?? 'MM/dd/yyyy');
|
|
30685
|
+
};
|
|
30686
|
+
const monthYearFormat = (shortDatePattern) => {
|
|
30687
|
+
const stripped = shortDatePattern.replace(/(?:[^a-zA-Z']+d+|d+[^a-zA-Z']+)/, '');
|
|
30688
|
+
if (stripped === shortDatePattern || /d/.test(stripped)) {
|
|
30689
|
+
return 'MM/yyyy';
|
|
30690
|
+
}
|
|
30691
|
+
return widenYearToken(stripped);
|
|
30692
|
+
};
|
|
30693
|
+
/** `y` / `yy` / `yyy` → `yyyy`, so the pattern is fixed-width and a mask can be derived from it. */
|
|
30694
|
+
const widenYearToken = (pattern) => pattern.replace(/y+/, 'yyyy');
|
|
30695
|
+
|
|
30696
|
+
const EXAMPLE_DATE = /* @__PURE__ */ new Date(2026, 6, 16, 21, 30, 0);
|
|
30697
|
+
/**
|
|
30698
|
+
* Dev mode only: warns once per control when a non-empty wire value does not parse against the
|
|
30699
|
+
* `valueFormat` in effect, since the field then renders blank. Call in an injection context.
|
|
30700
|
+
*/
|
|
30701
|
+
const warnOnUnparsedValue = (options) => {
|
|
30702
|
+
if (!ngDevMode)
|
|
30703
|
+
return;
|
|
30704
|
+
let warned = false;
|
|
30705
|
+
effect(() => {
|
|
30706
|
+
if (warned)
|
|
30707
|
+
return;
|
|
30708
|
+
const miss = options.readings().find((reading) => !!reading.value?.trim() && reading.parsed === null);
|
|
30709
|
+
if (!miss)
|
|
30710
|
+
return;
|
|
30711
|
+
warned = true;
|
|
30712
|
+
const format = options.format();
|
|
30713
|
+
const example = formatDateValue(EXAMPLE_DATE, { format, locale: options.locale() });
|
|
30714
|
+
console.warn(`[${options.selector}] The value "${miss.value}" does not match the valueFormat "${format}", so the field ` +
|
|
30715
|
+
`renders blank. A matching value looks like "${example}". Set valueFormat on the control or ` +
|
|
30716
|
+
`${options.formatProvider}() for the app.`);
|
|
30717
|
+
});
|
|
30718
|
+
};
|
|
30719
|
+
|
|
30219
30720
|
/** The day of `day` carrying the time of day of `time`. */
|
|
30220
30721
|
const withTimeOfDay = (day, time) => setSeconds(setMinutes(setHours(startOfDay(day), time.getHours()), time.getMinutes()), time.getSeconds());
|
|
30221
30722
|
|
|
@@ -31189,11 +31690,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
31189
31690
|
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], startPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "startPlaceholder", required: false }] }], endPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "endPlaceholder", required: false }] }], startAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAriaLabel", required: false }] }], endAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endAriaLabel", required: false }] }] } });
|
|
31190
31691
|
|
|
31191
31692
|
/** The preset state a range input shares with its styled component. Call in an injection context. */
|
|
31192
|
-
const createDateRangePresets = ({ host, presets, labels, normalize }) => {
|
|
31693
|
+
const createDateRangePresets = ({ host, presets, labels, firstDayOfWeek, normalize, }) => {
|
|
31193
31694
|
const resolveInstants = (preset) => {
|
|
31194
31695
|
const timeZone = host.effectiveTimeZone();
|
|
31195
31696
|
const now = timeZone === null ? new Date() : zonedProxy(new Date(), timeZone);
|
|
31196
|
-
const
|
|
31697
|
+
const locale = host.effectiveLocale();
|
|
31698
|
+
const range = preset.resolve(now, {
|
|
31699
|
+
locale,
|
|
31700
|
+
weekStartsOn: firstDayOfWeek() ?? locale?.options?.weekStartsOn ?? 1,
|
|
31701
|
+
});
|
|
31197
31702
|
return {
|
|
31198
31703
|
start: reinterpretInZone(normalize(range.start), timeZone),
|
|
31199
31704
|
end: reinterpretInZone(normalize(range.end), timeZone),
|
|
@@ -31326,6 +31831,7 @@ class DateRangeInputDirective extends DateRangePickerInputDirective {
|
|
|
31326
31831
|
host: this,
|
|
31327
31832
|
presets: this.presets,
|
|
31328
31833
|
labels: this.dateTimeLabels,
|
|
31834
|
+
firstDayOfWeek: this.firstDayOfWeek,
|
|
31329
31835
|
normalize: (date) => startOfCalendarUnit(date, this.precision()),
|
|
31330
31836
|
});
|
|
31331
31837
|
/** The format in effect: this instance's `displayFormat`, else the one `precision` implies. */
|
|
@@ -31548,7 +32054,10 @@ const dayRange = (start, end) => ({
|
|
|
31548
32054
|
start: startOfDay(start),
|
|
31549
32055
|
end: endOfDayMinute(end),
|
|
31550
32056
|
});
|
|
31551
|
-
const weekOptions = ({ locale }) => (
|
|
32057
|
+
const weekOptions = ({ locale, weekStartsOn }) => ({
|
|
32058
|
+
locale: locale ?? undefined,
|
|
32059
|
+
weekStartsOn: weekStartsOn ?? locale?.options?.weekStartsOn ?? 1,
|
|
32060
|
+
});
|
|
31552
32061
|
const createPreset = ({ defaultLabel, resolve, options }) => ({
|
|
31553
32062
|
label: options.label ?? defaultLabel,
|
|
31554
32063
|
resolve,
|
|
@@ -31573,7 +32082,7 @@ const nextDaysPreset = (count, options = {}) => createPreset({
|
|
|
31573
32082
|
resolve: (now) => dayRange(addDays(now, 1), addDays(now, Math.max(1, count))),
|
|
31574
32083
|
options,
|
|
31575
32084
|
});
|
|
31576
|
-
/** The current week, starting on the
|
|
32085
|
+
/** The current week, starting on the first day of the control's calendar rows. */
|
|
31577
32086
|
const thisWeekPreset = (options = {}) => createPreset({
|
|
31578
32087
|
defaultLabel: (labels) => labels.presetThisWeek,
|
|
31579
32088
|
resolve: (now, context) => dayRange(startOfWeek(now, weekOptions(context)), endOfWeek(now, weekOptions(context))),
|
|
@@ -31613,6 +32122,14 @@ const DATE_TIME_INPUT_ERROR_CODES = {
|
|
|
31613
32122
|
};
|
|
31614
32123
|
|
|
31615
32124
|
const secondsOfDay$1 = (date) => date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();
|
|
32125
|
+
/**
|
|
32126
|
+
* The start of `date`'s day, or of the same weekday a week earlier when the runtime's clocks change on it,
|
|
32127
|
+
* so every wall-clock time exists on the returned day.
|
|
32128
|
+
*/
|
|
32129
|
+
const clockSafeDay = (date) => {
|
|
32130
|
+
const day = startOfDay(date);
|
|
32131
|
+
return day.getTimezoneOffset() === endOfDay(day).getTimezoneOffset() ? day : subWeeks(day, 1);
|
|
32132
|
+
};
|
|
31616
32133
|
const setTimeOfDay = (day, candidate) => setSeconds(setMinutes(setHours(day, candidate.hour), candidate.minute), candidate.second);
|
|
31617
32134
|
const isTimeSelectable = (candidate, options) => {
|
|
31618
32135
|
const { min, max, filter, day } = options;
|
|
@@ -31782,7 +32299,19 @@ const DEFAULT_TIME_PICKER_LABELS = {
|
|
|
31782
32299
|
durationMinutes: 'min',
|
|
31783
32300
|
endsNextDay: 'ends next day',
|
|
31784
32301
|
};
|
|
31785
|
-
|
|
32302
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
32303
|
+
const GERMAN_TIME_PICKER_LABELS = {
|
|
32304
|
+
time: 'Uhrzeit',
|
|
32305
|
+
startTime: 'Startzeit',
|
|
32306
|
+
endTime: 'Endzeit',
|
|
32307
|
+
emptyHint: 'Uhrzeit wählen',
|
|
32308
|
+
durationHours: 'Std',
|
|
32309
|
+
durationMinutes: 'Min',
|
|
32310
|
+
endsNextDay: 'endet am nächsten Tag',
|
|
32311
|
+
};
|
|
32312
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideTimePickerLabels}. */
|
|
32313
|
+
const timePickerLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_TIME_PICKER_LABELS : DEFAULT_TIME_PICKER_LABELS;
|
|
32314
|
+
const TIME_PICKER_LABELS_DEF = /* @__PURE__ */ defineLabels('TIME_PICKER_LABELS', timePickerLabelsForLocale);
|
|
31786
32315
|
/**
|
|
31787
32316
|
* Localize the time picker's strings for everything below this injector, and read the set in effect here as a
|
|
31788
32317
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_TIME_PICKER_LABELS} value. See {@link defineLabels}
|
|
@@ -31804,7 +32333,7 @@ class TimePickerDirective {
|
|
|
31804
32333
|
constructor() {
|
|
31805
32334
|
this.timePickerLabels = injectTimePickerLabels();
|
|
31806
32335
|
this.defaultFormat = injectTimeFormat();
|
|
31807
|
-
this.defaultLocale =
|
|
32336
|
+
this.defaultLocale = injectDateLocaleSignal();
|
|
31808
32337
|
this.hostElement = injectHostElement();
|
|
31809
32338
|
/** Blocks every change: a press, a drag and the keys leave the time alone. */
|
|
31810
32339
|
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
@@ -31873,7 +32402,7 @@ class TimePickerDirective {
|
|
|
31873
32402
|
...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
|
|
31874
32403
|
this.effectiveFormat = computed(() => this.format() ?? this.defaultFormat, /* @ts-ignore */
|
|
31875
32404
|
...(ngDevMode ? [{ debugName: "effectiveFormat" }] : /* istanbul ignore next */ []));
|
|
31876
|
-
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale, /* @ts-ignore */
|
|
32405
|
+
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale(), /* @ts-ignore */
|
|
31877
32406
|
...(ngDevMode ? [{ debugName: "effectiveLocale" }] : /* istanbul ignore next */ []));
|
|
31878
32407
|
this.formatSpec = computed(() => deriveTimeFormatSpec({ format: this.effectiveFormat(), locale: this.effectiveLocale() }), /* @ts-ignore */
|
|
31879
32408
|
...(ngDevMode ? [{ debugName: "formatSpec" }] : /* istanbul ignore next */ []));
|
|
@@ -31885,9 +32414,11 @@ class TimePickerDirective {
|
|
|
31885
32414
|
return spec.hourCycle === 12 ? `h:mm${spec.showSeconds ? ':ss' : ''} a` : `HH:mm${spec.showSeconds ? ':ss' : ''}`;
|
|
31886
32415
|
}, /* @ts-ignore */
|
|
31887
32416
|
...(ngDevMode ? [{ debugName: "sideFormat" }] : /* istanbul ignore next */ []));
|
|
31888
|
-
this.
|
|
32417
|
+
this.emptyRingDay = computed(() => clockSafeDay(this.now()), /* @ts-ignore */
|
|
32418
|
+
...(ngDevMode ? [{ debugName: "emptyRingDay" }] : /* istanbul ignore next */ []));
|
|
32419
|
+
this.startRingDay = computed(() => startOfDay(this.ringValue('start') ?? this.emptyRingDay()).getTime(), /* @ts-ignore */
|
|
31889
32420
|
...(ngDevMode ? [{ debugName: "startRingDay" }] : /* istanbul ignore next */ []));
|
|
31890
|
-
this.endRingDay = computed(() => startOfDay(this.ringValue('end') ?? this.
|
|
32421
|
+
this.endRingDay = computed(() => startOfDay(this.ringValue('end') ?? this.emptyRingDay()).getTime(), /* @ts-ignore */
|
|
31891
32422
|
...(ngDevMode ? [{ debugName: "endRingDay" }] : /* istanbul ignore next */ []));
|
|
31892
32423
|
this.sameDayRange = computed(() => {
|
|
31893
32424
|
const days = this.rangeDays();
|
|
@@ -31938,7 +32469,7 @@ class TimePickerDirective {
|
|
|
31938
32469
|
return false;
|
|
31939
32470
|
}
|
|
31940
32471
|
const current = this.ringValue(side);
|
|
31941
|
-
const next = setMilliseconds(setTimeOfDay(current ??
|
|
32472
|
+
const next = setMilliseconds(setTimeOfDay(current ?? this.emptyRingDay(), {
|
|
31942
32473
|
hour: Math.floor(minute / 60),
|
|
31943
32474
|
minute: minute % 60,
|
|
31944
32475
|
second: 0,
|
|
@@ -33302,10 +33833,7 @@ const createPickerPanes = (order, pickerOpen) => {
|
|
|
33302
33833
|
* The day time-only values are read on: today, or the same weekday a week earlier when the
|
|
33303
33834
|
* runtime's clocks change today, so every wall-clock time exists on it.
|
|
33304
33835
|
*/
|
|
33305
|
-
const timeReferenceDay = () =>
|
|
33306
|
-
const today = startOfDay(new Date());
|
|
33307
|
-
return today.getTimezoneOffset() === endOfDay(today).getTimezoneOffset() ? today : subWeeks(today, 1);
|
|
33308
|
-
};
|
|
33836
|
+
const timeReferenceDay = () => clockSafeDay(new Date());
|
|
33309
33837
|
const MERIDIEM_PATTERN = /\s*([ap])\.?\s*(?:m\.?)?$/i;
|
|
33310
33838
|
const SEPARATED_PATTERN = /^(\d{1,2})(?:[:.\s](\d{1,2})(?:[:.\s](\d{1,2}))?)?$/;
|
|
33311
33839
|
const COMPACT_PATTERN = /^\d{3,6}$/;
|
|
@@ -33988,6 +34516,7 @@ class DateTimeRangeInputDirective extends DateRangePickerInputDirective {
|
|
|
33988
34516
|
host: this,
|
|
33989
34517
|
presets: this.presets,
|
|
33990
34518
|
labels: this.dateTimeLabels,
|
|
34519
|
+
firstDayOfWeek: this.firstDayOfWeek,
|
|
33991
34520
|
normalize: (date) => date,
|
|
33992
34521
|
});
|
|
33993
34522
|
/** The two days the picker calendar highlights - committed, else picked with no time yet. */
|
|
@@ -34385,22 +34914,23 @@ const dateTimeRangeOrder = (path, options = {}) => rangeOrder({
|
|
|
34385
34914
|
*/
|
|
34386
34915
|
const timeRangeOrder = (path, options = {}) => rangeOrder({ path, valueFormat: options.valueFormat ?? inject(TIME_FORMAT), options });
|
|
34387
34916
|
const resolveBound = (bound, ctx) => typeof bound === 'function' ? bound(ctx) : (bound ?? null);
|
|
34388
|
-
const bounds = ({ path, sidesOf, valueFormat, options, unit, label }) => {
|
|
34917
|
+
const bounds = ({ path, sidesOf, valueFormat, options, unit, onZoneCalendar, label }) => {
|
|
34389
34918
|
const labels = injectDateTimeLabels();
|
|
34390
|
-
const locale =
|
|
34919
|
+
const locale = injectDateLocaleSignal();
|
|
34391
34920
|
const timeZone = knownTimeZone(options.timeZone);
|
|
34392
|
-
const formatBound = (bound) => formatInZone(bound, { format: label, locale, timeZone }) ?? '';
|
|
34921
|
+
const formatBound = (bound) => formatInZone(bound, { format: label(locale()), locale: locale(), timeZone }) ?? '';
|
|
34922
|
+
const unitOf = (date) => unit(onZoneCalendar && timeZone !== null ? zonedProxy(date, timeZone) : date).getTime();
|
|
34393
34923
|
validate(path, (ctx) => {
|
|
34394
34924
|
const sides = sidesOf(ctx.value())
|
|
34395
34925
|
.map((side) => parseSide(side, { valueFormat, timeZone }))
|
|
34396
34926
|
.filter((side) => side !== null)
|
|
34397
|
-
.map(
|
|
34927
|
+
.map(unitOf);
|
|
34398
34928
|
const min = resolveBound(options.min, ctx);
|
|
34399
34929
|
const max = resolveBound(options.max, ctx);
|
|
34400
|
-
if (min !== null && sides.some((side) => side <
|
|
34930
|
+
if (min !== null && sides.some((side) => side < unitOf(min))) {
|
|
34401
34931
|
return { kind: 'rangeMin', min, message: options.message ?? labels().rangeMin(formatBound(min)) };
|
|
34402
34932
|
}
|
|
34403
|
-
if (max !== null && sides.some((side) => side >
|
|
34933
|
+
if (max !== null && sides.some((side) => side > unitOf(max))) {
|
|
34404
34934
|
return { kind: 'rangeMax', max, message: options.message ?? labels().rangeMax(formatBound(max)) };
|
|
34405
34935
|
}
|
|
34406
34936
|
return undefined;
|
|
@@ -34426,9 +34956,10 @@ const dateRangeBounds = (path, options) => {
|
|
|
34426
34956
|
rangeBounds({
|
|
34427
34957
|
path,
|
|
34428
34958
|
valueFormat: options.valueFormat ?? inject(DATE_FORMAT),
|
|
34429
|
-
options,
|
|
34959
|
+
options: withControlTimeZone(options),
|
|
34430
34960
|
unit: (date) => startOfCalendarUnit(date, precision),
|
|
34431
|
-
|
|
34961
|
+
onZoneCalendar: true,
|
|
34962
|
+
label: (locale) => displayFormatForPrecision(precision, locale),
|
|
34432
34963
|
});
|
|
34433
34964
|
};
|
|
34434
34965
|
/**
|
|
@@ -34446,7 +34977,7 @@ const dateTimeRangeBounds = (path, options) => rangeBounds({
|
|
|
34446
34977
|
valueFormat: options.valueFormat ?? inject(DATE_TIME_FORMAT),
|
|
34447
34978
|
options: withControlTimeZone(options),
|
|
34448
34979
|
unit: (date) => date,
|
|
34449
|
-
label: 'Pp',
|
|
34980
|
+
label: () => 'Pp',
|
|
34450
34981
|
});
|
|
34451
34982
|
/**
|
|
34452
34983
|
* Signal-forms validator for `et-date-input`: fails the value while it lies before `min` or after
|
|
@@ -34468,9 +34999,10 @@ const dateBounds = (path, options = {}) => {
|
|
|
34468
34999
|
path,
|
|
34469
35000
|
sidesOf: (value) => [value],
|
|
34470
35001
|
valueFormat: options.valueFormat ?? inject(DATE_FORMAT),
|
|
34471
|
-
options,
|
|
35002
|
+
options: withControlTimeZone(options),
|
|
34472
35003
|
unit: (date) => startOfCalendarUnit(date, precision),
|
|
34473
|
-
|
|
35004
|
+
onZoneCalendar: true,
|
|
35005
|
+
label: (locale) => displayFormatForPrecision(precision, locale),
|
|
34474
35006
|
});
|
|
34475
35007
|
};
|
|
34476
35008
|
/**
|
|
@@ -34489,14 +35021,14 @@ const dateTimeBounds = (path, options = {}) => bounds({
|
|
|
34489
35021
|
valueFormat: options.valueFormat ?? inject(DATE_TIME_FORMAT),
|
|
34490
35022
|
options: withControlTimeZone(options),
|
|
34491
35023
|
unit: (date) => date,
|
|
34492
|
-
label: 'Pp',
|
|
35024
|
+
label: () => 'Pp',
|
|
34493
35025
|
});
|
|
34494
35026
|
const secondsOfDay = (date) => date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();
|
|
34495
35027
|
const timeOfDayBounds = ({ path, sidesOf, options }) => {
|
|
34496
35028
|
const labels = injectDateTimeLabels();
|
|
34497
|
-
const locale =
|
|
35029
|
+
const locale = injectDateLocaleSignal();
|
|
34498
35030
|
const valueFormat = options.valueFormat ?? inject(TIME_FORMAT);
|
|
34499
|
-
const formatBound = (bound) => formatInZone(bound, { format: 'p', locale, timeZone: null }) ?? '';
|
|
35031
|
+
const formatBound = (bound) => formatInZone(bound, { format: 'p', locale: locale(), timeZone: null }) ?? '';
|
|
34500
35032
|
const minError = (min) => ({
|
|
34501
35033
|
kind: 'rangeMin',
|
|
34502
35034
|
min,
|
|
@@ -35607,7 +36139,24 @@ const DEFAULT_DROPZONE_LABELS = {
|
|
|
35607
36139
|
tooManyFiles: (fileName) => `"${fileName}" was not added (only one file is allowed).`,
|
|
35608
36140
|
uploading: (count) => (count === 1 ? 'Uploading 1 file' : `Uploading ${count} files`),
|
|
35609
36141
|
};
|
|
35610
|
-
|
|
36142
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
36143
|
+
const GERMAN_DROPZONE_LABELS = {
|
|
36144
|
+
prompt: 'Per Drag & Drop ablegen oder zum Durchsuchen klicken',
|
|
36145
|
+
empty: 'Keine Dateien',
|
|
36146
|
+
retry: 'Erneut versuchen',
|
|
36147
|
+
remove: 'Entfernen',
|
|
36148
|
+
replaceFile: 'Datei ersetzen',
|
|
36149
|
+
uploadFailed: 'konnte nicht hochgeladen werden',
|
|
36150
|
+
uploadFailedMessage: ({ fileName, serverMessage, uploadFailed }) => serverMessage ? `"${fileName}": ${serverMessage}` : `"${fileName}" ${uploadFailed}.`,
|
|
36151
|
+
unsupportedFileType: (fileName) => `"${fileName}" hat einen nicht unterstützten Dateityp.`,
|
|
36152
|
+
fileTooLarge: (fileName, maxFileSize) => `"${fileName}" ist zu groß${maxFileSize !== undefined ? ` (max. ${formatFileSize(maxFileSize)})` : ''}.`,
|
|
36153
|
+
fileTooSmall: (fileName, minFileSize) => `"${fileName}" ist zu klein${minFileSize !== undefined ? ` (min. ${formatFileSize(minFileSize)})` : ''}.`,
|
|
36154
|
+
tooManyFiles: (fileName) => `"${fileName}" wurde nicht hinzugefügt (nur eine Datei erlaubt).`,
|
|
36155
|
+
uploading: (count) => (count === 1 ? '1 Datei wird hochgeladen' : `${count} Dateien werden hochgeladen`),
|
|
36156
|
+
};
|
|
36157
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideDropzoneLabels}. */
|
|
36158
|
+
const dropzoneLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_DROPZONE_LABELS : DEFAULT_DROPZONE_LABELS;
|
|
36159
|
+
const DROPZONE_LABELS_DEF = /* @__PURE__ */ defineLabels('DROPZONE_LABELS', dropzoneLabelsForLocale);
|
|
35611
36160
|
/**
|
|
35612
36161
|
* Localize the dropzone's strings for everything below this injector, and read the set in effect here as a
|
|
35613
36162
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_DROPZONE_LABELS} value. See {@link defineLabels}
|
|
@@ -35687,7 +36236,9 @@ const DROPZONE_FILE_CONSTRAINTS = /* @__PURE__ */ createManagedMetadataKey((_sta
|
|
|
35687
36236
|
constraints: data,
|
|
35688
36237
|
rejections: signal([]),
|
|
35689
36238
|
labels: signal(DEFAULT_DROPZONE_LABELS),
|
|
36239
|
+
effectiveConstraints: signal(undefined),
|
|
35690
36240
|
}));
|
|
36241
|
+
/** @internal */
|
|
35691
36242
|
const rejectionMessage = (rejection, context) => {
|
|
35692
36243
|
const name = rejection.file.name;
|
|
35693
36244
|
const { constraints, labels } = context;
|
|
@@ -35732,7 +36283,7 @@ const dropzoneFiles = (path, constraints) => {
|
|
|
35732
36283
|
return channel.rejections().map((rejection) => ({
|
|
35733
36284
|
kind: DROPZONE_FILES_ERROR_KIND,
|
|
35734
36285
|
message: currentConstraints?.message?.(rejection) ??
|
|
35735
|
-
rejectionMessage(rejection, { constraints: currentConstraints, labels }),
|
|
36286
|
+
rejectionMessage(rejection, { constraints: channel.effectiveConstraints() ?? currentConstraints, labels }),
|
|
35736
36287
|
}));
|
|
35737
36288
|
});
|
|
35738
36289
|
};
|
|
@@ -35831,6 +36382,10 @@ class DropzoneDirective extends FieldStateControlDirective {
|
|
|
35831
36382
|
return state?.metadata(DROPZONE_FILE_CONSTRAINTS) ?? null;
|
|
35832
36383
|
}, /* @ts-ignore */
|
|
35833
36384
|
...(ngDevMode ? [{ debugName: "fileValidation" }] : /* istanbul ignore next */ []));
|
|
36385
|
+
/** The rejections no bound `dropzoneFiles()` rule turns into field errors - the dropzone reports these itself. */
|
|
36386
|
+
this.unhandledRejections = computed(() => (this.fileValidation() ? [] : this.lastRejections()), /* @ts-ignore */
|
|
36387
|
+
...(ngDevMode ? [{ debugName: "unhandledRejections" }] : /* istanbul ignore next */ []));
|
|
36388
|
+
/** @internal */
|
|
35834
36389
|
this.fileConstraints = computed(() => {
|
|
35835
36390
|
const schema = this.fileValidation()?.constraints();
|
|
35836
36391
|
return {
|
|
@@ -35875,6 +36430,11 @@ class DropzoneDirective extends FieldStateControlDirective {
|
|
|
35875
36430
|
const labels = this.dropzoneLabels();
|
|
35876
36431
|
untracked(() => channel?.labels.set(labels));
|
|
35877
36432
|
});
|
|
36433
|
+
effect(() => {
|
|
36434
|
+
const channel = this.fileValidation();
|
|
36435
|
+
const constraints = this.fileConstraints();
|
|
36436
|
+
untracked(() => channel?.effectiveConstraints.set(constraints));
|
|
36437
|
+
});
|
|
35878
36438
|
effect(() => {
|
|
35879
36439
|
const incoming = this.value();
|
|
35880
36440
|
untracked(() => this.reconcileValue(incoming));
|
|
@@ -36259,6 +36819,11 @@ class DropzoneComponent {
|
|
|
36259
36819
|
messages.push(this.uploadErrorMessage()?.(entry) ?? this.defaultUploadErrorMessage(entry));
|
|
36260
36820
|
}
|
|
36261
36821
|
}
|
|
36822
|
+
const labels = this.resolvedLabels();
|
|
36823
|
+
const constraints = this.dropzoneDir.fileConstraints();
|
|
36824
|
+
for (const rejection of this.dropzoneDir.unhandledRejections()) {
|
|
36825
|
+
messages.push(rejectionMessage(rejection, { constraints, labels }));
|
|
36826
|
+
}
|
|
36262
36827
|
return messages;
|
|
36263
36828
|
}, /* @ts-ignore */
|
|
36264
36829
|
...(ngDevMode ? [{ debugName: "internalErrorMessages" }] : /* istanbul ignore next */ []));
|
|
@@ -36739,22 +37304,25 @@ class CounterComponent {
|
|
|
36739
37304
|
* The limit to count towards. Wins over the schema's `maxLength()` - use it for a control whose
|
|
36740
37305
|
* length isn't schema-validated, or to count towards a softer limit than the one that validates.
|
|
36741
37306
|
*/
|
|
36742
|
-
this.max = input(undefined, /*
|
|
36743
|
-
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
37307
|
+
this.max = input(undefined, { ...(ngDevMode ? { debugName: "max" } : /* istanbul ignore next */ {}), transform: optionalNumberAttribute$1 });
|
|
36744
37308
|
/** Measures the control's value. Override for a value type the default can't count. */
|
|
36745
37309
|
this.lengthOf = input(defaultLengthOf, /* @ts-ignore */
|
|
36746
37310
|
...(ngDevMode ? [{ debugName: "lengthOf" }] : /* istanbul ignore next */ []));
|
|
36747
37311
|
/** The limit actually in effect: the explicit `[max]`, else the bound field's `maxLength()`. */
|
|
36748
37312
|
this.resolvedMax = computed(() => this.max() ?? this.formField?.controlMaxLength(), /* @ts-ignore */
|
|
36749
37313
|
...(ngDevMode ? [{ debugName: "resolvedMax" }] : /* istanbul ignore next */ []));
|
|
36750
|
-
|
|
36751
|
-
|
|
37314
|
+
this.controlMixed = computed(() => this.formField?.registeredControl()?.mixed?.() ?? false, /* @ts-ignore */
|
|
37315
|
+
...(ngDevMode ? [{ debugName: "controlMixed" }] : /* istanbul ignore next */ []));
|
|
37316
|
+
/** The current length of the control's value - `0` while mixed, so the hidden raw value never shows. */
|
|
37317
|
+
this.current = computed(() => (this.controlMixed() ? 0 : this.lengthOf()(this.formField?.controlValue() ?? null)), /* @ts-ignore */
|
|
36752
37318
|
...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
|
|
36753
37319
|
/**
|
|
36754
37320
|
* Whether the value is past the limit. With a schema `maxLength()` this is the control's own
|
|
36755
37321
|
* validation error.
|
|
36756
37322
|
*/
|
|
36757
37323
|
this.isOverLimit = computed(() => {
|
|
37324
|
+
if (this.controlMixed())
|
|
37325
|
+
return false;
|
|
36758
37326
|
const explicitMax = this.max();
|
|
36759
37327
|
if (explicitMax !== undefined) {
|
|
36760
37328
|
return this.current() > explicitMax;
|
|
@@ -36948,7 +37516,7 @@ class NumberInputComponent {
|
|
|
36948
37516
|
.subscribe();
|
|
36949
37517
|
}
|
|
36950
37518
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
36951
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: NumberInputComponent, isStandalone: true, selector: "et-number-input", inputs: { stepper: { classPropertyName: "stepper", publicName: "stepper", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "numberInputDir.activate()" }, properties: { "attr.data-stepper": "stepper() || null" }, classAttribute: "et-number-input" }, providers: [provideIcons(MINUS_ICON, PLUS_ICON)], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true, isSignal: true }], hostDirectives: [{ directive: NumberInputDirective, inputs: ["min", "min", "max", "max", "step", "step", "decimals", "decimals", "parseErrorMessage", "parseErrorMessage", "placeholder", "placeholder", "autocomplete", "autocomplete", "textAlign", "textAlign", "value", "value", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<input\n #nativeInput\n [
|
|
37519
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: NumberInputComponent, isStandalone: true, selector: "et-number-input", inputs: { stepper: { classPropertyName: "stepper", publicName: "stepper", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "numberInputDir.activate()" }, properties: { "attr.data-stepper": "stepper() || null" }, classAttribute: "et-number-input" }, providers: [provideIcons(MINUS_ICON, PLUS_ICON)], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true, isSignal: true }], hostDirectives: [{ directive: NumberInputDirective, inputs: ["min", "min", "max", "max", "step", "step", "decimals", "decimals", "parseErrorMessage", "parseErrorMessage", "placeholder", "placeholder", "autocomplete", "autocomplete", "textAlign", "textAlign", "value", "value", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<input\n #nativeInput\n [disabled]=\"numberInputDir.disabled()\"\n [readOnly]=\"numberInputDir.readonly()\"\n [required]=\"numberInputDir.required()\"\n [placeholder]=\"numberInputDir.effectivePlaceholder()\"\n [attr.autocomplete]=\"numberInputDir.autocomplete() || null\"\n [attr.min]=\"numberInputDir.min() ?? null\"\n [attr.max]=\"numberInputDir.max() ?? null\"\n [attr.step]=\"numberInputDir.step() ?? null\"\n [attr.inputmode]=\"numberInputDir.inputMode()\"\n [attr.name]=\"numberInputDir.name() || null\"\n [attr.aria-invalid]=\"numberInputDir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"numberInputDir.describedBy() || null\"\n [attr.aria-label]=\"numberInputDir.ariaLabel() || null\"\n [attr.aria-labelledby]=\"numberInputDir.labelId() || null\"\n [attr.data-text-align]=\"numberInputDir.textAlign()\"\n (focus)=\"numberInputDir.focused.set(true)\"\n (blur)=\"numberInputDir.focused.set(false); numberInputDir.touched.set(true); numberInputDir.normalizeNativeText()\"\n class=\"et-number-input-native\"\n type=\"number\"\n/>\n\n@if (stepper()) {\n <div class=\"et-number-input-stepper\">\n <button\n [attr.aria-label]=\"resolvedDecrementLabel()\"\n [disabled]=\"!numberInputDir.canStepDown()\"\n (pointerdown)=\"startStepRepeat($event, -1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-minus\"></i>\n </button>\n <button\n [attr.aria-label]=\"resolvedIncrementLabel()\"\n [disabled]=\"!numberInputDir.canStepUp()\"\n (pointerdown)=\"startStepRepeat($event, 1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-plus\"></i>\n </button>\n </div>\n}\n", styles: ["@layer components{html.et-number-input-scrubbing,html.et-number-input-scrubbing *{cursor:ew-resize!important}@property --et-number-input-stepper-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}et-number-input{display:block;flex:1;min-inline-size:0;color:inherit}et-number-input[data-stepper]{display:flex;align-items:center;gap:8px}et-number-input .et-number-input-stepper{display:flex;align-items:center;gap:2px;flex:none}et-number-input .et-number-input-stepper-button{display:flex;align-items:center;justify-content:center;flex:none;inline-size:calc(var(--et-number-input-stepper-size) + 8px);block-size:calc(var(--et-number-input-stepper-size) + 8px);padding:0;border:none;border-radius:4px;background:transparent;color:var(--et-surface-color-muted-solid, currentColor);cursor:pointer;outline:none;touch-action:none}@media(pointer:fine){et-number-input .et-number-input-stepper-button{cursor:ew-resize}}et-number-input .et-number-input-stepper-button .et-icon{inline-size:var(--et-number-input-stepper-size);block-size:var(--et-number-input-stepper-size)}@media(hover:hover){et-number-input .et-number-input-stepper-button:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}et-number-input .et-number-input-stepper-button:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 20%,transparent)}et-number-input .et-number-input-stepper-button:disabled{cursor:default;background:transparent;color:inherit;opacity:.4}et-number-input .et-number-input-native{display:block;inline-size:100%;border:none;outline:none;background:transparent;font:inherit;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);padding:0;min-width:0;appearance:textfield}et-number-input .et-number-input-native::-webkit-outer-spin-button,et-number-input .et-number-input-native::-webkit-inner-spin-button{appearance:none;margin:0}et-number-input .et-number-input-native:not(:focus){overflow:hidden;text-overflow:ellipsis}et-number-input .et-number-input-native::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-number-input .et-number-input-native[data-text-align=start]{text-align:start}et-number-input .et-number-input-native[data-text-align=center]{text-align:center}et-number-input .et-number-input-native[data-text-align=end]{text-align:end}et-number-input[data-mixed] .et-number-input-native::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"], dependencies: [{ kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
36952
37520
|
}
|
|
36953
37521
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NumberInputComponent, decorators: [{
|
|
36954
37522
|
type: Component,
|
|
@@ -36974,7 +37542,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
36974
37542
|
class: 'et-number-input',
|
|
36975
37543
|
'[attr.data-stepper]': 'stepper() || null',
|
|
36976
37544
|
'(click)': 'numberInputDir.activate()',
|
|
36977
|
-
}, template: "<input\n #nativeInput\n [
|
|
37545
|
+
}, template: "<input\n #nativeInput\n [disabled]=\"numberInputDir.disabled()\"\n [readOnly]=\"numberInputDir.readonly()\"\n [required]=\"numberInputDir.required()\"\n [placeholder]=\"numberInputDir.effectivePlaceholder()\"\n [attr.autocomplete]=\"numberInputDir.autocomplete() || null\"\n [attr.min]=\"numberInputDir.min() ?? null\"\n [attr.max]=\"numberInputDir.max() ?? null\"\n [attr.step]=\"numberInputDir.step() ?? null\"\n [attr.inputmode]=\"numberInputDir.inputMode()\"\n [attr.name]=\"numberInputDir.name() || null\"\n [attr.aria-invalid]=\"numberInputDir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"numberInputDir.describedBy() || null\"\n [attr.aria-label]=\"numberInputDir.ariaLabel() || null\"\n [attr.aria-labelledby]=\"numberInputDir.labelId() || null\"\n [attr.data-text-align]=\"numberInputDir.textAlign()\"\n (focus)=\"numberInputDir.focused.set(true)\"\n (blur)=\"numberInputDir.focused.set(false); numberInputDir.touched.set(true); numberInputDir.normalizeNativeText()\"\n class=\"et-number-input-native\"\n type=\"number\"\n/>\n\n@if (stepper()) {\n <div class=\"et-number-input-stepper\">\n <button\n [attr.aria-label]=\"resolvedDecrementLabel()\"\n [disabled]=\"!numberInputDir.canStepDown()\"\n (pointerdown)=\"startStepRepeat($event, -1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-minus\"></i>\n </button>\n <button\n [attr.aria-label]=\"resolvedIncrementLabel()\"\n [disabled]=\"!numberInputDir.canStepUp()\"\n (pointerdown)=\"startStepRepeat($event, 1)\"\n (pointerup)=\"stopStepRepeat()\"\n (pointercancel)=\"stopStepRepeat()\"\n (lostpointercapture)=\"stopStepRepeat()\"\n class=\"et-number-input-stepper-button\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <i aria-hidden=\"true\" etIcon=\"et-plus\"></i>\n </button>\n </div>\n}\n", styles: ["@layer components{html.et-number-input-scrubbing,html.et-number-input-scrubbing *{cursor:ew-resize!important}@property --et-number-input-stepper-size{syntax: \"<length>\"; inherits: true; initial-value: 16px;}et-number-input{display:block;flex:1;min-inline-size:0;color:inherit}et-number-input[data-stepper]{display:flex;align-items:center;gap:8px}et-number-input .et-number-input-stepper{display:flex;align-items:center;gap:2px;flex:none}et-number-input .et-number-input-stepper-button{display:flex;align-items:center;justify-content:center;flex:none;inline-size:calc(var(--et-number-input-stepper-size) + 8px);block-size:calc(var(--et-number-input-stepper-size) + 8px);padding:0;border:none;border-radius:4px;background:transparent;color:var(--et-surface-color-muted-solid, currentColor);cursor:pointer;outline:none;touch-action:none}@media(pointer:fine){et-number-input .et-number-input-stepper-button{cursor:ew-resize}}et-number-input .et-number-input-stepper-button .et-icon{inline-size:var(--et-number-input-stepper-size);block-size:var(--et-number-input-stepper-size)}@media(hover:hover){et-number-input .et-number-input-stepper-button:hover{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 12%,transparent);color:var(--et-surface-color-solid, currentColor)}}et-number-input .et-number-input-stepper-button:active{background:color-mix(in srgb,var(--et-surface-interaction-solid, currentColor) 20%,transparent)}et-number-input .et-number-input-stepper-button:disabled{cursor:default;background:transparent;color:inherit;opacity:.4}et-number-input .et-number-input-native{display:block;inline-size:100%;border:none;outline:none;background:transparent;font:inherit;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);padding:0;min-width:0;appearance:textfield}et-number-input .et-number-input-native::-webkit-outer-spin-button,et-number-input .et-number-input-native::-webkit-inner-spin-button{appearance:none;margin:0}et-number-input .et-number-input-native:not(:focus){overflow:hidden;text-overflow:ellipsis}et-number-input .et-number-input-native::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-number-input .et-number-input-native[data-text-align=start]{text-align:start}et-number-input .et-number-input-native[data-text-align=center]{text-align:center}et-number-input .et-number-input-native[data-text-align=end]{text-align:end}et-number-input[data-mixed] .et-number-input-native::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}}\n"] }]
|
|
36978
37546
|
}], ctorParameters: () => [], propDecorators: { stepper: [{ type: i0.Input, args: [{ isSignal: true, alias: "stepper", required: false }] }], incrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "incrementLabel", required: false }] }], decrementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "decrementLabel", required: false }] }], nativeInput: [{ type: i0.ViewChild, args: ['nativeInput', { isSignal: true }] }] } });
|
|
36979
37547
|
|
|
36980
37548
|
class PasswordInputComponent {
|
|
@@ -37238,7 +37806,8 @@ const findLanguagesError = (languages) => {
|
|
|
37238
37806
|
* ```
|
|
37239
37807
|
*/
|
|
37240
37808
|
const requiredLanguages = (path, { codes, message }) => validate(path, ({ value }) => {
|
|
37241
|
-
const
|
|
37809
|
+
const record = value() ?? {};
|
|
37810
|
+
const missing = (typeof codes === 'function' ? codes() : codes).filter((code) => (record[code] ?? '').trim().length === 0);
|
|
37242
37811
|
if (missing.length === 0)
|
|
37243
37812
|
return undefined;
|
|
37244
37813
|
const text = typeof message === 'function' ? message(missing) : (message ?? `Missing translations: ${missing.join(', ')}`);
|
|
@@ -37315,7 +37884,79 @@ const DEFAULT_RICH_TEXT_EDITOR_LABELS = {
|
|
|
37315
37884
|
languageFilled: 'has content',
|
|
37316
37885
|
languageEmpty: 'empty',
|
|
37317
37886
|
};
|
|
37318
|
-
|
|
37887
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
37888
|
+
const GERMAN_RICH_TEXT_EDITOR_LABELS = {
|
|
37889
|
+
toolbar: 'Textformatierung',
|
|
37890
|
+
selectionToolbar: 'Formatierung der Auswahl',
|
|
37891
|
+
textStyle: (currentStyle) => `Textstil: ${currentStyle}`,
|
|
37892
|
+
paragraph: 'Normal',
|
|
37893
|
+
heading: (level) => `Überschrift ${level}`,
|
|
37894
|
+
linkEditor: 'Link bearbeiten',
|
|
37895
|
+
linkEditorEdit: 'Link bearbeiten',
|
|
37896
|
+
linkEditorAdd: 'Link hinzufügen',
|
|
37897
|
+
linkEditorClose: 'Schließen',
|
|
37898
|
+
linkTextLabel: 'Text',
|
|
37899
|
+
linkTextPlaceholder: 'Linktext',
|
|
37900
|
+
linkUrlLabel: 'URL',
|
|
37901
|
+
linkUrlPlaceholder: 'https://…',
|
|
37902
|
+
linkUrlUnsupported: 'Einen http(s)-, mailto- oder tel-Link verwenden',
|
|
37903
|
+
linkNewTab: 'In neuem Tab öffnen',
|
|
37904
|
+
linkRemove: 'Entfernen',
|
|
37905
|
+
linkAdd: 'Hinzufügen',
|
|
37906
|
+
linkUpdate: 'Aktualisieren',
|
|
37907
|
+
linkPrompt: 'Link-URL',
|
|
37908
|
+
imageEditor: 'Bild',
|
|
37909
|
+
imageEditorClose: 'Schließen',
|
|
37910
|
+
imageAltLabel: 'Alternativtext',
|
|
37911
|
+
imageAltPlaceholder: 'Das Bild beschreiben',
|
|
37912
|
+
imageAltHint: 'Leer lassen, wenn das Bild nur dekorativ ist',
|
|
37913
|
+
imageRemove: 'Entfernen',
|
|
37914
|
+
imageUpdate: 'Aktualisieren',
|
|
37915
|
+
imageUploading: 'Bild wird hochgeladen…',
|
|
37916
|
+
imageUploadFailed: 'Bild konnte nicht hochgeladen werden',
|
|
37917
|
+
insertToken: 'Platzhalter einfügen',
|
|
37918
|
+
noResults: 'Keine Ergebnisse',
|
|
37919
|
+
loadFailed: 'Etwas ist schiefgelaufen',
|
|
37920
|
+
tableSize: (rows, columns) => `${rows} mal ${columns}`,
|
|
37921
|
+
tableSizePreview: (rows, columns) => `${rows} × ${columns}`,
|
|
37922
|
+
tableInsert: 'Tabelle einfügen',
|
|
37923
|
+
tableInsertHeaderRow: 'Kopfzeile einfügen',
|
|
37924
|
+
tableInsertRowAbove: 'Zeile oberhalb einfügen',
|
|
37925
|
+
tableInsertRowBelow: 'Zeile unterhalb einfügen',
|
|
37926
|
+
tableInsertColumnLeft: 'Spalte links einfügen',
|
|
37927
|
+
tableInsertColumnRight: 'Spalte rechts einfügen',
|
|
37928
|
+
tableDeleteRow: 'Zeile löschen',
|
|
37929
|
+
tableDeleteColumn: 'Spalte löschen',
|
|
37930
|
+
tableDeleteTable: 'Tabelle löschen',
|
|
37931
|
+
undo: 'Rückgängig',
|
|
37932
|
+
redo: 'Wiederholen',
|
|
37933
|
+
bold: 'Fett',
|
|
37934
|
+
italic: 'Kursiv',
|
|
37935
|
+
strike: 'Durchgestrichen',
|
|
37936
|
+
underline: 'Unterstrichen',
|
|
37937
|
+
code: 'Inline-Code',
|
|
37938
|
+
bulletedList: 'Aufzählung',
|
|
37939
|
+
numberedList: 'Nummerierte Liste',
|
|
37940
|
+
blockquote: 'Zitat',
|
|
37941
|
+
codeBlock: 'Codeblock',
|
|
37942
|
+
link: 'Link',
|
|
37943
|
+
align: 'Ausrichtung',
|
|
37944
|
+
alignTrigger: 'Textausrichtung',
|
|
37945
|
+
alignLeft: 'Linksbündig',
|
|
37946
|
+
alignCenter: 'Zentriert',
|
|
37947
|
+
alignRight: 'Rechtsbündig',
|
|
37948
|
+
alignJustify: 'Blocksatz',
|
|
37949
|
+
table: 'Tabelle',
|
|
37950
|
+
image: 'Bild',
|
|
37951
|
+
language: 'Sprache',
|
|
37952
|
+
languageTrigger: (currentLanguage) => `Sprache: ${currentLanguage}`,
|
|
37953
|
+
languageMissing: (count) => (count === 1 ? '1 Sprache fehlt' : `${count} Sprachen fehlen`),
|
|
37954
|
+
languageFilled: 'hat Inhalt',
|
|
37955
|
+
languageEmpty: 'leer',
|
|
37956
|
+
};
|
|
37957
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideRichTextEditorLabels}. */
|
|
37958
|
+
const richTextEditorLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_RICH_TEXT_EDITOR_LABELS : DEFAULT_RICH_TEXT_EDITOR_LABELS;
|
|
37959
|
+
const RICH_TEXT_EDITOR_LABELS_DEF = /* @__PURE__ */ defineLabels('RICH_TEXT_EDITOR_LABELS', richTextEditorLabelsForLocale);
|
|
37319
37960
|
/**
|
|
37320
37961
|
* Localize the rich text editor's strings for everything below this injector, and read the set in
|
|
37321
37962
|
* effect here as a signal. Partial - whatever you leave out keeps its
|
|
@@ -39318,6 +39959,31 @@ const HTML_ATTRIBUTE = /(\s+)([^\s/>=]+)((?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?
|
|
|
39318
39959
|
const renameStyleAttribute = (attribute, ...[space, name, value]) => name?.toLowerCase() === 'style' ? `${space}${INERT_STYLE_ATTRIBUTE}${value}` : attribute;
|
|
39319
39960
|
const renameStyleAttributes = (html) => html.replace(HTML_START_TAG, (tag) => tag.replace(HTML_ATTRIBUTE, renameStyleAttribute));
|
|
39320
39961
|
const restoreStyleAttributes = (html) => html.replaceAll(` ${INERT_STYLE_ATTRIBUTE}="`, ' style="');
|
|
39962
|
+
const stripPastedAlignment = (body, renderer) => {
|
|
39963
|
+
// eslint-disable-next-line ethlete/no-dom-query -- parsed clipboard document, not the editor's DOM
|
|
39964
|
+
for (const el of body.querySelectorAll(`[${INERT_STYLE_ATTRIBUTE}], [class*="${ALIGN_CLASS_PREFIX}"]`)) {
|
|
39965
|
+
renderer.removeAttribute(el, INERT_STYLE_ATTRIBUTE);
|
|
39966
|
+
for (const name of [...el.classList]) {
|
|
39967
|
+
if (name.startsWith(ALIGN_CLASS_PREFIX))
|
|
39968
|
+
renderer.removeClass(el, name);
|
|
39969
|
+
}
|
|
39970
|
+
}
|
|
39971
|
+
};
|
|
39972
|
+
const takeTextBeforeCaret = (editable, text) => {
|
|
39973
|
+
if (!editable?.range.collapsed)
|
|
39974
|
+
return null;
|
|
39975
|
+
const { startContainer: node, startOffset: end } = editable.range;
|
|
39976
|
+
if (node.nodeType !== Node.TEXT_NODE || !node.data.slice(0, end).endsWith(text))
|
|
39977
|
+
return null;
|
|
39978
|
+
const start = end - text.length;
|
|
39979
|
+
node.deleteData(start, text.length);
|
|
39980
|
+
editable.selection.collapse(node, start);
|
|
39981
|
+
return () => {
|
|
39982
|
+
node.insertData(start, text);
|
|
39983
|
+
editable.selection.collapse(node, end);
|
|
39984
|
+
};
|
|
39985
|
+
};
|
|
39986
|
+
const AUTOFORMAT_CHARS = ' *_~`';
|
|
39321
39987
|
const collectTextNodes = (root) => {
|
|
39322
39988
|
const walker = root.ownerDocument.createTreeWalker(root, NodeFilter.SHOW_TEXT);
|
|
39323
39989
|
const nodes = [];
|
|
@@ -39543,7 +40209,7 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
39543
40209
|
const markdown = this.value() ?? '';
|
|
39544
40210
|
if (markdown === this.lastEmittedMarkdown)
|
|
39545
40211
|
return;
|
|
39546
|
-
this.renderExternalValue(markdown);
|
|
40212
|
+
untracked(() => this.renderExternalValue(markdown));
|
|
39547
40213
|
});
|
|
39548
40214
|
}
|
|
39549
40215
|
/**
|
|
@@ -39623,9 +40289,15 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
39623
40289
|
}
|
|
39624
40290
|
/** @internal Restarts the history: an outside write is a new document, so undo must not reach back into the previous one's states. */
|
|
39625
40291
|
renderExternalValue(markdown = this.value() ?? '') {
|
|
40292
|
+
const root = this.editorDom.root();
|
|
40293
|
+
const caret = root && root.ownerDocument.activeElement === root ? this.editorDom.readSelectionOffsets() : null;
|
|
39626
40294
|
if (!this.writeValueToDom(markdown))
|
|
39627
40295
|
return;
|
|
39628
40296
|
this.history.reset(markdown);
|
|
40297
|
+
this.pendingMarks.set(null);
|
|
40298
|
+
if (caret)
|
|
40299
|
+
this.editorDom.restoreSelectionOffsets(caret);
|
|
40300
|
+
this.refreshActiveMarks();
|
|
39629
40301
|
}
|
|
39630
40302
|
refreshActiveMarks() {
|
|
39631
40303
|
const pending = this.pendingMarks();
|
|
@@ -39811,6 +40483,8 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
39811
40483
|
const body = new DOMParser().parseFromString(renameStyleAttributes(html), 'text/html').body;
|
|
39812
40484
|
// eslint-disable-next-line ethlete/no-dom-query -- clipboard HTML (e.g. from Word) embeds <style> blocks whose CSS text would survive the tag-strip as plain text
|
|
39813
40485
|
body.querySelectorAll('style, script, noscript, meta, link, title').forEach((junk) => junk.remove());
|
|
40486
|
+
if (!this.toolDefs.has(RICH_TEXT_EDITOR_TOOLS.ALIGN))
|
|
40487
|
+
stripPastedAlignment(body, this.renderer);
|
|
39814
40488
|
if (this.editorDom.markStates()?.codeBlock)
|
|
39815
40489
|
return this.pasteIntoCodeBlock(clipboardPlainText(body));
|
|
39816
40490
|
const codec = this.tokenCodec();
|
|
@@ -39891,7 +40565,11 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
39891
40565
|
}
|
|
39892
40566
|
listenToEditable(element) {
|
|
39893
40567
|
const listeners = [
|
|
39894
|
-
this.renderer.listen(element, 'input', () =>
|
|
40568
|
+
this.renderer.listen(element, 'input', (event) => {
|
|
40569
|
+
if (!event.isComposing)
|
|
40570
|
+
this.syncFromDom();
|
|
40571
|
+
}),
|
|
40572
|
+
this.renderer.listen(element, 'compositionend', (event) => this.finishComposition(event.data)),
|
|
39895
40573
|
this.renderer.listen(element, 'beforeinput', (event) => this.interceptBeforeInput(event)),
|
|
39896
40574
|
this.renderer.listen(element, 'keydown', (event) => this.interceptKeydown(event)),
|
|
39897
40575
|
this.renderer.listen(element, 'paste', (event) => this.interceptPaste(event)),
|
|
@@ -39908,6 +40586,9 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
39908
40586
|
return () => listeners.forEach((off) => off());
|
|
39909
40587
|
}
|
|
39910
40588
|
interceptKeydown(event) {
|
|
40589
|
+
// The keystrokes of an IME composition (Safari reports its commit as Enter) belong to the IME.
|
|
40590
|
+
if (event.isComposing || event.keyCode === 229)
|
|
40591
|
+
return;
|
|
39911
40592
|
// History first, and always prevented: the native contenteditable undo stack must never run,
|
|
39912
40593
|
// since paste normalization and autoformat rewrite the DOM behind its back and it would restore
|
|
39913
40594
|
// a state the value model never had. Ctrl/Cmd+Z undoes, Ctrl+Y and Ctrl/Cmd+Shift+Z redo.
|
|
@@ -40057,6 +40738,7 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
40057
40738
|
this.redo();
|
|
40058
40739
|
break;
|
|
40059
40740
|
case 'insertText':
|
|
40741
|
+
case 'insertFromComposition':
|
|
40060
40742
|
if (event.data !== null && this.handleAutoformat(event.data)) {
|
|
40061
40743
|
event.preventDefault();
|
|
40062
40744
|
break;
|
|
@@ -40067,6 +40749,23 @@ class RichTextEditorDirective extends FieldStateControlDirective {
|
|
|
40067
40749
|
break;
|
|
40068
40750
|
}
|
|
40069
40751
|
}
|
|
40752
|
+
finishComposition(data) {
|
|
40753
|
+
if (!this.canEdit())
|
|
40754
|
+
return;
|
|
40755
|
+
const pending = this.pendingMarks();
|
|
40756
|
+
if (pending !== null && data && takeTextBeforeCaret(this.editorDom.getSelection(), data)) {
|
|
40757
|
+
this.pendingMarks.set(null);
|
|
40758
|
+
this.runCommand(() => this.editorDom.insertInlineText(data, pending));
|
|
40759
|
+
return;
|
|
40760
|
+
}
|
|
40761
|
+
const last = data.at(-1);
|
|
40762
|
+
const restore = last && AUTOFORMAT_CHARS.includes(last) && takeTextBeforeCaret(this.editorDom.getSelection(), last);
|
|
40763
|
+
if (restore && last && this.handleAutoformat(last))
|
|
40764
|
+
return;
|
|
40765
|
+
if (restore)
|
|
40766
|
+
restore();
|
|
40767
|
+
this.syncFromDom();
|
|
40768
|
+
}
|
|
40070
40769
|
warnAboutMissingTools() {
|
|
40071
40770
|
const warned = new Set();
|
|
40072
40771
|
effect(() => {
|
|
@@ -40865,6 +41564,8 @@ class RichTextEditorTriggersDirective {
|
|
|
40865
41564
|
this.openOrReposition();
|
|
40866
41565
|
}
|
|
40867
41566
|
interceptPopupKeys(event) {
|
|
41567
|
+
if (event.isComposing || event.keyCode === 229)
|
|
41568
|
+
return;
|
|
40868
41569
|
if (event.key === 'Backspace' && this.deletePrecedingChip()) {
|
|
40869
41570
|
event.preventDefault();
|
|
40870
41571
|
event.stopPropagation();
|
|
@@ -41483,7 +42184,9 @@ class MenuDirective {
|
|
|
41483
42184
|
if (this.parent?.openSubmenu() === this) {
|
|
41484
42185
|
this.parent.openSubmenu.set(null);
|
|
41485
42186
|
}
|
|
41486
|
-
this.overlayRef()
|
|
42187
|
+
const overlayRef = this.overlayRef();
|
|
42188
|
+
this.overlayRef.set(null);
|
|
42189
|
+
overlayRef?.close();
|
|
41487
42190
|
});
|
|
41488
42191
|
if (ngDevMode) {
|
|
41489
42192
|
afterNextRender(() => {
|
|
@@ -41636,7 +42339,8 @@ class MenuDirective {
|
|
|
41636
42339
|
case 'ArrowLeft': {
|
|
41637
42340
|
const opensSubmenu = (event.key === 'ArrowRight') !== this.isRtl();
|
|
41638
42341
|
if (opensSubmenu) {
|
|
41639
|
-
const
|
|
42342
|
+
const activeItem = this.activeItem();
|
|
42343
|
+
const submenu = activeItem && !activeItem.isDisabled() ? activeItem.submenu : null;
|
|
41640
42344
|
if (submenu) {
|
|
41641
42345
|
event.preventDefault();
|
|
41642
42346
|
submenu.show({ source: 'keyboard' });
|
|
@@ -41667,13 +42371,23 @@ class MenuDirective {
|
|
|
41667
42371
|
if (searchFocused) {
|
|
41668
42372
|
return;
|
|
41669
42373
|
}
|
|
42374
|
+
if (event.key === ' ' && !search && this.typeahead.isRunning()) {
|
|
42375
|
+
const match = this.findTypeaheadMatch(this.typeahead.append(event.key));
|
|
42376
|
+
event.preventDefault();
|
|
42377
|
+
if (match) {
|
|
42378
|
+
this.setActiveItem(match);
|
|
42379
|
+
}
|
|
42380
|
+
return;
|
|
42381
|
+
}
|
|
41670
42382
|
const item = this.activeItem();
|
|
41671
42383
|
if (!item) {
|
|
41672
42384
|
return;
|
|
41673
42385
|
}
|
|
41674
42386
|
event.preventDefault();
|
|
41675
42387
|
if (item.submenu) {
|
|
41676
|
-
item.
|
|
42388
|
+
if (!item.isDisabled()) {
|
|
42389
|
+
item.submenu.show({ source: 'keyboard' });
|
|
42390
|
+
}
|
|
41677
42391
|
}
|
|
41678
42392
|
else {
|
|
41679
42393
|
item.activateFromKeyboard(event.key === 'Enter' ? 'keyboard-enter' : 'keyboard-space');
|
|
@@ -41808,22 +42522,25 @@ class MenuDirective {
|
|
|
41808
42522
|
return;
|
|
41809
42523
|
}
|
|
41810
42524
|
const current = this.activeItem();
|
|
41811
|
-
const
|
|
41812
|
-
|
|
42525
|
+
const sorted = this.sortedItems();
|
|
42526
|
+
const position = current ? sorted.indexOf(current) : -1;
|
|
42527
|
+
if (position === -1) {
|
|
41813
42528
|
this.setActiveToEdge(delta === 1 ? 'first' : 'last');
|
|
41814
42529
|
return;
|
|
41815
42530
|
}
|
|
41816
|
-
|
|
41817
|
-
|
|
42531
|
+
let next;
|
|
42532
|
+
for (let index = position + delta; index >= 0 && index < sorted.length && !next; index += delta) {
|
|
42533
|
+
next = sorted[index]?.isDisabled() ? undefined : sorted[index];
|
|
42534
|
+
}
|
|
42535
|
+
if (!next && search) {
|
|
41818
42536
|
this.activeItem.set(null);
|
|
41819
42537
|
search.focus();
|
|
41820
42538
|
return;
|
|
41821
42539
|
}
|
|
41822
|
-
if (!this.loop()
|
|
42540
|
+
if (!next && !this.loop()) {
|
|
41823
42541
|
return;
|
|
41824
42542
|
}
|
|
41825
|
-
|
|
41826
|
-
const next = items[wrappedIndex];
|
|
42543
|
+
next ??= delta === 1 ? items[0] : items.at(-1);
|
|
41827
42544
|
if (next) {
|
|
41828
42545
|
this.setActiveItem(next);
|
|
41829
42546
|
}
|
|
@@ -41873,6 +42590,15 @@ class MenuDirective {
|
|
|
41873
42590
|
};
|
|
41874
42591
|
const overlayRef = this.overlayManager.open(OverlayTemplateHostComponent, config);
|
|
41875
42592
|
this.overlayRef.set(overlayRef);
|
|
42593
|
+
overlayRef
|
|
42594
|
+
.beforeClosed()
|
|
42595
|
+
.pipe(take(1), tap(() => {
|
|
42596
|
+
if (this.overlayRef() === overlayRef && this.open()) {
|
|
42597
|
+
this.openSubmenu()?.hide();
|
|
42598
|
+
this.open.set(false);
|
|
42599
|
+
}
|
|
42600
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
42601
|
+
.subscribe();
|
|
41876
42602
|
if (this.isRoot) {
|
|
41877
42603
|
this.attachRootInteractionListeners();
|
|
41878
42604
|
}
|
|
@@ -42310,7 +43036,7 @@ class MenuItemDirective {
|
|
|
42310
43036
|
return -1;
|
|
42311
43037
|
}
|
|
42312
43038
|
const active = owner.activeItem();
|
|
42313
|
-
if (active) {
|
|
43039
|
+
if (active && !active.isDisabled()) {
|
|
42314
43040
|
return active === this ? 0 : -1;
|
|
42315
43041
|
}
|
|
42316
43042
|
return owner.enabledItems()[0] === this ? 0 : -1;
|
|
@@ -47361,7 +48087,15 @@ const DEFAULT_PHONE_INPUT_LABELS = {
|
|
|
47361
48087
|
searchCountries: 'Search countries',
|
|
47362
48088
|
noCountries: 'No countries found',
|
|
47363
48089
|
};
|
|
47364
|
-
|
|
48090
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
48091
|
+
const GERMAN_PHONE_INPUT_LABELS = {
|
|
48092
|
+
selectCountry: 'Land auswählen',
|
|
48093
|
+
searchCountries: 'Länder durchsuchen',
|
|
48094
|
+
noCountries: 'Keine Länder gefunden',
|
|
48095
|
+
};
|
|
48096
|
+
/** The label set for a locale. Anything other than English and German needs {@link providePhoneInputLabels}. */
|
|
48097
|
+
const phoneInputLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_PHONE_INPUT_LABELS : DEFAULT_PHONE_INPUT_LABELS;
|
|
48098
|
+
const PHONE_INPUT_LABELS_DEF = /* @__PURE__ */ defineLabels('PHONE_INPUT_LABELS', phoneInputLabelsForLocale);
|
|
47365
48099
|
/**
|
|
47366
48100
|
* Localize the phone input's strings for everything below this injector, and read the set in effect here as a
|
|
47367
48101
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_PHONE_INPUT_LABELS} value. See {@link defineLabels}
|
|
@@ -47420,6 +48154,34 @@ const createVirtualWindow = (config) => {
|
|
|
47420
48154
|
const containerDimensions = signalElementDimensions(config.container);
|
|
47421
48155
|
const viewportSize = computed(() => containerDimensions().client?.height ?? 0, /* @ts-ignore */
|
|
47422
48156
|
...(ngDevMode ? [{ debugName: "viewportSize" }] : /* istanbul ignore next */ []));
|
|
48157
|
+
const extras = computed(() => [...(config.extraItemHeights?.() ?? new Map())]
|
|
48158
|
+
.filter(([, height]) => height > 0)
|
|
48159
|
+
.sort(([a], [b]) => a - b), /* @ts-ignore */
|
|
48160
|
+
...(ngDevMode ? [{ debugName: "extras" }] : /* istanbul ignore next */ []));
|
|
48161
|
+
const totalExtra = computed(() => extras().reduce((sum, [, height]) => sum + height, 0), /* @ts-ignore */
|
|
48162
|
+
...(ngDevMode ? [{ debugName: "totalExtra" }] : /* istanbul ignore next */ []));
|
|
48163
|
+
const extraBefore = (index) => {
|
|
48164
|
+
let sum = 0;
|
|
48165
|
+
for (const [extraIndex, height] of extras()) {
|
|
48166
|
+
if (extraIndex >= index)
|
|
48167
|
+
break;
|
|
48168
|
+
sum += height;
|
|
48169
|
+
}
|
|
48170
|
+
return sum;
|
|
48171
|
+
};
|
|
48172
|
+
const topOf = (index) => index * itemHeight() + extraBefore(index);
|
|
48173
|
+
// `floor` finds the item an offset falls on, `ceil` the end of the range an edge at that offset closes.
|
|
48174
|
+
const indexAt = (offset, round) => {
|
|
48175
|
+
const height = itemHeight();
|
|
48176
|
+
let before = 0;
|
|
48177
|
+
for (const [extraIndex, extra] of extras()) {
|
|
48178
|
+
if (offset < extraIndex * height + before + height + extra) {
|
|
48179
|
+
return Math.min(round((offset - before) / height), round === Math.ceil ? extraIndex + 1 : extraIndex);
|
|
48180
|
+
}
|
|
48181
|
+
before += extra;
|
|
48182
|
+
}
|
|
48183
|
+
return round((offset - before) / height);
|
|
48184
|
+
};
|
|
47423
48185
|
// a scroll request that arrived before the container existed (e.g. scrolling the selected
|
|
47424
48186
|
// option into view while the panel is still mounting) - replayed once it does
|
|
47425
48187
|
let pendingScrollIndex = null;
|
|
@@ -47429,10 +48191,9 @@ const createVirtualWindow = (config) => {
|
|
|
47429
48191
|
pendingScrollIndex = index;
|
|
47430
48192
|
return;
|
|
47431
48193
|
}
|
|
47432
|
-
const height = itemHeight();
|
|
47433
48194
|
const viewport = viewportSize() || FALLBACK_VIEWPORT_SIZE;
|
|
47434
|
-
const rowTop = index
|
|
47435
|
-
const rowBottom = rowTop +
|
|
48195
|
+
const rowTop = topOf(index);
|
|
48196
|
+
const rowBottom = rowTop + itemHeight();
|
|
47436
48197
|
const current = container.scrollTop;
|
|
47437
48198
|
let next = current;
|
|
47438
48199
|
if (rowTop < current) {
|
|
@@ -47469,21 +48230,20 @@ const createVirtualWindow = (config) => {
|
|
|
47469
48230
|
if (!count || !config.container()) {
|
|
47470
48231
|
return { start: 0, end: count };
|
|
47471
48232
|
}
|
|
47472
|
-
const height = itemHeight();
|
|
47473
48233
|
const viewport = viewportSize() || FALLBACK_VIEWPORT_SIZE;
|
|
47474
48234
|
const offset = scrollOffset();
|
|
47475
48235
|
// clamp into the item range: when the count shrinks while scrolled far down (filtering a
|
|
47476
48236
|
// long list), the stale offset would otherwise start past the end - the browser's own
|
|
47477
48237
|
// clamp-scroll event arrives a frame later, but the window must never be empty until then
|
|
47478
48238
|
const rows = overscan();
|
|
47479
|
-
const start = Math.min(Math.max(0, Math.floor
|
|
47480
|
-
const end = Math.min(count, Math.max(
|
|
48239
|
+
const start = Math.min(Math.max(0, indexAt(offset, Math.floor) - rows), Math.max(0, count - 1));
|
|
48240
|
+
const end = Math.min(count, Math.max(indexAt(offset + viewport, Math.ceil) + rows, start + 1));
|
|
47481
48241
|
return { start, end };
|
|
47482
48242
|
}, /* @ts-ignore */
|
|
47483
48243
|
...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
|
|
47484
|
-
const paddingTop = computed(() => range().start
|
|
48244
|
+
const paddingTop = computed(() => topOf(range().start), /* @ts-ignore */
|
|
47485
48245
|
...(ngDevMode ? [{ debugName: "paddingTop" }] : /* istanbul ignore next */ []));
|
|
47486
|
-
const paddingBottom = computed(() => Math.max(0,
|
|
48246
|
+
const paddingBottom = computed(() => Math.max(0, config.itemCount() * itemHeight() + totalExtra() - topOf(range().end)), /* @ts-ignore */
|
|
47487
48247
|
...(ngDevMode ? [{ debugName: "paddingBottom" }] : /* istanbul ignore next */ []));
|
|
47488
48248
|
const measureItem = (element) => {
|
|
47489
48249
|
const height = element.offsetHeight;
|
|
@@ -47586,6 +48346,12 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
47586
48346
|
*/
|
|
47587
48347
|
this.valueKey = input(null, /* @ts-ignore */
|
|
47588
48348
|
...(ngDevMode ? [{ debugName: "valueKey" }] : /* istanbul ignore next */ []));
|
|
48349
|
+
/**
|
|
48350
|
+
* Labels a value no loaded option carries (e.g. a stored id whose option is on a page not yet
|
|
48351
|
+
* fetched): the trigger text in single mode, the chip label in multi mode.
|
|
48352
|
+
*/
|
|
48353
|
+
this.displayWith = input(null, /* @ts-ignore */
|
|
48354
|
+
...(ngDevMode ? [{ debugName: "displayWith" }] : /* istanbul ignore next */ []));
|
|
47589
48355
|
this.filterModeInput = input(SELECT_FILTER_MODES.INTERNAL, { ...(ngDevMode ? { debugName: "filterModeInput" } : /* istanbul ignore next */ {}), alias: 'filterMode' });
|
|
47590
48356
|
/** Enter with a search query that matches no option commits the raw query string as the value. */
|
|
47591
48357
|
this.allowCustomValues = input(false, { ...(ngDevMode ? { debugName: "allowCustomValues" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
@@ -47999,10 +48765,12 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
47999
48765
|
const items = this.sortedItems();
|
|
48000
48766
|
const cache = this.labelCache();
|
|
48001
48767
|
const valuesMatch = this.valuesMatch();
|
|
48768
|
+
const displayWith = this.displayWith();
|
|
48002
48769
|
return values.map((entryValue) => {
|
|
48003
48770
|
const item = items.find((candidate) => valuesMatch(candidate.value(), entryValue)) ?? null;
|
|
48004
48771
|
const label = item?.label() ||
|
|
48005
48772
|
this.findCachedLabel(cache, entryValue) ||
|
|
48773
|
+
displayWith?.(entryValue) ||
|
|
48006
48774
|
(typeof entryValue === 'string' && entryValue !== '' ? entryValue : null);
|
|
48007
48775
|
return { value: entryValue, label, item };
|
|
48008
48776
|
});
|
|
@@ -48379,7 +49147,7 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48379
49147
|
}
|
|
48380
49148
|
/** @internal A rendered virtual row attaches its element to its item while it is windowed in. */
|
|
48381
49149
|
attachVirtualOptionElement(item, element) {
|
|
48382
|
-
const entry = this.dataItemRegistry.get(item.value());
|
|
49150
|
+
const entry = this.dataItemRegistry.get(this.valueIdentity()(item.value()));
|
|
48383
49151
|
if (!entry || entry.item !== item) {
|
|
48384
49152
|
return;
|
|
48385
49153
|
}
|
|
@@ -48392,7 +49160,7 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48392
49160
|
}
|
|
48393
49161
|
/** @internal */
|
|
48394
49162
|
detachVirtualOptionElement(item, element) {
|
|
48395
|
-
const entry = this.dataItemRegistry.get(item.value());
|
|
49163
|
+
const entry = this.dataItemRegistry.get(this.valueIdentity()(item.value()));
|
|
48396
49164
|
if (!entry || entry.item !== item || entry.element() !== element) {
|
|
48397
49165
|
return;
|
|
48398
49166
|
}
|
|
@@ -48593,7 +49361,7 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48593
49361
|
return;
|
|
48594
49362
|
}
|
|
48595
49363
|
default: {
|
|
48596
|
-
if (event.key.length !== 1 || searchFocused || this.multiple()) {
|
|
49364
|
+
if (event.key.length !== 1 || searchFocused || this.multiple() || this.pickOnly()) {
|
|
48597
49365
|
return;
|
|
48598
49366
|
}
|
|
48599
49367
|
const match = this.findTypeaheadMatch(event.key, this.selectedItems()[0] ?? null);
|
|
@@ -48625,6 +49393,10 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48625
49393
|
if (value === null) {
|
|
48626
49394
|
return false;
|
|
48627
49395
|
}
|
|
49396
|
+
const matchingOption = this.findOptionByLabel(value);
|
|
49397
|
+
if (matchingOption) {
|
|
49398
|
+
return this.commitMatchingOption(matchingOption);
|
|
49399
|
+
}
|
|
48628
49400
|
this.labelCache.update((cache) => new Map(cache).set(value, value));
|
|
48629
49401
|
if (this.multiple()) {
|
|
48630
49402
|
const current = this.value();
|
|
@@ -48642,6 +49414,37 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48642
49414
|
}
|
|
48643
49415
|
return true;
|
|
48644
49416
|
}
|
|
49417
|
+
findOptionByLabel(label) {
|
|
49418
|
+
const lowered = label.toLowerCase();
|
|
49419
|
+
return this.visibleItems().find((item) => !item.custom?.() && !item.disabled() && item.label().toLowerCase() === lowered);
|
|
49420
|
+
}
|
|
49421
|
+
commitMatchingOption(item) {
|
|
49422
|
+
if (this.mixed()) {
|
|
49423
|
+
const committed = this.commitMixedOption(item);
|
|
49424
|
+
if (committed && this.multiple()) {
|
|
49425
|
+
this.registeredSearch()?.clear();
|
|
49426
|
+
}
|
|
49427
|
+
return committed;
|
|
49428
|
+
}
|
|
49429
|
+
if (!this.multiple()) {
|
|
49430
|
+
this.pickSingleOption(item);
|
|
49431
|
+
return true;
|
|
49432
|
+
}
|
|
49433
|
+
const current = this.value();
|
|
49434
|
+
const values = Array.isArray(current) ? current : [];
|
|
49435
|
+
const itemValue = item.value();
|
|
49436
|
+
if (this.includesValue(values, itemValue)) {
|
|
49437
|
+
return false;
|
|
49438
|
+
}
|
|
49439
|
+
if (this.pickOnly()) {
|
|
49440
|
+
this.pickOption.emit(itemValue);
|
|
49441
|
+
}
|
|
49442
|
+
else {
|
|
49443
|
+
this.writeValue([...values, itemValue]);
|
|
49444
|
+
}
|
|
49445
|
+
this.registeredSearch()?.clear();
|
|
49446
|
+
return true;
|
|
49447
|
+
}
|
|
48645
49448
|
commitOptionWhileClosed(item) {
|
|
48646
49449
|
if (this.disabled() || this.readonly() || item.disabled()) {
|
|
48647
49450
|
return;
|
|
@@ -48650,6 +49453,9 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48650
49453
|
this.commitMixedOption(item);
|
|
48651
49454
|
return;
|
|
48652
49455
|
}
|
|
49456
|
+
if (this.selectedItems()[0] === item) {
|
|
49457
|
+
return;
|
|
49458
|
+
}
|
|
48653
49459
|
this.pickSingleOption(item);
|
|
48654
49460
|
}
|
|
48655
49461
|
findTypeaheadMatch(character, from) {
|
|
@@ -48780,7 +49586,7 @@ class SelectDirective extends FieldStateControlDirective {
|
|
|
48780
49586
|
this.hide();
|
|
48781
49587
|
}
|
|
48782
49588
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
48783
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: SelectDirective, isStandalone: true, selector: "[etSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mixed: { classPropertyName: "mixed", publicName: "mixed", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, mixedLabel: { classPropertyName: "mixedLabel", publicName: "mixedLabel", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, pending: { classPropertyName: "pending", publicName: "pending", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, valueKey: { classPropertyName: "valueKey", publicName: "valueKey", isSignal: true, isRequired: false, transformFunction: null }, filterModeInput: { classPropertyName: "filterModeInput", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, allowCustomValues: { classPropertyName: "allowCustomValues", publicName: "allowCustomValues", isSignal: true, isRequired: false, transformFunction: null }, separators: { classPropertyName: "separators", publicName: "separators", isSignal: true, isRequired: false, transformFunction: null }, normalizeValue: { classPropertyName: "normalizeValue", publicName: "normalizeValue", isSignal: true, isRequired: false, transformFunction: null }, commitCustomValueOnClose: { classPropertyName: "commitCustomValueOnClose", publicName: "commitCustomValueOnClose", isSignal: true, isRequired: false, transformFunction: null }, maxSelection: { classPropertyName: "maxSelection", publicName: "maxSelection", isSignal: true, isRequired: false, transformFunction: null }, allowAddNew: { classPropertyName: "allowAddNew", publicName: "allowAddNew", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadErrorInput: { classPropertyName: "loadErrorInput", publicName: "loadError", isSignal: true, isRequired: false, transformFunction: null }, hasMoreItemsInput: { classPropertyName: "hasMoreItemsInput", publicName: "hasMoreItems", isSignal: true, isRequired: false, transformFunction: null }, mirrorPanelWidth: { classPropertyName: "mirrorPanelWidth", publicName: "mirrorPanelWidth", isSignal: true, isRequired: false, transformFunction: null }, pickOnly: { classPropertyName: "pickOnly", publicName: "pickOnly", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", mixed: "mixedChange", touched: "touchedChange", open: "openChange", touch: "touch", queryChange: "queryChange", loadMore: "loadMore", addNew: "addNew", pickOption: "pickOption", afterOpen: "afterOpen", afterClose: "afterClose" }, host: { properties: { "attr.data-select-open": "open() || null", "attr.data-mixed": "mixed() || null" } }, exportAs: ["etSelect"], usesInheritance: true, ngImport: i0 }); }
|
|
49589
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: SelectDirective, isStandalone: true, selector: "[etSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mixed: { classPropertyName: "mixed", publicName: "mixed", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, mixedLabel: { classPropertyName: "mixedLabel", publicName: "mixedLabel", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, pending: { classPropertyName: "pending", publicName: "pending", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, valueKey: { classPropertyName: "valueKey", publicName: "valueKey", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null }, filterModeInput: { classPropertyName: "filterModeInput", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, allowCustomValues: { classPropertyName: "allowCustomValues", publicName: "allowCustomValues", isSignal: true, isRequired: false, transformFunction: null }, separators: { classPropertyName: "separators", publicName: "separators", isSignal: true, isRequired: false, transformFunction: null }, normalizeValue: { classPropertyName: "normalizeValue", publicName: "normalizeValue", isSignal: true, isRequired: false, transformFunction: null }, commitCustomValueOnClose: { classPropertyName: "commitCustomValueOnClose", publicName: "commitCustomValueOnClose", isSignal: true, isRequired: false, transformFunction: null }, maxSelection: { classPropertyName: "maxSelection", publicName: "maxSelection", isSignal: true, isRequired: false, transformFunction: null }, allowAddNew: { classPropertyName: "allowAddNew", publicName: "allowAddNew", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadErrorInput: { classPropertyName: "loadErrorInput", publicName: "loadError", isSignal: true, isRequired: false, transformFunction: null }, hasMoreItemsInput: { classPropertyName: "hasMoreItemsInput", publicName: "hasMoreItems", isSignal: true, isRequired: false, transformFunction: null }, mirrorPanelWidth: { classPropertyName: "mirrorPanelWidth", publicName: "mirrorPanelWidth", isSignal: true, isRequired: false, transformFunction: null }, pickOnly: { classPropertyName: "pickOnly", publicName: "pickOnly", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", mixed: "mixedChange", touched: "touchedChange", open: "openChange", touch: "touch", queryChange: "queryChange", loadMore: "loadMore", addNew: "addNew", pickOption: "pickOption", afterOpen: "afterOpen", afterClose: "afterClose" }, host: { properties: { "attr.data-select-open": "open() || null", "attr.data-mixed": "mixed() || null" } }, exportAs: ["etSelect"], usesInheritance: true, ngImport: i0 }); }
|
|
48784
49590
|
}
|
|
48785
49591
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectDirective, decorators: [{
|
|
48786
49592
|
type: Directive,
|
|
@@ -48792,7 +49598,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
48792
49598
|
'[attr.data-mixed]': 'mixed() || null',
|
|
48793
49599
|
},
|
|
48794
49600
|
}]
|
|
48795
|
-
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], mixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixed", required: false }] }, { type: i0.Output, args: ["mixedChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], mixedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixedLabel", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], pending: [{ type: i0.Input, args: [{ isSignal: true, alias: "pending", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], valueKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueKey", required: false }] }], filterModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMode", required: false }] }], allowCustomValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCustomValues", required: false }] }], separators: [{ type: i0.Input, args: [{ isSignal: true, alias: "separators", required: false }] }], normalizeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "normalizeValue", required: false }] }], commitCustomValueOnClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "commitCustomValueOnClose", required: false }] }], maxSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelection", required: false }] }], allowAddNew: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowAddNew", required: false }] }], loadingInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadErrorInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadError", required: false }] }], hasMoreItemsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMoreItems", required: false }] }], mirrorPanelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorPanelWidth", required: false }] }], pickOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickOnly", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], touch: [{ type: i0.Output, args: ["touch"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], addNew: [{ type: i0.Output, args: ["addNew"] }], pickOption: [{ type: i0.Output, args: ["pickOption"] }], afterOpen: [{ type: i0.Output, args: ["afterOpen"] }], afterClose: [{ type: i0.Output, args: ["afterClose"] }] } });
|
|
49601
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], mixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixed", required: false }] }, { type: i0.Output, args: ["mixedChange"] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], mixedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "mixedLabel", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], pending: [{ type: i0.Input, args: [{ isSignal: true, alias: "pending", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], valueKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueKey", required: false }] }], displayWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayWith", required: false }] }], filterModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMode", required: false }] }], allowCustomValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCustomValues", required: false }] }], separators: [{ type: i0.Input, args: [{ isSignal: true, alias: "separators", required: false }] }], normalizeValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "normalizeValue", required: false }] }], commitCustomValueOnClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "commitCustomValueOnClose", required: false }] }], maxSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelection", required: false }] }], allowAddNew: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowAddNew", required: false }] }], loadingInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadErrorInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadError", required: false }] }], hasMoreItemsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMoreItems", required: false }] }], mirrorPanelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mirrorPanelWidth", required: false }] }], pickOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickOnly", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], touch: [{ type: i0.Output, args: ["touch"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], addNew: [{ type: i0.Output, args: ["addNew"] }], pickOption: [{ type: i0.Output, args: ["pickOption"] }], afterOpen: [{ type: i0.Output, args: ["afterOpen"] }], afterClose: [{ type: i0.Output, args: ["afterClose"] }] } });
|
|
48796
49602
|
|
|
48797
49603
|
/**
|
|
48798
49604
|
* The "Select all" row of a multi select (`selectAll`). Place it first inside the listbox; it takes
|
|
@@ -49460,8 +50266,11 @@ class SelectSearchDirective {
|
|
|
49460
50266
|
}
|
|
49461
50267
|
event.preventDefault();
|
|
49462
50268
|
this.clear();
|
|
49463
|
-
|
|
49464
|
-
|
|
50269
|
+
const refused = parts.filter((part) => part.trim() && !select.commitCustomValue(part));
|
|
50270
|
+
const pending = refused.map((part) => part.trim()).join(' ');
|
|
50271
|
+
if (pending) {
|
|
50272
|
+
this.query.set(pending);
|
|
50273
|
+
select.queryChange.emit(pending);
|
|
49465
50274
|
}
|
|
49466
50275
|
}
|
|
49467
50276
|
handleFocus() {
|
|
@@ -49935,7 +50744,18 @@ const DEFAULT_SELECT_LABELS = {
|
|
|
49935
50744
|
create: 'Create',
|
|
49936
50745
|
error: 'Something went wrong',
|
|
49937
50746
|
};
|
|
49938
|
-
|
|
50747
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
50748
|
+
const GERMAN_SELECT_LABELS = {
|
|
50749
|
+
loading: 'Lade…',
|
|
50750
|
+
empty: 'Keine Ergebnisse',
|
|
50751
|
+
loadMore: 'Mehr laden',
|
|
50752
|
+
addNew: 'Neu hinzufügen',
|
|
50753
|
+
create: 'Erstellen',
|
|
50754
|
+
error: 'Etwas ist schiefgelaufen',
|
|
50755
|
+
};
|
|
50756
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideSelectLabels}. */
|
|
50757
|
+
const selectLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_SELECT_LABELS : DEFAULT_SELECT_LABELS;
|
|
50758
|
+
const SELECT_LABELS_DEF = /* @__PURE__ */ defineLabels('SELECT_LABELS', selectLabelsForLocale);
|
|
49939
50759
|
/**
|
|
49940
50760
|
* Localize the select's strings for everything below this injector, and read the set in effect here as a
|
|
49941
50761
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_SELECT_LABELS} value. See {@link defineLabels}
|
|
@@ -50443,7 +51263,7 @@ class SelectComponent {
|
|
|
50443
51263
|
return () => injector.get(SelectDirective).focus({ preventScroll: true });
|
|
50444
51264
|
},
|
|
50445
51265
|
},
|
|
50446
|
-
], hostDirectives: [{ directive: SelectDirective, inputs: ["value", "value", "mixed", "mixed", "touched", "touched", "open", "open", "multiple", "multiple", "placeholder", "placeholder", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "options", "options", "compareWith", "compareWith", "valueKey", "valueKey", "filterMode", "filterMode", "allowCustomValues", "allowCustomValues", "separators", "separators", "normalizeValue", "normalizeValue", "commitCustomValueOnClose", "commitCustomValueOnClose", "maxSelection", "maxSelection", "allowAddNew", "allowAddNew", "loading", "loading", "loadError", "loadError", "hasMoreItems", "hasMoreItems", "pickOnly", "pickOnly", "selectAll", "selectAll", "mirrorPanelWidth", "mirrorPanelWidth", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "openChange", "openChange", "queryChange", "queryChange", "loadMore", "loadMore", "addNew", "addNew", "pickOption", "pickOption", "afterOpen", "afterOpen", "afterClose", "afterClose"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"select.displayValue() === null || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;min-block-size:1lh;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"], dependencies: [{ kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "component", type: SelectAllOptionComponent, selector: "et-select-all-option" }, { kind: "component", type: SelectVirtualOptionComponent, selector: "et-select-virtual-option" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ChipComponent, selector: "et-chip" }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: SemanticThemesDirective, selector: "[etSemanticThemes]", exportAs: ["etSemanticThemes"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
51266
|
+
], hostDirectives: [{ directive: SelectDirective, inputs: ["value", "value", "mixed", "mixed", "touched", "touched", "open", "open", "multiple", "multiple", "placeholder", "placeholder", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "options", "options", "compareWith", "compareWith", "valueKey", "valueKey", "displayWith", "displayWith", "filterMode", "filterMode", "allowCustomValues", "allowCustomValues", "separators", "separators", "normalizeValue", "normalizeValue", "commitCustomValueOnClose", "commitCustomValueOnClose", "maxSelection", "maxSelection", "allowAddNew", "allowAddNew", "loading", "loading", "loadError", "loadError", "hasMoreItems", "hasMoreItems", "pickOnly", "pickOnly", "selectAll", "selectAll", "mirrorPanelWidth", "mirrorPanelWidth", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby", "hidden", "hidden", "warnings", "warnings"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch", "openChange", "openChange", "queryChange", "queryChange", "loadMore", "loadMore", "addNew", "addNew", "pickOption", "pickOption", "afterOpen", "afterOpen", "afterClose", "afterClose"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"select.displayValue() === null || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;min-block-size:1lh;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-form-field-control-frame:has(et-select){cursor:pointer}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"], dependencies: [{ kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "component", type: SelectAllOptionComponent, selector: "et-select-all-option" }, { kind: "component", type: SelectVirtualOptionComponent, selector: "et-select-virtual-option" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ChipComponent, selector: "et-chip" }, { kind: "component", type: SpinnerComponent, selector: "et-spinner", inputs: ["diameter", "strokeWidth", "track", "value"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: SemanticThemesDirective, selector: "[etSemanticThemes]", exportAs: ["etSemanticThemes"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
50447
51267
|
}
|
|
50448
51268
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SelectComponent, decorators: [{
|
|
50449
51269
|
type: Component,
|
|
@@ -50493,6 +51313,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
50493
51313
|
'options',
|
|
50494
51314
|
'compareWith',
|
|
50495
51315
|
'valueKey',
|
|
51316
|
+
'displayWith',
|
|
50496
51317
|
'filterMode',
|
|
50497
51318
|
'allowCustomValues',
|
|
50498
51319
|
'separators',
|
|
@@ -50526,7 +51347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
50526
51347
|
ColorInteractiveDirective,
|
|
50527
51348
|
], host: {
|
|
50528
51349
|
class: 'et-select',
|
|
50529
|
-
}, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"select.displayValue() === null || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;min-block-size:1lh;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"] }]
|
|
51350
|
+
}, template: "<!-- a div, not a <button>: chips carry remove buttons and buttons cannot nest.\n The trigger directive manages tabindex/aria-disabled for non-button hosts. -->\n<div class=\"et-select-trigger\" etSelectTrigger>\n <div [class.et-select-trigger-content--stacked]=\"stackedValue()\" class=\"et-select-trigger-content\">\n @if (select.mixed()) {\n @if (showValueLabel()) {\n <span [id]=\"mixedLabelId\" class=\"et-select-value\">{{ select.displayValue() }}</span>\n }\n } @else if (select.registeredValueTemplate(); as valueTemplate) {\n @if (showCustomValue()) {\n <div class=\"et-select-value-custom\">\n <ng-template [ngTemplateOutlet]=\"valueTemplate.templateRef\" [ngTemplateOutletContext]=\"valueContext()\" />\n </div>\n }\n } @else if (select.multiple() && select.selectedEntries().length) {\n <div class=\"et-select-chips\">\n @for (entry of select.selectedEntries(); track entry.value) {\n <et-chip\n [disabled]=\"select.disabled()\"\n [removable]=\"!select.readonly() && !select.disabled()\"\n (remove)=\"select.deselectValue(entry.value)\"\n >\n {{ entry.label }}\n </et-chip>\n }\n </div>\n }\n\n @if (!select.mixed() && showValueLabel()) {\n <span [attr.data-placeholder]=\"select.displayValue() === null || null\" class=\"et-select-value\">\n {{ select.displayValue() ?? select.placeholder() }}\n </span>\n }\n\n <ng-content select=\"input[etSelectSearch]\" />\n </div>\n\n @if (select.showLoadingIndicator() && !select.open()) {\n <div class=\"et-select-trigger-busy\" animate.enter=\"et-select-trigger-busy--enter\">\n <et-spinner diameter=\"16\" strokeWidth=\"2\" />\n </div>\n }\n</div>\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear via Backspace / erasing.\n mousedown is prevented so the trigger keeps focus: `showClear` reads `focused()`, so a\n blur would unmount this button before the click could land -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n\n <button\n [disabled]=\"select.disabled()\"\n (click)=\"handleArrowClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-picker-trigger et-select-arrow\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n</ng-template>\n\n<ng-template #optionContent>\n <ng-content />\n</ng-template>\n\n@if (!select.isMounted()) {\n <!-- keeps the projected options rendered (and their bindings live) while the panel is\n closed, so the trigger can resolve a preselected value's label and closed typeahead\n works \u2014 the same template moves into the overlay while it is open -->\n <div class=\"et-select-detached-options\" aria-hidden=\"true\" hidden>\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n </div>\n}\n\n<ng-template etSelectSurface>\n <et-select-panel #panelThemes=\"etSemanticThemes\" etSemanticThemes>\n @if (select.showSelectAll()) {\n <et-select-all-option>{{ resolvedSelectAllLabel() }}</et-select-all-option>\n }\n\n @if (select.options()) {\n <div\n [style.padding-block-start.px]=\"select.virtualWindow.paddingTop()\"\n [style.padding-block-end.px]=\"select.virtualWindow.paddingBottom()\"\n class=\"et-select-virtual-options\"\n role=\"none\"\n >\n @for (item of select.virtualizedItems(); track item.id()) {\n <et-select-virtual-option [item]=\"item\" />\n }\n </div>\n }\n\n <ng-template [ngTemplateOutlet]=\"optionContent\" />\n\n @if (select.customValueCandidate(); as candidate) {\n <et-select-option [value]=\"candidate\" [label]=\"candidate\" class=\"et-select-create-option\" customValueOption>\n <i class=\"et-select-create-option-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedCreateLabel() }} \u201C{{ candidate }}\u201D\n </et-select-option>\n }\n\n <div class=\"et-select-panel-extras\" etSelectPanelExtras>\n @if (showBusyBar()) {\n <div class=\"et-select-busy-bar\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (showLoadingRow()) {\n @if (select.registeredLoadingTemplate(); as loadingTemplate) {\n @if (select.showLoadingIndicator()) {\n <ng-template [ngTemplateOutlet]=\"loadingTemplate.templateRef\" />\n }\n } @else {\n <div class=\"et-select-state et-select-state--loading\">\n <span\n [class.et-select-state-content--visible]=\"select.showLoadingIndicator()\"\n [attr.aria-hidden]=\"!select.showLoadingIndicator() || null\"\n class=\"et-select-state-content\"\n >\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </span>\n </div>\n }\n } @else if (select.error(); as error) {\n @if (select.registeredErrorTemplate(); as errorTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"errorTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error }\"\n />\n } @else {\n <div\n [etProvideColor]=\"panelThemes.themes.error()\"\n class=\"et-select-state et-select-state--error\"\n role=\"alert\"\n >\n {{ error }}\n </div>\n }\n } @else if (!select.visibleItems().length) {\n @if (select.registeredEmptyTemplate(); as emptyTemplate) {\n <ng-template [ngTemplateOutlet]=\"emptyTemplate.templateRef\" />\n } @else {\n <div class=\"et-select-state et-select-state--empty\">{{ selectLabels().empty }}</div>\n }\n }\n\n @if (select.hasMoreItems() && !showLoadingRow()) {\n @if (showLoadMoreLoading()) {\n <div class=\"et-select-load-more et-select-load-more--loading\" aria-live=\"polite\">\n <et-spinner class=\"et-select-state-spinner\" diameter=\"16\" strokeWidth=\"2\" />\n {{ selectLabels().loading }}\n </div>\n } @else {\n <button\n [disabled]=\"select.loading()\"\n (click)=\"select.requestLoadMore()\"\n class=\"et-select-load-more\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i class=\"et-select-load-more-icon\" etIcon=\"et-chevron\" aria-hidden=\"true\"></i>\n {{ resolvedLoadMoreLabel() }}\n </button>\n }\n }\n\n @if (select.allowAddNew() && !showLoadingRow()) {\n <button (click)=\"select.requestAddNew()\" class=\"et-select-add-new\" tabindex=\"-1\" type=\"button\">\n <i class=\"et-select-add-new-icon\" etIcon=\"et-plus\" aria-hidden=\"true\"></i>\n {{ resolvedAddNewLabel() }}\n </button>\n }\n </div>\n </et-select-panel>\n</ng-template>\n", styles: ["@layer components{et-select{--_et-select-trigger-busy-fade: 24px;--_et-select-trigger-busy-cover: 16px;--_et-select-trigger-busy-mask-direction: to right;display:flex;align-items:center;gap:6px;flex:1;min-inline-size:0;color:inherit}et-select .et-select-trigger{display:flex;align-items:center;gap:6px;flex:1;outline:none;color:inherit;min-inline-size:0;text-align:start;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation}et-select .et-select-trigger[data-disabled]{cursor:not-allowed}et-select .et-select-trigger[data-readonly]{cursor:default}et-select .et-select-trigger .et-select-trigger-content{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1;min-inline-size:0}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked{display:grid;grid-template-columns:minmax(0,1fr)}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked>*{grid-area:1 / 1}et-select .et-select-trigger .et-select-trigger-content.et-select-trigger-content--stacked:has(.et-select-value-custom) input[etselectsearch]{caret-color:transparent}et-select .et-select-trigger input[etselectsearch]{flex:1 1 60px;min-inline-size:60px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);cursor:text}et-select .et-select-trigger input[etselectsearch]::placeholder{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select .et-select-trigger input[etselectsearch]:read-only{cursor:default;caret-color:transparent}et-select .et-select-trigger input[etselectsearch]:disabled{cursor:not-allowed}et-select .et-select-trigger:has(input[etselectsearch]) .et-select-value{flex:0 1 auto}et-select .et-select-value{flex:1;min-block-size:1lh;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0}et-select .et-select-value[data-placeholder]{color:var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent))}et-select[data-mixed] .et-select-value,et-select[data-mixed] input[etselectsearch]:not(:focus){font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}et-select .et-select-value-custom{display:flex;align-items:center;flex:1;min-inline-size:0}et-select .et-select-trigger-content:has(input[etselectsearch]) .et-select-value-custom{flex:0 1 auto}et-select .et-select-trigger-content:has(.et-select-value-custom) input[etselectsearch]::placeholder{color:transparent}et-select .et-select-chips{display:contents}et-select .et-select-trigger-busy{position:relative;display:flex;align-items:center;align-self:stretch;flex:none;padding-inline-start:var(--_et-select-trigger-busy-fade);margin-inline-start:calc(-1 * (var(--_et-select-trigger-busy-fade) + var(--_et-select-trigger-busy-cover) + 6px));color:var(--et-surface-color-muted-solid, currentColor)}et-select:dir(rtl){--_et-select-trigger-busy-mask-direction: to left}et-select .et-select-trigger:has(>.et-select-trigger-busy) .et-select-trigger-content{-webkit-mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)));mask-image:linear-gradient(var(--_et-select-trigger-busy-mask-direction),black calc(100% - var(--_et-select-trigger-busy-cover) - var(--_et-select-trigger-busy-fade)),transparent calc(100% - var(--_et-select-trigger-busy-cover)))}et-select .et-select-trigger-busy--enter{animation:et-select-busy-in .12s ease}@media(prefers-reduced-motion:reduce){et-select .et-select-trigger-busy--enter{animation:none}}.et-form-field-control-frame:has(et-select){cursor:pointer}.et-select-arrow .et-icon{rotate:180deg}@keyframes et-select-busy-in{0%{opacity:0}}}\n"] }]
|
|
50530
51351
|
}], ctorParameters: () => [], propDecorators: { loadMoreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadMoreLabel", required: false }] }], addNewLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "addNewLabel", required: false }] }], createLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "createLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }] } });
|
|
50531
51352
|
|
|
50532
51353
|
const SELECT_IMPORTS = [
|
|
@@ -50625,7 +51446,7 @@ class PhoneInputComponent {
|
|
|
50625
51446
|
this.phone.focus(options);
|
|
50626
51447
|
}
|
|
50627
51448
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
50628
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PhoneInputComponent, isStandalone: true, selector: "et-phone-input", inputs: { countryLabel: { classPropertyName: "countryLabel", publicName: "countryLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-phone-input" }, providers: [provideIcons(TIMES_ICON)], hostDirectives: [{ directive: PhoneInputDirective, inputs: ["value", "value", "placeholder", "placeholder", "defaultCountry", "defaultCountry", "preferredCountries", "preferredCountries", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<div\n [aria-labelledby]=\"countryLabelId\"\n [value]=\"phone.country()\"\n [readonly]=\"phone.readonly()\"\n (valueChange)=\"handleCountryChange($event)\"\n class=\"et-phone-input-country\"\n mirrorPanelWidth=\"false\"\n etFormFieldBarrier\n etSelect\n>\n <span [id]=\"countryLabelId\" hidden>{{ resolvedCountryLabel() }}</span>\n <button [disabled]=\"phone.disabled()\" class=\"et-phone-input-country-trigger\" etSelectTrigger type=\"button\">\n <span class=\"et-phone-input-country-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template [ngTemplateOutlet]=\"flagTemplate.templateRef\" [ngTemplateOutletContext]=\"activeFlagContext()\" />\n } @else {\n {{ activeFlag() }}\n }\n </span>\n <span class=\"et-visually-hidden et-phone-input-country-name\">{{ activeCountryName() }}</span>\n <span class=\"et-phone-input-dial-code\">+{{ phone.dialCode() }}</span>\n </button>\n\n <ng-template etSelectSurface let-select>\n <et-select-panel class=\"et-phone-input-country-panel\">\n <div class=\"et-select-panel-search\">\n <input [placeholder]=\"phoneInputLabels().searchCountries\" etSelectSearch />\n </div>\n\n <!-- the label carries the dial code too, so searching by \"+49\" / \"49\" works -->\n @for (country of countries(); track country.iso2) {\n <et-select-option [label]=\"country.name + ' +' + country.dialCode\" [value]=\"country.iso2\">\n <span class=\"et-phone-input-option-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"flagTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: country }\"\n />\n } @else {\n {{ country.flag }}\n }\n </span>\n <span class=\"et-phone-input-option-name\">{{ country.name }}</span>\n <span class=\"et-phone-input-option-dial\">+{{ country.dialCode }}</span>\n </et-select-option>\n }\n\n @if (!select.visibleItems().length) {\n <div class=\"et-select-state et-select-state--empty\">{{ phoneInputLabels().noCountries }}</div>\n }\n </et-select-panel>\n </ng-template>\n</div>\n\n<input class=\"et-phone-input-field\" etPhoneInputField />\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear by erasing the text.\n mousedown is prevented so the field keeps focus (its blur would unmount this\n button before the click could land) -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n</ng-template>\n", styles: ["@layer components{et-phone-input{display:flex;align-items:center;gap:8px;flex:1;min-inline-size:0;color:inherit}et-phone-input .et-phone-input-country-trigger{display:flex;align-items:center;gap:4px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;margin:0;cursor:pointer;appearance:none;white-space:nowrap}et-phone-input .et-phone-input-country-trigger:disabled{cursor:not-allowed}et-phone-input .et-phone-input-country-trigger:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px;border-radius:4px}et-phone-input[data-readonly] .et-phone-input-country-trigger{cursor:default}et-phone-input .et-phone-input-country-flag{display:inline-flex;align-items:center}et-phone-input .et-phone-input-dial-code{color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-phone-input .et-phone-input-field:disabled{cursor:not-allowed}et-phone-input[data-mixed] .et-phone-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-phone-input-country-panel{inline-size:min(320px,calc(100vw - 24px))}.et-phone-input-country-panel .et-select-option-label{display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);flex:1;min-inline-size:0}.et-phone-input-option-flag{flex:none;display:inline-flex;align-items:center;justify-content:center}.et-phone-input-option-name{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-phone-input-option-dial{flex:none;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}.et-phone-input-country-flag :is(img,svg),.et-phone-input-option-flag :is(img,svg){display:block;inline-size:20px;block-size:auto}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "directive", type: FormFieldBarrierDirective, selector: "[etFormFieldBarrier]" }, { kind: "directive", type: SelectDirective, selector: "[etSelect]", inputs: ["value", "mixed", "touched", "open", "multiple", "disabled", "readonly", "invalid", "errors", "required", "name", "placeholder", "mixedLabel", "maxLength", "pending", "options", "compareWith", "valueKey", "filterMode", "allowCustomValues", "separators", "normalizeValue", "commitCustomValueOnClose", "maxSelection", "allowAddNew", "loading", "loadError", "hasMoreItems", "mirrorPanelWidth", "pickOnly", "selectAll"], outputs: ["valueChange", "mixedChange", "touchedChange", "openChange", "touch", "queryChange", "loadMore", "addNew", "pickOption", "afterOpen", "afterClose"], exportAs: ["etSelect"] }, { kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "directive", type: SelectSearchDirective, selector: "input[etSelectSearch]", inputs: ["query"], outputs: ["queryChange"], exportAs: ["etSelectSearch"] }, { kind: "directive", type: PhoneInputFieldDirective, selector: "input[etPhoneInputField]", exportAs: ["etPhoneInputField"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
51449
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PhoneInputComponent, isStandalone: true, selector: "et-phone-input", inputs: { countryLabel: { classPropertyName: "countryLabel", publicName: "countryLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-phone-input" }, providers: [provideIcons(TIMES_ICON)], hostDirectives: [{ directive: PhoneInputDirective, inputs: ["value", "value", "placeholder", "placeholder", "defaultCountry", "defaultCountry", "preferredCountries", "preferredCountries", "touched", "touched", "mixed", "mixed", "mixedLabel", "mixedLabel", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "warnings", "warnings", "required", "required", "name", "name", "maxLength", "maxLength", "pending", "pending", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange", "mixedChange", "mixedChange", "touchedChange", "touchedChange", "touch", "touch"] }, { directive: i1.ColorInteractiveDirective }], ngImport: i0, template: "<div\n [aria-labelledby]=\"countryLabelId\"\n [value]=\"phone.country()\"\n [readonly]=\"phone.readonly()\"\n (valueChange)=\"handleCountryChange($event)\"\n class=\"et-phone-input-country\"\n mirrorPanelWidth=\"false\"\n etFormFieldBarrier\n etSelect\n>\n <span [id]=\"countryLabelId\" hidden>{{ resolvedCountryLabel() }}</span>\n <button [disabled]=\"phone.disabled()\" class=\"et-phone-input-country-trigger\" etSelectTrigger type=\"button\">\n <span class=\"et-phone-input-country-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template [ngTemplateOutlet]=\"flagTemplate.templateRef\" [ngTemplateOutletContext]=\"activeFlagContext()\" />\n } @else {\n {{ activeFlag() }}\n }\n </span>\n <span class=\"et-visually-hidden et-phone-input-country-name\">{{ activeCountryName() }}</span>\n <span class=\"et-phone-input-dial-code\">+{{ phone.dialCode() }}</span>\n </button>\n\n <ng-template etSelectSurface let-select>\n <et-select-panel class=\"et-phone-input-country-panel\">\n <div class=\"et-select-panel-search\">\n <input [placeholder]=\"phoneInputLabels().searchCountries\" etSelectSearch />\n </div>\n\n <!-- the label carries the dial code too, so searching by \"+49\" / \"49\" works -->\n @for (country of countries(); track country.iso2) {\n <et-select-option [label]=\"country.name + ' +' + country.dialCode\" [value]=\"country.iso2\">\n <span class=\"et-phone-input-option-flag\" aria-hidden=\"true\">\n @if (phone.registeredFlagTemplate(); as flagTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"flagTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: country }\"\n />\n } @else {\n {{ country.flag }}\n }\n </span>\n <span class=\"et-phone-input-option-name\">{{ country.name }}</span>\n <span class=\"et-phone-input-option-dial\">+{{ country.dialCode }}</span>\n </et-select-option>\n }\n\n @if (!select.visibleItems().length) {\n <div class=\"et-select-state et-select-state--empty\">{{ phoneInputLabels().noCountries }}</div>\n }\n </et-select-panel>\n </ng-template>\n</div>\n\n<input class=\"et-phone-input-field\" etPhoneInputField />\n\n<ng-template etControlSuffix>\n @if (showClear()) {\n <!-- pointer-only, out of the tab order \u2014 keyboard users clear by erasing the text.\n mousedown is prevented so the field keeps focus (its blur would unmount this\n button before the click could land) -->\n <button\n [attr.aria-label]=\"resolvedClearLabel()\"\n (click)=\"handleClearClick($event)\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"et-input-clear\"\n animate.enter=\"et-input-clear--enter\"\n animate.leave=\"et-input-clear--leave\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i etIcon=\"et-times\"></i>\n </button>\n }\n</ng-template>\n", styles: ["@layer components{et-phone-input{display:flex;align-items:center;gap:8px;flex:1;min-inline-size:0;color:inherit}et-phone-input .et-phone-input-country-trigger{display:flex;align-items:center;gap:4px;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;margin:0;cursor:pointer;appearance:none;white-space:nowrap}et-phone-input .et-phone-input-country-trigger:disabled{cursor:not-allowed}et-phone-input .et-phone-input-country-trigger:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:2px;border-radius:4px}et-phone-input[data-readonly] .et-phone-input-country-trigger{cursor:default}et-phone-input .et-phone-input-country-flag{display:inline-flex;align-items:center}et-phone-input .et-phone-input-dial-code{color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field{flex:1;min-inline-size:0;border:none;outline:none;background:transparent;font:inherit;color:inherit;padding:0;caret-color:var(--et-theme-color-primary-solid, currentColor);font-variant-numeric:tabular-nums}et-phone-input .et-phone-input-field::placeholder{color:color-mix(in srgb,currentColor 46%,transparent)}et-phone-input .et-phone-input-field:disabled{cursor:not-allowed}et-phone-input[data-mixed] .et-phone-input-field::placeholder{font-style:italic;color:color-mix(in srgb,currentColor 72%,transparent)}.et-phone-input-country-panel{inline-size:min(320px,calc(100vw - 24px))}.et-phone-input-country-panel .et-select-option-label{display:flex;align-items:center;gap:var(--et-select-option-gap, 8px);flex:1;min-inline-size:0}.et-phone-input-option-flag{flex:none;display:inline-flex;align-items:center;justify-content:center}.et-phone-input-option-name{flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-phone-input-option-dial{flex:none;color:var(--et-surface-color-muted-solid, currentColor);font-variant-numeric:tabular-nums}.et-phone-input-country-flag :is(img,svg),.et-phone-input-option-flag :is(img,svg){display:block;inline-size:20px;block-size:auto}}\n"], dependencies: [{ kind: "directive", type: ControlSuffixDirective, selector: "ng-template[etControlSuffix]" }, { kind: "directive", type: FormFieldBarrierDirective, selector: "[etFormFieldBarrier]" }, { kind: "directive", type: SelectDirective, selector: "[etSelect]", inputs: ["value", "mixed", "touched", "open", "multiple", "disabled", "readonly", "invalid", "errors", "required", "name", "placeholder", "mixedLabel", "maxLength", "pending", "options", "compareWith", "valueKey", "displayWith", "filterMode", "allowCustomValues", "separators", "normalizeValue", "commitCustomValueOnClose", "maxSelection", "allowAddNew", "loading", "loadError", "hasMoreItems", "mirrorPanelWidth", "pickOnly", "selectAll"], outputs: ["valueChange", "mixedChange", "touchedChange", "openChange", "touch", "queryChange", "loadMore", "addNew", "pickOption", "afterOpen", "afterClose"], exportAs: ["etSelect"] }, { kind: "directive", type: SelectTriggerDirective, selector: "[etSelectTrigger]", exportAs: ["etSelectTrigger"] }, { kind: "directive", type: SelectSurfaceDirective, selector: "ng-template[etSelectSurface]", exportAs: ["etSelectSurface"] }, { kind: "component", type: SelectPanelComponent, selector: "et-select-panel" }, { kind: "component", type: SelectOptionComponent, selector: "et-select-option" }, { kind: "directive", type: SelectSearchDirective, selector: "input[etSelectSearch]", inputs: ["query"], outputs: ["queryChange"], exportAs: ["etSelectSearch"] }, { kind: "directive", type: PhoneInputFieldDirective, selector: "input[etPhoneInputField]", exportAs: ["etPhoneInputField"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
50629
51450
|
}
|
|
50630
51451
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PhoneInputComponent, decorators: [{
|
|
50631
51452
|
type: Component,
|
|
@@ -51645,7 +52466,8 @@ class RangeSliderDirective extends FieldStateControlDirective {
|
|
|
51645
52466
|
const min = this.effectiveMin();
|
|
51646
52467
|
return [min, min];
|
|
51647
52468
|
}
|
|
51648
|
-
const
|
|
52469
|
+
const range = this.value() ?? [this.effectiveMin(), this.effectiveMax()];
|
|
52470
|
+
const snapped = range.map((end) => this.snapValue(end));
|
|
51649
52471
|
return [Math.min(...snapped), Math.max(...snapped)];
|
|
51650
52472
|
}, /* @ts-ignore */
|
|
51651
52473
|
...(ngDevMode ? [{ debugName: "thumbValues" }] : /* istanbul ignore next */ []));
|
|
@@ -52231,7 +53053,14 @@ const DEFAULT_SLIDER_LABELS = {
|
|
|
52231
53053
|
minimum: 'Minimum',
|
|
52232
53054
|
maximum: 'Maximum',
|
|
52233
53055
|
};
|
|
52234
|
-
|
|
53056
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
53057
|
+
const GERMAN_SLIDER_LABELS = {
|
|
53058
|
+
minimum: 'Minimum',
|
|
53059
|
+
maximum: 'Maximum',
|
|
53060
|
+
};
|
|
53061
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideSliderLabels}. */
|
|
53062
|
+
const sliderLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_SLIDER_LABELS : DEFAULT_SLIDER_LABELS;
|
|
53063
|
+
const SLIDER_LABELS_DEF = /* @__PURE__ */ defineLabels('SLIDER_LABELS', sliderLabelsForLocale);
|
|
52235
53064
|
/**
|
|
52236
53065
|
* Localize a slider's strings for everything below this injector, and read the set in effect here as a
|
|
52237
53066
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_SLIDER_LABELS} value. See {@link defineLabels}
|
|
@@ -52530,6 +53359,8 @@ const defaultNormalizeValue = (raw) => {
|
|
|
52530
53359
|
const trimmed = raw.trim();
|
|
52531
53360
|
return trimmed.length ? trimmed : null;
|
|
52532
53361
|
};
|
|
53362
|
+
// a form model can hold `null` for a `string[]` field (a JSON `null` from an API)
|
|
53363
|
+
const tagsOf = (value) => value ?? [];
|
|
52533
53364
|
class TagInputDirective extends TextShellControlDirective {
|
|
52534
53365
|
constructor() {
|
|
52535
53366
|
super(...arguments);
|
|
@@ -52564,7 +53395,7 @@ class TagInputDirective extends TextShellControlDirective {
|
|
|
52564
53395
|
this.maxSelection = input(undefined, /* @ts-ignore */
|
|
52565
53396
|
...(ngDevMode ? [{ debugName: "maxSelection" }] : /* istanbul ignore next */ []));
|
|
52566
53397
|
/** The raw value normalized to the tags the control currently shows. Mixed has no effective tags. */
|
|
52567
|
-
this.effectiveValues = computed(() => (this.mixed() ? [] : this.value()), /* @ts-ignore */
|
|
53398
|
+
this.effectiveValues = computed(() => (this.mixed() ? [] : tagsOf(this.value())), /* @ts-ignore */
|
|
52568
53399
|
...(ngDevMode ? [{ debugName: "effectiveValues" }] : /* istanbul ignore next */ []));
|
|
52569
53400
|
this.hasValue = computed(() => this.mixed() || this.effectiveValues().length > 0, /* @ts-ignore */
|
|
52570
53401
|
...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
|
|
@@ -52637,7 +53468,7 @@ class TagInputDirective extends TextShellControlDirective {
|
|
|
52637
53468
|
if (!this.interactive() || this.mixed()) {
|
|
52638
53469
|
return;
|
|
52639
53470
|
}
|
|
52640
|
-
const current = this.value();
|
|
53471
|
+
const current = tagsOf(this.value());
|
|
52641
53472
|
// a no-op removal must not write: `filter` always allocates, so the model would notify with
|
|
52642
53473
|
// an equal-but-new array and dirty the bound form field on a keystroke that changed nothing
|
|
52643
53474
|
if (index < 0 || index >= current.length) {
|
|
@@ -54170,6 +55001,8 @@ class GridDirective {
|
|
|
54170
55001
|
.join(', ')}. Configured breakpoints are ${known.map((name) => `"${name}"`).join(', ')}.`, state);
|
|
54171
55002
|
}
|
|
54172
55003
|
}
|
|
55004
|
+
for (const id of this.leavingIds())
|
|
55005
|
+
this.cancelLeave(id);
|
|
54173
55006
|
const items = state.items.map((item) => ({
|
|
54174
55007
|
id: item.id,
|
|
54175
55008
|
type: item.type,
|
|
@@ -55013,7 +55846,16 @@ const DEFAULT_GRID_LABELS = {
|
|
|
55013
55846
|
item: 'Grid item',
|
|
55014
55847
|
removeItem: 'Remove item',
|
|
55015
55848
|
};
|
|
55016
|
-
|
|
55849
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
55850
|
+
const GERMAN_GRID_LABELS = {
|
|
55851
|
+
interactiveGrid: 'Interaktives Rasterlayout',
|
|
55852
|
+
readonlyGrid: 'Rasterlayout',
|
|
55853
|
+
item: 'Rasterelement',
|
|
55854
|
+
removeItem: 'Element entfernen',
|
|
55855
|
+
};
|
|
55856
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideGridLabels}. */
|
|
55857
|
+
const gridLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_GRID_LABELS : DEFAULT_GRID_LABELS;
|
|
55858
|
+
const GRID_LABELS_DEF = /* @__PURE__ */ defineLabels('GRID_LABELS', gridLabelsForLocale);
|
|
55017
55859
|
/**
|
|
55018
55860
|
* Localize the grid's accessible labels for everything below this injector, and read the set in effect
|
|
55019
55861
|
* here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_GRID_LABELS} value. See
|
|
@@ -56783,7 +57625,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
56783
57625
|
const DEFAULT_NOTIFICATION_LABELS = {
|
|
56784
57626
|
dismiss: 'Dismiss',
|
|
56785
57627
|
};
|
|
56786
|
-
|
|
57628
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
57629
|
+
const GERMAN_NOTIFICATION_LABELS = {
|
|
57630
|
+
dismiss: 'Schließen',
|
|
57631
|
+
};
|
|
57632
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideNotificationLabels}. */
|
|
57633
|
+
const notificationLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_NOTIFICATION_LABELS : DEFAULT_NOTIFICATION_LABELS;
|
|
57634
|
+
const NOTIFICATION_LABELS_DEF = /* @__PURE__ */ defineLabels('NOTIFICATION_LABELS', notificationLabelsForLocale);
|
|
56787
57635
|
/**
|
|
56788
57636
|
* Localize a notification's strings for everything below this injector, and read the set in effect here as a
|
|
56789
57637
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_NOTIFICATION_LABELS} value. See {@link defineLabels}
|
|
@@ -56815,8 +57663,21 @@ const runNotificationPromise = ({ content, open, injector, ...options }) => {
|
|
|
56815
57663
|
const resolved = typeof source === 'function' ? source(result) : source;
|
|
56816
57664
|
ref.replaceConfig({ ...toNotificationContent(resolved), status });
|
|
56817
57665
|
};
|
|
57666
|
+
const cancel = () => {
|
|
57667
|
+
if (isReplacedByLaterOpen())
|
|
57668
|
+
return;
|
|
57669
|
+
ref.dismiss();
|
|
57670
|
+
};
|
|
56818
57671
|
if (isQuery$1(work)) {
|
|
56819
|
-
followQuery({
|
|
57672
|
+
followQuery({
|
|
57673
|
+
query: work,
|
|
57674
|
+
ref,
|
|
57675
|
+
settle,
|
|
57676
|
+
cancel,
|
|
57677
|
+
updateProgress,
|
|
57678
|
+
followProgress: loading.progress !== undefined,
|
|
57679
|
+
injector,
|
|
57680
|
+
});
|
|
56820
57681
|
}
|
|
56821
57682
|
else if (isObservable(work)) {
|
|
56822
57683
|
let lastValue;
|
|
@@ -56848,18 +57709,39 @@ const runNotificationPromise = ({ content, open, injector, ...options }) => {
|
|
|
56848
57709
|
* `QueryErrorResponse`, everything else an `unknown`), not to pick different code paths.
|
|
56849
57710
|
*/
|
|
56850
57711
|
const createNotificationPromiseFn = (deps) => ((work, content) => runNotificationPromise({ ...deps, work, content }));
|
|
56851
|
-
const followQuery = ({ query, ref, settle, updateProgress, followProgress, injector, }) => {
|
|
57712
|
+
const followQuery = ({ query, ref, settle, cancel, updateProgress, followProgress, injector, }) => {
|
|
56852
57713
|
let effectRef = null;
|
|
56853
57714
|
let hasSettled = false;
|
|
56854
57715
|
const stopFollowing = () => {
|
|
56855
57716
|
effectRef?.destroy();
|
|
56856
57717
|
effectRef = null;
|
|
56857
57718
|
};
|
|
57719
|
+
let hasSeenLoading = false;
|
|
57720
|
+
let eventBeforeLoading = null;
|
|
57721
|
+
const markLoading = () => {
|
|
57722
|
+
hasSeenLoading = true;
|
|
57723
|
+
eventBeforeLoading = untracked(() => query.latestHttpEvent());
|
|
57724
|
+
};
|
|
57725
|
+
// Read before the effect's first run, which an abort can beat.
|
|
57726
|
+
if (untracked(() => query.executionState())?.type === 'loading')
|
|
57727
|
+
markLoading();
|
|
56858
57728
|
effectRef = effect(() => {
|
|
56859
57729
|
const state = query.executionState();
|
|
56860
|
-
if (
|
|
57730
|
+
if (hasSettled)
|
|
57731
|
+
return;
|
|
57732
|
+
if (!state) {
|
|
57733
|
+
if (!hasSeenLoading)
|
|
57734
|
+
return;
|
|
57735
|
+
hasSettled = true;
|
|
57736
|
+
untracked(() => {
|
|
57737
|
+
cancel();
|
|
57738
|
+
stopFollowing();
|
|
57739
|
+
});
|
|
56861
57740
|
return;
|
|
57741
|
+
}
|
|
56862
57742
|
if (state.type === 'loading') {
|
|
57743
|
+
if (!hasSeenLoading)
|
|
57744
|
+
markLoading();
|
|
56863
57745
|
const percentage = state.loading.progress?.percentage;
|
|
56864
57746
|
if (followProgress && percentage !== undefined) {
|
|
56865
57747
|
untracked(() => updateProgress(percentage));
|
|
@@ -56868,7 +57750,14 @@ const followQuery = ({ query, ref, settle, updateProgress, followProgress, injec
|
|
|
56868
57750
|
}
|
|
56869
57751
|
hasSettled = true;
|
|
56870
57752
|
untracked(() => {
|
|
56871
|
-
|
|
57753
|
+
const latestEvent = query.latestHttpEvent();
|
|
57754
|
+
// An aborted re-execution falls back to the previous round's response, which reads as a success.
|
|
57755
|
+
if (state.type === 'success' &&
|
|
57756
|
+
hasSeenLoading &&
|
|
57757
|
+
(latestEvent === eventBeforeLoading || latestEvent?.type !== HttpEventType.Response)) {
|
|
57758
|
+
cancel();
|
|
57759
|
+
}
|
|
57760
|
+
else if (state.type === 'success') {
|
|
56872
57761
|
settle('success', state.response);
|
|
56873
57762
|
}
|
|
56874
57763
|
else {
|
|
@@ -57341,7 +58230,25 @@ const DEFAULT_PAGINATION_LABELS = {
|
|
|
57341
58230
|
pageSize: 'Items per page',
|
|
57342
58231
|
pageSizeOption: (size) => `${size}`,
|
|
57343
58232
|
};
|
|
57344
|
-
|
|
58233
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
58234
|
+
const GERMAN_PAGINATION_LABELS = {
|
|
58235
|
+
navigation: 'Seitennavigation',
|
|
58236
|
+
first: 'Erste Seite',
|
|
58237
|
+
previous: 'Vorherige Seite',
|
|
58238
|
+
next: 'Nächste Seite',
|
|
58239
|
+
last: 'Letzte Seite',
|
|
58240
|
+
ellipsis: 'Weitere Seiten',
|
|
58241
|
+
page: (page) => `Seite ${page}`,
|
|
58242
|
+
range: ({ start, end, totalItems }) => `Zeige ${start}–${end} von ${totalItems}`,
|
|
58243
|
+
compactRange: ({ start, end, totalItems }) => `${start}–${end} von ${totalItems}`,
|
|
58244
|
+
compactPage: (page, totalPages) => `${page} / ${totalPages}`,
|
|
58245
|
+
jumpTo: 'Gehe zu Seite',
|
|
58246
|
+
pageSize: 'Einträge pro Seite',
|
|
58247
|
+
pageSizeOption: (size) => `${size}`,
|
|
58248
|
+
};
|
|
58249
|
+
/** The label set for a locale. Anything other than English and German needs {@link providePaginationLabels}. */
|
|
58250
|
+
const paginationLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_PAGINATION_LABELS : DEFAULT_PAGINATION_LABELS;
|
|
58251
|
+
const PAGINATION_LABELS_DEF = /* @__PURE__ */ defineLabels('PAGINATION_LABELS', paginationLabelsForLocale);
|
|
57345
58252
|
/**
|
|
57346
58253
|
* Localize the paginator's strings for everything below this injector, and read the set in effect
|
|
57347
58254
|
* here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_PAGINATION_LABELS}
|
|
@@ -57994,7 +58901,16 @@ const DEFAULT_PROGRESS_STEP_LABELS = {
|
|
|
57994
58901
|
warning: 'Warning',
|
|
57995
58902
|
error: 'Failed',
|
|
57996
58903
|
};
|
|
57997
|
-
|
|
58904
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
58905
|
+
const GERMAN_PROGRESS_STEP_LABELS = {
|
|
58906
|
+
complete: 'Abgeschlossen',
|
|
58907
|
+
success: 'Erfolgreich',
|
|
58908
|
+
warning: 'Warnung',
|
|
58909
|
+
error: 'Fehlgeschlagen',
|
|
58910
|
+
};
|
|
58911
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideProgressStepLabels}. */
|
|
58912
|
+
const progressStepLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_PROGRESS_STEP_LABELS : DEFAULT_PROGRESS_STEP_LABELS;
|
|
58913
|
+
const PROGRESS_STEP_LABELS_DEF = /* @__PURE__ */ defineLabels('PROGRESS_STEP_LABELS', progressStepLabelsForLocale);
|
|
57998
58914
|
/**
|
|
57999
58915
|
* Localize the state text of every progress step below this injector. Partial - whatever you leave out keeps
|
|
58000
58916
|
* its {@link DEFAULT_PROGRESS_STEP_LABELS} value.
|
|
@@ -58490,7 +59406,39 @@ const DEFAULT_SCHEDULER_LABELS = {
|
|
|
58490
59406
|
colorField: 'Color',
|
|
58491
59407
|
colorFieldNone: 'No color',
|
|
58492
59408
|
};
|
|
58493
|
-
|
|
59409
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
59410
|
+
const GERMAN_SCHEDULER_LABELS = {
|
|
59411
|
+
previous: 'Zurück',
|
|
59412
|
+
next: 'Weiter',
|
|
59413
|
+
today: 'Heute',
|
|
59414
|
+
allDay: 'Ganztägig',
|
|
59415
|
+
moreAppointments: (count) => `+${count} weitere`,
|
|
59416
|
+
switchView: 'Ansicht wechseln',
|
|
59417
|
+
month: 'Monat',
|
|
59418
|
+
week: 'Woche',
|
|
59419
|
+
day: 'Tag',
|
|
59420
|
+
agenda: 'Agenda',
|
|
59421
|
+
addAppointment: 'Termin hinzufügen',
|
|
59422
|
+
untitledAppointment: 'Unbenannter Termin',
|
|
59423
|
+
ancestors: 'Übergeordnete Termine',
|
|
59424
|
+
subAppointments: 'Untertermine',
|
|
59425
|
+
moreActions: 'Weitere Aktionen',
|
|
59426
|
+
save: 'Speichern',
|
|
59427
|
+
cancel: 'Abbrechen',
|
|
59428
|
+
addSubAppointment: 'Untertermin hinzufügen',
|
|
59429
|
+
deleteWithDescendants: 'Löschen (einschließlich Untertermine)',
|
|
59430
|
+
titleField: 'Titel',
|
|
59431
|
+
timeRangeField: 'Wann',
|
|
59432
|
+
startField: 'Beginn',
|
|
59433
|
+
endField: 'Ende',
|
|
59434
|
+
locationField: 'Ort',
|
|
59435
|
+
descriptionField: 'Beschreibung',
|
|
59436
|
+
colorField: 'Farbe',
|
|
59437
|
+
colorFieldNone: 'Keine Farbe',
|
|
59438
|
+
};
|
|
59439
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideSchedulerLabels}. */
|
|
59440
|
+
const schedulerLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_SCHEDULER_LABELS : DEFAULT_SCHEDULER_LABELS;
|
|
59441
|
+
const SCHEDULER_LABELS_DEF = /* @__PURE__ */ defineLabels('SCHEDULER_LABELS', schedulerLabelsForLocale);
|
|
58494
59442
|
const provideSchedulerLabels = /* @__PURE__ */ toProvideFn(SCHEDULER_LABELS_DEF);
|
|
58495
59443
|
const injectSchedulerLabels = /* @__PURE__ */ toInjectFn(SCHEDULER_LABELS_DEF);
|
|
58496
59444
|
const SCHEDULER_LABELS = /* @__PURE__ */ toToken(SCHEDULER_LABELS_DEF);
|
|
@@ -58541,7 +59489,7 @@ const collectDescendantIds = (node) => node.children.flatMap((child) => [child.a
|
|
|
58541
59489
|
*/
|
|
58542
59490
|
class SchedulerDirective {
|
|
58543
59491
|
constructor() {
|
|
58544
|
-
this.defaultLocale =
|
|
59492
|
+
this.defaultLocale = injectDateLocaleSignal();
|
|
58545
59493
|
/** Today, re-read when focus enters the scheduler and when the page becomes visible again - what each view's `today` flag compares against. */
|
|
58546
59494
|
this.today = injectToday();
|
|
58547
59495
|
/** Every appointment the scheduler knows about - not pre-filtered to the visible range. */
|
|
@@ -58582,7 +59530,7 @@ class SchedulerDirective {
|
|
|
58582
59530
|
* it; the preview drops on release, so persisting asynchronously wants an optimistic write.
|
|
58583
59531
|
*/
|
|
58584
59532
|
this.appointmentReschedule = output();
|
|
58585
|
-
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale, /* @ts-ignore */
|
|
59533
|
+
this.effectiveLocale = computed(() => this.locale() ?? this.defaultLocale(), /* @ts-ignore */
|
|
58586
59534
|
...(ngDevMode ? [{ debugName: "effectiveLocale" }] : /* istanbul ignore next */ []));
|
|
58587
59535
|
this.effectiveFirstDayOfWeek = computed(() => this.firstDayOfWeek() ??
|
|
58588
59536
|
this.effectiveLocale()?.options?.weekStartsOn ??
|
|
@@ -59451,6 +60399,75 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
59451
60399
|
args: [{ selector: 'et-scheduler-appointment-styles', template: '', encapsulation: ViewEncapsulation.None, styles: ["@layer components{.et-scheduler-appointment{display:flex;align-items:center;gap:6px;padding:2px 6px;border:none;border-radius:4px;background:color-mix(in srgb,var(--et-theme-color-primary-solid) 14%,transparent);color:var(--et-theme-color-ink-solid);font:inherit;font-size:12px;text-align:start;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}@media(hover:hover){.et-scheduler-appointment:hover{background:color-mix(in srgb,var(--et-theme-color-primary-solid) 22%,transparent)}}.et-scheduler-appointment:focus-visible{outline:2px solid var(--et-theme-color-primary-solid);outline-offset:1px}.et-scheduler-appointment:where([data-selected]){background:var(--et-theme-color-primary-solid);color:var(--et-theme-color-on-primary)}.et-scheduler-appointment:where([data-draggable]){cursor:grab;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.et-scheduler-appointment:where([data-dragging]){box-shadow:var(--et-scheduler-appointment-drag-shadow, 0 2px 8px rgb(var(--et-shadow-color-rgb, 0 0 0) / .25));cursor:grabbing}.et-scheduler-appointment-title{overflow:hidden;font-weight:600;min-inline-size:0;flex:1;text-overflow:ellipsis;white-space:nowrap}.et-scheduler-appointment-dot{flex-shrink:0;inline-size:6px;block-size:6px;border-radius:999px;background:var(--et-theme-color-primary-solid)}:where(.et-scheduler-appointment,.et-scheduler-time-grid-block):where([data-selected]) .et-scheduler-appointment-dot{background:var(--et-theme-color-on-primary)}.et-scheduler-appointment-time-range{flex-shrink:0;font-variant-numeric:tabular-nums;white-space:nowrap}.et-scheduler-appointment-location{display:flex;flex-shrink:0;align-items:center;gap:3px;max-inline-size:40%}.et-scheduler-appointment-location-icon{flex-shrink:0;inline-size:10px;block-size:10px}.et-scheduler-appointment-location-text{overflow:hidden;min-inline-size:0;text-overflow:ellipsis;white-space:nowrap}.et-scheduler-appointment-chain-count{display:flex;flex-shrink:0;align-items:center;gap:2px;font-variant-numeric:tabular-nums}.et-scheduler-appointment-chain-count-icon{inline-size:8px;block-size:8px;transform:rotate(90deg)}}\n"] }]
|
|
59452
60400
|
}] });
|
|
59453
60401
|
|
|
60402
|
+
/**
|
|
60403
|
+
* The time-range piece of an appointment badge, stamped by `etSchedulerBadgeTimeRange`. Renders
|
|
60404
|
+
* nothing for an all-day appointment, which has no meaningful start/end time to show.
|
|
60405
|
+
*
|
|
60406
|
+
* @internal
|
|
60407
|
+
*/
|
|
60408
|
+
class SchedulerBadgeTimeRangeComponent {
|
|
60409
|
+
constructor() {
|
|
60410
|
+
this.scheduler = inject(SchedulerDirective, { optional: true });
|
|
60411
|
+
this.node = input.required(/* @ts-ignore */
|
|
60412
|
+
...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
|
|
60413
|
+
this.range = computed(() => {
|
|
60414
|
+
const appointment = this.node().appointment;
|
|
60415
|
+
if (appointment.allDay) {
|
|
60416
|
+
return null;
|
|
60417
|
+
}
|
|
60418
|
+
const locale = this.scheduler?.effectiveLocale();
|
|
60419
|
+
const options = locale ? { locale } : undefined;
|
|
60420
|
+
return `${format(appointment.start, 'p', options)}–${format(appointment.end, 'p', options)}`;
|
|
60421
|
+
}, /* @ts-ignore */
|
|
60422
|
+
...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
|
|
60423
|
+
}
|
|
60424
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
60425
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerBadgeTimeRangeComponent, isStandalone: true, selector: "et-scheduler-badge-time-range", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
60426
|
+
@if (range(); as range) {
|
|
60427
|
+
<span class="et-scheduler-appointment-time-range">{{ range }}</span>
|
|
60428
|
+
}
|
|
60429
|
+
`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
|
|
60430
|
+
}
|
|
60431
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, decorators: [{
|
|
60432
|
+
type: Component,
|
|
60433
|
+
args: [{
|
|
60434
|
+
selector: 'et-scheduler-badge-time-range',
|
|
60435
|
+
template: `
|
|
60436
|
+
@if (range(); as range) {
|
|
60437
|
+
<span class="et-scheduler-appointment-time-range">{{ range }}</span>
|
|
60438
|
+
}
|
|
60439
|
+
`,
|
|
60440
|
+
encapsulation: ViewEncapsulation.None,
|
|
60441
|
+
}]
|
|
60442
|
+
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
|
|
60443
|
+
|
|
60444
|
+
/**
|
|
60445
|
+
* The title piece of an appointment badge, stamped by `etSchedulerBadgeTitle`.
|
|
60446
|
+
*
|
|
60447
|
+
* @internal
|
|
60448
|
+
*/
|
|
60449
|
+
class SchedulerBadgeTitleComponent {
|
|
60450
|
+
constructor() {
|
|
60451
|
+
this.node = input.required(/* @ts-ignore */
|
|
60452
|
+
...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
|
|
60453
|
+
}
|
|
60454
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
60455
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: SchedulerBadgeTitleComponent, isStandalone: true, selector: "et-scheduler-badge-title", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
|
|
60456
|
+
}
|
|
60457
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, decorators: [{
|
|
60458
|
+
type: Component,
|
|
60459
|
+
args: [{
|
|
60460
|
+
selector: 'et-scheduler-badge-title',
|
|
60461
|
+
template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`,
|
|
60462
|
+
encapsulation: ViewEncapsulation.None,
|
|
60463
|
+
}]
|
|
60464
|
+
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
|
|
60465
|
+
|
|
60466
|
+
const SCHEDULER_FALLBACK_BADGE_ADORNMENTS = [
|
|
60467
|
+
{ component: SchedulerBadgeTitleComponent, order: 0 },
|
|
60468
|
+
{ component: SchedulerBadgeTimeRangeComponent, order: 10 },
|
|
60469
|
+
];
|
|
60470
|
+
|
|
59454
60471
|
/** The default agenda list: one section per visible day, appointments as full-width badges indented by chain depth. */
|
|
59455
60472
|
class SchedulerAgendaViewComponent {
|
|
59456
60473
|
constructor() {
|
|
@@ -59473,7 +60490,7 @@ class SchedulerAgendaViewComponent {
|
|
|
59473
60490
|
injectStyleManager().mount(SchedulerAppointmentStylesComponent);
|
|
59474
60491
|
}
|
|
59475
60492
|
badgeAdornments() {
|
|
59476
|
-
return this.featureHost?.badgeAdornments() ??
|
|
60493
|
+
return this.featureHost?.badgeAdornments() ?? SCHEDULER_FALLBACK_BADGE_ADORNMENTS;
|
|
59477
60494
|
}
|
|
59478
60495
|
weekdayLabel(date) {
|
|
59479
60496
|
const locale = this.scheduler?.effectiveLocale();
|
|
@@ -59754,48 +60771,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
59754
60771
|
}]
|
|
59755
60772
|
}], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerBadgeLocation", required: false }] }] } });
|
|
59756
60773
|
|
|
59757
|
-
/**
|
|
59758
|
-
* The time-range piece of an appointment badge, stamped by `etSchedulerBadgeTimeRange`. Renders
|
|
59759
|
-
* nothing for an all-day appointment, which has no meaningful start/end time to show.
|
|
59760
|
-
*
|
|
59761
|
-
* @internal
|
|
59762
|
-
*/
|
|
59763
|
-
class SchedulerBadgeTimeRangeComponent {
|
|
59764
|
-
constructor() {
|
|
59765
|
-
this.scheduler = inject(SchedulerDirective, { optional: true });
|
|
59766
|
-
this.node = input.required(/* @ts-ignore */
|
|
59767
|
-
...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
|
|
59768
|
-
this.range = computed(() => {
|
|
59769
|
-
const appointment = this.node().appointment;
|
|
59770
|
-
if (appointment.allDay) {
|
|
59771
|
-
return null;
|
|
59772
|
-
}
|
|
59773
|
-
const locale = this.scheduler?.effectiveLocale();
|
|
59774
|
-
const options = locale ? { locale } : undefined;
|
|
59775
|
-
return `${format(appointment.start, 'p', options)}–${format(appointment.end, 'p', options)}`;
|
|
59776
|
-
}, /* @ts-ignore */
|
|
59777
|
-
...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
|
|
59778
|
-
}
|
|
59779
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
59780
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerBadgeTimeRangeComponent, isStandalone: true, selector: "et-scheduler-badge-time-range", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
59781
|
-
@if (range(); as range) {
|
|
59782
|
-
<span class="et-scheduler-appointment-time-range">{{ range }}</span>
|
|
59783
|
-
}
|
|
59784
|
-
`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
|
|
59785
|
-
}
|
|
59786
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTimeRangeComponent, decorators: [{
|
|
59787
|
-
type: Component,
|
|
59788
|
-
args: [{
|
|
59789
|
-
selector: 'et-scheduler-badge-time-range',
|
|
59790
|
-
template: `
|
|
59791
|
-
@if (range(); as range) {
|
|
59792
|
-
<span class="et-scheduler-appointment-time-range">{{ range }}</span>
|
|
59793
|
-
}
|
|
59794
|
-
`,
|
|
59795
|
-
encapsulation: ViewEncapsulation.None,
|
|
59796
|
-
}]
|
|
59797
|
-
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
|
|
59798
|
-
|
|
59799
60774
|
/**
|
|
59800
60775
|
* Built-in badge adornment: the appointment's `start`–`end` time, hidden for an all-day
|
|
59801
60776
|
* appointment. One of the default pieces `<et-scheduler>` bundles - see `registerBadgeAdornment`.
|
|
@@ -59826,28 +60801,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
59826
60801
|
}]
|
|
59827
60802
|
}], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "etSchedulerBadgeTimeRange", required: false }] }] } });
|
|
59828
60803
|
|
|
59829
|
-
/**
|
|
59830
|
-
* The title piece of an appointment badge, stamped by `etSchedulerBadgeTitle`.
|
|
59831
|
-
*
|
|
59832
|
-
* @internal
|
|
59833
|
-
*/
|
|
59834
|
-
class SchedulerBadgeTitleComponent {
|
|
59835
|
-
constructor() {
|
|
59836
|
-
this.node = input.required(/* @ts-ignore */
|
|
59837
|
-
...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
|
|
59838
|
-
}
|
|
59839
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
59840
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: SchedulerBadgeTitleComponent, isStandalone: true, selector: "et-scheduler-badge-title", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
|
|
59841
|
-
}
|
|
59842
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerBadgeTitleComponent, decorators: [{
|
|
59843
|
-
type: Component,
|
|
59844
|
-
args: [{
|
|
59845
|
-
selector: 'et-scheduler-badge-title',
|
|
59846
|
-
template: `<span class="et-scheduler-appointment-title">{{ node().appointment.title }}</span>`,
|
|
59847
|
-
encapsulation: ViewEncapsulation.None,
|
|
59848
|
-
}]
|
|
59849
|
-
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
|
|
59850
|
-
|
|
59851
60804
|
/**
|
|
59852
60805
|
* Built-in badge adornment: the appointment's title. One of the default pieces `<et-scheduler>`
|
|
59853
60806
|
* bundles - see `registerBadgeAdornment`.
|
|
@@ -60843,7 +61796,7 @@ class SchedulerMonthViewComponent {
|
|
|
60843
61796
|
injectStyleManager().mount(SchedulerAppointmentStylesComponent);
|
|
60844
61797
|
}
|
|
60845
61798
|
badgeAdornments() {
|
|
60846
|
-
return this.featureHost?.badgeAdornments() ??
|
|
61799
|
+
return this.featureHost?.badgeAdornments() ?? SCHEDULER_FALLBACK_BADGE_ADORNMENTS;
|
|
60847
61800
|
}
|
|
60848
61801
|
weekdays() {
|
|
60849
61802
|
return this.scheduler?.weekdays() ?? [];
|
|
@@ -61195,7 +62148,7 @@ class SchedulerTimeGridViewComponent {
|
|
|
61195
62148
|
});
|
|
61196
62149
|
}
|
|
61197
62150
|
badgeAdornments() {
|
|
61198
|
-
return this.featureHost?.badgeAdornments() ??
|
|
62151
|
+
return this.featureHost?.badgeAdornments() ?? SCHEDULER_FALLBACK_BADGE_ADORNMENTS;
|
|
61199
62152
|
}
|
|
61200
62153
|
weekdayLabel(date) {
|
|
61201
62154
|
const locale = this.scheduler?.effectiveLocale();
|
|
@@ -61524,10 +62477,15 @@ class SchedulerComponent {
|
|
|
61524
62477
|
*/
|
|
61525
62478
|
this.headless = inject(SchedulerDirective);
|
|
61526
62479
|
this.elementRef = inject(ElementRef);
|
|
62480
|
+
/** Every appointment the scheduler knows about - not pre-filtered to the visible range. */
|
|
62481
|
+
this.appointments = input([], /* @ts-ignore */
|
|
62482
|
+
...(ngDevMode ? [{ debugName: "appointments" }] : /* istanbul ignore next */ []));
|
|
61527
62483
|
/** Emits the edited or newly-added appointment once the edit surface saves. */
|
|
61528
62484
|
this.appointmentSave = output();
|
|
61529
62485
|
/** Emits every id to remove once the edit surface deletes a chain. */
|
|
61530
62486
|
this.appointmentsDelete = output();
|
|
62487
|
+
/** Emits when a move or resize lands an appointment somewhere else - see `SchedulerDirective.appointmentReschedule`. */
|
|
62488
|
+
this.appointmentReschedule = outputFromObservable(outputToObservable(this.headless.appointmentReschedule));
|
|
61531
62489
|
this.dimensions = signalHostElementDimensions();
|
|
61532
62490
|
this.isNarrow = computed(() => (this.dimensions().client?.width ?? Infinity) < NARROW_CONTAINER_WIDTH, /* @ts-ignore */
|
|
61533
62491
|
...(ngDevMode ? [{ debugName: "isNarrow" }] : /* istanbul ignore next */ []));
|
|
@@ -61620,7 +62578,7 @@ class SchedulerComponent {
|
|
|
61620
62578
|
get selectedAppointment() {
|
|
61621
62579
|
return this.headless.selectedAppointment;
|
|
61622
62580
|
}
|
|
61623
|
-
|
|
62581
|
+
visibleAppointments() {
|
|
61624
62582
|
return this.headless.visibleAppointments();
|
|
61625
62583
|
}
|
|
61626
62584
|
registerBadgeAdornment(adornment) {
|
|
@@ -61725,10 +62683,10 @@ class SchedulerComponent {
|
|
|
61725
62683
|
}
|
|
61726
62684
|
}
|
|
61727
62685
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
61728
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerComponent, isStandalone: true, selector: "et-scheduler", outputs: { appointmentSave: "appointmentSave", appointmentsDelete: "appointmentsDelete" }, host: { classAttribute: "et-scheduler" }, providers: [
|
|
62686
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SchedulerComponent, isStandalone: true, selector: "et-scheduler", inputs: { appointments: { classPropertyName: "appointments", publicName: "appointments", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { appointmentSave: "appointmentSave", appointmentsDelete: "appointmentsDelete", appointmentReschedule: "appointmentReschedule" }, host: { classAttribute: "et-scheduler" }, providers: [
|
|
61729
62687
|
provideIcons(CALENDAR_ICON, CHEVRON_ICON, PLUS_ICON),
|
|
61730
62688
|
{ provide: SCHEDULER_FEATURE_HOST, useExisting: SchedulerComponent },
|
|
61731
|
-
], hostDirectives: [{ directive: SchedulerDirective, inputs: ["appointments", "appointments", "view", "view", "focusedDate", "focusedDate", "selectedAppointmentId", "selectedAppointmentId", "locale", "locale", "firstDayOfWeek", "firstDayOfWeek", "agendaDays", "agendaDays", "businessHours", "businessHours", "nowIndicator", "nowIndicator"], outputs: ["viewChange", "viewChange", "focusedDateChange", "focusedDateChange", "selectedAppointmentIdChange", "selectedAppointmentIdChange"
|
|
62689
|
+
], hostDirectives: [{ directive: SchedulerDirective, inputs: ["appointments", "appointments", "view", "view", "focusedDate", "focusedDate", "selectedAppointmentId", "selectedAppointmentId", "locale", "locale", "firstDayOfWeek", "firstDayOfWeek", "agendaDays", "agendaDays", "businessHours", "businessHours", "nowIndicator", "nowIndicator"], outputs: ["viewChange", "viewChange", "focusedDateChange", "focusedDateChange", "selectedAppointmentIdChange", "selectedAppointmentIdChange"] }, { directive: SchedulerBadgeColorDotDirective, inputs: ["etSchedulerBadgeColorDot", "etSchedulerBadgeColorDot"] }, { directive: SchedulerBadgeTitleDirective, inputs: ["etSchedulerBadgeTitle", "etSchedulerBadgeTitle"] }, { directive: SchedulerBadgeTimeRangeDirective, inputs: ["etSchedulerBadgeTimeRange", "etSchedulerBadgeTimeRange"] }, { directive: SchedulerBadgeLocationDirective, inputs: ["etSchedulerBadgeLocation", "etSchedulerBadgeLocation"] }, { directive: SchedulerBadgeChainCountDirective, inputs: ["etSchedulerBadgeChainCount", "etSchedulerBadgeChainCount"] }, { directive: SchedulerActionAddAppointmentDirective, inputs: ["etSchedulerActionAddAppointment", "etSchedulerActionAddAppointment"] }, { directive: SchedulerSwipeNavigationDirective, inputs: ["etSchedulerSwipeNavigation", "etSchedulerSwipeNavigation"] }, { directive: SchedulerAppointmentDragDirective, inputs: ["etSchedulerAppointmentDrag", "etSchedulerAppointmentDrag"] }], ngImport: i0, template: "<div class=\"et-scheduler-header\">\n <button\n [attr.aria-label]=\"todayLabel()\"\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n <i etIcon=\"et-calendar\" aria-hidden=\"true\"></i>\n <span class=\"et-scheduler-today-button-label\">{{ todayLabel() }}</span>\n </button>\n\n @if (isNarrow()) {\n <div class=\"et-scheduler-toolbar-fabs\" etFloatingAction>\n <div etFloatingActionAnchor>\n <div class=\"et-scheduler-toolbar-fab-stack\" etFloatingActionTrigger>\n @for (action of toolbarActions(); track $index) {\n @if (action.icon; as icon) {\n <button\n [attr.aria-label]=\"action.label()\"\n (click)=\"action.run()\"\n class=\"et-scheduler-toolbar-action\"\n et-fab\n type=\"button\"\n >\n <i [etIcon]=\"icon\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-fab expanded type=\"button\">\n {{ action.label() }}\n </button>\n }\n }\n </div>\n </div>\n </div>\n } @else {\n @for (action of toolbarActions(); track $index) {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-button size=\"sm\" type=\"button\">\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n }\n\n <div class=\"et-scheduler-nav-buttons\">\n <button\n [attr.aria-label]=\"previousLabel()\"\n (click)=\"headless.previous()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--previous\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n\n <button\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"headless.next()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--next\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n </div>\n\n <span class=\"et-scheduler-header-label\">{{ headerLabel() }}</span>\n\n <div class=\"et-scheduler-header-spacer\"></div>\n\n <et-segmented-button-group\n [value]=\"headless.view()\"\n (valueChange)=\"setView($event)\"\n class=\"et-scheduler-view-switch\"\n size=\"sm\"\n variant=\"tabs\"\n >\n <et-label class=\"et-visually-hidden et-scheduler-view-switch-label\">{{ switchViewLabel() }}</et-label>\n\n <et-segmented-button value=\"month\">{{ monthViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"week\">{{ weekViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"day\">{{ dayViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"agenda\">{{ agendaViewLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n</div>\n\n<div class=\"et-scheduler-body\">\n @switch (headless.view()) {\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @case ('month') {\n <et-scheduler-month-view [attr.aria-label]=\"headerLabel()\" />\n }\n @default {\n <et-scheduler-time-grid-view [attr.aria-label]=\"headerLabel()\" />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{container-type:inline-size;container-name:et-scheduler;display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.et-scheduler-view-switch{flex-basis:100%}.et-scheduler-toolbar-fab-stack{display:flex;gap:8px}@container et-scheduler not (min-inline-size: 480px){.et-scheduler .et-scheduler-today-button{--et-button-padding: 0;inline-size:3.1rem;block-size:3.1rem;border-radius:9999px}.et-scheduler .et-scheduler-today-button-label{display:none}}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}.et-scheduler .et-scheduler-today-button .et-button-icon{display:none}}.et-scheduler-nav-buttons{display:flex;gap:2px}.et-scheduler-nav-button--previous .et-icon{rotate:-90deg}.et-scheduler-nav-button--next .et-icon{rotate:90deg}.et-scheduler-header-label{flex:1 1 auto;min-inline-size:0;overflow:hidden;font-size:15px;font-weight:600;color:var(--et-surface-color-solid);white-space:nowrap;text-overflow:ellipsis}.et-scheduler-header-spacer{display:none;flex:1}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "[et-button]", inputs: ["variant", "size", "iconAlignment"] }, { kind: "component", type: FabComponent, selector: "[et-fab]", inputs: ["variant", "size", "expanded", "iconAlignment"] }, { kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: FloatingActionDirective, selector: "[etFloatingAction]", inputs: ["disabled"], exportAs: ["etFloatingAction"] }, { kind: "directive", type: FloatingActionAnchorDirective, selector: "[etFloatingActionAnchor]", exportAs: ["etFloatingActionAnchor"] }, { kind: "directive", type: FloatingActionTriggerDirective, selector: "[etFloatingActionTrigger]", exportAs: ["etFloatingActionTrigger"] }, { kind: "component", type: SegmentedButtonGroupComponent, selector: "et-segmented-button-group", inputs: ["size", "variant"] }, { kind: "component", type: SegmentedButtonComponent, selector: "et-segmented-button" }, { kind: "component", type: LabelDirective, selector: "et-label" }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "component", type: SchedulerAgendaViewComponent, selector: "et-scheduler-agenda-view" }, { kind: "component", type: SchedulerMonthViewComponent, selector: "et-scheduler-month-view" }, { kind: "component", type: SchedulerTimeGridViewComponent, selector: "et-scheduler-time-grid-view" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
61732
62690
|
}
|
|
61733
62691
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SchedulerComponent, decorators: [{
|
|
61734
62692
|
type: Component,
|
|
@@ -61758,7 +62716,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
61758
62716
|
'businessHours',
|
|
61759
62717
|
'nowIndicator',
|
|
61760
62718
|
],
|
|
61761
|
-
outputs: ['viewChange', 'focusedDateChange', 'selectedAppointmentIdChange'
|
|
62719
|
+
outputs: ['viewChange', 'focusedDateChange', 'selectedAppointmentIdChange'],
|
|
61762
62720
|
},
|
|
61763
62721
|
{ directive: SchedulerBadgeColorDotDirective, inputs: ['etSchedulerBadgeColorDot'] },
|
|
61764
62722
|
{ directive: SchedulerBadgeTitleDirective, inputs: ['etSchedulerBadgeTitle'] },
|
|
@@ -61771,7 +62729,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
61771
62729
|
], host: {
|
|
61772
62730
|
class: 'et-scheduler',
|
|
61773
62731
|
}, template: "<div class=\"et-scheduler-header\">\n <button\n [attr.aria-label]=\"todayLabel()\"\n (click)=\"headless.goToToday()\"\n class=\"et-scheduler-today-button\"\n et-button\n size=\"sm\"\n variant=\"outline\"\n type=\"button\"\n >\n <i etIcon=\"et-calendar\" aria-hidden=\"true\"></i>\n <span class=\"et-scheduler-today-button-label\">{{ todayLabel() }}</span>\n </button>\n\n @if (isNarrow()) {\n <div class=\"et-scheduler-toolbar-fabs\" etFloatingAction>\n <div etFloatingActionAnchor>\n <div class=\"et-scheduler-toolbar-fab-stack\" etFloatingActionTrigger>\n @for (action of toolbarActions(); track $index) {\n @if (action.icon; as icon) {\n <button\n [attr.aria-label]=\"action.label()\"\n (click)=\"action.run()\"\n class=\"et-scheduler-toolbar-action\"\n et-fab\n type=\"button\"\n >\n <i [etIcon]=\"icon\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-fab expanded type=\"button\">\n {{ action.label() }}\n </button>\n }\n }\n </div>\n </div>\n </div>\n } @else {\n @for (action of toolbarActions(); track $index) {\n <button (click)=\"action.run()\" class=\"et-scheduler-toolbar-action\" et-button size=\"sm\" type=\"button\">\n @if (action.icon) {\n <i [etIcon]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n {{ action.label() }}\n </button>\n }\n }\n\n <div class=\"et-scheduler-nav-buttons\">\n <button\n [attr.aria-label]=\"previousLabel()\"\n (click)=\"headless.previous()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--previous\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n\n <button\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"headless.next()\"\n class=\"et-scheduler-nav-button et-scheduler-nav-button--next\"\n et-icon-button\n size=\"sm\"\n type=\"button\"\n >\n <i etIcon=\"et-chevron\"></i>\n </button>\n </div>\n\n <span class=\"et-scheduler-header-label\">{{ headerLabel() }}</span>\n\n <div class=\"et-scheduler-header-spacer\"></div>\n\n <et-segmented-button-group\n [value]=\"headless.view()\"\n (valueChange)=\"setView($event)\"\n class=\"et-scheduler-view-switch\"\n size=\"sm\"\n variant=\"tabs\"\n >\n <et-label class=\"et-visually-hidden et-scheduler-view-switch-label\">{{ switchViewLabel() }}</et-label>\n\n <et-segmented-button value=\"month\">{{ monthViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"week\">{{ weekViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"day\">{{ dayViewLabel() }}</et-segmented-button>\n <et-segmented-button value=\"agenda\">{{ agendaViewLabel() }}</et-segmented-button>\n </et-segmented-button-group>\n</div>\n\n<div class=\"et-scheduler-body\">\n @switch (headless.view()) {\n @case ('agenda') {\n <et-scheduler-agenda-view />\n }\n @case ('month') {\n <et-scheduler-month-view [attr.aria-label]=\"headerLabel()\" />\n }\n @default {\n <et-scheduler-time-grid-view [attr.aria-label]=\"headerLabel()\" />\n }\n }\n</div>\n", styles: ["@layer components{.et-scheduler{container-type:inline-size;container-name:et-scheduler;display:flex;flex-direction:column;gap:12px}.et-scheduler-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.et-scheduler-view-switch{flex-basis:100%}.et-scheduler-toolbar-fab-stack{display:flex;gap:8px}@container et-scheduler not (min-inline-size: 480px){.et-scheduler .et-scheduler-today-button{--et-button-padding: 0;inline-size:3.1rem;block-size:3.1rem;border-radius:9999px}.et-scheduler .et-scheduler-today-button-label{display:none}}@container et-scheduler (min-inline-size: 480px){.et-scheduler-header-spacer{display:block}.et-scheduler-view-switch{flex-basis:auto}.et-scheduler .et-scheduler-today-button .et-button-icon{display:none}}.et-scheduler-nav-buttons{display:flex;gap:2px}.et-scheduler-nav-button--previous .et-icon{rotate:-90deg}.et-scheduler-nav-button--next .et-icon{rotate:90deg}.et-scheduler-header-label{flex:1 1 auto;min-inline-size:0;overflow:hidden;font-size:15px;font-weight:600;color:var(--et-surface-color-solid);white-space:nowrap;text-overflow:ellipsis}.et-scheduler-header-spacer{display:none;flex:1}.et-scheduler-body{display:flex;flex:1;flex-direction:column}}\n"] }]
|
|
61774
|
-
}], ctorParameters: () => [], propDecorators: { appointmentSave: [{ type: i0.Output, args: ["appointmentSave"] }], appointmentsDelete: [{ type: i0.Output, args: ["appointmentsDelete"] }] } });
|
|
62732
|
+
}], ctorParameters: () => [], propDecorators: { appointments: [{ type: i0.Input, args: [{ isSignal: true, alias: "appointments", required: false }] }], appointmentSave: [{ type: i0.Output, args: ["appointmentSave"] }], appointmentsDelete: [{ type: i0.Output, args: ["appointmentsDelete"] }], appointmentReschedule: [{ type: i0.Output, args: ["appointmentReschedule"] }] } });
|
|
61775
62733
|
|
|
61776
62734
|
const SCHEDULER_IMPORTS = [
|
|
61777
62735
|
SchedulerDirective,
|
|
@@ -61861,7 +62819,40 @@ const DEFAULT_STANDINGS_LABELS = {
|
|
|
61861
62819
|
pickMoved: (participant, position) => `${participant} moved to position ${position}`,
|
|
61862
62820
|
pickLocked: 'This order can no longer be changed',
|
|
61863
62821
|
};
|
|
61864
|
-
|
|
62822
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
62823
|
+
const GERMAN_STANDINGS_LABELS = {
|
|
62824
|
+
caption: 'Tabelle',
|
|
62825
|
+
position: '#',
|
|
62826
|
+
positionFull: 'Platz',
|
|
62827
|
+
participant: 'Team',
|
|
62828
|
+
played: 'Sp',
|
|
62829
|
+
playedFull: 'Spiele',
|
|
62830
|
+
wins: 'S',
|
|
62831
|
+
winsFull: 'Siege',
|
|
62832
|
+
ties: 'U',
|
|
62833
|
+
tiesFull: 'Unentschieden',
|
|
62834
|
+
losses: 'N',
|
|
62835
|
+
lossesFull: 'Niederlagen',
|
|
62836
|
+
difference: 'Diff',
|
|
62837
|
+
differenceFull: 'Differenz',
|
|
62838
|
+
points: 'Pkt',
|
|
62839
|
+
pointsFull: 'Punkte',
|
|
62840
|
+
form: 'Form',
|
|
62841
|
+
formFull: 'Letzte Spiele, ältestes zuerst',
|
|
62842
|
+
formResult: (result) => (result === 'win' ? 'Sieg' : result === 'loss' ? 'Niederlage' : 'Unentschieden'),
|
|
62843
|
+
formResultShort: (result) => (result === 'win' ? 'S' : result === 'loss' ? 'N' : 'U'),
|
|
62844
|
+
legend: 'Bedeutung der hervorgehobenen Plätze',
|
|
62845
|
+
highlightedRow: 'Eigenes Team',
|
|
62846
|
+
pickCaption: 'Vorhergesagte Reihenfolge',
|
|
62847
|
+
pickCut: 'Kommt weiter',
|
|
62848
|
+
pickAdvancingRow: 'Kommt weiter',
|
|
62849
|
+
pickMoveRow: (participant) => `${participant} verschieben. Ziehen oder Pfeiltasten verwenden.`,
|
|
62850
|
+
pickMoved: (participant, position) => `${participant} auf Platz ${position} verschoben`,
|
|
62851
|
+
pickLocked: 'Diese Reihenfolge kann nicht mehr geändert werden',
|
|
62852
|
+
};
|
|
62853
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideStandingsLabels}. */
|
|
62854
|
+
const standingsLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_STANDINGS_LABELS : DEFAULT_STANDINGS_LABELS;
|
|
62855
|
+
const STANDINGS_LABELS_DEF = /* @__PURE__ */ defineLabels('STANDINGS_LABELS', standingsLabelsForLocale);
|
|
61865
62856
|
/**
|
|
61866
62857
|
* Localize the standings table for everything below this injector. Partial - whatever you leave out keeps
|
|
61867
62858
|
* its {@link DEFAULT_STANDINGS_LABELS} value.
|
|
@@ -62385,7 +63376,16 @@ const DEFAULT_STAT_TILE_LABELS = {
|
|
|
62385
63376
|
unchanged: 'Unchanged',
|
|
62386
63377
|
noValue: 'No value',
|
|
62387
63378
|
};
|
|
62388
|
-
|
|
63379
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
63380
|
+
const GERMAN_STAT_TILE_LABELS = {
|
|
63381
|
+
up: 'Gestiegen',
|
|
63382
|
+
down: 'Gesunken',
|
|
63383
|
+
unchanged: 'Unverändert',
|
|
63384
|
+
noValue: 'Kein Wert',
|
|
63385
|
+
};
|
|
63386
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideStatTileLabels}. */
|
|
63387
|
+
const statTileLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_STAT_TILE_LABELS : DEFAULT_STAT_TILE_LABELS;
|
|
63388
|
+
const STAT_TILE_LABELS_DEF = /* @__PURE__ */ defineLabels('STAT_TILE_LABELS', statTileLabelsForLocale);
|
|
62389
63389
|
/**
|
|
62390
63390
|
* Localize a stat tile's strings for everything below this injector, and read the set in effect here as a
|
|
62391
63391
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_STAT_TILE_LABELS} value.
|
|
@@ -62666,7 +63666,27 @@ const DEFAULT_STREAM_LABELS = {
|
|
|
62666
63666
|
pipGridView: 'Grid view',
|
|
62667
63667
|
pipSingleView: 'Single view',
|
|
62668
63668
|
};
|
|
62669
|
-
|
|
63669
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
63670
|
+
const GERMAN_STREAM_LABELS = {
|
|
63671
|
+
loading: 'Lädt',
|
|
63672
|
+
playerFrame: (platform) => `${platform}-Player`,
|
|
63673
|
+
consentHeading: 'Inhalt blockiert',
|
|
63674
|
+
consentDescription: 'Die Wiedergabe erfordert eine Zustimmung. Cookies und Daten von Drittanbietern können verwendet werden.',
|
|
63675
|
+
consentAccept: 'Erlauben und abspielen',
|
|
63676
|
+
errorHeading: 'Wiedergabe fehlgeschlagen',
|
|
63677
|
+
errorDescription: 'Der Player konnte nicht geladen werden. Bitte Verbindung prüfen oder erneut versuchen.',
|
|
63678
|
+
errorRetry: 'Erneut versuchen',
|
|
63679
|
+
pipPlaceholderMessage: 'Wird im Bild-in-Bild wiedergegeben',
|
|
63680
|
+
pipPlaceholderBack: 'Zurück zum Player',
|
|
63681
|
+
pipClose: 'Schließen',
|
|
63682
|
+
pipFocus: 'Fokussieren',
|
|
63683
|
+
pipMove: 'Bild-in-Bild-Fenster, mit den Pfeiltasten verschieben und mit Umschalt und den Pfeiltasten in der Größe ändern',
|
|
63684
|
+
pipGridView: 'Rasteransicht',
|
|
63685
|
+
pipSingleView: 'Einzelansicht',
|
|
63686
|
+
};
|
|
63687
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideStreamLabels}. */
|
|
63688
|
+
const streamLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_STREAM_LABELS : DEFAULT_STREAM_LABELS;
|
|
63689
|
+
const STREAM_LABELS_DEF = /* @__PURE__ */ defineLabels('STREAM_LABELS', streamLabelsForLocale);
|
|
62670
63690
|
/**
|
|
62671
63691
|
* Localize the stream chrome's strings for everything below this injector, and read the set in effect
|
|
62672
63692
|
* here as a signal. Partial - whatever you leave out keeps its {@link DEFAULT_STREAM_LABELS} value. See
|
|
@@ -67437,6 +68457,8 @@ const TABLE_ERROR_CODES = {
|
|
|
67437
68457
|
MISSING_COLUMN_FEATURE: 3512,
|
|
67438
68458
|
/** A CSV export read an object, list or function from a column that has no `exportValue`. */
|
|
67439
68459
|
UNSERIALIZABLE_EXPORT_VALUE: 3513,
|
|
68460
|
+
/** Client sorting read an object, list or function from a sortable column that has no `sortValue`. */
|
|
68461
|
+
UNSORTABLE_COLUMN_VALUE: 3514,
|
|
67440
68462
|
};
|
|
67441
68463
|
|
|
67442
68464
|
// What tells Excel the file is UTF-8; see `bom`.
|
|
@@ -67823,7 +68845,44 @@ const DEFAULT_TABLE_LABELS = {
|
|
|
67823
68845
|
selectAllRows: 'Select all rows',
|
|
67824
68846
|
selectRow: 'Select row',
|
|
67825
68847
|
};
|
|
67826
|
-
|
|
68848
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
68849
|
+
const GERMAN_TABLE_LABELS = {
|
|
68850
|
+
empty: 'Keine Daten',
|
|
68851
|
+
error: 'Daten konnten nicht geladen werden',
|
|
68852
|
+
expandRow: 'Zeile aufklappen',
|
|
68853
|
+
collapseRow: 'Zeile zuklappen',
|
|
68854
|
+
sortAction: (header, next) => {
|
|
68855
|
+
if (next === 'asc')
|
|
68856
|
+
return `${header} aufsteigend sortieren`;
|
|
68857
|
+
if (next === 'desc')
|
|
68858
|
+
return `${header} absteigend sortieren`;
|
|
68859
|
+
return `Sortierung von ${header} aufheben`;
|
|
68860
|
+
},
|
|
68861
|
+
sortPriority: (priority, count) => `Sortierpriorität ${priority} von ${count}`,
|
|
68862
|
+
filterColumn: (header) => `${header} filtern`,
|
|
68863
|
+
filterSearch: 'Suchen…',
|
|
68864
|
+
filterEmpty: 'Keine Optionen',
|
|
68865
|
+
filterLoadMore: 'Mehr laden',
|
|
68866
|
+
columnMenu: (header) => `Spaltenoptionen für ${header}`,
|
|
68867
|
+
sortAscending: 'Aufsteigend sortieren',
|
|
68868
|
+
sortDescending: 'Absteigend sortieren',
|
|
68869
|
+
clearSort: 'Sortierung aufheben',
|
|
68870
|
+
autosizeColumn: 'Spaltenbreite automatisch anpassen',
|
|
68871
|
+
autosizeAllColumns: 'Alle Spaltenbreiten automatisch anpassen',
|
|
68872
|
+
resetWidth: 'Breite zurücksetzen',
|
|
68873
|
+
resizeColumn: (header) => `Größe von ${header} ändern`,
|
|
68874
|
+
hideColumn: 'Spalte ausblenden',
|
|
68875
|
+
pinColumnStart: 'Am Anfang fixieren',
|
|
68876
|
+
pinColumnEnd: 'Am Ende fixieren',
|
|
68877
|
+
unpinColumn: 'Fixierung lösen',
|
|
68878
|
+
columns: 'Spalten',
|
|
68879
|
+
showAllColumns: 'Alle Spalten anzeigen',
|
|
68880
|
+
selectAllRows: 'Alle Zeilen auswählen',
|
|
68881
|
+
selectRow: 'Zeile auswählen',
|
|
68882
|
+
};
|
|
68883
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideTableLabels}. */
|
|
68884
|
+
const tableLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_TABLE_LABELS : DEFAULT_TABLE_LABELS;
|
|
68885
|
+
const TABLE_LABELS_DEF = /* @__PURE__ */ defineLabels('TABLE_LABELS', tableLabelsForLocale);
|
|
67827
68886
|
/**
|
|
67828
68887
|
* Localize the table's strings for everything below this injector, and read the set in effect here as
|
|
67829
68888
|
* a signal: the defaults with the provided set (or the set its factory builds for the current locale)
|
|
@@ -68036,6 +69095,17 @@ const isMissing = (value) => value === null ||
|
|
|
68036
69095
|
value === undefined ||
|
|
68037
69096
|
(typeof value === 'number' && Number.isNaN(value)) ||
|
|
68038
69097
|
(value instanceof Date && Number.isNaN(value.getTime()));
|
|
69098
|
+
const isSortValue = (value) => value === null ||
|
|
69099
|
+
value === undefined ||
|
|
69100
|
+
value instanceof Date ||
|
|
69101
|
+
typeof value === 'string' ||
|
|
69102
|
+
typeof value === 'number' ||
|
|
69103
|
+
typeof value === 'boolean';
|
|
69104
|
+
const assertSortValue = (value, key) => {
|
|
69105
|
+
if (isSortValue(value))
|
|
69106
|
+
return;
|
|
69107
|
+
throw new RuntimeError(TABLE_ERROR_CODES.UNSORTABLE_COLUMN_VALUE, `[et-table] Sorting read a ${Array.isArray(value) ? 'list' : typeof value} from the "${key}" column's value, which cannot be compared. Add \`sortValue\` to the column.`);
|
|
69108
|
+
};
|
|
68039
69109
|
const compare = (a, b) => {
|
|
68040
69110
|
if (isMissing(a) && isMissing(b))
|
|
68041
69111
|
return 0;
|
|
@@ -68056,7 +69126,8 @@ const compare = (a, b) => {
|
|
|
68056
69126
|
* `value` accessor). Stable, multi-key, pure and tree-shakable - the base table
|
|
68057
69127
|
* doesn't apply it unless in client sort mode; import it directly for custom flows.
|
|
68058
69128
|
* Server-side callers ignore this and let the backend sort instead. Nullish values,
|
|
68059
|
-
* `NaN` and invalid dates always sink to the bottom, regardless of direction.
|
|
69129
|
+
* `NaN` and invalid dates always sink to the bottom, regardless of direction. In dev mode, a column
|
|
69130
|
+
* without `sortValue` whose `value` returns an object, list or function throws `ET3514`.
|
|
68060
69131
|
*/
|
|
68061
69132
|
const sortRows = ({ rows, sort, columns }) => {
|
|
68062
69133
|
if (!sort.length)
|
|
@@ -68069,6 +69140,10 @@ const sortRows = ({ rows, sort, columns }) => {
|
|
|
68069
69140
|
const accessor = column.sortValue ?? column.value;
|
|
68070
69141
|
const valueA = accessor(rowA);
|
|
68071
69142
|
const valueB = accessor(rowB);
|
|
69143
|
+
if (isDevMode$1() && !column.sortValue) {
|
|
69144
|
+
assertSortValue(valueA, key);
|
|
69145
|
+
assertSortValue(valueB, key);
|
|
69146
|
+
}
|
|
68072
69147
|
if (isMissing(valueA) || isMissing(valueB)) {
|
|
68073
69148
|
const nullCmp = compare(valueA, valueB);
|
|
68074
69149
|
if (nullCmp !== 0)
|
|
@@ -69195,6 +70270,44 @@ class TableComponent {
|
|
|
69195
70270
|
return { start: window.paddingStart(), end: window.paddingEnd() };
|
|
69196
70271
|
}, /* @ts-ignore */
|
|
69197
70272
|
...(ngDevMode ? [{ debugName: "spacers" }] : /* istanbul ignore next */ []));
|
|
70273
|
+
this.openDetailIndices = computed(() => {
|
|
70274
|
+
const detail = this.rowDetail();
|
|
70275
|
+
if (!detail || !this.rowWindow())
|
|
70276
|
+
return [];
|
|
70277
|
+
const indices = [];
|
|
70278
|
+
this.rows().forEach((row, index) => {
|
|
70279
|
+
if (detail.isOpen(row))
|
|
70280
|
+
indices.push(index);
|
|
70281
|
+
});
|
|
70282
|
+
return indices;
|
|
70283
|
+
}, /* @ts-ignore */
|
|
70284
|
+
...(ngDevMode ? [{ debugName: "openDetailIndices" }] : /* istanbul ignore next */ []));
|
|
70285
|
+
this.measuredDetailHeights = signal(new Map(), /* @ts-ignore */
|
|
70286
|
+
...(ngDevMode ? [{ debugName: "measuredDetailHeights" }] : /* istanbul ignore next */ []));
|
|
70287
|
+
this.openDetailHeights = computed(() => {
|
|
70288
|
+
const open = this.openDetailIndices();
|
|
70289
|
+
if (!open.length)
|
|
70290
|
+
return new Map();
|
|
70291
|
+
const measured = this.measuredDetailHeights();
|
|
70292
|
+
const rows = this.rows();
|
|
70293
|
+
const fallback = measured.size
|
|
70294
|
+
? [...measured.values()].reduce((sum, height) => sum + height, 0) / measured.size
|
|
70295
|
+
: 0;
|
|
70296
|
+
return new Map(open.map((index) => [index, measured.get(this.rowIdentity(rows[index])) ?? fallback]));
|
|
70297
|
+
}, /* @ts-ignore */
|
|
70298
|
+
...(ngDevMode ? [{ debugName: "openDetailHeights" }] : /* istanbul ignore next */ []));
|
|
70299
|
+
this.headerRowCount = computed(() => this.headerRows().length + 1, /* @ts-ignore */
|
|
70300
|
+
...(ngDevMode ? [{ debugName: "headerRowCount" }] : /* istanbul ignore next */ []));
|
|
70301
|
+
/**
|
|
70302
|
+
* The full row count a windowed table announces through `aria-rowcount` - header rows, every body row,
|
|
70303
|
+
* every open detail row and the footer row - or `null` while every row is in the DOM anyway.
|
|
70304
|
+
*/
|
|
70305
|
+
this.ariaRowCount = computed(() => {
|
|
70306
|
+
if (!this.spacers())
|
|
70307
|
+
return null;
|
|
70308
|
+
return this.headerRowCount() + this.rows().length + this.openDetailIndices().length + (this.hasFooter() ? 1 : 0);
|
|
70309
|
+
}, /* @ts-ignore */
|
|
70310
|
+
...(ngDevMode ? [{ debugName: "ariaRowCount" }] : /* istanbul ignore next */ []));
|
|
69198
70311
|
this.bodyRows = computed(() => {
|
|
69199
70312
|
const pinning = this.columnPinning();
|
|
69200
70313
|
const templates = this.columnTemplates().cell;
|
|
@@ -69213,6 +70326,7 @@ class TableComponent {
|
|
|
69213
70326
|
const rendered = this.renderedRows();
|
|
69214
70327
|
// A footer row separates itself with this rule, and an end spacer stands in for rows still below.
|
|
69215
70328
|
const endsWithRows = !this.hasFooter() && !this.spacers()?.end;
|
|
70329
|
+
const announcesIndex = this.ariaRowCount() !== null;
|
|
69216
70330
|
return rendered.map((row, index) => {
|
|
69217
70331
|
const key = this.rowIdentity(row);
|
|
69218
70332
|
const link = rowLink?.(row) ?? null;
|
|
@@ -69233,6 +70347,7 @@ class TableComponent {
|
|
|
69233
70347
|
stripe: (indexOffset + index) % 2 === 1,
|
|
69234
70348
|
last: endsWithRows && index === rendered.length - 1,
|
|
69235
70349
|
detail: detail?.isOpen(row) ? detail : null,
|
|
70350
|
+
ariaRowIndex: announcesIndex ? this.ariaRowIndexOf(indexOffset + index) : null,
|
|
69236
70351
|
leads,
|
|
69237
70352
|
trails,
|
|
69238
70353
|
cells: columns.map((column) => {
|
|
@@ -69261,6 +70376,8 @@ class TableComponent {
|
|
|
69261
70376
|
});
|
|
69262
70377
|
}, /* @ts-ignore */
|
|
69263
70378
|
...(ngDevMode ? [{ debugName: "bodyRows" }] : /* istanbul ignore next */ []));
|
|
70379
|
+
this.detailAriaRowIndices = computed(() => new Map(this.bodyRows().flatMap((vm) => (vm.detail && vm.ariaRowIndex ? [[vm.row, vm.ariaRowIndex + 1]] : []))), /* @ts-ignore */
|
|
70380
|
+
...(ngDevMode ? [{ debugName: "detailAriaRowIndices" }] : /* istanbul ignore next */ []));
|
|
69264
70381
|
/**
|
|
69265
70382
|
* The keys of the currently hidden columns, in declared order. Nothing in the table's own chrome
|
|
69266
70383
|
* shows a hidden column - the column menu's "Hide column" takes one away and has no way back - so
|
|
@@ -69380,6 +70497,21 @@ class TableComponent {
|
|
|
69380
70497
|
afterNextRender({ read: () => this.syncScrollState() }, { injector: this.injector });
|
|
69381
70498
|
});
|
|
69382
70499
|
}
|
|
70500
|
+
/** The `aria-rowindex` of an open row's detail row, or `null` while every row is in the DOM. Part of the feature contract. */
|
|
70501
|
+
detailAriaRowIndex(row) {
|
|
70502
|
+
return this.detailAriaRowIndices().get(row) ?? null;
|
|
70503
|
+
}
|
|
70504
|
+
/** Record a detail row's rendered height. Part of the feature contract. */
|
|
70505
|
+
setDetailRowHeight(row, height) {
|
|
70506
|
+
const key = this.rowIdentity(row);
|
|
70507
|
+
if (this.measuredDetailHeights().get(key) === height)
|
|
70508
|
+
return;
|
|
70509
|
+
this.measuredDetailHeights.update((heights) => new Map(heights).set(key, height));
|
|
70510
|
+
}
|
|
70511
|
+
/** The height each open detail row adds, by absolute row index. Part of the feature contract. */
|
|
70512
|
+
detailRowHeights() {
|
|
70513
|
+
return this.openDetailHeights();
|
|
70514
|
+
}
|
|
69383
70515
|
syncScrollState() {
|
|
69384
70516
|
const element = this.scrollElement();
|
|
69385
70517
|
// `scrollLeft` counts down from 0 in RTL, so compare distances rather than raw offsets.
|
|
@@ -69739,10 +70871,16 @@ class TableComponent {
|
|
|
69739
70871
|
/**
|
|
69740
70872
|
* Set a column's sort direction outright, or clear it with `null` - what a column menu's explicit
|
|
69741
70873
|
* "Sort ascending / descending / Clear" entries need, where {@link toggleSort}'s cycle would make
|
|
69742
|
-
* the result depend on the column's current state. Layers like a plain header activation does
|
|
70874
|
+
* the result depend on the column's current state. Layers like a plain header activation does;
|
|
70875
|
+
* clearing drops only this column's entry from a layered sort.
|
|
69743
70876
|
*/
|
|
69744
70877
|
setSort(key, direction) {
|
|
69745
|
-
|
|
70878
|
+
if (direction) {
|
|
70879
|
+
this.applySort(this.nextSort({ key, direction, additive: false }));
|
|
70880
|
+
}
|
|
70881
|
+
else if (this.sort().some((entry) => entry.key === key)) {
|
|
70882
|
+
this.applySort(this.sort().filter((entry) => entry.key !== key));
|
|
70883
|
+
}
|
|
69746
70884
|
}
|
|
69747
70885
|
activateSortHeader(key, event) {
|
|
69748
70886
|
if (event instanceof KeyboardEvent)
|
|
@@ -70016,6 +71154,19 @@ class TableComponent {
|
|
|
70016
71154
|
return next;
|
|
70017
71155
|
});
|
|
70018
71156
|
}
|
|
71157
|
+
ariaRowIndexOf(index) {
|
|
71158
|
+
const open = this.openDetailIndices();
|
|
71159
|
+
let low = 0;
|
|
71160
|
+
let high = open.length;
|
|
71161
|
+
while (low < high) {
|
|
71162
|
+
const mid = (low + high) >> 1;
|
|
71163
|
+
if ((open[mid] ?? Infinity) < index)
|
|
71164
|
+
low = mid + 1;
|
|
71165
|
+
else
|
|
71166
|
+
high = mid;
|
|
71167
|
+
}
|
|
71168
|
+
return this.headerRowCount() + index + low + 1;
|
|
71169
|
+
}
|
|
70019
71170
|
// Must stay a same-tick write on the header grid. A requestAnimationFrame hop defers it past the
|
|
70020
71171
|
// paint the body already moved in, so the header trails a whole frame; and the property inherits,
|
|
70021
71172
|
// so writing it on the host recalculates style for every row cell, which only the header reads.
|
|
@@ -70116,10 +71267,10 @@ class TableComponent {
|
|
|
70116
71267
|
return false;
|
|
70117
71268
|
}
|
|
70118
71269
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70119
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableComponent, isStandalone: true, selector: "et-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, rowsSource: { classPropertyName: "rowsSource", publicName: "rowsSource", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, errorTemplate: { classPropertyName: "errorTemplate", publicName: "errorTemplate", isSignal: true, isRequired: false, transformFunction: null }, cellState: { classPropertyName: "cellState", publicName: "cellState", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, sortMode: { classPropertyName: "sortMode", publicName: "sortMode", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, filterMode: { classPropertyName: "filterMode", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, quickFilter: { classPropertyName: "quickFilter", publicName: "quickFilter", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowInteractive: { classPropertyName: "rowInteractive", publicName: "rowInteractive", isSignal: true, isRequired: false, transformFunction: null }, rowLink: { classPropertyName: "rowLink", publicName: "rowLink", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", filters: "filtersChange", rowClick: "rowClick" }, host: { listeners: { "scroll": "syncScrollState()" }, properties: { "attr.data-appearance": "appearance()", "attr.data-density": "density()", "attr.aria-busy": "resolvedLoading() ? \"true\" : null", "attr.role": "pageStickyHeader() ? tableRole() : null", "class.et-table-host--scrolled-block-start": "blockScrollShadows().blockStart", "class.et-table-host--scrolled-block-end": "blockScrollShadows().blockEnd", "class.et-table-host--scrolled-inline-start": "scrollFades().start", "class.et-table-host--scrolled-inline-end": "scrollFades().end", "class.et-table-host--header-adornments": "headerAdornments().length > 0", "style.--_et-table-viewport-inline-size.px": "viewportInlineSize()" }, classAttribute: "et-table-host" }, providers: [
|
|
71270
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableComponent, isStandalone: true, selector: "et-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, rowsSource: { classPropertyName: "rowsSource", publicName: "rowsSource", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, errorTemplate: { classPropertyName: "errorTemplate", publicName: "errorTemplate", isSignal: true, isRequired: false, transformFunction: null }, cellState: { classPropertyName: "cellState", publicName: "cellState", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, sortMode: { classPropertyName: "sortMode", publicName: "sortMode", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, filterMode: { classPropertyName: "filterMode", publicName: "filterMode", isSignal: true, isRequired: false, transformFunction: null }, quickFilter: { classPropertyName: "quickFilter", publicName: "quickFilter", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowInteractive: { classPropertyName: "rowInteractive", publicName: "rowInteractive", isSignal: true, isRequired: false, transformFunction: null }, rowLink: { classPropertyName: "rowLink", publicName: "rowLink", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", filters: "filtersChange", rowClick: "rowClick" }, host: { listeners: { "scroll": "syncScrollState()" }, properties: { "attr.data-appearance": "appearance()", "attr.data-density": "density()", "attr.aria-busy": "resolvedLoading() ? \"true\" : null", "attr.role": "pageStickyHeader() ? tableRole() : null", "attr.aria-rowcount": "pageStickyHeader() ? ariaRowCount() : null", "class.et-table-host--scrolled-block-start": "blockScrollShadows().blockStart", "class.et-table-host--scrolled-block-end": "blockScrollShadows().blockEnd", "class.et-table-host--scrolled-inline-start": "scrollFades().start", "class.et-table-host--scrolled-inline-end": "scrollFades().end", "class.et-table-host--header-adornments": "headerAdornments().length > 0", "style.--_et-table-viewport-inline-size.px": "viewportInlineSize()" }, classAttribute: "et-table-host" }, providers: [
|
|
70120
71271
|
{ provide: TABLE_FEATURE_HOST, useExisting: TableComponent },
|
|
70121
71272
|
provideIcons(ARROW_UP_ICON, TRIANGLE_EXCLAMATION_ICON),
|
|
70122
|
-
], queries: [{ propertyName: "footerSlot", first: true, predicate: TableFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true, isSignal: true }, { propertyName: "headerGridRef", first: true, predicate: ["headerGrid"], descendants: true, isSignal: true }, { propertyName: "scrollerRef", first: true, predicate: ["scroller"], descendants: true, isSignal: true }, { propertyName: "headerCells", predicate: ["headerCell"], descendants: true, isSignal: true }, { propertyName: "bodyCells", predicate: ["bodyCell"], descendants: true, isSignal: true }, { propertyName: "gridCells", predicate: ["gridCell"], descendants: true, isSignal: true }, { propertyName: "leadHeaderCells", predicate: ["leadHeaderCell"], descendants: true, isSignal: true }, { propertyName: "trailHeaderCells", predicate: ["trailHeaderCell"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div #grid [style.grid-template-columns]=\"templateColumns()\" [attr.role]=\"tableRole()\" class=\"et-table\">\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: TableCardSurfaceDirective, selector: "[etTableCardSurface]", inputs: ["etTableCardSurface"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
71273
|
+
], queries: [{ propertyName: "footerSlot", first: true, predicate: TableFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true, isSignal: true }, { propertyName: "headerGridRef", first: true, predicate: ["headerGrid"], descendants: true, isSignal: true }, { propertyName: "scrollerRef", first: true, predicate: ["scroller"], descendants: true, isSignal: true }, { propertyName: "headerCells", predicate: ["headerCell"], descendants: true, isSignal: true }, { propertyName: "bodyCells", predicate: ["bodyCell"], descendants: true, isSignal: true }, { propertyName: "gridCells", predicate: ["gridCell"], descendants: true, isSignal: true }, { propertyName: "leadHeaderCells", predicate: ["leadHeaderCell"], descendants: true, isSignal: true }, { propertyName: "trailHeaderCells", predicate: ["trailHeaderCell"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div [attr.aria-rowindex]=\"ariaRowCount() === null ? null : headerRowCount()\" class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n [attr.aria-rowindex]=\"rowVm.ariaRowIndex\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div [attr.aria-rowindex]=\"ariaRowCount()\" class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div\n #grid\n [style.grid-template-columns]=\"templateColumns()\"\n [attr.role]=\"tableRole()\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n class=\"et-table\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "variant", "allowHardcodedColor", "label"] }, { kind: "directive", type: ProvideColorDirective, selector: "[etProvideColor]", inputs: ["etProvideColor"] }, { kind: "directive", type: TableCardSurfaceDirective, selector: "[etTableCardSurface]", inputs: ["etTableCardSurface"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
70123
71274
|
}
|
|
70124
71275
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableComponent, decorators: [{
|
|
70125
71276
|
type: Component,
|
|
@@ -70132,6 +71283,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
70132
71283
|
'[attr.data-density]': 'density()',
|
|
70133
71284
|
'[attr.aria-busy]': 'resolvedLoading() ? "true" : null',
|
|
70134
71285
|
'[attr.role]': 'pageStickyHeader() ? tableRole() : null',
|
|
71286
|
+
'[attr.aria-rowcount]': 'pageStickyHeader() ? ariaRowCount() : null',
|
|
70135
71287
|
'[class.et-table-host--scrolled-block-start]': 'blockScrollShadows().blockStart',
|
|
70136
71288
|
'[class.et-table-host--scrolled-block-end]': 'blockScrollShadows().blockEnd',
|
|
70137
71289
|
'[class.et-table-host--scrolled-inline-start]': 'scrollFades().start',
|
|
@@ -70139,7 +71291,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
70139
71291
|
'[class.et-table-host--header-adornments]': 'headerAdornments().length > 0',
|
|
70140
71292
|
'[style.--_et-table-viewport-inline-size.px]': 'viewportInlineSize()',
|
|
70141
71293
|
'(scroll)': 'syncScrollState()',
|
|
70142
|
-
}, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div #grid [style.grid-template-columns]=\"templateColumns()\" [attr.role]=\"tableRole()\" class=\"et-table\">\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"] }]
|
|
71294
|
+
}, template: "<!-- Every binding below reads a field off a render model (see the `\u2026Vm` types in the component):\n methods belong in event bindings, not in bindings the framework re-evaluates each pass. -->\n<ng-template #headerContent>\n <!-- Rows a feature renders above the column headers (etTableGroupHeaders' spanning group row). Each\n is display: contents and lays its own cells into these tracks \u2014 see registerHeaderRow. -->\n @for (headerRow of headerRows(); track $index) {\n <ng-container *ngComponentOutlet=\"headerRow.component; injector: headerRow.injector\" />\n }\n\n <div [attr.aria-rowindex]=\"ariaRowCount() === null ? null : headerRowCount()\" class=\"et-table-header-row\" role=\"row\">\n <!-- Leading utility columns (selection from a feature, the expander when expansion is on). The\n table owns the cell chrome; the feature only supplies what goes inside. -->\n @for (lead of leadCells(); track lead.key) {\n <div\n #leadHeaderCell\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : lead.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (lead.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: lead.lead.injector\" />\n }\n </div>\n }\n @for (cell of headerCellVms(); track cell.key) {\n <div\n #headerCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.data-disabled]=\"cell.disabled || null\"\n [attr.aria-sort]=\"cell.ariaSort\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"pageStickyHeader() ? null : cell.offsetStart\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : cell.offsetEnd\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n <!-- Sorting is the whole header's job, not a control's: the label plus everything around it is\n one button, and the only sort affordance is the direction arrow, which appears once the\n column is actually sorted. Adornments sit outside it so their own clicks don't sort. -->\n @if (cell.sortable) {\n <button\n [attr.aria-label]=\"cell.sortLabel\"\n [attr.aria-description]=\"cell.priorityLabel\"\n [disabled]=\"cell.disabled\"\n (click)=\"activateSortHeader(cell.key, $event)\"\n (keydown.shift.enter)=\"activateSortHeader(cell.key, $event)\"\n class=\"et-table-header-label et-table-header-label--sortable\"\n type=\"button\"\n >\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n @if (cell.direction; as direction) {\n <!-- Flipping direction keeps this element mounted, so the arrow turns over rather than\n swapping; only appearing and disappearing are the fade, and only for a sort the user\n just asked for (see sortIndicatorEnter). -->\n <i\n [attr.data-direction]=\"direction\"\n [animate.enter]=\"sortIndicatorEnter()\"\n [animate.leave]=\"sortIndicatorLeave()\"\n class=\"et-table-sort-indicator\"\n etIcon=\"et-arrow-up\"\n ></i>\n }\n @if (cell.priority; as priority) {\n <span class=\"et-table-sort-priority\" aria-hidden=\"true\">{{ priority }}</span>\n }\n </span>\n </button>\n } @else {\n <span class=\"et-table-header-label\">\n <span class=\"et-table-header-label-box\">\n @if (cell.template; as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: cell.column.header }\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.column.header }}</span>\n }\n </span>\n </span>\n }\n\n <!-- UI from opt-in features (filter menu, \u2026), each registered rather than referenced \u2014 see\n registerHeaderAdornment. Renders nothing when no feature is imported.\n\n Dropped once the column is covered by a pinned one: an adornment's menu is a portal, so it\n would go on floating over the pinned column, anchored to a cell nobody can see. Unmounting\n the trigger is what closes it. -->\n @if (!cell.obscured && headerAdornments().length) {\n <div class=\"et-table-header-adornments\">\n @for (adornment of headerAdornments(); track $index) {\n <ng-container\n *ngComponentOutlet=\"adornment.component; inputs: { column: cell.column }; injector: adornment.injector\"\n />\n }\n </div>\n }\n </div>\n }\n <!-- Filler cell for the trailing slack track (see hasFiller): carries the header band to the\n panel's edge when every column is a rigid width. -->\n @if (hasFiller()) {\n <div class=\"et-table-header-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n <!-- Trailing utility columns (a selection column moved to this edge). Same chrome as the leading\n ones, pinned to the trailing edge instead - see TableLeadColumn.side. -->\n @for (trail of trailCells(); track trail.key) {\n <div\n #trailHeaderCell\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"pageStickyHeader() ? null : trail.offset\"\n class=\"et-table-header-cell\"\n role=\"columnheader\"\n >\n @if (trail.lead.headerComponent; as headerComponent) {\n <ng-container *ngComponentOutlet=\"headerComponent; injector: trail.lead.injector\" />\n }\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #bodyContent>\n <!-- Refetching over rows that are already on screen: a 2px indeterminate bar right under the header,\n so the data stays readable and in place. Drawn here rather than with `et-progress-bar` \u2014 the base\n table takes no component dependencies, and this is 2px of chrome, not a control. -->\n @if (showBusyBar()) {\n <!-- Faded in and out: a refetch is often over in a few hundred ms, and a bar that pops in and\n vanishes reads as a flicker rather than as work happening. -->\n <div\n class=\"et-table-busy-bar\"\n animate.enter=\"et-table-busy-bar--enter\"\n animate.leave=\"et-table-busy-bar--leave\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.start\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n @if (hasError()) {\n <!-- The error state stands in for the whole body: rows are either trustworthy or absent. -->\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-error-cell\" aria-live=\"polite\">\n @if (showErrorMessage()) {\n @if (errorTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: resolvedError() }\" />\n } @else {\n <ng-content select=\"[etTableError]\">\n <i [etProvideColor]=\"errorColorTheme()\" class=\"et-table-error-icon\" etIcon=\"et-triangle-exclamation\"></i>\n <span>{{ resolvedLabels().error }}</span>\n </ng-content>\n }\n }\n </div>\n </div>\n } @else if (showPlaceholderRows()) {\n <!-- First load with nothing to show yet. What a loading body looks like belongs to a feature\n (etTableSkeleton draws placeholder rows in these tracks); with none the body stays blank rather\n than showing a misleading empty state \u2014 the host's `aria-busy` is the announcement. -->\n @if (bodyPlaceholder(); as placeholder) {\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n }\n } @else {\n @for (rowVm of bodyRows(); track rowVm.key) {\n <!-- A linked row is not a tab stop of its own: its anchor is the one stop, and the one link. -->\n <div\n [class]=\"rowVm.classes\"\n [class.et-table-row--stripe]=\"rowVm.stripe\"\n [class.et-table-row--last]=\"rowVm.last\"\n [class.et-table-row--interactive]=\"rowInteractive()\"\n [class.et-table-row--box]=\"rowBox()\"\n [class.et-table-row--card]=\"cardRows()\"\n [class.et-table-row--link]=\"rowVm.href !== null\"\n [etTableCardSurface]=\"cardRows()\"\n [attr.tabindex]=\"rowInteractive() && !cellNavigation() && rowVm.href === null ? 0 : null\"\n [attr.aria-rowindex]=\"rowVm.ariaRowIndex\"\n (click)=\"activateRow(rowVm.row, $event)\"\n (keydown.enter)=\"activateRow(rowVm.row, $event)\"\n (keydown.space)=\"activateRow(rowVm.row, $event)\"\n class=\"et-table-row\"\n role=\"row\"\n >\n @for (lead of rowVm.leads; track lead.key) {\n <div\n #gridCell\n [class]=\"lead.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"lead.lead.bodyComponent; inputs: { row: rowVm.row }; injector: lead.lead.injector\"\n />\n </div>\n }\n @for (cell of rowVm.cells; track cell.key) {\n <div\n #bodyCell\n #gridCell\n [attr.data-align]=\"cell.align\"\n [attr.data-col-key]=\"cell.key\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [attr.data-state]=\"cell.state\"\n [attr.id]=\"cell.linkHost ? rowVm.linkLabelId : null\"\n [class.et-table-cell--interactive]=\"cell.interactive\"\n [class.et-table-cell--editing]=\"cell.edit\"\n [class.et-skeleton--animated]=\"cell.state === 'loading'\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n @if (cell.edit; as edit) {\n <!-- The one cell in edit mode: the column's etTableCellEdit template, rendered with the\n editing feature's own context (the draft field). See registerCellEditing. -->\n <ng-container *ngTemplateOutlet=\"edit.template; context: edit.context\" />\n } @else if (cell.state === 'loading' && cellPlaceholder(); as placeholder) {\n <!-- A cell that is loading on its own (an inline edit saving) shows a feature's placeholder\n instead of its value; the row around it stays readable. Without one the value stays put\n and `data-state` carries the cue \u2014 see registerCellPlaceholder. -->\n <ng-container *ngComponentOutlet=\"placeholder.component; injector: placeholder.injector\" />\n } @else {\n @if (cell.state === 'error') {\n @if (cellErrorMark(); as mark) {\n <!-- A feature (etTableCellErrorTooltip) draws the mark instead, so the overlay runtime\n only ships when a table actually wants a tooltip. -->\n <ng-container\n *ngComponentOutlet=\"mark.component; inputs: { message: cell.message }; injector: mark.injector\"\n />\n } @else {\n <!-- Color-scoped here rather than on the cell: the mark is the only part that must read\n as an error, and a provider per errored cell is cheap where one per cell would not\n be. The message rides along as `title`, which costs nothing. -->\n <i\n [etProvideColor]=\"errorColorTheme()\"\n [attr.title]=\"cell.message\"\n [label]=\"cell.message\"\n class=\"et-table-cell-error-icon\"\n etIcon=\"et-triangle-exclamation\"\n ></i>\n }\n }\n @if (cell.template; as bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: cell.context\" />\n } @else {\n <span class=\"et-table-cell-text\">{{ cell.value }}</span>\n }\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of rowVm.trails; track trail.key) {\n <div\n #gridCell\n [class]=\"trail.cellClass\"\n [attr.tabindex]=\"cellNavigation() ? -1 : null\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-cell\"\n >\n <ng-container\n *ngComponentOutlet=\"trail.lead.bodyComponent; inputs: { row: rowVm.row }; injector: trail.lead.injector\"\n />\n </div>\n }\n\n @if (rowVm.href !== null) {\n <!-- The row's link: one real anchor, stretched over the row box (see rowBox) rather than\n wrapping any content, so the cells stay exactly as a table without links renders them.\n It carries no text of its own and is named by the identity cell instead - `aria-labelledby`\n resolves to that cell's content, which is the row's identity.\n\n A child of the row, not of a cell: a cell that is pinned is `position: sticky` and would\n therefore be the anchor's containing block, shrinking the row's hit area to that one\n column. The row box is the containing block that spans every cell. -->\n <a\n [attr.href]=\"rowVm.href\"\n [attr.aria-labelledby]=\"rowVm.linkLabelId\"\n (click)=\"activateRowLink(rowVm.link, $event)\"\n class=\"et-table-row-link\"\n ></a>\n }\n\n @if (cardRows()) {\n <div class=\"et-table-card-corners\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n </div>\n\n <!-- The detail row of an expanded row, from etTableRowExpansion \u2014 the whole row, its chrome and\n its animation belong to the feature, so a table that never expands carries none of them. -->\n @if (rowVm.detail; as detail) {\n <ng-container *ngComponentOutlet=\"detail.component; inputs: { row: rowVm.row }; injector: detail.injector\" />\n }\n } @empty {\n <div class=\"et-table-message-row\" role=\"row\">\n <div [attr.role]=\"cellRole()\" class=\"et-table-empty-cell\">\n @if (emptyTemplate(); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: rows() }\" />\n } @else {\n <ng-content select=\"[etTableEmpty]\">{{ resolvedLabels().empty }}</ng-content>\n }\n </div>\n </div>\n }\n }\n\n @if (spacers(); as spacer) {\n <div [style.block-size.px]=\"spacer.end\" class=\"et-table-spacer\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n\n <!-- Edge gradients marking rows scrolled out of view horizontally, on the edges no pinned column\n already marks (see visibleScrollFades). The layer is absolutely positioned over the whole grid \u2014\n the full scroll extent, not just the viewport \u2014 which is what lets the two fades inside it hold\n their place with `position: sticky` for the entire scroll range. -->\n <div class=\"et-table-scroll-fades\" role=\"presentation\" aria-hidden=\"true\">\n <div\n [style.inset-inline-start.px]=\"fadeInset().start\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().start\"\n class=\"et-table-scroll-fade et-table-scroll-fade--start\"\n ></div>\n <div\n [style.inset-inline-end.px]=\"fadeInset().end\"\n [class.et-table-scroll-fade--visible]=\"visibleScrollFades().end\"\n class=\"et-table-scroll-fade et-table-scroll-fade--end\"\n ></div>\n </div>\n\n @if (hasFooter()) {\n <div [attr.aria-rowindex]=\"ariaRowCount()\" class=\"et-table-footer-row\" role=\"row\">\n @for (lead of leadCells(); track lead.key) {\n <div\n [class]=\"lead.cellClass\"\n [class.et-table-sticky-start]=\"lead.sticky\"\n [style.inset-inline-start.px]=\"lead.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n @for (cell of footerCells(); track cell.key) {\n <div\n [attr.data-align]=\"cell.align\"\n [class.et-table-sticky-start]=\"cell.stickyStart\"\n [class.et-table-sticky-end]=\"cell.stickyEnd\"\n [style.inset-inline-start.px]=\"cell.offsetStart\"\n [style.inset-inline-end.px]=\"cell.offsetEnd\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n >\n @if (cell.template; as footerTemplate) {\n <ng-container *ngTemplateOutlet=\"footerTemplate; context: { $implicit: rows() }\" />\n }\n </div>\n }\n @if (hasFiller()) {\n <div class=\"et-table-footer-cell et-table-filler-cell\" role=\"presentation\" aria-hidden=\"true\"></div>\n }\n @for (trail of trailCells(); track trail.key) {\n <div\n [class]=\"trail.cellClass\"\n [class.et-table-sticky-end]=\"trail.sticky\"\n [style.inset-inline-end.px]=\"trail.offset\"\n [attr.role]=\"cellRole()\"\n class=\"et-table-footer-cell\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n</ng-template>\n\n@if (pageStickyHeader()) {\n <div class=\"et-table-header-strip\" role=\"presentation\">\n <div\n #headerGrid\n [style.grid-template-columns]=\"pageHeaderColumns()\"\n class=\"et-table et-table-header\"\n role=\"rowgroup\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n </div>\n </div>\n <div #scroller (scroll)=\"syncScrollState()\" class=\"et-table-scroller\" role=\"presentation\">\n <div #grid [style.grid-template-columns]=\"templateColumns()\" class=\"et-table\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n </div>\n} @else {\n <div\n #grid\n [style.grid-template-columns]=\"templateColumns()\"\n [attr.role]=\"tableRole()\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n class=\"et-table\"\n >\n <ng-container *ngTemplateOutlet=\"headerContent\" />\n <ng-container *ngTemplateOutlet=\"bodyContent\" />\n </div>\n}\n\n<!-- Full-width footer slot (paginator, page-size, etc.), pinned to the bottom of the scroll viewport.\n Rendered only when the consumer projects `[etTableFooter]`, so the chrome never shows empty. -->\n@if (footerSlot()) {\n <div class=\"et-table-footer\">\n <ng-content select=\"[etTableFooter]\" />\n </div>\n}\n\n<!-- Floating UI from opt-in features (the reorder drag ghost / drop indicator), stamped here so a\n feature can draw without having a view \u2014 or an element \u2014 of its own. -->\n@for (layer of layers(); track $index) {\n <ng-container *ngComponentOutlet=\"layer.component; injector: layer.injector\" />\n}\n", styles: ["@layer components{@property --et-table-cell-padding-block{syntax: \"<length>\"; inherits: true; initial-value: 10px;}@property --et-table-cell-padding-inline{syntax: \"<length>\"; inherits: true; initial-value: 12px;}@property --et-table-opacity-disabled{syntax: \"<number>\"; inherits: true; initial-value: .4;}:where(.et-table-host){display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;overflow:auto;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 35%,transparent) transparent;--_et-table-band: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 7%, var(--et-surface-background-solid, Canvas) );--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-header-border: var(--et-surface-border-solid, rgb(128 128 128 / .3));--_et-table-row-divider: transparent;--_et-table-header-adornment-size: 2.4rem;--_et-table-row-surface: var(--et-surface-background-solid, Canvas);--_et-table-stripe-bg: transparent;--_et-table-stripe-solid: var(--_et-table-row-surface);--_et-table-hover-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);--_et-table-hover-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 8%, var(--_et-table-row-surface) );--_et-table-row-hover: var(--_et-table-hover-tint);--_et-table-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-pressed-tint: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 16%, transparent);--_et-table-pressed-tint-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 16%, var(--_et-table-row-surface) );--_et-table-row-pressed: var(--_et-table-pressed-tint);--_et-table-row-pressed-solid: var(--_et-table-pressed-tint-solid);--_et-table-inert-row-hover: var(--_et-table-hover-tint);--_et-table-inert-row-hover-solid: var(--_et-table-hover-tint-solid);--_et-table-row-gap-block: 0px;--_et-table-row-paint: transparent;--_et-table-row-corner: 0px;--_et-table-header-gap-block: 0px;--_et-table-cell-rule: 0;--_et-table-sticky-clip: none;--_et-table-busy-margin-block-start: 0px;--_et-table-busy-margin-block-end: -2px;--_et-table-detail-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-card-outside: var(--et-surface-background-solid, Canvas);--_et-table-pin-shadow: var( --et-table-pin-shadow-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 30%, transparent) );--_et-table-pin-shadow-inline: var(--et-table-pin-shadow-color-inline, var(--_et-table-pin-shadow));--_et-table-pin-shadow-block: var(--et-table-pin-shadow-color-block, var(--_et-table-pin-shadow));--_et-table-edge-none: 0 0 transparent;--_et-table-edge-start: var(--_et-table-edge-none);--_et-table-edge-end: var(--_et-table-edge-none);--_et-table-edge-block-start: var(--_et-table-edge-none);--_et-table-edge-block-end: var(--_et-table-edge-none)}.et-table-host--scrolled-inline-start{--_et-table-edge-start: 8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-inline-end{--_et-table-edge-end: -8px 0 10px -6px var(--_et-table-pin-shadow-inline)}.et-table-host--scrolled-block-start{--_et-table-edge-block-start: 0 8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host--scrolled-block-end{--_et-table-edge-block-end: 0 -8px 10px -6px var(--_et-table-pin-shadow-block)}.et-table-host:where([data-density=sm]){--et-table-cell-padding-block: 6px;--et-table-cell-padding-inline: 10px}.et-table-host:where([data-density=md]){--et-table-cell-padding-block: 10px;--et-table-cell-padding-inline: 12px}.et-table-host:where([data-density=lg]){--et-table-cell-padding-block: 15px;--et-table-cell-padding-inline: 16px}.et-table-host:where([data-appearance=enclosed],[data-appearance=zebra],[data-appearance=grid]){border:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3));border-radius:var(--et-table-radius, 10px)}.et-table-host:where([data-appearance=enclosed]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15));box-shadow:0 1px 2px rgb(var(--et-shadow-color-rgb, 0 0 0) / .04),0 6px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / .06)}.et-table-host:where([data-appearance=divided]){--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=zebra]){--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-stripe-bg: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 4%, transparent);--_et-table-stripe-solid: color-mix( in srgb, var(--et-surface-interaction-solid, gray) 4%, var(--_et-table-row-surface) )}.et-table-host:where([data-appearance=grid]){--_et-table-cell-rule: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / .15));--_et-table-header-bg: var(--et-table-header-background-color, var(--_et-table-band));--_et-table-row-divider: var(--et-surface-border-solid, rgb(128 128 128 / .15))}.et-table-host:where([data-appearance=bare]){--_et-table-header-border: transparent}.et-table-host:where([data-appearance=cards]){--_et-table-row-gap-block: var(--et-table-row-gap, 8px);--_et-table-row-corner: var(--et-table-row-radius, 10px);--_et-table-header-gap-block: var(--et-table-row-gap, 8px);--_et-table-sticky-clip: inset(0 -24px);--_et-table-busy-margin-block-start: calc((var(--et-table-row-gap, 8px) + 2px) / -2);--_et-table-busy-margin-block-end: calc((var(--et-table-row-gap, 8px) - 2px) / 2);--_et-table-detail-rule: 0;--_et-table-inert-row-hover: transparent;--_et-table-header-bg: var(--et-table-header-background-color, var(--et-surface-background-solid, Canvas));--_et-table-row-divider: transparent}.et-table{display:grid;position:relative;align-content:start;inline-size:min-content;min-inline-size:100%;background:var(--et-surface-background-solid, Canvas);color:var(--et-surface-color-solid, CanvasText);font-size:14px;line-height:1.4}.et-table-header-cell.et-table-filler-cell,.et-table-cell.et-table-filler-cell,.et-table-footer-cell.et-table-filler-cell,.et-table-group-cell.et-table-filler-cell{padding-inline:0}.et-table-header-row,.et-table-row{display:contents}.et-table-header-cell,.et-table-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline)}.et-table-cell-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.et-table-header-cell{position:sticky;inset-block-start:max(0px,calc(var(--_et-table-group-h, 0px) - 1px));gap:4px;z-index:1;font-weight:600;color:var(--et-table-header-color, var(--et-surface-color-muted-solid, CanvasText));background:var(--_et-table-header-bg);border-block-end:1px solid var(--_et-table-header-border)}.et-table-header-adornments{display:flex;align-items:center;flex:none}.et-table-header-cell .et-table-filter-trigger,.et-table-header-cell .et-table-column-menu-trigger{--et-icon-button-size: var(--_et-table-header-adornment-size);--et-icon-button-icon-size: 1.6rem;min-width:24px;min-height:24px}.et-table-host--header-adornments .et-table-header-cell{min-block-size:calc(max(var(--_et-table-header-adornment-size),24px) + 2 * var(--et-table-cell-padding-block) + 1px)}.et-table-cell{min-block-size:var(--et-table-row-min-block-size, auto);border-block-end:1px solid var(--_et-table-row-divider)}.et-table-header-cell{box-shadow:var(--_et-table-edge-block-start)}.et-table-footer,.et-table-footer-cell{box-shadow:var(--_et-table-edge-block-end)}.et-table-row--last:not(:has(+.et-table-detail-row)) .et-table-cell{border-block-end:0}.et-table-row--stripe .et-table-cell{background:var(--_et-table-stripe-bg)}.et-table-header-cell,.et-table-cell{border-inline-end:var(--_et-table-cell-rule)}.et-table-header-row .et-table-header-cell:last-child,.et-table-row .et-table-cell:nth-last-child(1 of.et-table-cell){border-inline-end:0}.et-table-footer-row{display:contents}.et-table-footer-cell{display:flex;align-items:center;min-inline-size:0;overflow:hidden;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);position:sticky;inset-block-end:0;z-index:1;font-weight:600;background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-footer-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-scroll-fades{position:absolute;inset:0;display:flex;justify-content:space-between;z-index:3;pointer-events:none}.et-table-scroll-fade{position:sticky;flex:none;inline-size:var(--et-table-scroll-fade-size, 28px);opacity:0;transition:opacity .15s ease;--_et-table-scroll-fade-color: var( --et-table-scroll-fade-color, color-mix(in srgb, var(--et-surface-interaction-solid, black) 22%, transparent) )}.et-table-scroll-fade--visible{opacity:1}.et-table-scroll-fade--start{background:linear-gradient(to right,var(--_et-table-scroll-fade-color),transparent)}.et-table-scroll-fade--end{background:linear-gradient(to left,var(--_et-table-scroll-fade-color),transparent)}@media(prefers-reduced-motion:reduce){.et-table-scroll-fade{transition:none}}.et-table-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;position:sticky;inset-block-end:0;inset-inline-start:0;z-index:4;padding:var(--et-table-cell-padding-block) var(--et-table-cell-padding-inline);background:var(--_et-table-header-bg);border-block-start:1px solid var(--et-surface-border-solid, rgb(128 128 128 / .3))}.et-table-footer-label{margin:0;font-size:14px;color:var(--et-surface-color-muted-solid, CanvasText)}@media(pointer:coarse){.et-table-footer{gap:8px;padding:8px var(--et-table-cell-padding-inline)}}.et-table-header-cell:where([data-align=center]),.et-table-cell:where([data-align=center]){justify-content:center;text-align:center}.et-table-header-cell:where([data-align=end]),.et-table-cell:where([data-align=end]){justify-content:flex-end;text-align:end}.et-table-row--interactive .et-table-cell{cursor:pointer}@media(hover:hover){.et-table-row:hover .et-table-cell{background:var(--_et-table-row-hover)}}.et-table-row:where(.et-table-row--interactive,.et-table-row--link):active .et-table-cell{background:var(--_et-table-row-pressed)}.et-table-header-label:focus-visible,.et-table-expander:focus-visible,.et-table-cell:focus-visible{outline:2px solid var(--et-theme-color-primary-solid, currentColor);outline-offset:-2px}.et-table-header-label{border-radius:4px}.et-table-header-label{display:flex;align-items:center;flex:1;min-inline-size:0;margin:0;padding:0;font:inherit;color:inherit;text-align:inherit;background:none;border:none}.et-table-header-label-box{display:flex;align-items:center;gap:4px;min-inline-size:0;padding:4px;margin:-4px;border-radius:4px}.et-table-header-label:where(.et-table-header-label--sortable){cursor:pointer}.et-table-header-label--sortable .et-table-header-label-box{background-color:var(--_et-table-header-label-tint, transparent);transition:background-color .12s var(--ease-out-5, ease)}@media(hover:hover){.et-table-header-label--sortable:hover:not(:disabled){--_et-table-header-label-tint: var(--_et-table-hover-tint)}}.et-table-header-label--sortable:active:not(:disabled){--_et-table-header-label-tint: var(--_et-table-pressed-tint)}.et-table-header-cell:where([data-disabled]) .et-table-header-label{opacity:var(--et-table-opacity-disabled)}.et-table-header-label:where(.et-table-header-label--sortable:disabled){cursor:not-allowed}.et-table-header-cell:where([data-align=center]) .et-table-header-label{justify-content:center}.et-table-header-cell:where([data-align=end]) .et-table-header-label{justify-content:flex-end}.et-table-sort-indicator{flex:none;inline-size:1.15em;block-size:1.15em;transform:translateY(-.045em);color:var(--et-theme-color-primary-solid, currentColor);transition:transform .2s var(--ease-out-5, ease)}.et-table-sort-indicator:where([data-direction=desc]){transform:translateY(-.045em) rotate(180deg)}.et-table-sort-indicator.et-table-sort-indicator--enter{animation:et-table-sort-in .15s ease}.et-table-sort-indicator.et-table-sort-indicator--leave{animation:et-table-sort-in .12s ease reverse forwards}@keyframes et-table-sort-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.et-table-sort-indicator{transition:none}.et-table-sort-indicator.et-table-sort-indicator--enter,.et-table-sort-indicator.et-table-sort-indicator--leave{animation:none}}.et-table-message-row{display:contents}.et-table-empty-cell,.et-table-error-cell{grid-column:1 / -1;position:sticky;inset-inline-start:0;inline-size:var(--_et-table-viewport-inline-size, 100%);padding:32px var(--et-table-cell-padding-inline);color:var(--et-surface-color-muted-solid, CanvasText);text-align:center}.et-table-empty-cell{display:grid;place-content:center;justify-items:center}.et-table-error-cell{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;gap:8px}.et-table-error-icon{flex:none;inline-size:16px;block-size:16px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=error]){gap:6px}.et-table-cell-error-icon{flex:none;inline-size:14px;block-size:14px;color:var(--et-theme-color-ink-solid, currentColor)}.et-table-cell:where([data-state=loading]){display:flex}.et-table-busy-bar{grid-column:1 / -1;block-size:2px;margin-block-start:var(--_et-table-busy-margin-block-start);margin-block-end:var(--_et-table-busy-margin-block-end);overflow:hidden;background:color-mix(in srgb,var(--et-surface-interaction-solid, gray) 10%,transparent)}.et-table-busy-bar.et-table-busy-bar--enter{animation:et-table-busy-fade .15s ease}.et-table-busy-bar.et-table-busy-bar--leave{animation:et-table-busy-fade .25s ease reverse forwards}@keyframes et-table-busy-fade{0%{opacity:0}to{opacity:1}}.et-table-busy-bar:after{content:\"\";display:block;inline-size:40%;block-size:100%;border-radius:999px;background:var(--et-theme-color-primary-solid, currentColor);animation:et-table-busy-sweep 1.1s ease-in-out infinite}@keyframes et-table-busy-sweep{0%{transform:translate(-100%)}to{transform:translate(250%)}}@media(prefers-reduced-motion:reduce){.et-table-busy-bar:after{inline-size:100%;animation:none}.et-table-busy-bar.et-table-busy-bar--enter,.et-table-busy-bar.et-table-busy-bar--leave{animation:none}}}\n"] }]
|
|
70143
71295
|
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], rowsSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsSource", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], errorTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorTemplate", required: false }] }], cellState: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellState", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], multiSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSort", required: false }] }], sortMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortMode", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], filterMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMode", required: false }] }], quickFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilter", required: false }] }], expandedRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedRowTemplate", required: false }] }], rowInteractive: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowInteractive", required: false }] }], rowLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowLink", required: false }] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], footerSlot: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TableFooterDirective), { isSignal: true }] }], gridRef: [{ type: i0.ViewChild, args: ['grid', { isSignal: true }] }], headerGridRef: [{ type: i0.ViewChild, args: ['headerGrid', { isSignal: true }] }], scrollerRef: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }], headerCells: [{ type: i0.ViewChildren, args: ['headerCell', { isSignal: true }] }], bodyCells: [{ type: i0.ViewChildren, args: ['bodyCell', { isSignal: true }] }], gridCells: [{ type: i0.ViewChildren, args: ['gridCell', { isSignal: true }] }], leadHeaderCells: [{ type: i0.ViewChildren, args: ['leadHeaderCell', { isSignal: true }] }], trailHeaderCells: [{ type: i0.ViewChildren, args: ['trailHeaderCell', { isSignal: true }] }] } });
|
|
70144
71296
|
|
|
70145
71297
|
/**
|
|
@@ -70595,6 +71747,9 @@ class TableColumnMenuDirective {
|
|
|
70595
71747
|
return (this.config().hideColumn ?? true) && this.table.visibleColumnsMeta().length > 1;
|
|
70596
71748
|
}
|
|
70597
71749
|
hide(column) {
|
|
71750
|
+
this.table.setSort(column.key, null);
|
|
71751
|
+
if (this.table.filterValuesFor(column.key).length)
|
|
71752
|
+
this.table.setFilterValues(column.key, []);
|
|
70598
71753
|
this.table.setColumnVisible(column.key, false);
|
|
70599
71754
|
}
|
|
70600
71755
|
canPin() {
|
|
@@ -71216,9 +72371,16 @@ class TableRowDetailComponent {
|
|
|
71216
72371
|
...(ngDevMode ? [{ debugName: "row" }] : /* istanbul ignore next */ []));
|
|
71217
72372
|
this.animated = computed(() => this.expansion.animates(this.row()), /* @ts-ignore */
|
|
71218
72373
|
...(ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []));
|
|
72374
|
+
this.dimensions = signalHostElementDimensions();
|
|
72375
|
+
effect(() => {
|
|
72376
|
+
const height = this.dimensions().offset?.height;
|
|
72377
|
+
const row = this.row();
|
|
72378
|
+
if (height !== undefined)
|
|
72379
|
+
untracked(() => this.table.setDetailRowHeight(row, height));
|
|
72380
|
+
});
|
|
71219
72381
|
}
|
|
71220
72382
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableRowDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
71221
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: TableRowDetailComponent, isStandalone: true, selector: "et-table-row-detail", inputs: { row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "row" }, properties: { "animate.enter": "animated() ? 'et-table-detail--enter' : ''", "animate.leave": "animated() ? 'et-table-detail--leave' : ''" }, classAttribute: "et-table-detail-row" }, ngImport: i0, template: `
|
|
72383
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: TableRowDetailComponent, isStandalone: true, selector: "et-table-row-detail", inputs: { row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "row" }, properties: { "attr.aria-rowindex": "table.detailAriaRowIndex(row())", "animate.enter": "animated() ? 'et-table-detail--enter' : ''", "animate.leave": "animated() ? 'et-table-detail--leave' : ''" }, classAttribute: "et-table-detail-row" }, ngImport: i0, template: `
|
|
71222
72384
|
<!-- The clip window the animating track squeezes to nothing, and the body that carries the padding.
|
|
71223
72385
|
Two elements on purpose - see table-detail-styles.component.css. -->
|
|
71224
72386
|
<div [attr.role]="table.cellRole()" class="et-table-detail-cell">
|
|
@@ -71246,13 +72408,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
71246
72408
|
host: {
|
|
71247
72409
|
class: 'et-table-detail-row',
|
|
71248
72410
|
role: 'row',
|
|
72411
|
+
'[attr.aria-rowindex]': 'table.detailAriaRowIndex(row())',
|
|
71249
72412
|
// Animated only for the row the user just toggled - a re-mount from paging/sorting must not replay
|
|
71250
72413
|
// the reveal (see TableRowExpansionDirective.animates).
|
|
71251
72414
|
'[animate.enter]': "animated() ? 'et-table-detail--enter' : ''",
|
|
71252
72415
|
'[animate.leave]': "animated() ? 'et-table-detail--leave' : ''",
|
|
71253
72416
|
},
|
|
71254
72417
|
}]
|
|
71255
|
-
}], propDecorators: { row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: true }] }] } });
|
|
72418
|
+
}], ctorParameters: () => [], propDecorators: { row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: true }] }] } });
|
|
71256
72419
|
|
|
71257
72420
|
/** Covers the 0.18s detail-row enter/leave animations in the CSS - see {@link TableRowExpansionDirective.animates}. */
|
|
71258
72421
|
const DETAIL_ANIMATION_MS = 200;
|
|
@@ -73537,6 +74700,7 @@ class TableVirtualScrollDirective {
|
|
|
73537
74700
|
itemCount: computed(() => this.table.rows().length),
|
|
73538
74701
|
estimateItemHeight: computed(() => this.config().estimateRowHeight ?? 48),
|
|
73539
74702
|
overscan: computed(() => this.config().overscan ?? 6),
|
|
74703
|
+
extraItemHeights: computed(() => this.table.detailRowHeights()),
|
|
73540
74704
|
});
|
|
73541
74705
|
injectStyleManager().mount(TableVirtualScrollStylesComponent);
|
|
73542
74706
|
this.table.registerRowWindow({
|
|
@@ -74452,9 +75616,17 @@ class TabGroupDirective {
|
|
|
74452
75616
|
this.sessionMemoryKey = input(null, /* @ts-ignore */
|
|
74453
75617
|
...(ngDevMode ? [{ debugName: "sessionMemoryKey" }] : /* istanbul ignore next */ []));
|
|
74454
75618
|
this.sessionMemoryAvailable = canUseSessionMemory();
|
|
74455
|
-
|
|
74456
|
-
|
|
74457
|
-
|
|
75619
|
+
this.registeredPanels = signal([], /* @ts-ignore */
|
|
75620
|
+
...(ngDevMode ? [{ debugName: "registeredPanels" }] : /* istanbul ignore next */ []));
|
|
75621
|
+
this.childMutations = signalElementMutations(inject(ElementRef), {
|
|
75622
|
+
childList: true,
|
|
75623
|
+
subtree: true,
|
|
75624
|
+
});
|
|
75625
|
+
/** @internal The panels in DOM order, which a keyed `@for` can change without re-registering any. */
|
|
75626
|
+
this.panels = computed(() => {
|
|
75627
|
+
this.childMutations();
|
|
75628
|
+
return sortByDomOrder(this.registeredPanels(), (panel) => panel.hostElement);
|
|
75629
|
+
}, { ...(ngDevMode ? { debugName: "panels" } : /* istanbul ignore next */ {}), equal: isSameOrder$1 });
|
|
74458
75630
|
/** @internal Set by composing components (e.g. et-tab-group) that render panel content themselves instead of registering [etTabPanel] directives. */
|
|
74459
75631
|
this.managesPanelsInternally = signal(false, /* @ts-ignore */
|
|
74460
75632
|
...(ngDevMode ? [{ debugName: "managesPanelsInternally" }] : /* istanbul ignore next */ []));
|
|
@@ -74537,18 +75709,19 @@ class TabGroupDirective {
|
|
|
74537
75709
|
}
|
|
74538
75710
|
/** @internal */
|
|
74539
75711
|
registerPanel(panel) {
|
|
74540
|
-
this.
|
|
75712
|
+
this.registeredPanels.update((list) => [...list, panel]);
|
|
74541
75713
|
}
|
|
74542
75714
|
/** @internal */
|
|
74543
75715
|
unregisterPanel(panel) {
|
|
74544
|
-
this.
|
|
75716
|
+
this.registeredPanels.update((list) => list.filter((p) => p !== panel));
|
|
74545
75717
|
}
|
|
74546
75718
|
resolveSelectedIndex(index) {
|
|
74547
75719
|
const triggers = this.tabBar.triggers();
|
|
74548
75720
|
if (triggers.length === 0) {
|
|
74549
75721
|
return null;
|
|
74550
75722
|
}
|
|
74551
|
-
const
|
|
75723
|
+
const wholeIndex = Number.isFinite(index) ? Math.trunc(index) : 0;
|
|
75724
|
+
const clampedIndex = Math.min(Math.max(wholeIndex, 0), triggers.length - 1);
|
|
74552
75725
|
const selectedTrigger = triggers[clampedIndex];
|
|
74553
75726
|
if (selectedTrigger && !selectedTrigger.disabled()) {
|
|
74554
75727
|
return clampedIndex;
|
|
@@ -74595,6 +75768,7 @@ let nextPanelId = 0;
|
|
|
74595
75768
|
class TabPanelDirective {
|
|
74596
75769
|
constructor() {
|
|
74597
75770
|
this.tabGroup = inject(TAB_GROUP_TOKEN, { optional: true });
|
|
75771
|
+
/** @internal */
|
|
74598
75772
|
this.hostElement = injectHostElement();
|
|
74599
75773
|
this.triggerId = input(null, /* @ts-ignore */
|
|
74600
75774
|
...(ngDevMode ? [{ debugName: "triggerId" }] : /* istanbul ignore next */ []));
|
|
@@ -75811,7 +76985,15 @@ const DEFAULT_TREE_LABELS = {
|
|
|
75811
76985
|
empty: 'Nothing to show',
|
|
75812
76986
|
retry: 'select to retry',
|
|
75813
76987
|
};
|
|
75814
|
-
|
|
76988
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
76989
|
+
const GERMAN_TREE_LABELS = {
|
|
76990
|
+
loading: 'Lade…',
|
|
76991
|
+
empty: 'Nichts anzuzeigen',
|
|
76992
|
+
retry: 'zum Wiederholen auswählen',
|
|
76993
|
+
};
|
|
76994
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideTreeLabels}. */
|
|
76995
|
+
const treeLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_TREE_LABELS : DEFAULT_TREE_LABELS;
|
|
76996
|
+
const TREE_LABELS_DEF = /* @__PURE__ */ defineLabels('TREE_LABELS', treeLabelsForLocale);
|
|
75815
76997
|
/**
|
|
75816
76998
|
* Localize the tree's strings for everything below this injector, and read the set in effect here as a
|
|
75817
76999
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_TREE_LABELS} value. See {@link defineLabels}
|
|
@@ -75887,7 +77069,16 @@ const DEFAULT_UNSAVED_CHANGES_LABELS = {
|
|
|
75887
77069
|
discard: 'Discard',
|
|
75888
77070
|
keepEditing: 'Keep editing',
|
|
75889
77071
|
};
|
|
75890
|
-
|
|
77072
|
+
/** The built-in German labels, used when the current locale is a German one. */
|
|
77073
|
+
const GERMAN_UNSAVED_CHANGES_LABELS = {
|
|
77074
|
+
title: 'Ungespeicherte Änderungen verwerfen?',
|
|
77075
|
+
message: 'Die Änderungen wurden nicht gespeichert. Seite verlassen und Änderungen verwerfen?',
|
|
77076
|
+
discard: 'Verwerfen',
|
|
77077
|
+
keepEditing: 'Weiter bearbeiten',
|
|
77078
|
+
};
|
|
77079
|
+
/** The label set for a locale. Anything other than English and German needs {@link provideUnsavedChangesLabels}. */
|
|
77080
|
+
const unsavedChangesLabelsForLocale = (locale) => locale.toLowerCase().startsWith('de') ? GERMAN_UNSAVED_CHANGES_LABELS : DEFAULT_UNSAVED_CHANGES_LABELS;
|
|
77081
|
+
const UNSAVED_CHANGES_LABELS_DEF = /* @__PURE__ */ defineLabels('UNSAVED_CHANGES_LABELS', unsavedChangesLabelsForLocale);
|
|
75891
77082
|
/**
|
|
75892
77083
|
* Localize the unsaved-changes dialog for everything below this injector, and read the set in effect here as a
|
|
75893
77084
|
* signal. Partial - whatever you leave out keeps its {@link DEFAULT_UNSAVED_CHANGES_LABELS} value. See
|
|
@@ -75919,11 +77110,11 @@ const provideUnsavedChangesAlertDialog = () => provideUnsavedChangesConfirm(() =
|
|
|
75919
77110
|
|
|
75920
77111
|
// Generated from package.json by tools/scripts/generate-version.js - do not edit.
|
|
75921
77112
|
/** The version of `@ethlete/components` this build was cut from. */
|
|
75922
|
-
const COMPONENTS_VERSION = '1.0.0-next.
|
|
77113
|
+
const COMPONENTS_VERSION = '1.0.0-next.70';
|
|
75923
77114
|
|
|
75924
77115
|
/**
|
|
75925
77116
|
* Generated bundle index. Do not edit.
|
|
75926
77117
|
*/
|
|
75927
77118
|
|
|
75928
|
-
export { ACCESSIBLE_NAME_INPUTS, ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, ALERT_DIALOG_LABELS, ALIGN_CENTER_ICON, ALIGN_JUSTIFY_ICON, ALIGN_LEFT_ICON, ALIGN_RIGHT_ICON, ARROWS_LEFT_RIGHT_ICON, ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, ARROW_UP_ICON, AVATAR_IMPORTS, AVATAR_LABELS, AVATAR_SHAPES, AVATAR_SIZES, AccessibleNameControlDirective, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, AvatarComponent, AvatarGroupComponent, BADGE_ICON_ALIGNMENTS, BADGE_IMPORTS, BADGE_SIZES, BADGE_VARIANTS, BANNER_IMPORTS, BANNER_LABELS, BANNER_TYPES, BOLD_ICON, BRACKET_CARD_CONTEXT, BRACKET_DEFAULTS, BRACKET_DEFAULT_CARDS, BRACKET_DENSITY, BRACKET_DENSITY_PRESETS, BRACKET_IMPORTS, BRACKET_LABELS, BRACKET_PARTICIPANTS_IMPORTS, BRACKET_PICK_CARD_IMPORTS, BRACKET_PICK_CARD_NOTE_TONE, BRACKET_ROUNDS_LIST_IMPORTS, BRACKET_ROUND_HEADER_ALIGN, BRACKET_SKELETON_IMPORTS, BREADCRUMB_COLLAPSE_IMPORTS, BREADCRUMB_COLLAPSE_TOKEN, BREADCRUMB_ERROR_CODES, BREADCRUMB_IMPORTS, BREADCRUMB_LABELS, BREADCRUMB_SEGMENT_TOKEN, BREADCRUMB_SEO_IMPORTS, BREADCRUMB_TOKEN, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BadgeComponent, BannerComponent, BarChartComponent, BarChartDirective, BarChartPlotDirective, BracketComponent, BracketDefaultContinueComponent, BracketDefaultFinalMatchComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketParticipantsComponent, BracketPickCardComponent, BracketRoundsListComponent, BracketSkeletonComponent, BracketSkeletonContinueComponent, BracketSkeletonFinalMatchComponent, BracketSkeletonMatchComponent, BracketSkeletonRoundHeaderComponent, BrandLoaderComponent, BreadcrumbCollapseDirective, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbOverflowComponent, BreadcrumbSegmentDirective, BreadcrumbSeoDirective, BreadcrumbSeparatorDirective, ButtonColorDirective, ButtonComponent, ButtonDirective, ButtonStylesDirective, CALENDAR_ERROR_CODES, CALENDAR_ICON, CALENDAR_IMPORTS, CALENDAR_LABELS, CARD_IMPORTS, CARD_VARIANTS, CAROUSEL_AUTOPLAY_TOKEN, CAROUSEL_ERROR_CODES, CAROUSEL_IMPORTS, CAROUSEL_LABELS, CAROUSEL_SLIDE_ALIGNMENTS, CAROUSEL_TOKEN, CAROUSEL_TRANSITIONS, CAROUSEL_TRANSITION_DRIVERS, CASCADER_ERROR_CODES, CASCADER_IMPORTS, CASCADER_LABELS, CASCADER_SELECTABLE_LEVELS, CHART_ERROR_CODES, CHART_IMPORTS, CHART_LABELS, CHART_PLOT_HOST, CHECKBOX_GROUP_IMPORTS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHIP_REMOVE_FOCUS_FALLBACK, CHIP_REMOVE_TAB_STOP, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CIRCLE_CHECK_ICON, CIRCLE_INFO_ICON, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_BLOCK_ICON, CODE_ICON, COLOR_INPUT_ERROR_CODES, COLOR_INPUT_IMPORTS, COLOR_INPUT_LABELS, COLOR_INPUT_TOKEN, COLOR_NOTATIONS, COLOR_NOTATION_ORDER, COMMAND_PALETTE_ERROR_CODES, COMMAND_PALETTE_IMPORTS, COMMAND_PALETTE_LABELS, COMMAND_PALETTE_OVERLAY, COMMAND_PALETTE_REGISTRY, COMMAND_PALETTE_TOKEN, COMPONENTS_VERSION, COPY_BUTTON_IMPORTS, COPY_BUTTON_LABELS, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CalendarHeaderDirective, CardComponent, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, ChartPlotDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxGroupSelectAllComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, ColorPickerAreaDirective, ColorPickerChannelDirective, ColorPickerPanelComponent, ColorPickerSurfaceDirective, ColorPickerTriggerDirective, CommandPaletteComponent, CommandPaletteDirective, CommandPaletteItemComponent, CommandPaletteSearchDirective, CommandPaletteShortcutDirective, ControlSuffixDirective, CopyButtonDirective, CounterComponent, DAILYMOTION_PLAYER_TOKEN, DATE_FORMAT, DATE_INPUT_ERROR_CODES, DATE_INPUT_IMPORTS, DATE_LOCALE, DATE_PICKER_HOST, DATE_RANGE_INPUT_ERROR_CODES, DATE_RANGE_INPUT_IMPORTS, DATE_TIME_FORMAT, DATE_TIME_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_LABELS, DATE_TIME_RANGE_INPUT_ERROR_CODES, DATE_TIME_RANGE_INPUT_IMPORTS, DEFAULT_ALERT_DIALOG_LABELS, DEFAULT_AVATAR_LABELS, DEFAULT_BANNER_LABELS, DEFAULT_BRACKET_LABELS, DEFAULT_BREADCRUMB_LABELS, DEFAULT_BREAKPOINTS, DEFAULT_CALENDAR_LABELS, DEFAULT_CALENDAR_RANGE_STRATEGY, DEFAULT_CAROUSEL_LABELS, DEFAULT_CASCADER_LABELS, DEFAULT_CHART_LABELS, DEFAULT_CHIP_LABELS, DEFAULT_COLOR_INPUT_LABELS, DEFAULT_COMMAND_PALETTE_LABELS, DEFAULT_COPY_BUTTON_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_DROPZONE_MAX_PREVIEW_FILE_SIZE, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_DEFAULTS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_LABELS, DEFAULT_KBD_LABELS, DEFAULT_LOADER_LABELS, DEFAULT_MATCH_CARD_START_TIME_FORMAT, DEFAULT_MATCH_LABELS, DEFAULT_NOTIFICATION_LABELS, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_NOTIFICATION_STATUS_ICONS, DEFAULT_PAGINATION_LABELS, DEFAULT_PHONE_INPUT_LABELS, DEFAULT_PROGRESS_STEP_LABELS, DEFAULT_QUERY_ERROR_LABELS, DEFAULT_RICH_TEXT_EDITOR_LABELS, DEFAULT_RICH_TEXT_EDITOR_TOOLS, DEFAULT_SCHEDULER_LABELS, DEFAULT_SELECT_LABELS, DEFAULT_SLIDER_LABELS, DEFAULT_STANDINGS_LABELS, DEFAULT_STAT_TILE_LABELS, DEFAULT_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DEFAULT_TREE_LABELS, DEFAULT_UNSAVED_CHANGES_LABELS, DESCRIPTION_IMPORTS, DESCRIPTION_LIST_IMPORTS, DESCRIPTION_LIST_VARIANTS, DIVIDER_IMPORTS, DROPZONE_ENTRY_STATUSES, DROPZONE_ERROR_CODES, DROPZONE_FILES_ERROR_KIND, DROPZONE_FILE_CONSTRAINTS, DROPZONE_FILE_REJECTION_REASONS, DROPZONE_IMPORTS, DROPZONE_LABELS, DURATION_INPUT_ERROR_CODES, DURATION_INPUT_IMPORTS, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DateInputComponent, DateInputDirective, DateInputFieldDirective, DatePickerPanelComponent, DatePickerSurfaceDirective, DatePickerTriggerDirective, DateRangeInputComponent, DateRangeInputDirective, DateRangeInputFieldDirective, DateTimeInputComponent, DateTimeInputDirective, DateTimeInputFieldDirective, DateTimeRangeInputComponent, DateTimeRangeInputDirective, DateTimeRangeInputFieldDirective, DescriptionComponent, DescriptionListComponent, DividerComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, EMPTY_STATE_IMPORTS, ET_BUILT_IN_ICON_NAMES, EYEDROPPER_ICON, EYE_ICON, EYE_SLASH_ICON, EmptyStateComponent, FACEBOOK_PLAYER_TOKEN, FIELD_WARNINGS, FIELD_WARNING_KIND, FILE_ICON, FILTER_ICON, FILTER_OVERLAY_ERROR_CODES, FILTER_OVERLAY_IMPORTS, FILTER_OVERLAY_LABELS, FILTER_OVERLAY_TOKEN, FLOATING_ACTION_ERROR_CODES, FLOATING_ACTION_IMPORTS, FLOATING_ACTION_STATES, FLOATING_ACTION_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_ERROR_MESSAGE_RESOLVER, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABELS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FORM_IMPORTS, FORM_WARNING_MESSAGE_RESOLVER, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormDirective, FormErrorComponent, FormFieldBarrierDirective, FormFieldComponent, FormFieldDirective, FormWarningComponent, GERMAN_COMMAND_PALETTE_LABELS, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_QUERY_ERROR_LABELS, GRID_2X2_ICON, GRID_DEBUG_IMPORTS, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemToolbarComponent, GridResizeDirective, HEADING_1_ICON, HEADING_2_ICON, HEADING_3_ICON, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, ICON_OVERRIDES_TOKEN, IMAGE_ICON, INHERIT_COLOR, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS$1 as INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KBD_IMPORTS, KBD_LABELS, KBD_PLATFORM, KICK_PLAYER_TOKEN, KbdComponent, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINE_CHART_ERROR_CODES, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_IMPORTS, LOADER_LABELS, LOCATION_ICON, LOCK_ICON, LabelDirective, LineChartComponent, LineChartDirective, LineChartSliceDirective, MASKED_INPUT_ERROR_CODES, MASKED_INPUT_IMPORTS, MASK_VALUE_MODES, MASONRY_ERROR_CODES, MASONRY_IMPORTS, MASONRY_TOKEN, MATCH_CARD_IMPORTS, MATCH_CARD_SIZES, MATCH_CARD_TOKEN, MATCH_ERROR_CODES, MATCH_LABELS, MATCH_PARTICIPANT_IMPORTS, MENU_ERROR_CODES, MENU_IMPORTS, MENU_ITEM_VARIANTS, MENU_SEARCH_IMPORTS, MENU_SELECTION_GROUP_MULTIPLE, MENU_SELECTION_GROUP_TOKEN, MENU_SELECTION_ITEM_KIND, MINUS_ICON, MULTI_LANGUAGE_RICH_TEXT_EDITOR_ERROR_CODES, MULTI_LANGUAGE_RICH_TEXT_EDITOR_IMPORTS, MasonryDirective, MasonryItemDirective, MatchCardComponent, MatchCardDirective, MatchCardGameScoresDirective, MatchCardMetaDirective, MatchCardScoreDirective, MatchParticipantComponent, MatchScoreComponent, MenuCheckboxGroupComponent, MenuCheckboxItemComponent, MenuComponent, MenuContextTriggerDirective, MenuDirective, MenuGroupLabelComponent, MenuItemComponent, MenuItemDirective, MenuItemShortcutComponent, MenuItemSubmenuIconComponent, MenuPanelDirective, MenuRadioGroupComponent, MenuRadioItemComponent, MenuSearchDirective, MenuSelectionGroupDirective, MenuSelectionItemDirective, MenuSeparatorComponent, MenuSurfaceDirective, MenuTriggerDirective, MultiLanguageRichTextEditorComponent, MultiLanguageRichTextEditorDirective, MultiLanguageRichTextEditorLanguageToolComponent, NAV_TABS_TOKEN, NAV_TAB_IMPORTS, NOTIFICATION_ACTION_SLOTS, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_LABELS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STACK_OVERLAY_LAYER, NOTIFICATION_STATUS, NO_STREAM_PLAYER_CAPABILITIES, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, NavTabLinkStylesComponent, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, NotificationSwipeToDismissDirective, NumberInputComponent, NumberInputDirective, OTP_INPUT_IMPORTS, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HAS_BACKDROP, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_NAV_TAB_IMPORTS, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OtpInputComponent, OtpInputDirective, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayNavTabLinkComponent, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGE_SIZE_SELECT_IMPORTS, PAGINATION_IMPORTS, PAGINATION_LABELS, PAGINATION_SIZES, PARAGRAPH_ICON, PASSWORD_INPUT_IMPORTS, PAUSE_ICON, PENCIL_ICON, PHONE_COUNTRIES, PHONE_INPUT_ERROR_CODES, PHONE_INPUT_IMPORTS, PHONE_INPUT_LABELS, PICTURE_IMPORTS, PICTURE_STATES, PIE_CHART_ERROR_CODES, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PROGRESS_STEPS_IMPORTS, PROGRESS_STEPS_ORIENTATIONS, PROGRESS_STEP_LABELS, PROGRESS_STEP_STATES, PageSizeSelectComponent, PagedQueryTriggerDirective, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PieChartComponent, PieChartDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, ProgressStepComponent, ProgressStepsComponent, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QUOTE_ICON, QueryButtonDirective, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_GROUP_IMPORTS, RADIO_VARIANTS, RATING_ERROR_CODES, RATING_IMPORTS, REDO_ICON, RICH_TEXT_EDITOR_FLOATING_TOOLBAR, RICH_TEXT_EDITOR_HEADING_OPTIONS, RICH_TEXT_EDITOR_IMPORTS, RICH_TEXT_EDITOR_INLINE_TOOLS, RICH_TEXT_EDITOR_LABELS, RICH_TEXT_EDITOR_LANGUAGE_TOOL, RICH_TEXT_EDITOR_LINK_EDITOR, RICH_TEXT_EDITOR_TOKEN_CODEC, RICH_TEXT_EDITOR_TOKEN_PALETTE_IMPORTS, RICH_TEXT_EDITOR_TOOL, RICH_TEXT_EDITOR_TOOLS, RICH_TEXT_EDITOR_TOOL_BUTTONS, RICH_TEXT_EDITOR_TRIGGERS_IMPORTS, ROTATE_RIGHT_ICON, RadioComponent, RadioGroupComponent, RangeSliderComponent, RangeSliderDirective, RatingComponent, RatingDirective, RatingIconDirective, RichTextEditorAlignToolComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, RichTextEditorFloatingToolbarDirective, RichTextEditorHeadingToolComponent, RichTextEditorImageEditorComponent, RichTextEditorImageToolComponent, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, RichTextViewerComponent, SANKEY_CHART_ERROR_CODES, SCHEDULER_EDIT_SURFACE_IMPORTS, SCHEDULER_ERROR_CODES, SCHEDULER_FEATURE_HOST, SCHEDULER_IMPORTS, SCHEDULER_LABELS, SCROLLABLE_DARKEN_IMPORTS, SCROLLABLE_DRAG_IMPORTS, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SCROLLABLE_NAVIGATION_IMPORTS, SCROLLBAR_ERROR_CODES, SCROLLBAR_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SEGMENTED_BUTTON_IMPORTS, SELECTION_CARD_CONTROL_POSITIONS, SELECTION_LIST_ERROR_CODES, SELECTION_LIST_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SELECT_ERROR_CODES, SELECT_FILTER_MODES, SELECT_IMPORTS, SELECT_LABELS, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_MARK_VALUE_ATTRIBUTE, SLIDER_TOKEN, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STANDINGS_ERROR_CODES, STANDINGS_IMPORTS, STANDINGS_LABELS, STANDINGS_PICK_IMPORTS, STAR_ICON, STAT_TILE_IMPORTS, STAT_TILE_LABELS, STREAM_ALL_IMPORTS, STREAM_CONSENT_TOKEN, STREAM_DAILYMOTION_IMPORTS, STREAM_DEFAULT_COMPONENTS, STREAM_ERROR_CODES, STREAM_FACEBOOK_IMPORTS, STREAM_IMPORTS, STREAM_KICK_IMPORTS, STREAM_LABELS, STREAM_PIP_IMPORTS, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_SOOP_IMPORTS, STREAM_TIKTOK_IMPORTS, STREAM_TWITCH_IMPORTS, STREAM_USER_CONSENT_PROVIDER_TOKEN, STREAM_VIMEO_IMPORTS, STREAM_YOUTUBE_IMPORTS, STRIKETHROUGH_ICON, SUPPORT_CONTENT_STATE, SUPPORT_TRANSITION_DIRECTION, SWITCH_IMPORTS, SankeyChartComponent, SankeyChartDirective, SankeyChartMarkDirective, SchedulerActionAddAppointmentDirective, SchedulerAgendaDirective, SchedulerAgendaViewComponent, SchedulerAppointmentDragDirective, SchedulerBadgeChainCountComponent, SchedulerBadgeChainCountDirective, SchedulerBadgeColorDotComponent, SchedulerBadgeColorDotDirective, SchedulerBadgeLocationComponent, SchedulerBadgeLocationDirective, SchedulerBadgeTimeRangeComponent, SchedulerBadgeTimeRangeDirective, SchedulerBadgeTitleComponent, SchedulerBadgeTitleDirective, SchedulerComponent, SchedulerDirective, SchedulerEditAddSubAppointmentItemComponent, SchedulerEditColorComponent, SchedulerEditDeleteItemComponent, SchedulerEditDescriptionComponent, SchedulerEditLocationComponent, SchedulerEditSurfaceActionsComponent, SchedulerEditSurfaceBreadcrumbComponent, SchedulerEditSurfaceChildrenComponent, SchedulerEditSurfaceComponent, SchedulerEditSurfaceDirective, SchedulerEditSurfaceFieldsComponent, SchedulerEditSurfaceFooterComponent, SchedulerEditSurfaceHeaderComponent, SchedulerEditTimeRangeComponent, SchedulerEditTitleComponent, SchedulerMonthDirective, SchedulerMonthViewComponent, SchedulerSwipeNavigationDirective, SchedulerTimeGridDirective, SchedulerTimeGridViewComponent, ScrollableActiveChildDirective, ScrollableButtonsComponent, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksComponent, ScrollableNavigationComponent, ScrollableNavigationDirective, ScrollableSnapDirective, ScrollbarComponent, ScrollbarDirective, ScrollbarThumbDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectAllOptionComponent, SelectAllOptionDirective, SelectComponent, SelectDirective, SelectEmptyDirective, SelectErrorDirective, SelectListboxDirective, SelectLoadingDirective, SelectOptionComponent, SelectOptionDirective, SelectOptionGroupComponent, SelectOptionGroupDirective, SelectOptionTemplateDirective, SelectOptionsDirective, SelectPanelComponent, SelectSearchDirective, SelectSurfaceDirective, SelectTriggerDirective, SelectValueDirective, SelectViewportDirective, SelectVirtualOptionComponent, SelectVirtualOptionDirective, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SkeletonComponent, SkeletonItemComponent, SkeletonTextComponent, SliderComponent, SliderDirective, SliderThumbDirective, SliderThumbLabelDirective, SliderTrackDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, SplitButtonActionDirective, SplitButtonComponent, SplitButtonDirective, SplitButtonTriggerDirective, StandingsComponent, StandingsDirective, StandingsPickComponent, StandingsPickDirective, StandingsPickMarkDirective, StatTileComponent, StatTileSparklineComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TABLE_CELL_ERROR_TOOLTIP_IMPORTS, TABLE_COLUMN_CHOOSER_IMPORTS, TABLE_COLUMN_MENU_IMPORTS, TABLE_CSV_EXPORT_IMPORTS, TABLE_DRAG_SCROLL_IMPORTS, TABLE_ERROR_CODES, TABLE_FEATURE_HOST, TABLE_FILTER_IMPORTS, TABLE_GROUP_HEADERS_IMPORTS, TABLE_ICON, TABLE_IMPORTS, TABLE_INLINE_EDIT_IMPORTS, TABLE_KEYBOARD_NAV_IMPORTS, TABLE_LABELS, TABLE_PAGE_STICKY_HEADER_IMPORTS, TABLE_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_ROW_EXPANSION_IMPORTS, TABLE_ROW_ROUTER_LINK_IMPORTS, TABLE_SELECTION_IMPORTS, TABLE_SKELETON_IMPORTS, TABLE_STATE_PERSISTENCE_IMPORTS, TABLE_STICKY_COLUMNS_IMPORTS, TABLE_VIRTUAL_SCROLL_IMPORTS, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_IMPORTS, TAB_PANEL_TOKEN, TAB_SIZES, TAG_INPUT_ERROR_CODES, TAG_INPUT_IMPORTS, TEXTAREA_IMPORTS, TEXTAREA_RESIZE_MODES, TEXT_ALIGNS, TEXT_FIELD_CONTROL_INPUTS, THUMBTACK_ICON, TIKTOK_PLAYER_TOKEN, TIMELINE_IMPORTS, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TIME_RANGE_INPUT_ERROR_CODES, TIME_RANGE_INPUT_IMPORTS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLBAR_IMPORTS, TOOLBAR_ORIENTATIONS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRASH_ICON, TREE_ERROR_CODES, TREE_IMPORTS, TREE_LABELS, TREE_LEVEL_STATUSES, TREE_MARKERS, TREE_SELECTION_MODES, TRIANGLE_EXCLAMATION_ICON, TROPHY_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCardSurfaceDirective, TableCellDirective, TableCellEditDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableCsvExportDirective, TableDetailStylesComponent, TableDragScrollDirective, TableDragScrollStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableGroupHeaderRowComponent, TableGroupHeadersDirective, TableHeaderCellDirective, TableInlineEditDirective, TableInlineEditStylesComponent, TableKeyboardNavDirective, TablePageStickyHeaderDirective, TablePageStickyHeaderStylesComponent, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableRowBoxStylesComponent, TableRowDetailComponent, TableRowExpansionDirective, TableRowRouterLinkDirective, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableSkeletonDirective, TableSkeletonRowsComponent, TableStatePersistenceDirective, TableStickyColumnsDirective, TableStickyColumnsStylesComponent, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerComponent, TimePickerDirective, TimePickerRingDirective, TimePickerRingHandleDirective, TimeRangeInputComponent, TimeRangeInputDirective, TimeRangeInputFieldDirective, TimelineComponent, TimelineItemComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, ToolbarComponent, ToolbarDirective, TooltipComponent, TooltipDirective, TreeComponent, TreeDirective, TreeMarkerComponent, TreeNodeDefDirective, TreeNodeDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNDO_ICON, UNSAVED_CHANGES_LABELS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WCAG_CONTRAST_RATIOS, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, bottomSheetOverlayStrategy, bracketFitsWidth, bracketNaturalWidth, buildAnchoredRuntimePositionStrategy, canHaveChildren, canonicalKbdKey, cascaderFromQuery, centeredOverlayStrategy, clearLeavingSupportStateOnExit, colorContrast, commandPaletteLabelsForLocale, countDescendants, createAlertDialogOpener, createAnchoredPanelController, createCardMask, createCommandPaletteOpener, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createFixedLengthRangeStrategy, createGridAdapter, createIbanMask, createNormalizedBracketMatch, createNotificationPromiseFn, createNotificationRef, createOverlayOpener, createOverlaySingleSlot, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createSchedulerRegistry, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableRowsState, createTableStateStorage, createV2DropzoneUpload, createWeekRangeStrategy, dateBounds, dateRangeBounds, dateRangeOrder, dateTimeBounds, dateTimeRangeBounds, dateTimeRangeOrder, defaultCompareWith$1 as defaultCompareWith, defaultDropzoneRejectionMessage, defaultSankeyChartLinkKeyHint, defineOverlay, defineQueryParamOverlay, describeBracketSlot, deserializeGridLayout, deserializeTableState, detectKbdPlatform, dialogOverlayStrategy, disposeDropzoneEntry, doubleEliminationBracketLayout, dropzoneFiles, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, filterValues, findNextRelevantHtmlElement, focusFirstInvalidField, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateRoundTypeFromEthleteRoundType, generateTournamentModeFromEthleteRounds, getClosestOverlay, getColorContrastRatio, getOriginCoordinatesAndDimensions, hexColor, hitsInteractiveElement, iconRegistryKey, injectAlertDialogLabels, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectAvatarLabels, injectBannerLabels, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBracketLabels, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChartLabels, injectChipLabels, injectColorInputLabels, injectCommandPalette, injectCommandPaletteLabels, injectCommandPaletteRegistry, injectCopyButtonLabels, injectDateFormat, injectDateLocale, injectDateTimeFormat, injectDateTimeLabels, injectDateTimeZone, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldDefaults, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectKbdLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectMatchLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectProgressStepLabels, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSchedulerEditSurface, injectSchedulerEditSurfaceOpener, injectSchedulerFeatureHost, injectSchedulerLabels, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStandingsLabels, injectStatTileLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamPlayerSlot, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableCsvExport, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, injectTreeLabels, injectUnsavedChangesLabels, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isRestorableTableState, isTargetInsideOverlayTree, isTouchEvent, kbdKeyLabel, kbdKeyName, lastDaysPreset, lastMonthPreset, lastWeekPreset, leftSheetOverlayStrategy, legacyQueryErrorSource, mapGridLayout, matchCountryByDialCode, matchParticipantDisplayName, matchedDialPrefix, matchesKbdChord, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, mergeTableCsvExportOptions, mirroredDoubleEliminationBracketLayout, mirroredSingleEliminationBracketLayout, missingStreamSourceError, mountNavTabLinkStyles, nextDaysPreset, normalizeEthleteBracketMatch, normalizeEthleteGroupRanking, normalizeEthleteMatch, normalizeEthleteMatchStatus, normalizeEthleteMedia, normalizeEthleteParticipant, normalizeEthletePlacement, normalizePictureSizes, normalizePictureSource, numberInputStepMultiplierFrom, overlayResult, paginate, parseKbdKeys, phoneCountryFlag, phoneCountryName, provideAlertDialogLabels, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideAvatarLabels, provideBannerLabels, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBracketLabels, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChartLabels, provideChipLabels, provideColorInputLabels, provideCommandPaletteLabels, provideCommandPaletteRegistry, provideCopyButtonLabels, provideDateFormat, provideDateLocale, provideDateTimeFormat, provideDateTimeLabels, provideDateTimeZone, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldDefaults, provideFormFieldLabels, provideFormSupport, provideFormWarningMessageResolver, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideKbdLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideMatchLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideProgressStepLabels, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorAutoformat, provideRichTextEditorBlockquoteTool, provideRichTextEditorCodeBlockTool, provideRichTextEditorDefaultTools, provideRichTextEditorFloatingToolbar, provideRichTextEditorHeadingTool, provideRichTextEditorImageTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorLinkEditor, provideRichTextEditorLinkTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTool, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSchedulerEditSurface, provideSchedulerLabels, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStandingsLabels, provideStatTileLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPip, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, provideTreeLabels, provideUnsavedChangesAlertDialog, provideUnsavedChangesLabels, queryButtonSourceFromV2Query, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, quickFilterRows, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerCommands, registerSingleton, requiredLanguages, resolveBracketLayout, resolveClosestOverlay, resolveFilterOverlaySubmitButton, resolveNormalizedMatchSideState, resolveNotificationStatusIcon, resolveOverlayHasBackdrop, resolveTableCsvRows, rgbColor, richTextEditorToolLabel, rightSheetOverlayStrategy, schedulerFeatureConfig, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, singleEliminationBracketLayout, sortRows, startOfCalendarUnit, stripTrunkZero, supportPresentationIncludesState, swissBracketLayout, tableCsvRowsFromPages, tableFeatureConfig, tableRowsFromQuery, tableRowsFromV2Query, tableToCsv, thisMonthPreset, thisWeekPreset, thisYearPreset, timeBounds, timeRangeBounds, timeRangeOrder, toFieldWarnings, toGridPosition, toNotificationContent, toPictureDimension, todayPreset, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, warn, wireFormSupport, withPictureBaseUrl, yesterdayPreset };
|
|
77119
|
+
export { ACCESSIBLE_NAME_INPUTS, ACCORDION_ERROR_CODES, ACCORDION_GROUP_TOKEN, ACCORDION_IMPORTS, ACCORDION_TOKEN, ALERT_DIALOG_LABELS, ALIGN_CENTER_ICON, ALIGN_JUSTIFY_ICON, ALIGN_LEFT_ICON, ALIGN_RIGHT_ICON, ARROWS_LEFT_RIGHT_ICON, ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, ARROW_UP_ICON, AVATAR_IMPORTS, AVATAR_LABELS, AVATAR_SHAPES, AVATAR_SIZES, AccessibleNameControlDirective, AccordionComponent, AccordionContentDirective, AccordionDirective, AccordionGroupComponent, AccordionGroupDirective, AccordionHintDirective, AccordionLabelDirective, AccordionPanelDirective, AccordionTriggerDirective, AvatarComponent, AvatarGroupComponent, BADGE_ICON_ALIGNMENTS, BADGE_IMPORTS, BADGE_SIZES, BADGE_VARIANTS, BANNER_IMPORTS, BANNER_LABELS, BANNER_TYPES, BOLD_ICON, BRACKET_CARD_CONTEXT, BRACKET_DEFAULTS, BRACKET_DEFAULT_CARDS, BRACKET_DENSITY, BRACKET_DENSITY_PRESETS, BRACKET_IMPORTS, BRACKET_LABELS, BRACKET_PARTICIPANTS_IMPORTS, BRACKET_PICK_CARD_IMPORTS, BRACKET_PICK_CARD_NOTE_TONE, BRACKET_ROUNDS_LIST_IMPORTS, BRACKET_ROUND_HEADER_ALIGN, BRACKET_SKELETON_IMPORTS, BREADCRUMB_COLLAPSE_IMPORTS, BREADCRUMB_COLLAPSE_TOKEN, BREADCRUMB_ERROR_CODES, BREADCRUMB_IMPORTS, BREADCRUMB_LABELS, BREADCRUMB_SEGMENT_TOKEN, BREADCRUMB_SEO_IMPORTS, BREADCRUMB_TOKEN, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BadgeComponent, BannerComponent, BarChartComponent, BarChartDirective, BarChartPlotDirective, BracketComponent, BracketDefaultContinueComponent, BracketDefaultFinalMatchComponent, BracketDefaultMatchComponent, BracketDefaultRoundHeaderComponent, BracketParticipantsComponent, BracketPickCardComponent, BracketRoundsListComponent, BracketSkeletonComponent, BracketSkeletonContinueComponent, BracketSkeletonFinalMatchComponent, BracketSkeletonMatchComponent, BracketSkeletonRoundHeaderComponent, BrandLoaderComponent, BreadcrumbCollapseDirective, BreadcrumbComponent, BreadcrumbDirective, BreadcrumbItemDirective, BreadcrumbItemTemplateDirective, BreadcrumbOutletComponent, BreadcrumbOverflowComponent, BreadcrumbSegmentDirective, BreadcrumbSeoDirective, BreadcrumbSeparatorDirective, ButtonColorDirective, ButtonComponent, ButtonDirective, ButtonStylesDirective, CALENDAR_ERROR_CODES, CALENDAR_ICON, CALENDAR_IMPORTS, CALENDAR_LABELS, CARD_IMPORTS, CARD_VARIANTS, CAROUSEL_AUTOPLAY_TOKEN, CAROUSEL_ERROR_CODES, CAROUSEL_IMPORTS, CAROUSEL_LABELS, CAROUSEL_SLIDE_ALIGNMENTS, CAROUSEL_TOKEN, CAROUSEL_TRANSITIONS, CAROUSEL_TRANSITION_DRIVERS, CASCADER_ERROR_CODES, CASCADER_IMPORTS, CASCADER_LABELS, CASCADER_SELECTABLE_LEVELS, CHART_ERROR_CODES, CHART_IMPORTS, CHART_LABELS, CHART_PLOT_HOST, CHECKBOX_GROUP_IMPORTS, CHECKBOX_IMPORTS, CHECKBOX_OPTION_VARIANTS, CHECK_ICON, CHEVRON_ICON, CHIP_ERROR_CODES, CHIP_IMPORTS, CHIP_LABELS, CHIP_REMOVE_FOCUS_FALLBACK, CHIP_REMOVE_TAB_STOP, CHOICE_FIELD_IMPORTS, CHOICE_FIELD_VARIANTS, CIRCLE_CHECK_ICON, CIRCLE_INFO_ICON, CLIPBOARD_CHECK_ICON, CLOCK_ICON, CODE_BLOCK_ICON, CODE_ICON, COLOR_INPUT_ERROR_CODES, COLOR_INPUT_IMPORTS, COLOR_INPUT_LABELS, COLOR_INPUT_TOKEN, COLOR_NOTATIONS, COLOR_NOTATION_ORDER, COMMAND_PALETTE_ERROR_CODES, COMMAND_PALETTE_IMPORTS, COMMAND_PALETTE_LABELS, COMMAND_PALETTE_OVERLAY, COMMAND_PALETTE_REGISTRY, COMMAND_PALETTE_TOKEN, COMPONENTS_VERSION, COPY_BUTTON_IMPORTS, COPY_BUTTON_LABELS, CalendarCellDirective, CalendarComponent, CalendarDirective, CalendarGridDirective, CalendarHeaderDirective, CardComponent, CarouselAutoplayDirective, CarouselComponent, CarouselDirective, CarouselItemDirective, CarouselNextDirective, CarouselPlayToggleDirective, CarouselPreviousDirective, CarouselSlideDirective, CascaderColumnDirective, CascaderComponent, CascaderDirective, CascaderNodeDirective, CascaderPanelComponent, CascaderSearchDirective, CascaderSearchOptionDirective, CascaderSurfaceDirective, CascaderTriggerDirective, ChartPlotDirective, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxGroupSelectAllComponent, CheckboxOptionComponent, ChipComponent, ChipDirective, ChipRemoveDirective, ChoiceFieldComponent, ColorInputComponent, ColorInputDirective, ColorPickerAreaDirective, ColorPickerChannelDirective, ColorPickerPanelComponent, ColorPickerSurfaceDirective, ColorPickerTriggerDirective, CommandPaletteComponent, CommandPaletteDirective, CommandPaletteItemComponent, CommandPaletteSearchDirective, CommandPaletteShortcutDirective, ControlSuffixDirective, CopyButtonDirective, CounterComponent, DAILYMOTION_PLAYER_TOKEN, DATE_FORMAT, DATE_INPUT_ERROR_CODES, DATE_INPUT_IMPORTS, DATE_LOCALE, DATE_PICKER_HOST, DATE_RANGE_INPUT_ERROR_CODES, DATE_RANGE_INPUT_IMPORTS, DATE_TIME_FORMAT, DATE_TIME_INPUT_ERROR_CODES, DATE_TIME_INPUT_IMPORTS, DATE_TIME_LABELS, DATE_TIME_RANGE_INPUT_ERROR_CODES, DATE_TIME_RANGE_INPUT_IMPORTS, DEFAULT_ALERT_DIALOG_LABELS, DEFAULT_AVATAR_LABELS, DEFAULT_BANNER_LABELS, DEFAULT_BRACKET_LABELS, DEFAULT_BREADCRUMB_LABELS, DEFAULT_BREAKPOINTS, DEFAULT_CALENDAR_LABELS, DEFAULT_CALENDAR_RANGE_STRATEGY, DEFAULT_CAROUSEL_LABELS, DEFAULT_CASCADER_LABELS, DEFAULT_CHART_LABELS, DEFAULT_CHIP_LABELS, DEFAULT_COLOR_INPUT_LABELS, DEFAULT_COMMAND_PALETTE_LABELS, DEFAULT_COPY_BUTTON_LABELS, DEFAULT_DATE_TIME_LABELS, DEFAULT_DROPZONE_LABELS, DEFAULT_DROPZONE_MAX_PREVIEW_FILE_SIZE, DEFAULT_FILTER_OVERLAY_LABELS, DEFAULT_FORM_FIELD_DEFAULTS, DEFAULT_FORM_FIELD_LABELS, DEFAULT_GRID_LABELS, DEFAULT_ICON_VARIANT, DEFAULT_INPUT_LABELS, DEFAULT_KBD_LABELS, DEFAULT_LOADER_LABELS, DEFAULT_MATCH_CARD_START_TIME_FORMAT, DEFAULT_MATCH_LABELS, DEFAULT_NOTIFICATION_LABELS, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_NOTIFICATION_STATUS_ICONS, DEFAULT_PAGINATION_LABELS, DEFAULT_PHONE_INPUT_LABELS, DEFAULT_PROGRESS_STEP_LABELS, DEFAULT_QUERY_ERROR_LABELS, DEFAULT_RICH_TEXT_EDITOR_LABELS, DEFAULT_RICH_TEXT_EDITOR_TOOLS, DEFAULT_SCHEDULER_LABELS, DEFAULT_SELECT_LABELS, DEFAULT_SLIDER_LABELS, DEFAULT_STANDINGS_LABELS, DEFAULT_STAT_TILE_LABELS, DEFAULT_STREAM_LABELS, DEFAULT_STREAM_PLAYER_STATE, DEFAULT_TABLE_LABELS, DEFAULT_TIME_PICKER_LABELS, DEFAULT_TREE_LABELS, DEFAULT_UNSAVED_CHANGES_LABELS, DESCRIPTION_IMPORTS, DESCRIPTION_LIST_IMPORTS, DESCRIPTION_LIST_VARIANTS, DIVIDER_IMPORTS, DROPZONE_ENTRY_STATUSES, DROPZONE_ERROR_CODES, DROPZONE_FILES_ERROR_KIND, DROPZONE_FILE_CONSTRAINTS, DROPZONE_FILE_REJECTION_REASONS, DROPZONE_IMPORTS, DROPZONE_LABELS, DURATION_INPUT_ERROR_CODES, DURATION_INPUT_IMPORTS, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DateInputComponent, DateInputDirective, DateInputFieldDirective, DatePickerPanelComponent, DatePickerSurfaceDirective, DatePickerTriggerDirective, DateRangeInputComponent, DateRangeInputDirective, DateRangeInputFieldDirective, DateTimeInputComponent, DateTimeInputDirective, DateTimeInputFieldDirective, DateTimeRangeInputComponent, DateTimeRangeInputDirective, DateTimeRangeInputFieldDirective, DescriptionComponent, DescriptionListComponent, DividerComponent, DropzoneComponent, DropzoneDirective, DurationInputComponent, DurationInputDirective, DurationInputFieldDirective, ELLIPSIS_ICON, ELLIPSIS_VERTICAL_ICON, EMPTY_STATE_IMPORTS, ET_BUILT_IN_ICON_NAMES, EYEDROPPER_ICON, EYE_ICON, EYE_SLASH_ICON, EmptyStateComponent, FACEBOOK_PLAYER_TOKEN, FIELD_WARNINGS, FIELD_WARNING_KIND, FILE_ICON, FILTER_ICON, FILTER_OVERLAY_ERROR_CODES, FILTER_OVERLAY_IMPORTS, FILTER_OVERLAY_LABELS, FILTER_OVERLAY_TOKEN, FLOATING_ACTION_ERROR_CODES, FLOATING_ACTION_IMPORTS, FLOATING_ACTION_STATES, FLOATING_ACTION_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_ERROR_MESSAGE_RESOLVER, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABELS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FORM_IMPORTS, FORM_WARNING_MESSAGE_RESOLVER, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FilterOverlayResetDirective, FilterOverlaySubmitDirective, FloatingActionAnchorDirective, FloatingActionDirective, FloatingActionScopeDirective, FloatingActionTopDirective, FloatingActionTriggerDirective, FocusRingDirective, FormDirective, FormErrorComponent, FormFieldBarrierDirective, FormFieldComponent, FormFieldDirective, FormWarningComponent, GERMAN_ALERT_DIALOG_LABELS, GERMAN_AVATAR_LABELS, GERMAN_BANNER_LABELS, GERMAN_BRACKET_LABELS, GERMAN_BREADCRUMB_LABELS, GERMAN_CALENDAR_LABELS, GERMAN_CAROUSEL_LABELS, GERMAN_CASCADER_LABELS, GERMAN_CHART_LABELS, GERMAN_CHIP_LABELS, GERMAN_COLOR_INPUT_LABELS, GERMAN_COMMAND_PALETTE_LABELS, GERMAN_COPY_BUTTON_LABELS, GERMAN_DATE_TIME_LABELS, GERMAN_DROPZONE_LABELS, GERMAN_FILTER_OVERLAY_LABELS, GERMAN_FORM_FIELD_LABELS, GERMAN_GRID_LABELS, GERMAN_INPUT_LABELS, GERMAN_KBD_LABELS, GERMAN_LOADER_LABELS, GERMAN_MATCH_LABELS, GERMAN_NOTIFICATION_LABELS, GERMAN_PAGINATION_LABELS, GERMAN_PHONE_INPUT_LABELS, GERMAN_PROGRESS_STEP_LABELS, GERMAN_QUERY_ERROR_LABELS, GERMAN_RICH_TEXT_EDITOR_LABELS, GERMAN_SCHEDULER_LABELS, GERMAN_SELECT_LABELS, GERMAN_SLIDER_LABELS, GERMAN_STANDINGS_LABELS, GERMAN_STAT_TILE_LABELS, GERMAN_STREAM_LABELS, GERMAN_TABLE_LABELS, GERMAN_TIME_PICKER_LABELS, GERMAN_TREE_LABELS, GERMAN_UNSAVED_CHANGES_LABELS, GRID_2X2_ICON, GRID_DEBUG_IMPORTS, GRID_ERROR_CODES, GRID_IMPORTS, GRID_LABELS, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemToolbarComponent, GridResizeDirective, HEADING_1_ICON, HEADING_2_ICON, HEADING_3_ICON, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, ICON_OVERRIDES_TOKEN, IMAGE_ICON, INHERIT_COLOR, INITIAL_SUPPORT_PRESENTATION_STATE, INPUT_IMPORTS, INPUT_LABELS, INPUT_MASK_HOST, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, INTERACTIVE_TAGS$1 as INTERACTIVE_TAGS, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputMaskDirective, InputPrefixDirective, InputSuffixDirective, KBD_IMPORTS, KBD_LABELS, KBD_PLATFORM, KICK_PLAYER_TOKEN, KbdComponent, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINE_CHART_ERROR_CODES, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOADER_IMPORTS, LOADER_LABELS, LOCATION_ICON, LOCK_ICON, LabelDirective, LineChartComponent, LineChartDirective, LineChartSliceDirective, MASKED_INPUT_ERROR_CODES, MASKED_INPUT_IMPORTS, MASK_VALUE_MODES, MASONRY_ERROR_CODES, MASONRY_IMPORTS, MASONRY_TOKEN, MATCH_CARD_IMPORTS, MATCH_CARD_SIZES, MATCH_CARD_TOKEN, MATCH_ERROR_CODES, MATCH_LABELS, MATCH_PARTICIPANT_IMPORTS, MENU_ERROR_CODES, MENU_IMPORTS, MENU_ITEM_VARIANTS, MENU_SEARCH_IMPORTS, MENU_SELECTION_GROUP_MULTIPLE, MENU_SELECTION_GROUP_TOKEN, MENU_SELECTION_ITEM_KIND, MINUS_ICON, MULTI_LANGUAGE_RICH_TEXT_EDITOR_ERROR_CODES, MULTI_LANGUAGE_RICH_TEXT_EDITOR_IMPORTS, MasonryDirective, MasonryItemDirective, MatchCardComponent, MatchCardDirective, MatchCardGameScoresDirective, MatchCardMetaDirective, MatchCardScoreDirective, MatchParticipantComponent, MatchScoreComponent, MenuCheckboxGroupComponent, MenuCheckboxItemComponent, MenuComponent, MenuContextTriggerDirective, MenuDirective, MenuGroupLabelComponent, MenuItemComponent, MenuItemDirective, MenuItemShortcutComponent, MenuItemSubmenuIconComponent, MenuPanelDirective, MenuRadioGroupComponent, MenuRadioItemComponent, MenuSearchDirective, MenuSelectionGroupDirective, MenuSelectionItemDirective, MenuSeparatorComponent, MenuSurfaceDirective, MenuTriggerDirective, MultiLanguageRichTextEditorComponent, MultiLanguageRichTextEditorDirective, MultiLanguageRichTextEditorLanguageToolComponent, NAV_TABS_TOKEN, NAV_TAB_IMPORTS, NOTIFICATION_ACTION_SLOTS, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_LABELS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STACK_OVERLAY_LAYER, NOTIFICATION_STATUS, NO_STREAM_PLAYER_CAPABILITIES, NUMBER_INPUT_IMPORTS, NavTabLinkComponent, NavTabLinkDirective, NavTabLinkStylesComponent, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, NotificationSwipeToDismissDirective, NumberInputComponent, NumberInputDirective, OTP_INPUT_IMPORTS, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HAS_BACKDROP, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_NAV_TAB_IMPORTS, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OtpInputComponent, OtpInputDirective, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayNavTabLinkComponent, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PAGE_SIZE_SELECT_IMPORTS, PAGINATION_IMPORTS, PAGINATION_LABELS, PAGINATION_SIZES, PARAGRAPH_ICON, PASSWORD_INPUT_IMPORTS, PAUSE_ICON, PENCIL_ICON, PHONE_COUNTRIES, PHONE_INPUT_ERROR_CODES, PHONE_INPUT_IMPORTS, PHONE_INPUT_LABELS, PICTURE_IMPORTS, PICTURE_STATES, PIE_CHART_ERROR_CODES, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLAY_ICON, PLUS_ICON, PROGRESS_STEPS_IMPORTS, PROGRESS_STEPS_ORIENTATIONS, PROGRESS_STEP_LABELS, PROGRESS_STEP_STATES, PageSizeSelectComponent, PagedQueryTriggerDirective, PaginationComponent, PaginationDirective, PaginationSeoDirective, PasswordInputComponent, PasswordInputDirective, PhoneInputComponent, PhoneInputDirective, PhoneInputFieldDirective, PhoneInputFlagDirective, PictureComponent, PictureErrorDirective, PicturePlaceholderDirective, PieChartComponent, PieChartDirective, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, ProgressStepComponent, ProgressStepsComponent, QUERY_ERROR_ERROR_CODES, QUERY_ERROR_IMPORTS, QUERY_ERROR_LABELS, QUERY_ERROR_TOKEN, QUOTE_ICON, QueryButtonDirective, QueryErrorActionsDirective, QueryErrorComponent, QueryErrorDirective, QueryErrorTitleDirective, QueryParamOverlayLinkDirective, RADIO_GROUP_IMPORTS, RADIO_VARIANTS, RATING_ERROR_CODES, RATING_IMPORTS, REDO_ICON, RICH_TEXT_EDITOR_FLOATING_TOOLBAR, RICH_TEXT_EDITOR_HEADING_OPTIONS, RICH_TEXT_EDITOR_IMPORTS, RICH_TEXT_EDITOR_INLINE_TOOLS, RICH_TEXT_EDITOR_LABELS, RICH_TEXT_EDITOR_LANGUAGE_TOOL, RICH_TEXT_EDITOR_LINK_EDITOR, RICH_TEXT_EDITOR_TOKEN_CODEC, RICH_TEXT_EDITOR_TOKEN_PALETTE_IMPORTS, RICH_TEXT_EDITOR_TOOL, RICH_TEXT_EDITOR_TOOLS, RICH_TEXT_EDITOR_TOOL_BUTTONS, RICH_TEXT_EDITOR_TRIGGERS_IMPORTS, ROTATE_RIGHT_ICON, RadioComponent, RadioGroupComponent, RangeSliderComponent, RangeSliderDirective, RatingComponent, RatingDirective, RatingIconDirective, RichTextEditorAlignToolComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, RichTextEditorFloatingToolbarDirective, RichTextEditorHeadingToolComponent, RichTextEditorImageEditorComponent, RichTextEditorImageToolComponent, RichTextEditorLinkEditorComponent, RichTextEditorLinkEditorDirective, RichTextEditorTableToolComponent, RichTextEditorTokenPaletteComponent, RichTextEditorTokenPopupComponent, RichTextEditorTriggersDirective, RichTextViewerComponent, SANKEY_CHART_ERROR_CODES, SCHEDULER_EDIT_SURFACE_IMPORTS, SCHEDULER_ERROR_CODES, SCHEDULER_FEATURE_HOST, SCHEDULER_IMPORTS, SCHEDULER_LABELS, SCROLLABLE_DARKEN_IMPORTS, SCROLLABLE_DRAG_IMPORTS, SCROLLABLE_ERROR_CODES, SCROLLABLE_IMPORTS, SCROLLABLE_NAVIGATION_IMPORTS, SCROLLBAR_ERROR_CODES, SCROLLBAR_IMPORTS, SEGMENTED_BUTTON_GROUP_VARIANTS, SEGMENTED_BUTTON_IMPORTS, SELECTION_CARD_CONTROL_POSITIONS, SELECTION_LIST_ERROR_CODES, SELECTION_LIST_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SELECT_ERROR_CODES, SELECT_FILTER_MODES, SELECT_IMPORTS, SELECT_LABELS, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SKELETON_IMPORTS, SLIDER_ERROR_CODES, SLIDER_IMPORTS, SLIDER_LABELS, SLIDER_MARK_VALUE_ATTRIBUTE, SLIDER_TOKEN, SOOP_PLAYER_TOKEN, SPLIT_BUTTON_ERROR_CODES, STANDINGS_ERROR_CODES, STANDINGS_IMPORTS, STANDINGS_LABELS, STANDINGS_PICK_IMPORTS, STAR_ICON, STAT_TILE_IMPORTS, STAT_TILE_LABELS, STREAM_ALL_IMPORTS, STREAM_CONSENT_TOKEN, STREAM_DAILYMOTION_IMPORTS, STREAM_DEFAULT_COMPONENTS, STREAM_ERROR_CODES, STREAM_FACEBOOK_IMPORTS, STREAM_IMPORTS, STREAM_KICK_IMPORTS, STREAM_LABELS, STREAM_PIP_IMPORTS, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_SOOP_IMPORTS, STREAM_TIKTOK_IMPORTS, STREAM_TWITCH_IMPORTS, STREAM_USER_CONSENT_PROVIDER_TOKEN, STREAM_VIMEO_IMPORTS, STREAM_YOUTUBE_IMPORTS, STRIKETHROUGH_ICON, SUPPORT_CONTENT_STATE, SUPPORT_TRANSITION_DIRECTION, SWITCH_IMPORTS, SankeyChartComponent, SankeyChartDirective, SankeyChartMarkDirective, SchedulerActionAddAppointmentDirective, SchedulerAgendaDirective, SchedulerAgendaViewComponent, SchedulerAppointmentDragDirective, SchedulerBadgeChainCountComponent, SchedulerBadgeChainCountDirective, SchedulerBadgeColorDotComponent, SchedulerBadgeColorDotDirective, SchedulerBadgeLocationComponent, SchedulerBadgeLocationDirective, SchedulerBadgeTimeRangeComponent, SchedulerBadgeTimeRangeDirective, SchedulerBadgeTitleComponent, SchedulerBadgeTitleDirective, SchedulerComponent, SchedulerDirective, SchedulerEditAddSubAppointmentItemComponent, SchedulerEditColorComponent, SchedulerEditDeleteItemComponent, SchedulerEditDescriptionComponent, SchedulerEditLocationComponent, SchedulerEditSurfaceActionsComponent, SchedulerEditSurfaceBreadcrumbComponent, SchedulerEditSurfaceChildrenComponent, SchedulerEditSurfaceComponent, SchedulerEditSurfaceDirective, SchedulerEditSurfaceFieldsComponent, SchedulerEditSurfaceFooterComponent, SchedulerEditSurfaceHeaderComponent, SchedulerEditTimeRangeComponent, SchedulerEditTitleComponent, SchedulerMonthDirective, SchedulerMonthViewComponent, SchedulerSwipeNavigationDirective, SchedulerTimeGridDirective, SchedulerTimeGridViewComponent, ScrollableActiveChildDirective, ScrollableButtonsComponent, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksComponent, ScrollableNavigationComponent, ScrollableNavigationDirective, ScrollableSnapDirective, ScrollbarComponent, ScrollbarDirective, ScrollbarThumbDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectAllOptionComponent, SelectAllOptionDirective, SelectComponent, SelectDirective, SelectEmptyDirective, SelectErrorDirective, SelectListboxDirective, SelectLoadingDirective, SelectOptionComponent, SelectOptionDirective, SelectOptionGroupComponent, SelectOptionGroupDirective, SelectOptionTemplateDirective, SelectOptionsDirective, SelectPanelComponent, SelectSearchDirective, SelectSurfaceDirective, SelectTriggerDirective, SelectValueDirective, SelectViewportDirective, SelectVirtualOptionComponent, SelectVirtualOptionDirective, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SkeletonComponent, SkeletonItemComponent, SkeletonTextComponent, SliderComponent, SliderDirective, SliderThumbDirective, SliderThumbLabelDirective, SliderTrackDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, SplitButtonActionDirective, SplitButtonComponent, SplitButtonDirective, SplitButtonTriggerDirective, StandingsComponent, StandingsDirective, StandingsPickComponent, StandingsPickDirective, StandingsPickMarkDirective, StatTileComponent, StatTileSparklineComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TABLE_CELL_ERROR_TOOLTIP_IMPORTS, TABLE_COLUMN_CHOOSER_IMPORTS, TABLE_COLUMN_MENU_IMPORTS, TABLE_CSV_EXPORT_IMPORTS, TABLE_DRAG_SCROLL_IMPORTS, TABLE_ERROR_CODES, TABLE_FEATURE_HOST, TABLE_FILTER_IMPORTS, TABLE_GROUP_HEADERS_IMPORTS, TABLE_ICON, TABLE_IMPORTS, TABLE_INLINE_EDIT_IMPORTS, TABLE_KEYBOARD_NAV_IMPORTS, TABLE_LABELS, TABLE_PAGE_STICKY_HEADER_IMPORTS, TABLE_REORDER_IMPORTS, TABLE_RESIZE_IMPORTS, TABLE_ROW_EXPANSION_IMPORTS, TABLE_ROW_ROUTER_LINK_IMPORTS, TABLE_SELECTION_IMPORTS, TABLE_SKELETON_IMPORTS, TABLE_STATE_PERSISTENCE_IMPORTS, TABLE_STICKY_COLUMNS_IMPORTS, TABLE_VIRTUAL_SCROLL_IMPORTS, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_IMPORTS, TAB_PANEL_TOKEN, TAB_SIZES, TAG_INPUT_ERROR_CODES, TAG_INPUT_IMPORTS, TEXTAREA_IMPORTS, TEXTAREA_RESIZE_MODES, TEXT_ALIGNS, TEXT_FIELD_CONTROL_INPUTS, THUMBTACK_ICON, TIKTOK_PLAYER_TOKEN, TIMELINE_IMPORTS, TIMES_ICON, TIME_FORMAT, TIME_INPUT_ERROR_CODES, TIME_INPUT_IMPORTS, TIME_PICKER_ERROR_CODES, TIME_PICKER_IMPORTS, TIME_PICKER_LABELS, TIME_RANGE_INPUT_ERROR_CODES, TIME_RANGE_INPUT_IMPORTS, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLBAR_IMPORTS, TOOLBAR_ORIENTATIONS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRASH_ICON, TREE_ERROR_CODES, TREE_IMPORTS, TREE_LABELS, TREE_LEVEL_STATUSES, TREE_MARKERS, TREE_SELECTION_MODES, TRIANGLE_EXCLAMATION_ICON, TROPHY_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TableCardSurfaceDirective, TableCellDirective, TableCellEditDirective, TableCellErrorMarkComponent, TableCellErrorTooltipDirective, TableCellSkeletonDirective, TableColumnChooserComponent, TableColumnMenuDirective, TableColumnMenuTriggerComponent, TableComponent, TableCsvExportDirective, TableDetailStylesComponent, TableDragScrollDirective, TableDragScrollStylesComponent, TableExpanderCellComponent, TableFilterOptionDirective, TableFilterTriggerComponent, TableFiltersDirective, TableFooterCellDirective, TableFooterDirective, TableGroupHeaderRowComponent, TableGroupHeadersDirective, TableHeaderCellDirective, TableInlineEditDirective, TableInlineEditStylesComponent, TableKeyboardNavDirective, TablePageStickyHeaderDirective, TablePageStickyHeaderStylesComponent, TableReorderDirective, TableReorderOverlayComponent, TableResizeDirective, TableResizeGripComponent, TableRowBoxStylesComponent, TableRowDetailComponent, TableRowExpansionDirective, TableRowRouterLinkDirective, TableSelectAllCellComponent, TableSelectCellComponent, TableSelectionDirective, TableSkeletonDirective, TableSkeletonRowsComponent, TableStatePersistenceDirective, TableStickyColumnsDirective, TableStickyColumnsStylesComponent, TableVirtualScrollDirective, TableVirtualScrollStylesComponent, TagInputComponent, TagInputDirective, TagInputFieldDirective, TextButtonComponent, TextFieldControlDirective, TextareaComponent, TextareaDirective, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, TimeInputComponent, TimeInputDirective, TimeInputFieldDirective, TimePickerComponent, TimePickerDirective, TimePickerRingDirective, TimePickerRingHandleDirective, TimeRangeInputComponent, TimeRangeInputDirective, TimeRangeInputFieldDirective, TimelineComponent, TimelineItemComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, ToolbarComponent, ToolbarDirective, TooltipComponent, TooltipDirective, TreeComponent, TreeDirective, TreeMarkerComponent, TreeNodeDefDirective, TreeNodeDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, UNDERLINE_ICON, UNDO_ICON, UNSAVED_CHANGES_LABELS, UPLOAD_ICON, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WCAG_CONTRAST_RATIOS, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, alertDialogLabelsForLocale, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, avatarLabelsForLocale, bannerLabelsForLocale, bottomSheetOverlayStrategy, bracketFitsWidth, bracketLabelsForLocale, bracketNaturalWidth, breadcrumbLabelsForLocale, buildAnchoredRuntimePositionStrategy, calendarLabelsForLocale, canHaveChildren, canonicalKbdKey, carouselLabelsForLocale, cascaderFromQuery, cascaderLabelsForLocale, centeredOverlayStrategy, chartLabelsForLocale, chipLabelsForLocale, clearLeavingSupportStateOnExit, colorContrast, colorInputLabelsForLocale, commandPaletteLabelsForLocale, copyButtonLabelsForLocale, countDescendants, createAlertDialogOpener, createAnchoredPanelController, createCardMask, createCommandPaletteOpener, createCurrencyMask, createDefaultDropzoneArgs, createDropzoneUpload, createExistingDropzoneEntry, createFileDropzoneEntry, createFixedLengthRangeStrategy, createGridAdapter, createIbanMask, createNormalizedBracketMatch, createNotificationPromiseFn, createNotificationRef, createOverlayOpener, createOverlaySingleSlot, createOverlayStrategyController, createOverlayUnsavedChangesGuard, createPipChromeAnimations, createPipChromeState, createRichTextEditorTrigger, createRichTextEditorTriggerWithQuery, createSchedulerRegistry, createStreamConfig, createStreamPlayerSlot, createTableRowsSource, createTableRowsState, createTableStateStorage, createV2DropzoneUpload, createWeekRangeStrategy, dateBounds, dateRangeBounds, dateRangeOrder, dateTimeBounds, dateTimeLabelsForLocale, dateTimeRangeBounds, dateTimeRangeOrder, defaultCompareWith$1 as defaultCompareWith, defaultDropzoneRejectionMessage, defaultSankeyChartLinkKeyHint, defineOverlay, defineQueryParamOverlay, describeBracketSlot, deserializeGridLayout, deserializeTableState, detectKbdPlatform, dialogOverlayStrategy, disposeDropzoneEntry, doubleEliminationBracketLayout, dropzoneFiles, dropzoneLabelsForLocale, enableDragToDismiss, extractFirstImageUrl, filterOverlayLabelsForLocale, filterOverlayPreviewFromQuery, filterRows, filterValues, findNextRelevantHtmlElement, focusFirstInvalidField, formFieldLabelsForLocale, formatFileSize, fromGridPosition, fullScreenDialogOverlayStrategy, generateBracketDataForEthlete, generateRoundTypeFromEthleteRoundType, generateTournamentModeFromEthleteRounds, getClosestOverlay, getColorContrastRatio, getOriginCoordinatesAndDimensions, gridLabelsForLocale, hexColor, hitsInteractiveElement, iconRegistryKey, injectAlertDialogLabels, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectAvatarLabels, injectBannerLabels, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectBracketConfig, injectBracketLabels, injectBreadcrumbLabels, injectBreadcrumbManager, injectCalendarLabels, injectCarouselLabels, injectCascaderLabels, injectChartLabels, injectChipLabels, injectColorInputLabels, injectCommandPalette, injectCommandPaletteLabels, injectCommandPaletteRegistry, injectCopyButtonLabels, injectDateFormat, injectDateLocale, injectDateLocaleSignal, injectDateTimeFormat, injectDateTimeLabels, injectDateTimeZone, injectDialogStrategy, injectDialogStrategyDefaults, injectDropzoneLabels, injectFilterOverlay, injectFilterOverlayLabels, injectFormFieldDefaults, injectFormFieldLabels, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectGridLabels, injectInputLabels, injectKbdLabels, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectLoaderLabels, injectMatchLabels, injectNotificationLabels, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectOverlaySurfaceContext, injectPaginationLabels, injectPhoneInputLabels, injectPictureConfig, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectProgressStepLabels, injectQueryErrorLabels, injectRichTextEditorLabels, injectRichTextEditorTools, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSchedulerEditSurface, injectSchedulerEditSurfaceOpener, injectSchedulerFeatureHost, injectSchedulerLabels, injectSelectLabels, injectSidebarOverlay, injectSliderLabels, injectStandingsLabels, injectStatTileLabels, injectStreamConfig, injectStreamConsentConfig, injectStreamLabels, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamPlayerSlot, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTableCsvExport, injectTableFeatureHost, injectTableLabels, injectTimeFormat, injectTimePickerLabels, injectTopSheetStrategy, injectTopSheetStrategyDefaults, injectTreeLabels, injectUnsavedChangesLabels, inputLabelsForLocale, isFileAccepted, isHtmlElement, isInteractiveElement, isPointerEvent, isRestorableTableState, isTargetInsideOverlayTree, isTouchEvent, kbdKeyLabel, kbdKeyName, kbdLabelsForLocale, lastDaysPreset, lastMonthPreset, lastWeekPreset, leftSheetOverlayStrategy, legacyQueryErrorSource, loaderLabelsForLocale, mapGridLayout, matchCountryByDialCode, matchLabelsForLocale, matchParticipantDisplayName, matchedDialPrefix, matchesKbdChord, mergeOverlayBreakpointConfigs, mergeOverlayConfigs, mergeTableCsvExportOptions, mirroredDoubleEliminationBracketLayout, mirroredSingleEliminationBracketLayout, missingStreamSourceError, mountNavTabLinkStyles, nextDaysPreset, normalizeEthleteBracketMatch, normalizeEthleteGroupRanking, normalizeEthleteMatch, normalizeEthleteMatchStatus, normalizeEthleteMedia, normalizeEthleteParticipant, normalizeEthletePlacement, normalizePictureSizes, normalizePictureSource, notificationLabelsForLocale, numberInputStepMultiplierFrom, overlayResult, paginate, paginationLabelsForLocale, parseKbdKeys, phoneCountryFlag, phoneCountryName, phoneInputLabelsForLocale, progressStepLabelsForLocale, provideAlertDialogLabels, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideAvatarLabels, provideBannerLabels, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideBracketConfig, provideBracketLabels, provideBreadcrumbLabels, provideBreadcrumbManager, provideCalendarLabels, provideCarouselLabels, provideCascaderLabels, provideChartLabels, provideChipLabels, provideColorInputLabels, provideCommandPaletteLabels, provideCommandPaletteRegistry, provideCopyButtonLabels, provideDateFormat, provideDateLocale, provideDateTimeFormat, provideDateTimeLabels, provideDateTimeZone, provideDialogStrategy, provideDialogStrategyDefaults, provideDropzoneLabels, provideFilterOverlay, provideFilterOverlayLabels, provideFormErrorMessageResolver, provideFormFieldDefaults, provideFormFieldLabels, provideFormSupport, provideFormWarningMessageResolver, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideGridLabels, provideIconOverrides, provideIcons, provideInputLabels, provideKbdLabels, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideLoaderLabels, provideMatchLabels, provideNotificationLabels, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePaginationLabels, providePhoneInputLabels, providePictureConfig, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideProgressStepLabels, provideQueryErrorLabels, provideRichTextEditorAlignmentTool, provideRichTextEditorAutoformat, provideRichTextEditorBlockquoteTool, provideRichTextEditorCodeBlockTool, provideRichTextEditorDefaultTools, provideRichTextEditorFloatingToolbar, provideRichTextEditorHeadingTool, provideRichTextEditorImageTool, provideRichTextEditorLabels, provideRichTextEditorLanguageTool, provideRichTextEditorLinkEditor, provideRichTextEditorLinkTool, provideRichTextEditorTableTool, provideRichTextEditorTokenRendering, provideRichTextEditorTool, provideRichTextEditorTools, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSchedulerEditSurface, provideSchedulerLabels, provideSelectLabels, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideSliderLabels, provideStandingsLabels, provideStatTileLabels, provideStreamConfig, provideStreamConsentConfig, provideStreamLabels, provideStreamManager, provideStreamPip, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTableLabels, provideTimeFormat, provideTimePickerLabels, provideTopSheetStrategy, provideTopSheetStrategyDefaults, provideTreeLabels, provideUnsavedChangesAlertDialog, provideUnsavedChangesLabels, queryButtonSourceFromV2Query, queryErrorLabelsForLocale, queryErrorResponseFromLegacyError, quickFilterRows, reconcileColumnOrder, reconcileColumnWidths, reconcileHiddenColumns, reduceSupportPresentation, registerCommands, registerSingleton, rejectionMessage, requiredLanguages, resolveBracketLayout, resolveClosestOverlay, resolveFilterOverlaySubmitButton, resolveNormalizedMatchSideState, resolveNotificationStatusIcon, resolveOverlayHasBackdrop, resolveTableCsvRows, rgbColor, richTextEditorLabelsForLocale, richTextEditorToolLabel, rightSheetOverlayStrategy, schedulerFeatureConfig, schedulerLabelsForLocale, selectLabelsForLocale, selectOptionsFromQuery, selectOptionsFromV2Query, serializeGridLayout, serializeTableState, singleEliminationBracketLayout, sliderLabelsForLocale, sortRows, standingsLabelsForLocale, startOfCalendarUnit, statTileLabelsForLocale, streamLabelsForLocale, stripTrunkZero, supportPresentationIncludesState, swissBracketLayout, tableCsvRowsFromPages, tableFeatureConfig, tableLabelsForLocale, tableRowsFromQuery, tableRowsFromV2Query, tableToCsv, thisMonthPreset, thisWeekPreset, thisYearPreset, timeBounds, timePickerLabelsForLocale, timeRangeBounds, timeRangeOrder, toFieldWarnings, toGridPosition, toNotificationContent, toPictureDimension, todayPreset, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy, treeLabelsForLocale, unsavedChangesLabelsForLocale, warn, wireFormSupport, withPictureBaseUrl, yesterdayPreset };
|
|
75929
77120
|
//# sourceMappingURL=ethlete-components.mjs.map
|