@ethlete/components 0.1.0-next.3 → 0.1.0-next.6

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 CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0-next.6
4
+
5
+ ### Patch Changes
6
+
7
+ - [`6ee86dc`](https://github.com/ethlete-io/ethdk/commit/6ee86dc6e2dde7ec6661d12e92fe1ceb87bc5800) Thanks [@TomTomB](https://github.com/TomTomB)! - Fix grid edge cases
8
+
9
+ ## 0.1.0-next.5
10
+
11
+ ### Patch Changes
12
+
13
+ - [`b73a127`](https://github.com/ethlete-io/ethdk/commit/b73a127002a06e3aa0c4e7e977b1ad1f3e04e7e6) Thanks [@TomTomB](https://github.com/TomTomB)! - Bump yet again, final one for sure, pinky promise
14
+
15
+ ## 0.1.0-beta.4
16
+
17
+ ### Patch Changes
18
+
19
+ - [`ddb5d09`](https://github.com/ethlete-io/ethdk/commit/ddb5d09e4bc56e18cc8c228aa78a200441e7a766) Thanks [@TomTomB](https://github.com/TomTomB)! - Bump to beta
20
+
21
+ - Updated dependencies [[`ddb5d09`](https://github.com/ethlete-io/ethdk/commit/ddb5d09e4bc56e18cc8c228aa78a200441e7a766)]:
22
+ - @ethlete/core@5.0.0-beta.11
23
+
3
24
  ## 0.1.0-next.3
4
25
 
5
26
  ### Patch Changes
@@ -4,7 +4,8 @@ import * as i2 from '@ethlete/core';
4
4
  import { injectStyleManager, createCanAnimateSignal, ColorInteractiveDirective, ProvideColorDirective, RuntimeError, injectErrorTheme, signalElementDimensions, createProvider, AnimatableDirective, ColorInteractiveContainerDirective, ColorInteractiveExcludeDirective, ProvideSurfaceDirective, SURFACE_PROVIDER, injectSurfaceThemes, resolveSurfaceByElevation, ColorInteractiveHasFocusDirective, createStaticRootProvider, signalHostElementDimensions, signalHostStyles, DragHandleDirective, injectRenderer, injectLocale, ResizeHandlesComponent, ANIMATED_LIFECYCLE_TOKEN, injectSurfaceContextTracker, AnimatedLifecycleDirective, createRootProvider, injectOverlayRuntime, typedBreakpointTransform, signalElementChildren, signalElementScrollState, signalElementIntersection, signalHostAttributes, signalHostClasses, getScrollContainerTarget, getScrollItemTarget, getElementScrollCoordinates, provideBreakpointInstance, signalClasses, useCursorDragScroll, signalStyles, getScrollSnapTarget, ScrollObserverDirective, ScrollObserverStartDirective, ScrollObserverEndDirective, injectViewportSize, createFlipAnimation, signalHostElementIntersection, injectHostElement, setInputSignal, SurfaceInteractiveDirective, injectRouterEvent, canUseSessionMemory, createAutoSessionMemoryKey, createSessionMemory, COLOR_PROVIDER, injectFocusVisibleTracker } from '@ethlete/core';
5
5
  import { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';
6
6
  import { toObservable, takeUntilDestroyed, outputToObservable, outputFromObservable, rxResource } from '@angular/core/rxjs-interop';
7
- import { switchMap, EMPTY, filter, tap, take, of, timer, animationFrameScheduler, Subject, fromEvent, debounceTime, map, exhaustMap, takeUntil, finalize, distinctUntilChanged, Observable, shareReplay, catchError, interval } from 'rxjs';
7
+ import { switchMap, EMPTY, filter, tap, timer, take, of, animationFrameScheduler, Subject, fromEvent, debounceTime, map, exhaustMap, takeUntil, finalize, distinctUntilChanged, Observable, shareReplay, catchError, interval } from 'rxjs';
8
+ import { tap as tap$1 } from 'rxjs/operators';
8
9
  import { DomSanitizer } from '@angular/platform-browser';
9
10
  import * as i1 from '@angular/router';
10
11
  import { RouterLinkActive, NavigationEnd, RouterLink } from '@angular/router';
@@ -2620,6 +2621,17 @@ const deserializeGridLayout = (state, breakpointMinWidths) => {
2620
2621
  return { breakpoints, items, rowHeight: state.rowHeight };
2621
2622
  };
2622
2623
 
2624
+ const positionsEqual = (a, b) => a.col === b.col && a.row === b.row && a.colSpan === b.colSpan && a.rowSpan === b.rowSpan;
2625
+ const layoutsEqual = (a, b) => {
2626
+ const aKeys = Object.keys(a);
2627
+ if (aKeys.length !== Object.keys(b).length)
2628
+ return false;
2629
+ return aKeys.every((k) => {
2630
+ const ap = a[k];
2631
+ const bp = b[k];
2632
+ return ap !== undefined && bp !== undefined && positionsEqual(ap, bp);
2633
+ });
2634
+ };
2623
2635
  const DEFAULT_CONSTRAINTS = {
2624
2636
  minColSpan: 1,
2625
2637
  maxColSpan: 12,
@@ -2719,14 +2731,41 @@ class GridDirective {
2719
2731
  this.itemConfigs.set(initial);
2720
2732
  return;
2721
2733
  }
2722
- const currentIds = new Set(current.map((c) => c.id));
2723
- const newItems = initial.filter((item) => !currentIds.has(item.id));
2734
+ const currentById = new Map(current.map((c) => [c.id, c]));
2735
+ const initialIds = new Set(initial.map((i) => i.id));
2736
+ const newItems = initial.filter((item) => !currentById.has(item.id));
2737
+ const removedIds = current.filter((c) => !initialIds.has(c.id)).map((c) => c.id);
2738
+ // Pure layout update — same item set but positions changed (e.g. the host
2739
+ // reset its signal to a saved snapshot after the user cancelled edits).
2740
+ // A structural add/remove takes precedence and is handled below.
2741
+ if (newItems.length === 0 && removedIds.length === 0) {
2742
+ const anyLayoutChanged = initial.some((incoming) => {
2743
+ const existing = currentById.get(incoming.id);
2744
+ return existing && !layoutsEqual(existing.layout, incoming.layout);
2745
+ });
2746
+ if (anyLayoutChanged) {
2747
+ // Restore itemConfigs from the incoming snapshot.
2748
+ this.itemConfigs.set(initial);
2749
+ // Rebuild layoutOverrides for every breakpoint that has already been
2750
+ // visited so the grid renders the restored positions immediately without
2751
+ // waiting for a breakpoint switch.
2752
+ const visitedBps = Object.keys(this.layoutOverrides());
2753
+ if (visitedBps.length > 0) {
2754
+ const restored = {};
2755
+ for (const bp of visitedBps) {
2756
+ restored[bp] = initial.map((item) => ({
2757
+ id: item.id,
2758
+ position: item.layout[bp] ?? { col: 0, row: 0, colSpan: 1, rowSpan: 1 },
2759
+ }));
2760
+ }
2761
+ this.layoutOverrides.set(restored);
2762
+ }
2763
+ }
2764
+ return;
2765
+ }
2724
2766
  for (const item of newItems) {
2725
2767
  this.placeItem(item);
2726
2768
  }
2727
- // Remove items no longer in initial
2728
- const initialIds = new Set(initial.map((i) => i.id));
2729
- const removedIds = current.filter((c) => !initialIds.has(c.id)).map((c) => c.id);
2730
2769
  for (const id of removedIds) {
2731
2770
  this.removeItem(id);
2732
2771
  }
@@ -2799,27 +2838,33 @@ class GridDirective {
2799
2838
  // On first registration the item may have been auto-placed with 1×1 defaults
2800
2839
  // (because addItem runs before the GridItemDirective initialises). If so,
2801
2840
  // re-place it now at the correct minimum size.
2802
- const breakpoint = this.activeBreakpoint();
2803
- const existing = this.layoutOverrides()[breakpoint];
2804
- if (!existing)
2805
- return;
2806
- const entry = existing.find((e) => e.id === id);
2807
- if (!entry)
2808
- return;
2809
- const pos = entry.position;
2810
- if (pos.colSpan >= constraints.minColSpan && pos.rowSpan >= constraints.minRowSpan)
2811
- return;
2812
- const cols = this.activeColumns();
2813
- const others = existing.filter((e) => e.id !== id);
2814
- const newPosition = autoPlace({
2815
- entries: others,
2816
- colSpan: Math.max(pos.colSpan, constraints.minColSpan),
2817
- rowSpan: Math.max(pos.rowSpan, constraints.minRowSpan),
2818
- columns: cols,
2841
+ // All signal reads are wrapped in untracked() to prevent this method from
2842
+ // inadvertently becoming a dependency of the caller's reactive context
2843
+ // (e.g. GridItemDirective's registration effect), which would cause the
2844
+ // layoutOverrides.update() write below to re-trigger that effect in a loop.
2845
+ untracked(() => {
2846
+ const breakpoint = this.activeBreakpoint();
2847
+ const existing = this.layoutOverrides()[breakpoint];
2848
+ if (!existing)
2849
+ return;
2850
+ const entry = existing.find((e) => e.id === id);
2851
+ if (!entry)
2852
+ return;
2853
+ const pos = entry.position;
2854
+ if (pos.colSpan >= constraints.minColSpan && pos.rowSpan >= constraints.minRowSpan)
2855
+ return;
2856
+ const cols = this.activeColumns();
2857
+ const others = existing.filter((e) => e.id !== id);
2858
+ const newPosition = autoPlace({
2859
+ entries: others,
2860
+ colSpan: Math.max(pos.colSpan, constraints.minColSpan),
2861
+ rowSpan: Math.max(pos.rowSpan, constraints.minRowSpan),
2862
+ columns: cols,
2863
+ });
2864
+ const updated = existing.map((e) => (e.id === id ? { ...e, position: newPosition } : e));
2865
+ const compacted = compactLayout(updated, cols);
2866
+ this.layoutOverrides.update((prev) => ({ ...prev, [breakpoint]: compacted }));
2819
2867
  });
2820
- const updated = existing.map((e) => (e.id === id ? { ...e, position: newPosition } : e));
2821
- const compacted = compactLayout(updated, cols);
2822
- this.layoutOverrides.update((prev) => ({ ...prev, [breakpoint]: compacted }));
2823
2868
  }
2824
2869
  registerItem(id, options) {
2825
2870
  this.itemElements.set(id, options.el);
@@ -2960,6 +3005,7 @@ class GridDirective {
2960
3005
  const currentLayout = this.baseLayout().filter((e) => e.id !== id);
2961
3006
  const compacted = compactLayout(currentLayout, columns);
2962
3007
  this.updateLayoutForCurrentBreakpoint(compacted);
3008
+ this.compactOtherBreakpoints(id);
2963
3009
  this.emitLayoutChange();
2964
3010
  this.animateLayoutTransition({ excludeIds: new Set([id]) });
2965
3011
  };
@@ -2970,6 +3016,7 @@ class GridDirective {
2970
3016
  const currentLayout = this.baseLayout().filter((e) => e.id !== id);
2971
3017
  const compacted = compactLayout(currentLayout, columns);
2972
3018
  this.updateLayoutForCurrentBreakpoint(compacted);
3019
+ this.compactOtherBreakpoints(id);
2973
3020
  this.emitLayoutChange();
2974
3021
  }
2975
3022
  }
@@ -3022,8 +3069,22 @@ class GridDirective {
3022
3069
  this.resizeBaseLayout.set(null);
3023
3070
  }
3024
3071
  getSerializedState() {
3072
+ const overrides = this.layoutOverrides();
3073
+ // layoutOverrides is the authoritative source for any breakpoint that has been visited.
3074
+ // itemConfigs.layout[bp] lags behind for breakpoints that haven't been written back
3075
+ // yet (e.g. items pushed by moveItem/resizeItem collision resolution, or items whose
3076
+ // non-current-breakpoint positions haven't been visited since the last change).
3077
+ const items = this.itemConfigs().map((item) => {
3078
+ const layout = { ...item.layout };
3079
+ for (const [bp, entries] of Object.entries(overrides)) {
3080
+ const entry = entries.find((e) => e.id === item.id);
3081
+ if (entry)
3082
+ layout[bp] = entry.position;
3083
+ }
3084
+ return { ...item, layout };
3085
+ });
3025
3086
  return serializeGridLayout({
3026
- items: this.itemConfigs(),
3087
+ items,
3027
3088
  breakpoints: this.breakpoints(),
3028
3089
  rowHeight: this.rowHeight(),
3029
3090
  });
@@ -3052,24 +3113,45 @@ class GridDirective {
3052
3113
  this.layoutOverrides.set(overrides);
3053
3114
  }
3054
3115
  placeItem(config) {
3055
- const breakpoint = this.activeBreakpoint();
3116
+ const activeBp = this.activeBreakpoint();
3056
3117
  const columns = this.activeColumns();
3057
3118
  const currentLayout = this.baseLayout();
3058
3119
  const constraints = this.getConstraints(config.id);
3059
- const position = config.layout[breakpoint] ??
3120
+ const allBreakpoints = this.breakpoints();
3121
+ const overrides = this.layoutOverrides();
3122
+ const existingItems = this.itemConfigs();
3123
+ // Start from any layouts already in the config (e.g. when re-adding from API data).
3124
+ const layout = { ...config.layout };
3125
+ // Place on the active breakpoint first so other breakpoints can use it as a reference.
3126
+ const position = layout[activeBp] ??
3060
3127
  autoPlace({
3061
3128
  entries: currentLayout,
3062
3129
  colSpan: constraints.minColSpan,
3063
3130
  rowSpan: constraints.minRowSpan,
3064
3131
  columns,
3065
3132
  });
3066
- const itemWithLayout = {
3067
- ...config,
3068
- layout: {
3069
- ...config.layout,
3070
- [breakpoint]: position,
3071
- },
3072
- };
3133
+ layout[activeBp] = position;
3134
+ // Auto-place on every other breakpoint that has no position yet.
3135
+ // This ensures the emitted layoutChange always carries all breakpoints so
3136
+ // the host's gridItems signal never loses sm/md positions for new items.
3137
+ for (const bp of allBreakpoints) {
3138
+ if (bp.name === activeBp || layout[bp.name])
3139
+ continue;
3140
+ // Effective layout for this breakpoint: prefer layoutOverrides (already visited),
3141
+ // fall back to itemConfigs.layout[bp] (original API positions).
3142
+ const bpEntries = overrides[bp.name] ??
3143
+ existingItems.map((item) => ({
3144
+ id: item.id,
3145
+ position: item.layout[bp.name] ?? { col: 0, row: 0, colSpan: 1, rowSpan: 1 },
3146
+ }));
3147
+ layout[bp.name] = autoPlace({
3148
+ entries: bpEntries,
3149
+ colSpan: Math.min(constraints.minColSpan, bp.columns),
3150
+ rowSpan: constraints.minRowSpan,
3151
+ columns: bp.columns,
3152
+ });
3153
+ }
3154
+ const itemWithLayout = { ...config, layout };
3073
3155
  this.itemConfigs.update((items) => [...items, itemWithLayout]);
3074
3156
  this.updateLayoutForCurrentBreakpoint([...currentLayout, { id: config.id, position }]);
3075
3157
  this.emitLayoutChange();
@@ -3153,6 +3235,19 @@ class GridDirective {
3153
3235
  return collides ? original : entry;
3154
3236
  });
3155
3237
  }
3238
+ /** Compact all visited breakpoints (layoutOverrides entries) after an item is removed. */
3239
+ compactOtherBreakpoints(removedId) {
3240
+ const activeBp = this.activeBreakpoint();
3241
+ const bpColumns = new Map(this.breakpoints().map((b) => [b.name, b.columns]));
3242
+ for (const [bp, entries] of Object.entries(this.layoutOverrides())) {
3243
+ if (bp === activeBp)
3244
+ continue;
3245
+ const withoutItem = entries.filter((e) => e.id !== removedId);
3246
+ const cols = bpColumns.get(bp) ?? 1;
3247
+ const compacted = compactLayout(withoutItem, cols);
3248
+ this.layoutOverrides.update((prev) => ({ ...prev, [bp]: compacted }));
3249
+ }
3250
+ }
3156
3251
  updateLayoutForCurrentBreakpoint(entries) {
3157
3252
  const breakpoint = this.activeBreakpoint();
3158
3253
  this.layoutOverrides.update((prev) => ({ ...prev, [breakpoint]: entries }));
@@ -3714,6 +3809,326 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
3714
3809
  }, styles: ["@property --et-grid-item-border-radius{syntax: \"<length>\"; inherits: false; initial-value: 8px;}@property --et-grid-item-bg{syntax: \"<color>\"; inherits: false; initial-value: rgb(var(--et-surface-background, 255 255 255));}@property --et-grid-item-shadow{syntax: \"*\"; inherits: false; initial-value: 0 1px 3px rgba(0,0,0,.12);}@property --et-grid-item-drag-handle-height{syntax: \"<length>\"; inherits: false; initial-value: 32px;}.et-grid-item{position:relative;border-radius:var(--et-grid-item-border-radius);background:var(--et-grid-item-bg);box-shadow:var(--et-grid-item-shadow);border:1px solid rgb(var(--et-surface-border, 229 229 229));color:rgb(var(--et-surface-color, 23 23 23));overflow:hidden;display:flex;flex-direction:column;outline:none;will-change:transform}.et-grid-item:focus-visible{box-shadow:0 0 0 2px var(--et-grid-item-focus-ring-color, #2563eb)}.et-grid-item:is(.et-grid-item--dragging){z-index:100;box-shadow:0 12px 32px #0003;opacity:.95;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:rgb(var(--et-surface-color, 23 23 23) / .2);transition:opacity .15s ease}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{height:var(--et-grid-item-drag-handle-height);cursor:grab;display:flex;align-items:center;padding-inline:8px;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;overflow:hidden;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"] }]
3715
3810
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
3716
3811
 
3812
+ const posEq = (a, b) => {
3813
+ if (!a && !b)
3814
+ return true;
3815
+ if (!a || !b)
3816
+ return false;
3817
+ return a.col === b.col && a.row === b.row && a.colSpan === b.colSpan && a.rowSpan === b.rowSpan;
3818
+ };
3819
+ /**
3820
+ * Development-only debug overlay for an `et-grid` instance.
3821
+ *
3822
+ * ```html
3823
+ * <et-grid #myGrid [initialItems]="items()" ...></et-grid>
3824
+ * <et-grid-debug [grid]="myGrid" [externalItems]="items()" />
3825
+ * ```
3826
+ *
3827
+ * Pass `externalItems` to detect divergence between the host signal
3828
+ * and the grid's internal itemConfigs. The **Copy JSON** button writes
3829
+ * a full diagnostic snapshot to the clipboard without any console output.
3830
+ */
3831
+ class GridDebugComponent {
3832
+ constructor() {
3833
+ this.destroyRef = inject(DestroyRef);
3834
+ this.grid = input.required(...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
3835
+ this.externalItems = input(null, ...(ngDevMode ? [{ debugName: "externalItems" }] : /* istanbul ignore next */ []));
3836
+ this.activeBreakpoint = computed(() => this.grid().grid.activeBreakpoint(), ...(ngDevMode ? [{ debugName: "activeBreakpoint" }] : /* istanbul ignore next */ []));
3837
+ this.containerWidth = computed(() => this.grid().grid.containerWidth(), ...(ngDevMode ? [{ debugName: "containerWidth" }] : /* istanbul ignore next */ []));
3838
+ this.breakpoints = computed(() => this.grid().grid.breakpoints(), ...(ngDevMode ? [{ debugName: "breakpoints" }] : /* istanbul ignore next */ []));
3839
+ this.items = computed(() => this.grid().grid.items(), ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
3840
+ this.layout = computed(() => this.grid().grid.layout(), ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
3841
+ this.hasDrag = computed(() => this.grid().grid.dragState() !== null, ...(ngDevMode ? [{ debugName: "hasDrag" }] : /* istanbul ignore next */ []));
3842
+ this.hasExternal = computed(() => this.externalItems() !== null, ...(ngDevMode ? [{ debugName: "hasExternal" }] : /* istanbul ignore next */ []));
3843
+ this.copied = signal(false, ...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
3844
+ this.rows = computed(() => {
3845
+ const bps = this.breakpoints().map((b) => b.name);
3846
+ const internalItems = this.items();
3847
+ const external = this.externalItems();
3848
+ const extById = external ? new Map(external.map((i) => [i.id, i])) : null;
3849
+ return internalItems.map((item) => ({
3850
+ id: item.id,
3851
+ type: item.type,
3852
+ cells: bps.map((bp) => {
3853
+ const int = item.layout[bp];
3854
+ const ext = extById?.get(item.id)?.layout[bp];
3855
+ return {
3856
+ bp,
3857
+ int,
3858
+ ext,
3859
+ intMissing: !int,
3860
+ extMissing: extById !== null && !ext,
3861
+ mismatch: extById !== null && !posEq(int, ext),
3862
+ };
3863
+ }),
3864
+ }));
3865
+ }, ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
3866
+ this.issueCount = computed(() => this.rows().reduce((n, row) => n + row.cells.filter((c) => c.intMissing || c.mismatch).length, 0), ...(ngDevMode ? [{ debugName: "issueCount" }] : /* istanbul ignore next */ []));
3867
+ }
3868
+ fmtPos(pos) {
3869
+ return pos ? `(${pos.col},${pos.row}) ${pos.colSpan}×${pos.rowSpan}` : '—';
3870
+ }
3871
+ copyJson($event) {
3872
+ $event.stopPropagation();
3873
+ const issues = [];
3874
+ for (const row of this.rows()) {
3875
+ for (const cell of row.cells) {
3876
+ if (cell.intMissing)
3877
+ issues.push({ type: 'missing-internal-layout', itemId: row.id, breakpoint: cell.bp });
3878
+ if (cell.mismatch)
3879
+ issues.push({ type: 'external-internal-mismatch', itemId: row.id, breakpoint: cell.bp });
3880
+ }
3881
+ }
3882
+ const external = this.externalItems();
3883
+ const snapshot = {
3884
+ timestamp: new Date().toISOString(),
3885
+ activeBreakpoint: this.activeBreakpoint(),
3886
+ containerWidth: this.containerWidth(),
3887
+ breakpoints: this.breakpoints(),
3888
+ internalItems: this.items().map((i) => ({ id: i.id, type: i.type, layout: i.layout })),
3889
+ activeLayout: this.layout(),
3890
+ ...(external ? { externalItems: external.map((i) => ({ id: i.id, type: i.type, layout: i.layout })) } : {}),
3891
+ issues,
3892
+ };
3893
+ navigator.clipboard.writeText(JSON.stringify(snapshot, null, 2)).catch(() => {
3894
+ /* clipboard unavailable in this context */
3895
+ });
3896
+ this.copied.set(true);
3897
+ timer(2000)
3898
+ .pipe(takeUntilDestroyed(this.destroyRef), tap$1(() => this.copied.set(false)))
3899
+ .subscribe();
3900
+ }
3901
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridDebugComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3902
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: GridDebugComponent, isStandalone: true, selector: "et-grid-debug", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: true, transformFunction: null }, externalItems: { classPropertyName: "externalItems", publicName: "externalItems", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
3903
+ <details
3904
+ style="font-family: monospace; font-size: 11px; border: 1px solid #d1d5db; border-radius: 4px; margin-top: 8px; background: #f9fafb; color: #111"
3905
+ >
3906
+ <summary
3907
+ style="padding: 6px 10px; cursor: pointer; list-style: none; display: flex; align-items: center; gap: 10px; user-select: none"
3908
+ >
3909
+ <span style="font-weight: 700; color: #6b7280">et-grid-debug</span>
3910
+
3911
+ <span style="color: #6b7280">
3912
+ bp: <strong style="color: #111827">{{ activeBreakpoint() }}</strong> &nbsp;·&nbsp; {{ containerWidth() }}px
3913
+ &nbsp;·&nbsp; {{ items().length }} items
3914
+ @if (hasDrag()) {
3915
+ &nbsp;·&nbsp; <span style="color: #d97706">⠿ dragging</span>
3916
+ }
3917
+ </span>
3918
+
3919
+ @if (issueCount() > 0) {
3920
+ <span style="color: #dc2626; font-weight: 700"
3921
+ >⚠ {{ issueCount() }} issue{{ issueCount() === 1 ? '' : 's' }}</span
3922
+ >
3923
+ }
3924
+
3925
+ <button
3926
+ (click)="copyJson($event)"
3927
+ style="margin-left: auto; padding: 2px 8px; border: 1px solid #d1d5db; border-radius: 3px; background: #fff; cursor: pointer; font-size: 11px; color: #374151"
3928
+ >
3929
+ Copy JSON
3930
+ </button>
3931
+
3932
+ @if (copied()) {
3933
+ <span style="color: #16a34a; font-size: 10px">✓ copied</span>
3934
+ }
3935
+ </summary>
3936
+
3937
+ <div style="padding: 8px 10px; overflow-x: auto; border-top: 1px solid #e5e7eb">
3938
+ <!-- Breakpoint legend -->
3939
+ <div style="display: flex; gap: 6px; margin-bottom: 8px; flex-wrap: wrap">
3940
+ @for (bp of breakpoints(); track bp.name) {
3941
+ <span
3942
+ [style.fontWeight]="bp.name === activeBreakpoint() ? '700' : '400'"
3943
+ [style.color]="bp.name === activeBreakpoint() ? '#1d4ed8' : '#9ca3af'"
3944
+ style="padding: 1px 7px; border: 1px solid currentColor; border-radius: 99px"
3945
+ >{{ bp.name }}&nbsp;{{ bp.columns }}col&nbsp;≥{{ bp.minWidth }}px</span
3946
+ >
3947
+ }
3948
+ </div>
3949
+
3950
+ <!-- Layout table -->
3951
+ <table style="border-collapse: collapse; white-space: nowrap">
3952
+ <thead>
3953
+ <tr style="background: #f3f4f6">
3954
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">id</th>
3955
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">type</th>
3956
+ @for (bp of breakpoints(); track bp.name) {
3957
+ <th
3958
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
3959
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb"
3960
+ >
3961
+ {{ bp.name }}{{ hasExternal() ? ' int' : '' }}
3962
+ </th>
3963
+ @if (hasExternal()) {
3964
+ <th
3965
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
3966
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb; opacity: .65"
3967
+ >
3968
+ {{ bp.name }} ext
3969
+ </th>
3970
+ }
3971
+ }
3972
+ </tr>
3973
+ </thead>
3974
+ <tbody>
3975
+ @for (row of rows(); track row.id) {
3976
+ <tr>
3977
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #6b7280">{{ row.id }}</td>
3978
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #9ca3af">{{ row.type }}</td>
3979
+ @for (cell of row.cells; track cell.bp) {
3980
+ <td
3981
+ [style.color]="cell.intMissing ? '#dc2626' : '#111'"
3982
+ [title]="cell.intMissing ? 'MISSING — layout.' + cell.bp + ' undefined in internal state' : ''"
3983
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
3984
+ >
3985
+ {{ fmtPos(cell.int) }}
3986
+ </td>
3987
+ @if (hasExternal()) {
3988
+ <td
3989
+ [style.color]="cell.extMissing ? '#dc2626' : cell.mismatch ? '#d97706' : '#9ca3af'"
3990
+ [title]="cell.mismatch ? 'MISMATCH — ext=' + fmtPos(cell.ext) + ' int=' + fmtPos(cell.int) : ''"
3991
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
3992
+ >
3993
+ {{ fmtPos(cell.ext) }}
3994
+ </td>
3995
+ }
3996
+ }
3997
+ </tr>
3998
+ }
3999
+ </tbody>
4000
+ </table>
4001
+
4002
+ @if (hasExternal()) {
4003
+ <p style="margin-top: 6px; color: #9ca3af; font-size: 10px">
4004
+ int = grid.items() (internal) &nbsp;·&nbsp; ext = externalItems input &nbsp;·&nbsp;
4005
+ <span style="color: #dc2626">red = undefined</span> &nbsp;·&nbsp;
4006
+ <span style="color: #d97706">orange = mismatch</span>
4007
+ </p>
4008
+ }
4009
+ </div>
4010
+ </details>
4011
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4012
+ }
4013
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: GridDebugComponent, decorators: [{
4014
+ type: Component,
4015
+ args: [{
4016
+ selector: 'et-grid-debug',
4017
+ template: `
4018
+ <details
4019
+ style="font-family: monospace; font-size: 11px; border: 1px solid #d1d5db; border-radius: 4px; margin-top: 8px; background: #f9fafb; color: #111"
4020
+ >
4021
+ <summary
4022
+ style="padding: 6px 10px; cursor: pointer; list-style: none; display: flex; align-items: center; gap: 10px; user-select: none"
4023
+ >
4024
+ <span style="font-weight: 700; color: #6b7280">et-grid-debug</span>
4025
+
4026
+ <span style="color: #6b7280">
4027
+ bp: <strong style="color: #111827">{{ activeBreakpoint() }}</strong> &nbsp;·&nbsp; {{ containerWidth() }}px
4028
+ &nbsp;·&nbsp; {{ items().length }} items
4029
+ @if (hasDrag()) {
4030
+ &nbsp;·&nbsp; <span style="color: #d97706">⠿ dragging</span>
4031
+ }
4032
+ </span>
4033
+
4034
+ @if (issueCount() > 0) {
4035
+ <span style="color: #dc2626; font-weight: 700"
4036
+ >⚠ {{ issueCount() }} issue{{ issueCount() === 1 ? '' : 's' }}</span
4037
+ >
4038
+ }
4039
+
4040
+ <button
4041
+ (click)="copyJson($event)"
4042
+ style="margin-left: auto; padding: 2px 8px; border: 1px solid #d1d5db; border-radius: 3px; background: #fff; cursor: pointer; font-size: 11px; color: #374151"
4043
+ >
4044
+ Copy JSON
4045
+ </button>
4046
+
4047
+ @if (copied()) {
4048
+ <span style="color: #16a34a; font-size: 10px">✓ copied</span>
4049
+ }
4050
+ </summary>
4051
+
4052
+ <div style="padding: 8px 10px; overflow-x: auto; border-top: 1px solid #e5e7eb">
4053
+ <!-- Breakpoint legend -->
4054
+ <div style="display: flex; gap: 6px; margin-bottom: 8px; flex-wrap: wrap">
4055
+ @for (bp of breakpoints(); track bp.name) {
4056
+ <span
4057
+ [style.fontWeight]="bp.name === activeBreakpoint() ? '700' : '400'"
4058
+ [style.color]="bp.name === activeBreakpoint() ? '#1d4ed8' : '#9ca3af'"
4059
+ style="padding: 1px 7px; border: 1px solid currentColor; border-radius: 99px"
4060
+ >{{ bp.name }}&nbsp;{{ bp.columns }}col&nbsp;≥{{ bp.minWidth }}px</span
4061
+ >
4062
+ }
4063
+ </div>
4064
+
4065
+ <!-- Layout table -->
4066
+ <table style="border-collapse: collapse; white-space: nowrap">
4067
+ <thead>
4068
+ <tr style="background: #f3f4f6">
4069
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">id</th>
4070
+ <th style="padding: 3px 8px; text-align: left; border: 1px solid #e5e7eb">type</th>
4071
+ @for (bp of breakpoints(); track bp.name) {
4072
+ <th
4073
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
4074
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb"
4075
+ >
4076
+ {{ bp.name }}{{ hasExternal() ? ' int' : '' }}
4077
+ </th>
4078
+ @if (hasExternal()) {
4079
+ <th
4080
+ [style.background]="bp.name === activeBreakpoint() ? '#dbeafe' : '#f3f4f6'"
4081
+ style="padding: 3px 8px; text-align: center; border: 1px solid #e5e7eb; opacity: .65"
4082
+ >
4083
+ {{ bp.name }} ext
4084
+ </th>
4085
+ }
4086
+ }
4087
+ </tr>
4088
+ </thead>
4089
+ <tbody>
4090
+ @for (row of rows(); track row.id) {
4091
+ <tr>
4092
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #6b7280">{{ row.id }}</td>
4093
+ <td style="padding: 3px 8px; border: 1px solid #e5e7eb; color: #9ca3af">{{ row.type }}</td>
4094
+ @for (cell of row.cells; track cell.bp) {
4095
+ <td
4096
+ [style.color]="cell.intMissing ? '#dc2626' : '#111'"
4097
+ [title]="cell.intMissing ? 'MISSING — layout.' + cell.bp + ' undefined in internal state' : ''"
4098
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
4099
+ >
4100
+ {{ fmtPos(cell.int) }}
4101
+ </td>
4102
+ @if (hasExternal()) {
4103
+ <td
4104
+ [style.color]="cell.extMissing ? '#dc2626' : cell.mismatch ? '#d97706' : '#9ca3af'"
4105
+ [title]="cell.mismatch ? 'MISMATCH — ext=' + fmtPos(cell.ext) + ' int=' + fmtPos(cell.int) : ''"
4106
+ style="padding: 3px 8px; border: 1px solid #e5e7eb; text-align: center"
4107
+ >
4108
+ {{ fmtPos(cell.ext) }}
4109
+ </td>
4110
+ }
4111
+ }
4112
+ </tr>
4113
+ }
4114
+ </tbody>
4115
+ </table>
4116
+
4117
+ @if (hasExternal()) {
4118
+ <p style="margin-top: 6px; color: #9ca3af; font-size: 10px">
4119
+ int = grid.items() (internal) &nbsp;·&nbsp; ext = externalItems input &nbsp;·&nbsp;
4120
+ <span style="color: #dc2626">red = undefined</span> &nbsp;·&nbsp;
4121
+ <span style="color: #d97706">orange = mismatch</span>
4122
+ </p>
4123
+ }
4124
+ </div>
4125
+ </details>
4126
+ `,
4127
+ encapsulation: ViewEncapsulation.None,
4128
+ changeDetection: ChangeDetectionStrategy.OnPush,
4129
+ }]
4130
+ }], propDecorators: { grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: true }] }], externalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "externalItems", required: false }] }] } });
4131
+
3717
4132
  const GRID_ERROR_CODES = {
3718
4133
  MISSING_GRID: 1900,
3719
4134
  MISSING_GRID_ITEM: 1901,
@@ -3721,7 +4136,7 @@ const GRID_ERROR_CODES = {
3721
4136
  INVALID_LAYOUT_STATE: 1903,
3722
4137
  };
3723
4138
 
3724
- const GridImports = [GridComponent, GridItemComponent];
4139
+ const GridImports = [GridComponent, GridItemComponent, GridDebugComponent];
3725
4140
 
3726
4141
  const ARROW_OUT_UP_RIGHT_ICON = {
3727
4142
  name: 'et-arrow-out-up-right',
@@ -11538,5 +11953,5 @@ const TOOLTIP_IMPORTS = [TooltipDirective, TooltipComponent];
11538
11953
  * Generated bundle index. Do not edit.
11539
11954
  */
11540
11955
 
11541
- export { ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BrandLoaderComponent, ButtonComponent, ButtonDirective, ButtonStylesDirective, CHECKBOX_IMPORTS, CHEVRON_ICON, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChoiceFieldComponent, DAILYMOTION_PLAYER_TOKEN, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_STREAM_PLAYER_STATE, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DescriptionComponent, FACEBOOK_PLAYER_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_TOKEN, GridComponent, GridDirective, GridDragDirective, GridImports, GridItemComponent, GridItemDirective, GridItemRef, GridResizeDirective, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, INPUT_IMPORTS, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LOCK_ICON, LabelDirective, NAV_TABS_TOKEN, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NavTabImports, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, OVERLAY_ERROR_CODES, OVERLAY_IMPORTS, OVERLAY_REF, OverlayAnchorDirective, OverlayDirective, OverlaySurfaceDirective, OverlayTriggerDirective, PENCIL_ICON, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLUS_ICON, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, RadioComponent, RadioGroupComponent, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SOOP_PLAYER_TOKEN, STREAM_CONSENT_TOKEN, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableErrorCode, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamImports, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_PANEL_TOKEN, TAB_SIZES, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabImports, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TextButtonComponent, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, createGridAdapter, createNotificationRef, createOverlayRef, createPipChromeAnimations, createPipChromeState, createStreamConfig, createStreamPlayerSlot, fromGridPosition, injectFormSupport, injectGridConfig, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, provideFormSupport, provideGridConfig, provideIcons, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlayManager, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, toGridPosition };
11956
+ export { ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BrandLoaderComponent, ButtonComponent, ButtonDirective, ButtonStylesDirective, CHECKBOX_IMPORTS, CHEVRON_ICON, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChoiceFieldComponent, DAILYMOTION_PLAYER_TOKEN, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_STREAM_PLAYER_STATE, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DescriptionComponent, FACEBOOK_PLAYER_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridImports, GridItemComponent, GridItemDirective, GridItemRef, GridResizeDirective, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, INPUT_IMPORTS, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LOCK_ICON, LabelDirective, NAV_TABS_TOKEN, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NavTabImports, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, OVERLAY_ERROR_CODES, OVERLAY_IMPORTS, OVERLAY_REF, OverlayAnchorDirective, OverlayDirective, OverlaySurfaceDirective, OverlayTriggerDirective, PENCIL_ICON, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLUS_ICON, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, RadioComponent, RadioGroupComponent, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SOOP_PLAYER_TOKEN, STREAM_CONSENT_TOKEN, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableErrorCode, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamImports, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_PANEL_TOKEN, TAB_SIZES, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabImports, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TextButtonComponent, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, createGridAdapter, createNotificationRef, createOverlayRef, createPipChromeAnimations, createPipChromeState, createStreamConfig, createStreamPlayerSlot, fromGridPosition, injectFormSupport, injectGridConfig, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, provideFormSupport, provideGridConfig, provideIcons, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlayManager, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, toGridPosition };
11542
11957
  //# sourceMappingURL=ethlete-components.mjs.map