@ethlete/components 0.1.0-next.12 → 0.1.0-next.13

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.
@@ -46,8 +46,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
46
46
 
47
47
  class FocusRingDirective {
48
48
  constructor() {
49
- this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
50
49
  this.styleManager = injectStyleManager();
50
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
51
51
  this.active = signal(false, /* @ts-ignore */
52
52
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
53
53
  effect(() => {
@@ -1411,6 +1411,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1411
1411
 
1412
1412
  class ChoiceFieldComponent {
1413
1413
  constructor() {
1414
+ this.support = injectFormSupport();
1414
1415
  this.errorContentRef = viewChild('errorContent', /* @ts-ignore */
1415
1416
  ...(ngDevMode ? [{ debugName: "errorContentRef" }] : /* istanbul ignore next */ []));
1416
1417
  this.hintContentRef = viewChild('hintContent', /* @ts-ignore */
@@ -1419,7 +1420,6 @@ class ChoiceFieldComponent {
1419
1420
  ...(ngDevMode ? [{ debugName: "errorAnimatableRef" }] : /* istanbul ignore next */ []));
1420
1421
  this.hintAnimatableRef = viewChild('hintAnimatable', /* @ts-ignore */
1421
1422
  ...(ngDevMode ? [{ debugName: "hintAnimatableRef" }] : /* istanbul ignore next */ []));
1422
- this.support = injectFormSupport();
1423
1423
  this.canAnimate = createCanAnimateSignal();
1424
1424
  effect(() => {
1425
1425
  this.support.errorContent.set(this.errorContentRef());
@@ -1583,6 +1583,8 @@ class FormFieldComponent {
1583
1583
  this.provideSurface = inject(ProvideSurfaceDirective);
1584
1584
  this.parentSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
1585
1585
  this.formFieldDir = inject(FormFieldDirective);
1586
+ this.errorColorTheme = injectErrorTheme();
1587
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
1586
1588
  this.appearance = input(FORM_FIELD_APPEARANCES.BOX, /* @ts-ignore */
1587
1589
  ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
1588
1590
  this.fill = input(FORM_FIELD_FILLS.TRANSPARENT, /* @ts-ignore */
@@ -1601,8 +1603,6 @@ class FormFieldComponent {
1601
1603
  ...(ngDevMode ? [{ debugName: "errorAnimatable" }] : /* istanbul ignore next */ []));
1602
1604
  this.hintAnimatable = viewChild('hintAnimatable', /* @ts-ignore */
1603
1605
  ...(ngDevMode ? [{ debugName: "hintAnimatable" }] : /* istanbul ignore next */ []));
1604
- this.errorColorTheme = injectErrorTheme();
1605
- this.surfaceThemes = injectSurfaceThemes({ optional: true });
1606
1606
  this.errorDimensions = signalElementDimensions(this.errorContent);
1607
1607
  this.hintDimensions = signalElementDimensions(this.hintContent);
1608
1608
  this.prefixDimensions = signalElementDimensions(this.prefixEl);
@@ -2642,6 +2642,8 @@ class RichTextEditorDirective {
2642
2642
  this.formField = inject(FORM_FIELD_TOKEN, { optional: true });
2643
2643
  this.destroyRef = inject(DestroyRef);
2644
2644
  this.document = inject(DOCUMENT);
2645
+ /** @internal */
2646
+ this.editorDom = injectRichTextEditorDom();
2645
2647
  this.value = model('', /* @ts-ignore */
2646
2648
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2647
2649
  this.touched = model(false, /* @ts-ignore */
@@ -2690,8 +2692,6 @@ class RichTextEditorDirective {
2690
2692
  ...(ngDevMode ? [{ debugName: "linkActive" }] : /* istanbul ignore next */ []));
2691
2693
  /** @internal */
2692
2694
  this.lastEmittedMarkdown = null;
2693
- /** @internal */
2694
- this.editorDom = injectRichTextEditorDom();
2695
2695
  this.formField?.registerControl(this);
2696
2696
  this.destroyRef.onDestroy(() => this.formField?.unregisterControl(this));
2697
2697
  }
@@ -3230,7 +3230,7 @@ class RichTextEditorFloatingToolbarComponent {
3230
3230
  this.renderer.listen(root, 'pointerdown', () => (this.pointerSelectingInContent = true)),
3231
3231
  this.renderer.listen(root, 'keyup', () => this.evaluate()),
3232
3232
  this.renderer.listen(root, 'blur', () => this.hide()),
3233
- this.renderer.listen(this.document, 'pointerup', () => this.onDocumentPointerUp()),
3233
+ this.renderer.listen(this.document, 'pointerup', () => this.finishContentPointerSelection()),
3234
3234
  this.renderer.listen(this.document, 'selectionchange', () => this.reposition()),
3235
3235
  ];
3236
3236
  onCleanup(() => listeners.forEach((off) => off()));
@@ -3242,7 +3242,7 @@ class RichTextEditorFloatingToolbarComponent {
3242
3242
  const usable = !!range && !range.collapsed && this.dir.focused() && !this.dir.disabled() && !this.dir.readonly();
3243
3243
  return usable ? range : null;
3244
3244
  }
3245
- onDocumentPointerUp() {
3245
+ finishContentPointerSelection() {
3246
3246
  if (!this.pointerSelectingInContent)
3247
3247
  return;
3248
3248
  this.pointerSelectingInContent = false;
@@ -3341,17 +3341,17 @@ class RichTextEditorComponent {
3341
3341
  this.renderExternalValue(markdown);
3342
3342
  });
3343
3343
  }
3344
- onInput() {
3344
+ syncValueFromDom() {
3345
3345
  this.dir.syncFromDom();
3346
3346
  }
3347
- onKeydown(event) {
3347
+ interceptBackspaceKey(event) {
3348
3348
  if (event.key !== 'Backspace')
3349
3349
  return;
3350
3350
  if (this.dir.handleBackspace()) {
3351
3351
  event.preventDefault();
3352
3352
  }
3353
3353
  }
3354
- onBeforeInput(event) {
3354
+ interceptFormattingCommand(event) {
3355
3355
  // Keep keyboard shortcuts (Ctrl/Cmd+B, …) running through our Selection/Range commands
3356
3356
  // instead of the browser's deprecated execCommand-backed formatting.
3357
3357
  switch (event.inputType) {
@@ -3379,7 +3379,7 @@ class RichTextEditorComponent {
3379
3379
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RichTextEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3380
3380
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.5", type: RichTextEditorComponent, isStandalone: true, selector: "et-rich-text-editor", host: { listeners: { "click": "dir.activate()" }, classAttribute: "et-rich-text-editor" }, providers: [
3381
3381
  provideIcons(BOLD_ICON, ITALIC_ICON, STRIKETHROUGH_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LINK_ICON),
3382
- ], viewQueries: [{ propertyName: "editable", first: true, predicate: ["editable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: RichTextEditorDirective, inputs: ["value", "value", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder"], outputs: ["valueChange", "valueChange", "touchedChange", "touchedChange"] }], ngImport: i0, template: "<div class=\"et-rte-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n <button\n [pressed]=\"dir.boldActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleBold()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bold\"\n >\n <i etIcon=\"et-bold\"></i>\n </button>\n\n <button\n [pressed]=\"dir.italicActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleItalic()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Italic\"\n >\n <i etIcon=\"et-italic\"></i>\n </button>\n\n <button\n [pressed]=\"dir.strikeActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleStrikethrough()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Strikethrough\"\n >\n <i etIcon=\"et-strikethrough\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.unorderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleUnorderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bulleted list\"\n >\n <i etIcon=\"et-list-bulleted\"></i>\n </button>\n\n <button\n [pressed]=\"dir.orderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleOrderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Numbered list\"\n >\n <i etIcon=\"et-list-numbered\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.linkActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.promptForLink()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Link\"\n >\n <i [allowHardcodedColor]=\"true\" etIcon=\"et-link\"></i>\n </button>\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedById() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"onInput()\"\n (beforeinput)=\"onBeforeInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n\n<et-rich-text-editor-floating-toolbar />\n", styles: ["@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-toolbar .et-icon-button{border-radius:var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-content{display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "allowHardcodedColor"] }, { kind: "component", type: RichTextEditorFloatingToolbarComponent, selector: "et-rich-text-editor-floating-toolbar" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3382
+ ], viewQueries: [{ propertyName: "editable", first: true, predicate: ["editable"], descendants: true, isSignal: true }], hostDirectives: [{ directive: RichTextEditorDirective, inputs: ["value", "value", "disabled", "disabled", "readonly", "readonly", "hidden", "hidden", "invalid", "invalid", "errors", "errors", "required", "required", "name", "name", "placeholder", "placeholder"], outputs: ["valueChange", "valueChange", "touchedChange", "touchedChange"] }], ngImport: i0, template: "<div class=\"et-rte-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n <button\n [pressed]=\"dir.boldActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleBold()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bold\"\n >\n <i etIcon=\"et-bold\"></i>\n </button>\n\n <button\n [pressed]=\"dir.italicActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleItalic()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Italic\"\n >\n <i etIcon=\"et-italic\"></i>\n </button>\n\n <button\n [pressed]=\"dir.strikeActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleStrikethrough()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Strikethrough\"\n >\n <i etIcon=\"et-strikethrough\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.unorderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleUnorderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bulleted list\"\n >\n <i etIcon=\"et-list-bulleted\"></i>\n </button>\n\n <button\n [pressed]=\"dir.orderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleOrderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Numbered list\"\n >\n <i etIcon=\"et-list-numbered\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.linkActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.promptForLink()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Link\"\n >\n <i [allowHardcodedColor]=\"true\" etIcon=\"et-link\"></i>\n </button>\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedById() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"syncValueFromDom()\"\n (beforeinput)=\"interceptFormattingCommand($event)\"\n (keydown)=\"interceptBackspaceKey($event)\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n\n<et-rich-text-editor-floating-toolbar />\n", styles: ["@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-toolbar .et-icon-button{border-radius:var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-content{display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "allowHardcodedColor"] }, { kind: "component", type: RichTextEditorFloatingToolbarComponent, selector: "et-rich-text-editor-floating-toolbar" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3383
3383
  }
3384
3384
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RichTextEditorComponent, decorators: [{
3385
3385
  type: Component,
@@ -3394,7 +3394,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
3394
3394
  ], host: {
3395
3395
  class: 'et-rich-text-editor',
3396
3396
  '(click)': 'dir.activate()',
3397
- }, template: "<div class=\"et-rte-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n <button\n [pressed]=\"dir.boldActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleBold()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bold\"\n >\n <i etIcon=\"et-bold\"></i>\n </button>\n\n <button\n [pressed]=\"dir.italicActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleItalic()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Italic\"\n >\n <i etIcon=\"et-italic\"></i>\n </button>\n\n <button\n [pressed]=\"dir.strikeActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleStrikethrough()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Strikethrough\"\n >\n <i etIcon=\"et-strikethrough\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.unorderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleUnorderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bulleted list\"\n >\n <i etIcon=\"et-list-bulleted\"></i>\n </button>\n\n <button\n [pressed]=\"dir.orderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleOrderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Numbered list\"\n >\n <i etIcon=\"et-list-numbered\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.linkActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.promptForLink()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Link\"\n >\n <i [allowHardcodedColor]=\"true\" etIcon=\"et-link\"></i>\n </button>\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedById() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"onInput()\"\n (beforeinput)=\"onBeforeInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n\n<et-rich-text-editor-floating-toolbar />\n", styles: ["@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-toolbar .et-icon-button{border-radius:var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-content{display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}\n"] }]
3397
+ }, template: "<div class=\"et-rte-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n <button\n [pressed]=\"dir.boldActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleBold()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bold\"\n >\n <i etIcon=\"et-bold\"></i>\n </button>\n\n <button\n [pressed]=\"dir.italicActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleItalic()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Italic\"\n >\n <i etIcon=\"et-italic\"></i>\n </button>\n\n <button\n [pressed]=\"dir.strikeActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleStrikethrough()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Strikethrough\"\n >\n <i etIcon=\"et-strikethrough\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.unorderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleUnorderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Bulleted list\"\n >\n <i etIcon=\"et-list-bulleted\"></i>\n </button>\n\n <button\n [pressed]=\"dir.orderedListActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.toggleOrderedList()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Numbered list\"\n >\n <i etIcon=\"et-list-numbered\"></i>\n </button>\n\n <span class=\"et-rte-toolbar-divider\" aria-hidden=\"true\"></span>\n\n <button\n [pressed]=\"dir.linkActive()\"\n [disabled]=\"dir.disabled() || dir.readonly()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"dir.promptForLink()\"\n mutedUntilPressed\n et-icon-button\n size=\"xs\"\n type=\"button\"\n aria-label=\"Link\"\n >\n <i [allowHardcodedColor]=\"true\" etIcon=\"et-link\"></i>\n </button>\n</div>\n\n<div\n #editable\n [attr.contenteditable]=\"dir.disabled() || dir.readonly() ? 'false' : 'true'\"\n [attr.tabindex]=\"dir.disabled() ? -1 : 0\"\n [attr.data-placeholder]=\"dir.placeholder() || null\"\n [attr.aria-invalid]=\"dir.shouldDisplayError() || null\"\n [attr.aria-describedby]=\"dir.describedById() || null\"\n [attr.aria-labelledby]=\"dir.labelId() || null\"\n [attr.aria-disabled]=\"dir.disabled() || null\"\n [attr.aria-readonly]=\"dir.readonly() || null\"\n (input)=\"syncValueFromDom()\"\n (beforeinput)=\"interceptFormattingCommand($event)\"\n (keydown)=\"interceptBackspaceKey($event)\"\n (focus)=\"dir.focused.set(true)\"\n (blur)=\"dir.focused.set(false); dir.touched.set(true)\"\n class=\"et-rte-content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n></div>\n\n<et-rich-text-editor-floating-toolbar />\n", styles: ["@property --et-rich-text-editor-toolbar-gap{syntax: \"<length>\"; inherits: true; initial-value: 2px;}@property --et-rich-text-editor-toolbar-padding{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-button-radius{syntax: \"<length>\"; inherits: true; initial-value: 4px;}@property --et-rich-text-editor-min-height{syntax: \"<length>\"; inherits: true; initial-value: 96px;}@property --et-rich-text-editor-content-gap{syntax: \"<length>\"; inherits: true; initial-value: 8px;}et-rich-text-editor{display:flex;flex:1;flex-direction:column;min-inline-size:0;color:inherit}et-rich-text-editor .et-rte-toolbar{display:flex;align-items:center;gap:var(--et-rich-text-editor-toolbar-gap);padding:var(--et-rich-text-editor-toolbar-padding);padding-inline:calc(var(--et-form-field-control-padding-inline) - var(--et-rich-text-editor-toolbar-padding));border-block-end:var(--et-form-field-control-border-width, 1px) solid color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-toolbar .et-icon-button{border-radius:var(--et-rich-text-editor-button-radius)}et-rich-text-editor .et-rte-toolbar-divider{inline-size:1px;align-self:stretch;margin-block:4px;margin-inline:2px;background:color-mix(in srgb,currentColor 12%,transparent)}et-rich-text-editor .et-rte-content{display:block;flex:1;min-inline-size:0;padding-block:var(--et-form-field-control-padding-block);padding-inline:var(--et-form-field-control-padding-inline);min-block-size:var(--et-rich-text-editor-min-height);outline:none;color:inherit;caret-color:var(--et-theme-color-primary-solid, currentColor);overflow-wrap:anywhere}et-rich-text-editor .et-rte-content:empty:before{content:attr(data-placeholder);color:color-mix(in srgb,currentColor 46%,transparent);pointer-events:none}et-rich-text-editor .et-rte-content>:first-child{margin-block-start:0}et-rich-text-editor .et-rte-content>:last-child{margin-block-end:0}et-rich-text-editor .et-rte-content p{margin-block:0}et-rich-text-editor .et-rte-content p+p,et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-start:var(--et-rich-text-editor-content-gap)}et-rich-text-editor .et-rte-content ul,et-rich-text-editor .et-rte-content ol{margin-block-end:0;padding-inline-start:1.5em;list-style-position:outside}et-rich-text-editor .et-rte-content ul{list-style-type:disc}et-rich-text-editor .et-rte-content ol{list-style-type:decimal}et-rich-text-editor .et-rte-content li{margin-block:0}et-rich-text-editor .et-rte-content li::marker{color:color-mix(in srgb,currentColor 60%,transparent)}et-rich-text-editor .et-rte-content a{color:var(--et-theme-color-primary-solid, currentColor);text-decoration:underline}\n"] }]
3398
3398
  }], ctorParameters: () => [], propDecorators: { editable: [{ type: i0.ViewChild, args: ['editable', { isSignal: true }] }] } });
3399
3399
 
3400
3400
  const RICH_TEXT_EDITOR_IMPORTS = [RichTextEditorComponent, RichTextEditorDirective];
@@ -3716,6 +3716,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
3716
3716
 
3717
3717
  class CheckboxGroupComponent {
3718
3718
  constructor() {
3719
+ this.support = injectFormSupport();
3719
3720
  this.errorContentRef = viewChild('errorContent', /* @ts-ignore */
3720
3721
  ...(ngDevMode ? [{ debugName: "errorContentRef" }] : /* istanbul ignore next */ []));
3721
3722
  this.hintContentRef = viewChild('hintContent', /* @ts-ignore */
@@ -3724,7 +3725,6 @@ class CheckboxGroupComponent {
3724
3725
  ...(ngDevMode ? [{ debugName: "errorAnimatableRef" }] : /* istanbul ignore next */ []));
3725
3726
  this.hintAnimatableRef = viewChild('hintAnimatable', /* @ts-ignore */
3726
3727
  ...(ngDevMode ? [{ debugName: "hintAnimatableRef" }] : /* istanbul ignore next */ []));
3727
- this.support = injectFormSupport();
3728
3728
  this.canAnimate = createCanAnimateSignal();
3729
3729
  effect(() => {
3730
3730
  this.support.errorContent.set(this.errorContentRef());
@@ -3778,6 +3778,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
3778
3778
 
3779
3779
  class RadioGroupComponent {
3780
3780
  constructor() {
3781
+ this.support = injectFormSupport();
3781
3782
  this.errorContentRef = viewChild('errorContent', /* @ts-ignore */
3782
3783
  ...(ngDevMode ? [{ debugName: "errorContentRef" }] : /* istanbul ignore next */ []));
3783
3784
  this.hintContentRef = viewChild('hintContent', /* @ts-ignore */
@@ -3786,7 +3787,6 @@ class RadioGroupComponent {
3786
3787
  ...(ngDevMode ? [{ debugName: "errorAnimatableRef" }] : /* istanbul ignore next */ []));
3787
3788
  this.hintAnimatableRef = viewChild('hintAnimatable', /* @ts-ignore */
3788
3789
  ...(ngDevMode ? [{ debugName: "hintAnimatableRef" }] : /* istanbul ignore next */ []));
3789
- this.support = injectFormSupport();
3790
3790
  this.canAnimate = createCanAnimateSignal();
3791
3791
  effect(() => {
3792
3792
  this.support.errorContent.set(this.errorContentRef());
@@ -3840,6 +3840,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
3840
3840
 
3841
3841
  class SegmentedButtonGroupComponent {
3842
3842
  constructor() {
3843
+ this.support = injectFormSupport();
3843
3844
  this.errorContentRef = viewChild('errorContent', /* @ts-ignore */
3844
3845
  ...(ngDevMode ? [{ debugName: "errorContentRef" }] : /* istanbul ignore next */ []));
3845
3846
  this.hintContentRef = viewChild('hintContent', /* @ts-ignore */
@@ -3848,7 +3849,6 @@ class SegmentedButtonGroupComponent {
3848
3849
  ...(ngDevMode ? [{ debugName: "errorAnimatableRef" }] : /* istanbul ignore next */ []));
3849
3850
  this.hintAnimatableRef = viewChild('hintAnimatable', /* @ts-ignore */
3850
3851
  ...(ngDevMode ? [{ debugName: "hintAnimatableRef" }] : /* istanbul ignore next */ []));
3851
- this.support = injectFormSupport();
3852
3852
  this.canAnimate = createCanAnimateSignal();
3853
3853
  effect(() => {
3854
3854
  this.support.errorContent.set(this.errorContentRef());
@@ -3995,7 +3995,7 @@ const DEFAULT_GRID_CONFIG = {
3995
3995
  registrations: [],
3996
3996
  interactiveAriaLabel: 'Interactive grid layout',
3997
3997
  readonlyAriaLabel: 'Grid layout',
3998
- dragHandleAriaLabel: 'Drag to reorder',
3998
+ removeActionAriaLabel: 'Remove item',
3999
3999
  transformer: (text) => text,
4000
4000
  };
4001
4001
  const [provideGridConfig, injectGridConfig] = createStaticRootProvider(DEFAULT_GRID_CONFIG, {
@@ -4282,6 +4282,25 @@ const deserializeGridLayout = (state, breakpointMinWidths) => {
4282
4282
  return { breakpoints, items, rowHeight: state.rowHeight };
4283
4283
  };
4284
4284
 
4285
+ const GRID_DEBUG_STORAGE_KEY = 'et-grid-debug';
4286
+ let cachedGridDebug = null;
4287
+ const isGridDebugEnabled = () => {
4288
+ if (cachedGridDebug === null) {
4289
+ try {
4290
+ cachedGridDebug = globalThis.localStorage?.getItem(GRID_DEBUG_STORAGE_KEY) === 'true';
4291
+ }
4292
+ catch {
4293
+ cachedGridDebug = false;
4294
+ }
4295
+ }
4296
+ return cachedGridDebug;
4297
+ };
4298
+ const gridDebug = (...args) => {
4299
+ if (!isGridDebugEnabled())
4300
+ return;
4301
+ const timestamp = (globalThis.performance?.now() ?? 0).toFixed(1);
4302
+ console.log(`\x1B[36m[et-grid ${timestamp}ms]\x1B[m`, ...args);
4303
+ };
4285
4304
  const positionsEqual = (a, b) => a.col === b.col && a.row === b.row && a.colSpan === b.colSpan && a.rowSpan === b.rowSpan;
4286
4305
  const layoutsEqual = (a, b) => {
4287
4306
  const aKeys = Object.keys(a);
@@ -4312,6 +4331,8 @@ const resolveItemConstraints = (id, context) => {
4312
4331
  class GridDirective {
4313
4332
  constructor() {
4314
4333
  this.injector = inject(Injector);
4334
+ this.renderer = injectRenderer();
4335
+ this.gridConfig = injectGridConfig();
4315
4336
  this.breakpoints = input(DEFAULT_BREAKPOINTS, /* @ts-ignore */
4316
4337
  ...(ngDevMode ? [{ debugName: "breakpoints" }] : /* istanbul ignore next */ []));
4317
4338
  this.rowHeight = input(100, /* @ts-ignore */
@@ -4322,7 +4343,6 @@ class GridDirective {
4322
4343
  ...(ngDevMode ? [{ debugName: "initialItems" }] : /* istanbul ignore next */ []));
4323
4344
  this.readOnly = input(false, { ...(ngDevMode ? { debugName: "readOnly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4324
4345
  this.layoutChange = output();
4325
- this.gridConfig = injectGridConfig();
4326
4346
  this.registrations = computed(() => this.gridConfig.registrations, /* @ts-ignore */
4327
4347
  ...(ngDevMode ? [{ debugName: "registrations" }] : /* istanbul ignore next */ []));
4328
4348
  this.dimensions = signalHostElementDimensions();
@@ -4336,7 +4356,9 @@ class GridDirective {
4336
4356
  this.resizeBaseLayout = signal(null, /* @ts-ignore */
4337
4357
  ...(ngDevMode ? [{ debugName: "resizeBaseLayout" }] : /* istanbul ignore next */ []));
4338
4358
  this.itemElements = new Map();
4359
+ this.contentElements = new Map();
4339
4360
  this.ghostElement = null;
4361
+ this.lastFlipAt = 0;
4340
4362
  this.rectSnapshot = new Map();
4341
4363
  this.containerWidth = computed(() => this.dimensions().client?.width ?? 0, /* @ts-ignore */
4342
4364
  ...(ngDevMode ? [{ debugName: "containerWidth" }] : /* istanbul ignore next */ []));
@@ -4549,8 +4571,18 @@ class GridDirective {
4549
4571
  }
4550
4572
  unregisterItem(id) {
4551
4573
  this.itemElements.delete(id);
4574
+ this.contentElements.delete(id);
4552
4575
  this.constraintsRegistry.delete(id);
4553
4576
  }
4577
+ /**
4578
+ * The item's inner content wrapper. Used by the counter-scaled resize FLIP so the
4579
+ * box can scale while the content takes the inverse scale and stays undistorted.
4580
+ */
4581
+ registerContentElement(id, el) {
4582
+ if (this.contentElements.get(id) !== el) {
4583
+ this.contentElements.set(id, el);
4584
+ }
4585
+ }
4554
4586
  setGhostElement(el) {
4555
4587
  if (this.ghostElement !== el) {
4556
4588
  this.ghostElement = el;
@@ -4575,51 +4607,116 @@ class GridDirective {
4575
4607
  }
4576
4608
  animateLayoutTransition(options) {
4577
4609
  const excludeIds = options?.excludeIds ?? new Set();
4610
+ const durationMs = options?.durationMs ?? 250;
4578
4611
  const snapshot = new Map(this.rectSnapshot);
4579
4612
  const ghostEl = this.ghostElement;
4613
+ const debug = isGridDebugEnabled();
4614
+ const scheduledAt = debug ? performance.now() : 0;
4580
4615
  afterNextRender(() => {
4616
+ const t0 = debug ? performance.now() : 0;
4617
+ // Phase 1 — read every "from" rect together (no writes in between, so the
4618
+ // browser can serve them from a single layout pass).
4619
+ // - Mid-animation elements: their snapshot (taken a frame earlier) is stale, so
4620
+ // read the actual current on-screen rect and continue from exactly there.
4621
+ // - Otherwise: use the snapshot, which holds the pre-layout-change position.
4622
+ const flips = [];
4581
4623
  for (const [id, el] of this.itemElements) {
4582
4624
  if (excludeIds.has(id))
4583
4625
  continue;
4584
- const oldRect = snapshot.get(id);
4585
- if (!oldRect)
4586
- continue;
4587
- const newRect = el.getBoundingClientRect();
4588
- const dx = oldRect.left - newRect.left;
4589
- const dy = oldRect.top - newRect.top;
4590
- const scaleX = oldRect.width / newRect.width;
4591
- const scaleY = oldRect.height / newRect.height;
4592
- const hasMoved = Math.abs(dx) > 1 || Math.abs(dy) > 1;
4593
- const hasResized = Math.abs(scaleX - 1) > 0.01 || Math.abs(scaleY - 1) > 0.01;
4594
- if (!hasMoved && !hasResized)
4626
+ const running = el.getAnimations();
4627
+ const fromRect = running.length > 0 ? el.getBoundingClientRect() : snapshot.get(id);
4628
+ if (!fromRect)
4595
4629
  continue;
4596
- el.getAnimations().forEach((a) => a.cancel());
4597
- if (hasResized) {
4598
- el.animate([
4599
- { transform: `translate(${dx}px, ${dy}px) scale(${scaleX}, ${scaleY})`, transformOrigin: 'top left' },
4600
- { transform: 'translate(0px, 0px) scale(1, 1)', transformOrigin: 'top left' },
4601
- ], { duration: 250, easing: 'cubic-bezier(0.2, 0, 0, 1)' });
4630
+ flips.push({ el, content: this.contentElements.get(id) ?? null, running, fromRect });
4631
+ }
4632
+ const ghostRunning = ghostEl ? ghostEl.getAnimations() : [];
4633
+ let ghostFrom;
4634
+ if (ghostEl) {
4635
+ ghostFrom = ghostRunning.length > 0 ? ghostEl.getBoundingClientRect() : snapshot.get('__ghost__');
4636
+ }
4637
+ const interrupted = debug ? flips.filter((f) => f.running.length > 0).length : 0;
4638
+ const t1 = debug ? performance.now() : 0;
4639
+ // Phase 2 — cancel all in-flight animations (writes only).
4640
+ for (const flip of flips) {
4641
+ flip.running.forEach((a) => a.cancel());
4642
+ flip.content?.getAnimations().forEach((a) => a.cancel());
4643
+ }
4644
+ ghostRunning.forEach((a) => a.cancel());
4645
+ const t2 = debug ? performance.now() : 0;
4646
+ // Phase 3 — read every target rect together (single layout pass).
4647
+ const targets = flips.map((flip) => flip.el.getBoundingClientRect());
4648
+ const ghostTarget = ghostEl ? ghostEl.getBoundingClientRect() : null;
4649
+ const t3 = debug ? performance.now() : 0;
4650
+ let animated = 0;
4651
+ let maxDx = 0;
4652
+ let maxDy = 0;
4653
+ // Phase 4 — start the animations (writes only).
4654
+ flips.forEach((flip, i) => {
4655
+ const { el, content, fromRect } = flip;
4656
+ const newRect = targets[i];
4657
+ if (!newRect)
4658
+ return;
4659
+ const dx = fromRect.left - newRect.left;
4660
+ const dy = fromRect.top - newRect.top;
4661
+ const scaleX = newRect.width > 0 ? fromRect.width / newRect.width : 1;
4662
+ const scaleY = newRect.height > 0 ? fromRect.height / newRect.height : 1;
4663
+ const moved = Math.abs(dx) > 1 || Math.abs(dy) > 1;
4664
+ const resized = Math.abs(scaleX - 1) > 0.01 || Math.abs(scaleY - 1) > 0.01;
4665
+ if (!moved && !resized)
4666
+ return;
4667
+ if (debug) {
4668
+ animated++;
4669
+ maxDx = Math.max(maxDx, Math.abs(dx));
4670
+ maxDy = Math.max(maxDy, Math.abs(dy));
4671
+ }
4672
+ if (resized) {
4673
+ // Counter-scaled FLIP: the box scales from its old to new size while the
4674
+ // content wrapper takes the inverse scale, so text/children never distort.
4675
+ // Easing is baked into sampled keyframes (played linearly) so the outer and
4676
+ // inner scales multiply to ~1 on every frame, not just at the endpoints.
4677
+ this.animateCounterScaled({ el, content, dx, dy, scaleX, scaleY, durationMs });
4602
4678
  }
4603
4679
  else {
4604
4680
  el.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0px, 0px)' }], {
4605
- duration: 250,
4681
+ duration: durationMs,
4682
+ easing: 'cubic-bezier(0.2, 0, 0, 1)',
4683
+ });
4684
+ }
4685
+ });
4686
+ if (ghostEl && ghostFrom && ghostTarget) {
4687
+ const dx = ghostFrom.left - ghostTarget.left;
4688
+ const dy = ghostFrom.top - ghostTarget.top;
4689
+ if (Math.abs(dx) > 1 || Math.abs(dy) > 1) {
4690
+ ghostEl.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0px, 0px)' }], {
4691
+ duration: 200,
4606
4692
  easing: 'cubic-bezier(0.2, 0, 0, 1)',
4607
4693
  });
4608
4694
  }
4609
4695
  }
4610
- if (ghostEl) {
4611
- const oldRect = snapshot.get('__ghost__');
4612
- if (oldRect) {
4613
- const newRect = ghostEl.getBoundingClientRect();
4614
- const dx = oldRect.left - newRect.left;
4615
- const dy = oldRect.top - newRect.top;
4616
- if (Math.abs(dx) > 1 || Math.abs(dy) > 1) {
4617
- ghostEl.getAnimations().forEach((a) => a.cancel());
4618
- ghostEl.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0px, 0px)' }], {
4619
- duration: 200,
4620
- easing: 'cubic-bezier(0.2, 0, 0, 1)',
4621
- });
4622
- }
4696
+ if (debug) {
4697
+ const t4 = performance.now();
4698
+ const gapSinceLast = this.lastFlipAt ? t0 - this.lastFlipAt : -1;
4699
+ this.lastFlipAt = t0;
4700
+ const round = (n) => Math.round(n * 100) / 100;
4701
+ const info = {
4702
+ items: flips.length,
4703
+ interrupted, // items already mid-animation when this FLIP started
4704
+ animated, // items that actually started a new animation
4705
+ maxDx: round(maxDx),
4706
+ maxDy: round(maxDy),
4707
+ renderDelay: round(t0 - scheduledAt), // schedule → afterNextRender gap
4708
+ readFrom: round(t1 - t0),
4709
+ cancel: round(t2 - t1),
4710
+ readTarget: round(t3 - t2),
4711
+ startAnim: round(t4 - t3),
4712
+ total: round(t4 - t0),
4713
+ gapSinceLast: round(gapSinceLast), // time between consecutive FLIPs
4714
+ };
4715
+ if (info.total > 6 || (gapSinceLast >= 0 && gapSinceLast < 12)) {
4716
+ gridDebug('flip ⚠', info);
4717
+ }
4718
+ else {
4719
+ gridDebug('flip', info);
4623
4720
  }
4624
4721
  }
4625
4722
  }, { injector: this.injector });
@@ -4936,6 +5033,38 @@ class GridDirective {
4936
5033
  emitLayoutChange() {
4937
5034
  this.layoutChange.emit(this.getSerializedState());
4938
5035
  }
5036
+ animateCounterScaled(options) {
5037
+ const { el, content, dx, dy, scaleX, scaleY, durationMs } = options;
5038
+ const steps = 14;
5039
+ const outer = [];
5040
+ const inner = [];
5041
+ for (let i = 0; i <= steps; i++) {
5042
+ const t = i / steps;
5043
+ const eased = 1 - Math.pow(1 - t, 3); // easeOutCubic — matches the translate easing feel
5044
+ const sx = scaleX + (1 - scaleX) * eased;
5045
+ const sy = scaleY + (1 - scaleY) * eased;
5046
+ const tx = dx * (1 - eased);
5047
+ const ty = dy * (1 - eased);
5048
+ outer.push({
5049
+ offset: t,
5050
+ transform: `translate(${tx}px, ${ty}px) scale(${sx}, ${sy})`,
5051
+ transformOrigin: 'top left',
5052
+ });
5053
+ inner.push({ offset: t, transform: `scale(${1 / sx}, ${1 / sy})`, transformOrigin: 'top left' });
5054
+ }
5055
+ // Clip the box for the duration. When the item grows back (scaleX/scaleY < 1) the
5056
+ // content wrapper is counter-scaled UP past the box, and browsers count transformed
5057
+ // descendants in an ancestor's scrollable overflow — so without clipping the content
5058
+ // spills out and flashes scrollbars. overflow:hidden turns it into a clean reveal.
5059
+ // Only counter-scale sets this, and nothing else touches inline overflow, so
5060
+ // restoring to '' (back to the CSS value) on finish/cancel is safe.
5061
+ this.renderer.setStyle(el, { overflow: 'hidden' });
5062
+ const restore = () => this.renderer.removeStyles(el, 'overflow');
5063
+ const outerAnim = el.animate(outer, { duration: durationMs, easing: 'linear' });
5064
+ outerAnim.onfinish = restore;
5065
+ outerAnim.oncancel = restore;
5066
+ content?.animate(inner, { duration: durationMs, easing: 'linear' });
5067
+ }
4939
5068
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4940
5069
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: GridDirective, isStandalone: true, selector: "[etGrid]", inputs: { breakpoints: { classPropertyName: "breakpoints", publicName: "breakpoints", isSignal: true, isRequired: false, transformFunction: null }, rowHeight: { classPropertyName: "rowHeight", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, initialItems: { classPropertyName: "initialItems", publicName: "initialItems", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layoutChange: "layoutChange" }, host: { properties: { "class.et-grid--readonly": "readOnly()" }, classAttribute: "et-grid" }, providers: [{ provide: GRID_TOKEN, useExisting: GridDirective }], exportAs: ["etGrid"], ngImport: i0 }); }
4941
5070
  }
@@ -5049,6 +5178,8 @@ class GridDragDirective {
5049
5178
  ...(ngDevMode ? [{ debugName: "dragStartClient" }] : /* istanbul ignore next */ []));
5050
5179
  this.dragPixelOffset = signal({ x: 0, y: 0 }, /* @ts-ignore */
5051
5180
  ...(ngDevMode ? [{ debugName: "dragPixelOffset" }] : /* istanbul ignore next */ []));
5181
+ this.dragMoveCount = 0;
5182
+ this.lastGhostMoveAt = 0;
5052
5183
  this.dragTransform = computed(() => {
5053
5184
  const offset = this.dragPixelOffset();
5054
5185
  return `translate(${offset.x}px, ${offset.y}px)`;
@@ -5087,20 +5218,37 @@ class GridDragDirective {
5087
5218
  return;
5088
5219
  const newCol = Math.max(0, Math.min(originPos.col + colDelta, columns - originPos.colSpan));
5089
5220
  const newRow = Math.max(0, originPos.row + rowDelta);
5090
- const currentGhost = this.grid.ghostPosition();
5091
- const ghostWillMove = !currentGhost || currentGhost.col !== newCol || currentGhost.row !== newRow;
5092
- if (ghostWillMove) {
5093
- this.grid.snapshotRects();
5094
- }
5221
+ // Gate on whether the RAW target cell changed — not on ghostPosition(), which
5222
+ // is the collision-resolved position. During a swap, resolution relocates the
5223
+ // dragged item so the resolved ghost never equals the raw target, which made
5224
+ // this fire on every pointermove and restart every neighbour's animation ~120×/s
5225
+ // (the chop). layout() is a pure function of targetPosition, so if that cell is
5226
+ // unchanged nothing needs re-animating.
5227
+ const prevTarget = this.grid.dragState()?.targetPosition;
5228
+ const targetChanged = !prevTarget || prevTarget.col !== newCol || prevTarget.row !== newRow;
5229
+ this.dragMoveCount++;
5230
+ if (!targetChanged)
5231
+ return;
5232
+ this.grid.snapshotRects();
5095
5233
  this.grid.updateDragTarget({
5096
5234
  col: newCol,
5097
5235
  row: newRow,
5098
5236
  colSpan: originPos.colSpan,
5099
5237
  rowSpan: originPos.rowSpan,
5100
5238
  });
5101
- if (ghostWillMove) {
5102
- this.grid.animateLayoutTransition({ excludeIds: new Set([this.gridItem.itemId()]) });
5239
+ if (isGridDebugEnabled()) {
5240
+ const now = performance.now();
5241
+ const sinceLast = this.lastGhostMoveAt ? Math.round((now - this.lastGhostMoveAt) * 100) / 100 : -1;
5242
+ gridDebug('ghost→', {
5243
+ col: newCol,
5244
+ row: newRow,
5245
+ movesSinceLastGhostMove: this.dragMoveCount, // raw pointermoves between cell crossings
5246
+ msSinceLastGhostMove: sinceLast,
5247
+ });
5248
+ this.lastGhostMoveAt = now;
5249
+ this.dragMoveCount = 0;
5103
5250
  }
5251
+ this.grid.animateLayoutTransition({ excludeIds: new Set([this.gridItem.itemId()]) });
5104
5252
  }), takeUntilDestroyed())
5105
5253
  .subscribe();
5106
5254
  outputToObservable(this.dragHandle.dragEnded)
@@ -5188,29 +5336,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5188
5336
  }]
5189
5337
  }], ctorParameters: () => [] });
5190
5338
 
5339
+ const GROW_THRESHOLD = 0.25;
5191
5340
  class GridResizeDirective {
5192
5341
  constructor() {
5193
5342
  this.grid = inject(GRID_TOKEN);
5194
5343
  this.gridItem = inject(GridItemDirective);
5344
+ this.injector = inject(Injector);
5345
+ this.elementRef = inject(ElementRef);
5346
+ this.renderer = injectRenderer();
5195
5347
  this.isResizing = signal(false, /* @ts-ignore */
5196
5348
  ...(ngDevMode ? [{ debugName: "isResizing" }] : /* istanbul ignore next */ []));
5197
5349
  this.resizeEdges = computed(() => ['n', 'e', 's', 'w', 'ne', 'nw', 'se', 'sw'], /* @ts-ignore */
5198
5350
  ...(ngDevMode ? [{ debugName: "resizeEdges" }] : /* istanbul ignore next */ []));
5199
5351
  this.resizeStartPos = signal(null, /* @ts-ignore */
5200
5352
  ...(ngDevMode ? [{ debugName: "resizeStartPos" }] : /* istanbul ignore next */ []));
5353
+ this.liftedRect = null;
5354
+ this.lastSnap = null;
5201
5355
  }
5202
5356
  beginResize() {
5203
5357
  if (this.grid.readOnly())
5204
5358
  return;
5205
5359
  const pos = this.gridItem.currentPosition();
5206
- if (pos) {
5207
- this.resizeStartPos.set({ col: pos.col, row: pos.row, colSpan: pos.colSpan, rowSpan: pos.rowSpan });
5208
- this.isResizing.set(true);
5209
- }
5360
+ if (!pos)
5361
+ return;
5362
+ this.resizeStartPos.set({ col: pos.col, row: pos.row, colSpan: pos.colSpan, rowSpan: pos.rowSpan });
5363
+ this.lastSnap = null;
5364
+ this.isResizing.set(true);
5365
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
5366
+ this.liftedRect = { left: rect.left, top: rect.top, width: rect.width, height: rect.height };
5367
+ this.applyFixed(this.liftedRect);
5210
5368
  }
5211
5369
  updateResize(event) {
5212
5370
  const start = this.resizeStartPos();
5213
- if (!start)
5371
+ const startRect = this.liftedRect;
5372
+ if (!start || !startRect)
5214
5373
  return;
5215
5374
  const columns = this.grid.activeColumns();
5216
5375
  const containerWidth = this.grid.containerWidth();
@@ -5218,53 +5377,143 @@ class GridResizeDirective {
5218
5377
  const gap = this.grid.gap();
5219
5378
  const cellWidth = (containerWidth - gap * (columns - 1)) / columns;
5220
5379
  const cellHeight = rowHeight + gap;
5380
+ // 1. Live pixel size — the item follows the pointer 1:1, clamped to the span
5381
+ // constraints in pixels so it can't grow/shrink past its allowed size.
5382
+ const spanWidth = (span) => span * cellWidth + (span - 1) * gap;
5383
+ const spanHeight = (span) => span * rowHeight + (span - 1) * gap;
5384
+ const minW = spanWidth(this.gridItem.minColSpan());
5385
+ const maxW = spanWidth(this.gridItem.maxColSpan());
5386
+ const minH = spanHeight(this.gridItem.minRowSpan());
5387
+ const maxH = spanHeight(this.gridItem.maxRowSpan());
5388
+ const live = { ...startRect };
5389
+ if (event.edge === 'e' || event.edge === 'se' || event.edge === 'ne') {
5390
+ live.width = Math.min(maxW, Math.max(minW, startRect.width + event.dx));
5391
+ }
5392
+ if (event.edge === 'w' || event.edge === 'sw' || event.edge === 'nw') {
5393
+ const rightEdge = startRect.left + startRect.width;
5394
+ live.width = Math.min(maxW, Math.max(minW, startRect.width - event.dx));
5395
+ live.left = rightEdge - live.width;
5396
+ }
5397
+ if (event.edge === 's' || event.edge === 'se' || event.edge === 'sw') {
5398
+ live.height = Math.min(maxH, Math.max(minH, startRect.height + event.dy));
5399
+ }
5400
+ if (event.edge === 'n' || event.edge === 'ne' || event.edge === 'nw') {
5401
+ const bottomEdge = startRect.top + startRect.height;
5402
+ live.height = Math.min(maxH, Math.max(minH, startRect.height - event.dy));
5403
+ live.top = bottomEdge - live.height;
5404
+ }
5405
+ this.applyFixed(live);
5406
+ // liftedRect stays the gesture-start anchor — event.dx/dy are cumulative from start.
5407
+ // 2. Snapped span — drives neighbour reflow. The snap is biased toward the growth
5408
+ // direction (a cell is claimed once the edge is GROW_THRESHOLD into it) so
5409
+ // neighbours slide out of the way early and the growing item barely overlaps them.
5410
+ // growPos: for edges that grow with a positive delta (east/south).
5411
+ // growNeg: for edges that grow with a negative delta (west/north).
5412
+ const growPos = (px, cell) => Math.floor(px / cell + (1 - GROW_THRESHOLD));
5413
+ const growNeg = (px, cell) => Math.ceil(px / cell - (1 - GROW_THRESHOLD));
5221
5414
  let newColSpan = start.colSpan;
5222
5415
  let newRowSpan = start.rowSpan;
5223
5416
  let newCol = start.col;
5224
5417
  let newRow = start.row;
5225
- // East edges: grow/shrink span to the right
5226
5418
  if (event.edge === 'e' || event.edge === 'se' || event.edge === 'ne') {
5227
- newColSpan = Math.max(1, start.colSpan + Math.round(event.dx / cellWidth));
5419
+ newColSpan = Math.max(1, start.colSpan + growPos(event.dx, cellWidth));
5228
5420
  }
5229
- // West edges: move col left and grow span, keeping right edge fixed
5230
5421
  if (event.edge === 'w' || event.edge === 'sw' || event.edge === 'nw') {
5231
5422
  const rightEdge = start.col + start.colSpan;
5232
- const colDelta = Math.round(event.dx / cellWidth);
5233
- newCol = Math.max(0, start.col + colDelta);
5423
+ newCol = Math.max(0, start.col + growNeg(event.dx, cellWidth));
5234
5424
  newColSpan = rightEdge - newCol;
5235
- // Clamp against constraints and recalculate col to keep right edge fixed
5236
5425
  newColSpan = Math.min(this.gridItem.maxColSpan(), Math.max(this.gridItem.minColSpan(), newColSpan));
5237
5426
  newCol = rightEdge - newColSpan;
5238
5427
  }
5239
- // South edges: grow/shrink span downward
5240
5428
  if (event.edge === 's' || event.edge === 'se' || event.edge === 'sw') {
5241
- newRowSpan = Math.max(1, start.rowSpan + Math.round(event.dy / cellHeight));
5429
+ newRowSpan = Math.max(1, start.rowSpan + growPos(event.dy, cellHeight));
5242
5430
  }
5243
- // North edges: move row up and grow span, keeping bottom edge fixed
5244
5431
  if (event.edge === 'n' || event.edge === 'ne' || event.edge === 'nw') {
5245
5432
  const bottomEdge = start.row + start.rowSpan;
5246
- const rowDelta = Math.round(event.dy / cellHeight);
5247
- newRow = Math.max(0, start.row + rowDelta);
5433
+ newRow = Math.max(0, start.row + growNeg(event.dy, cellHeight));
5248
5434
  newRowSpan = bottomEdge - newRow;
5249
- // Clamp against constraints and recalculate row to keep bottom edge fixed
5250
5435
  newRowSpan = Math.min(this.gridItem.maxRowSpan(), Math.max(this.gridItem.minRowSpan(), newRowSpan));
5251
5436
  newRow = bottomEdge - newRowSpan;
5252
5437
  }
5253
- const currentPos = this.gridItem.currentPosition();
5254
- if (currentPos &&
5255
- currentPos.colSpan === newColSpan &&
5256
- currentPos.rowSpan === newRowSpan &&
5257
- currentPos.col === newCol &&
5258
- currentPos.row === newRow)
5438
+ // Gate on the raw snapped target changing — not on the resized item's resolved
5439
+ // position (which compaction can shift), so we don't re-run the reflow and restart
5440
+ // every neighbour's animation on every pointermove.
5441
+ if (this.lastSnap &&
5442
+ this.lastSnap.colSpan === newColSpan &&
5443
+ this.lastSnap.rowSpan === newRowSpan &&
5444
+ this.lastSnap.col === newCol &&
5445
+ this.lastSnap.row === newRow)
5259
5446
  return;
5447
+ this.lastSnap = { col: newCol, row: newRow, colSpan: newColSpan, rowSpan: newRowSpan };
5448
+ // The snapped span crossed into a new cell: reflow the neighbours. The resized
5449
+ // item is excluded from the FLIP because its own fixed element drives the size.
5450
+ // A shorter duration than a drag keeps pushed neighbours tracking the live-resizing
5451
+ // edge closely during a fast resize, instead of trailing it with a long glide.
5260
5452
  this.grid.snapshotRects();
5261
5453
  this.grid.resizeItem({ id: this.gridItem.itemId(), newColSpan, newRowSpan, newCol, newRow });
5262
- this.grid.animateLayoutTransition({ scaleIds: new Set([this.gridItem.itemId()]) });
5454
+ this.grid.animateLayoutTransition({ excludeIds: new Set([this.gridItem.itemId()]), durationMs: 160 });
5263
5455
  }
5264
5456
  finishResize() {
5265
5457
  this.resizeStartPos.set(null);
5458
+ this.lastSnap = null;
5266
5459
  this.isResizing.set(false);
5267
5460
  this.grid.commitResize();
5461
+ const liveRect = this.liftedRect ? this.currentFixedRect() : null;
5462
+ this.liftedRect = null;
5463
+ if (!liveRect) {
5464
+ this.releaseFixed();
5465
+ return;
5466
+ }
5467
+ // Settle: drop back into grid flow, measure the final slot, then animate the
5468
+ // fixed element from its free pixel rect to that slot. Real width/height/left/top
5469
+ // are animated (never scale) so the content stays crisp during the settle.
5470
+ afterNextRender(() => {
5471
+ const el = this.elementRef.nativeElement;
5472
+ this.releaseFixed();
5473
+ const finalRect = el.getBoundingClientRect();
5474
+ this.applyFixed({ left: finalRect.left, top: finalRect.top, width: finalRect.width, height: finalRect.height });
5475
+ el.getAnimations().forEach((a) => a.cancel());
5476
+ const moved = Math.abs(liveRect.left - finalRect.left) > 1 || Math.abs(liveRect.top - finalRect.top) > 1;
5477
+ const resized = Math.abs(liveRect.width - finalRect.width) > 1 || Math.abs(liveRect.height - finalRect.height) > 1;
5478
+ const release = () => this.releaseFixed();
5479
+ if (!moved && !resized) {
5480
+ release();
5481
+ return;
5482
+ }
5483
+ const anim = el.animate([
5484
+ {
5485
+ left: `${liveRect.left}px`,
5486
+ top: `${liveRect.top}px`,
5487
+ width: `${liveRect.width}px`,
5488
+ height: `${liveRect.height}px`,
5489
+ },
5490
+ {
5491
+ left: `${finalRect.left}px`,
5492
+ top: `${finalRect.top}px`,
5493
+ width: `${finalRect.width}px`,
5494
+ height: `${finalRect.height}px`,
5495
+ },
5496
+ ], { duration: 250, easing: 'cubic-bezier(0.2, 0, 0, 1)' });
5497
+ anim.onfinish = release;
5498
+ anim.oncancel = release;
5499
+ }, { injector: this.injector });
5500
+ }
5501
+ currentFixedRect() {
5502
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
5503
+ return { left: rect.left, top: rect.top, width: rect.width, height: rect.height };
5504
+ }
5505
+ applyFixed(rect) {
5506
+ this.renderer.setStyle(this.elementRef.nativeElement, {
5507
+ position: 'fixed',
5508
+ left: `${rect.left}px`,
5509
+ top: `${rect.top}px`,
5510
+ width: `${rect.width}px`,
5511
+ height: `${rect.height}px`,
5512
+ zIndex: '100',
5513
+ });
5514
+ }
5515
+ releaseFixed() {
5516
+ this.renderer.removeStyles(this.elementRef.nativeElement, 'position', 'left', 'top', 'width', 'height', 'zIndex');
5268
5517
  }
5269
5518
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridResizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5270
5519
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.5", type: GridResizeDirective, isStandalone: true, selector: "[etGridResize]", host: { properties: { "class.et-grid-resize--active": "isResizing()" }, classAttribute: "et-grid-resize" }, ngImport: i0 }); }
@@ -5306,6 +5555,67 @@ const fromGridPosition = (pos) => ({
5306
5555
  rows: pos.rowSpan,
5307
5556
  });
5308
5557
 
5558
+ class GridItemToolbarComponent {
5559
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridItemToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5560
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: GridItemToolbarComponent, isStandalone: true, selector: "et-grid-item-toolbar, [et-grid-item-toolbar]", host: { listeners: { "pointerdown": "$event.stopPropagation()" }, classAttribute: "et-grid-item-toolbar" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [".et-grid-item-toolbar{display:inline-flex;align-items:center;gap:var(--et-grid-item-toolbar-gap, 4px);padding:var(--et-grid-item-toolbar-padding, 4px);border-radius:var(--et-grid-item-toolbar-radius, 8px);background:var(--et-grid-item-toolbar-background, transparent)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5561
+ }
5562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridItemToolbarComponent, decorators: [{
5563
+ type: Component,
5564
+ args: [{ selector: 'et-grid-item-toolbar, [et-grid-item-toolbar]', template: `<ng-content />`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
5565
+ class: 'et-grid-item-toolbar',
5566
+ '(pointerdown)': '$event.stopPropagation()',
5567
+ }, styles: [".et-grid-item-toolbar{display:inline-flex;align-items:center;gap:var(--et-grid-item-toolbar-gap, 4px);padding:var(--et-grid-item-toolbar-padding, 4px);border-radius:var(--et-grid-item-toolbar-radius, 8px);background:var(--et-grid-item-toolbar-background, transparent)}\n"] }]
5568
+ }] });
5569
+
5570
+ class GridItemDefaultActionsComponent {
5571
+ constructor() {
5572
+ this.grid = inject(GRID_TOKEN);
5573
+ this.gridConfig = injectGridConfig();
5574
+ this.locale = injectLocale();
5575
+ this.itemId = input.required(/* @ts-ignore */
5576
+ ...(ngDevMode ? [{ debugName: "itemId" }] : /* istanbul ignore next */ []));
5577
+ this.data = input(/* @ts-ignore */
5578
+ ...(ngDevMode ? [undefined, { debugName: "data" }] : /* istanbul ignore next */ []));
5579
+ this.removeAriaLabel = computed(() => this.gridConfig.transformer(this.gridConfig.removeActionAriaLabel, this.locale.currentLocale()), /* @ts-ignore */
5580
+ ...(ngDevMode ? [{ debugName: "removeAriaLabel" }] : /* istanbul ignore next */ []));
5581
+ }
5582
+ remove() {
5583
+ this.grid.removeItem(this.itemId());
5584
+ }
5585
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridItemDefaultActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5586
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: GridItemDefaultActionsComponent, isStandalone: true, selector: "et-grid-item-default-actions", inputs: { itemId: { classPropertyName: "itemId", publicName: "itemId", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideIcons(TIMES_ICON)], ngImport: i0, template: `
5587
+ <et-grid-item-toolbar>
5588
+ <button
5589
+ [attr.aria-label]="removeAriaLabel()"
5590
+ (click)="remove()"
5591
+ class="et-grid-item-default-actions__remove"
5592
+ et-icon-button
5593
+ size="xs"
5594
+ type="button"
5595
+ >
5596
+ <i etIcon="et-times"></i>
5597
+ </button>
5598
+ </et-grid-item-toolbar>
5599
+ `, isInline: true, styles: ["et-grid-item-default-actions .et-grid-item-default-actions__remove{color:rgb(var(--et-surface-color-muted))}et-grid-item-default-actions .et-grid-item-default-actions__remove:hover{color:rgb(var(--et-surface-color))}\n"], dependencies: [{ kind: "component", type: GridItemToolbarComponent, selector: "et-grid-item-toolbar, [et-grid-item-toolbar]" }, { kind: "component", type: IconButtonComponent, selector: "[et-icon-button]", inputs: ["variant", "size"] }, { kind: "directive", type: IconDirective, selector: "[etIcon]", inputs: ["etIcon", "allowHardcodedColor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5600
+ }
5601
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridItemDefaultActionsComponent, decorators: [{
5602
+ type: Component,
5603
+ args: [{ selector: 'et-grid-item-default-actions', template: `
5604
+ <et-grid-item-toolbar>
5605
+ <button
5606
+ [attr.aria-label]="removeAriaLabel()"
5607
+ (click)="remove()"
5608
+ class="et-grid-item-default-actions__remove"
5609
+ et-icon-button
5610
+ size="xs"
5611
+ type="button"
5612
+ >
5613
+ <i etIcon="et-times"></i>
5614
+ </button>
5615
+ </et-grid-item-toolbar>
5616
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [GridItemToolbarComponent, IconButtonComponent, ...ICON_IMPORTS], providers: [provideIcons(TIMES_ICON)], styles: ["et-grid-item-default-actions .et-grid-item-default-actions__remove{color:rgb(var(--et-surface-color-muted))}et-grid-item-default-actions .et-grid-item-default-actions__remove:hover{color:rgb(var(--et-surface-color))}\n"] }]
5617
+ }], propDecorators: { itemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemId", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
5618
+
5309
5619
  class GridItemComponent {
5310
5620
  constructor() {
5311
5621
  this.grid = inject(GRID_TOKEN);
@@ -5314,16 +5624,14 @@ class GridItemComponent {
5314
5624
  this.parentSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
5315
5625
  this.gridDrag = inject(GridDragDirective);
5316
5626
  this.gridResize = inject(GridResizeDirective);
5627
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
5317
5628
  this.ariaLabel = input('Grid item', /* @ts-ignore */
5318
5629
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
5319
5630
  this.removed = output();
5320
- this.surfaceThemes = injectSurfaceThemes({ optional: true });
5321
- this.gridConfig = injectGridConfig();
5322
- this.locale = injectLocale();
5631
+ this.itemContent = viewChild('itemContent', /* @ts-ignore */
5632
+ ...(ngDevMode ? [{ debugName: "itemContent" }] : /* istanbul ignore next */ []));
5323
5633
  this.isReadOnly = computed(() => this.grid.readOnly(), /* @ts-ignore */
5324
5634
  ...(ngDevMode ? [{ debugName: "isReadOnly" }] : /* istanbul ignore next */ []));
5325
- this.dragHandleAriaLabel = computed(() => this.gridConfig.transformer(this.gridConfig.dragHandleAriaLabel, this.locale.currentLocale()), /* @ts-ignore */
5326
- ...(ngDevMode ? [{ debugName: "dragHandleAriaLabel" }] : /* istanbul ignore next */ []));
5327
5635
  this.resolvedSurface = computed(() => {
5328
5636
  const themes = this.surfaceThemes;
5329
5637
  const parent = this.parentSurfaceProvider;
@@ -5341,6 +5649,17 @@ class GridItemComponent {
5341
5649
  this.provideSurface.clearForcedSurface();
5342
5650
  }
5343
5651
  });
5652
+ effect(() => {
5653
+ const el = this.itemContent()?.nativeElement;
5654
+ if (el) {
5655
+ this.grid.registerContentElement(this.gridItem.itemId(), el);
5656
+ }
5657
+ });
5658
+ }
5659
+ blockPointerDownWhenReadOnly(event) {
5660
+ if (this.isReadOnly()) {
5661
+ event.stopPropagation();
5662
+ }
5344
5663
  }
5345
5664
  applyKeyboardShortcut(event) {
5346
5665
  if (this.isReadOnly())
@@ -5374,6 +5693,7 @@ class GridItemComponent {
5374
5693
  }
5375
5694
  if (event.shiftKey) {
5376
5695
  let handled = true;
5696
+ this.grid.snapshotRects();
5377
5697
  switch (event.key) {
5378
5698
  case 'ArrowRight':
5379
5699
  this.grid.resizeItem({ id: this.gridItem.itemId(), newColSpan: pos.colSpan + 1, newRowSpan: pos.rowSpan });
@@ -5391,9 +5711,16 @@ class GridItemComponent {
5391
5711
  handled = false;
5392
5712
  }
5393
5713
  if (handled) {
5714
+ // Discrete keyboard step: animate the neighbours (translate-only) and commit
5715
+ // so the resize base doesn't carry over into the next keypress or gesture.
5716
+ this.grid.animateLayoutTransition({ excludeIds: new Set([this.gridItem.itemId()]) });
5717
+ this.grid.commitResize();
5394
5718
  event.preventDefault();
5395
5719
  event.stopPropagation();
5396
5720
  }
5721
+ else {
5722
+ this.grid.commitResize();
5723
+ }
5397
5724
  }
5398
5725
  if (event.key === 'Delete' || event.key === 'Backspace') {
5399
5726
  if (event.ctrlKey || event.metaKey) {
@@ -5404,12 +5731,8 @@ class GridItemComponent {
5404
5731
  }
5405
5732
  }
5406
5733
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5407
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: GridItemComponent, isStandalone: true, selector: "et-grid-item, [et-grid-item]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { listeners: { "keydown": "applyKeyboardShortcut($event)" }, properties: { "class.et-grid-item--dragging": "!isReadOnly() && gridDrag.dragHandle.isDragging()", "class.et-grid-item--resizing": "gridResize.isResizing()", "attr.role": "\"group\"", "attr.aria-label": "ariaLabel()", "attr.tabindex": "\"0\"" }, classAttribute: "et-grid-item" }, hostDirectives: [{ directive: GridItemDirective, inputs: ["itemId", "itemId", "minColSpan", "minColSpan", "maxColSpan", "maxColSpan", "minRowSpan", "minRowSpan", "maxRowSpan", "maxRowSpan"] }, { directive: GridDragDirective }, { directive: GridResizeDirective }, { directive: i1.ProvideSurfaceDirective }], ngImport: i0, template: `
5408
- <div [attr.aria-label]="dragHandleAriaLabel()" class="et-grid-item__drag-handle">
5409
- <ng-content select="[etGridItemDragHandle]" />
5410
- </div>
5411
-
5412
- <div (pointerdown)="$event.stopPropagation()" class="et-grid-item__content">
5734
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.5", type: GridItemComponent, isStandalone: true, selector: "et-grid-item, [et-grid-item]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { listeners: { "keydown": "applyKeyboardShortcut($event)" }, properties: { "class.et-grid-item--dragging": "!isReadOnly() && gridDrag.dragHandle.isDragging()", "class.et-grid-item--resizing": "gridResize.isResizing()", "attr.role": "\"group\"", "attr.aria-label": "ariaLabel()", "attr.tabindex": "\"0\"" }, classAttribute: "et-grid-item" }, viewQueries: [{ propertyName: "itemContent", first: true, predicate: ["itemContent"], descendants: true, isSignal: true }], hostDirectives: [{ directive: GridItemDirective, inputs: ["itemId", "itemId", "minColSpan", "minColSpan", "maxColSpan", "maxColSpan", "minRowSpan", "minRowSpan", "maxRowSpan", "maxRowSpan"] }, { directive: GridDragDirective }, { directive: GridResizeDirective }, { directive: i1.ProvideSurfaceDirective }], ngImport: i0, template: `
5735
+ <div #itemContent (pointerdown)="blockPointerDownWhenReadOnly($event)" class="et-grid-item__content">
5413
5736
  <ng-content />
5414
5737
  </div>
5415
5738
 
@@ -5425,16 +5748,12 @@ class GridItemComponent {
5425
5748
  <div (pointerdown)="$event.stopPropagation()" class="et-grid-item__actions">
5426
5749
  <ng-content select="[etGridItemAction]" />
5427
5750
  </div>
5428
- `, isInline: true, styles: [".et-grid-item{position:relative;display:flex;flex-direction:column;outline:none;will-change:transform;border-radius:var(--et-grid-item-radius, 0);background:var(--et-grid-item-bg, var(--et-surface-background-solid))}.et-grid-item:is(.et-grid-item--dragging){z-index:100;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:var(--et-grid-item-resize-handle-color, var(--et-surface-color-solid));opacity:.2}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{cursor:grab;display:flex;align-items:center;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"], dependencies: [{ kind: "component", type: ResizeHandlesComponent, selector: "et-resize-handles", inputs: ["edges", "disabled"], outputs: ["resizeStarted", "resizeMoved", "resizeEnded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5751
+ `, isInline: true, styles: [".et-grid-item{position:relative;display:flex;flex-direction:column;outline:none;will-change:transform;border-radius:var(--et-grid-item-radius, 0);background:var(--et-grid-item-bg, var(--et-surface-background-solid))}.et-grid-item:is(.et-grid-item--dragging){z-index:100;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:var(--et-grid-item-resize-handle-color, var(--et-surface-color-solid));opacity:.2}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__content{flex:1;min-height:0}.et-grid:not(.et-grid--readonly) .et-grid-item__content{cursor:grab}.et-grid-item--dragging .et-grid-item__content{cursor:grabbing}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"], dependencies: [{ kind: "component", type: ResizeHandlesComponent, selector: "et-resize-handles", inputs: ["edges", "disabled"], outputs: ["resizeStarted", "resizeMoved", "resizeEnded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5429
5752
  }
5430
5753
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridItemComponent, decorators: [{
5431
5754
  type: Component,
5432
5755
  args: [{ selector: 'et-grid-item, [et-grid-item]', template: `
5433
- <div [attr.aria-label]="dragHandleAriaLabel()" class="et-grid-item__drag-handle">
5434
- <ng-content select="[etGridItemDragHandle]" />
5435
- </div>
5436
-
5437
- <div (pointerdown)="$event.stopPropagation()" class="et-grid-item__content">
5756
+ <div #itemContent (pointerdown)="blockPointerDownWhenReadOnly($event)" class="et-grid-item__content">
5438
5757
  <ng-content />
5439
5758
  </div>
5440
5759
 
@@ -5466,21 +5785,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5466
5785
  '[attr.aria-label]': 'ariaLabel()',
5467
5786
  '[attr.tabindex]': '"0"',
5468
5787
  '(keydown)': 'applyKeyboardShortcut($event)',
5469
- }, styles: [".et-grid-item{position:relative;display:flex;flex-direction:column;outline:none;will-change:transform;border-radius:var(--et-grid-item-radius, 0);background:var(--et-grid-item-bg, var(--et-surface-background-solid))}.et-grid-item:is(.et-grid-item--dragging){z-index:100;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:var(--et-grid-item-resize-handle-color, var(--et-surface-color-solid));opacity:.2}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__drag-handle{cursor:grab;display:flex;align-items:center;-webkit-user-select:none;user-select:none;touch-action:none}.et-grid-item--dragging .et-grid-item__drag-handle{cursor:grabbing}.et-grid-item__content{flex:1;min-height:0}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"] }]
5470
- }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
5788
+ }, styles: [".et-grid-item{position:relative;display:flex;flex-direction:column;outline:none;will-change:transform;border-radius:var(--et-grid-item-radius, 0);background:var(--et-grid-item-bg, var(--et-surface-background-solid))}.et-grid-item:is(.et-grid-item--dragging){z-index:100;cursor:grabbing;-webkit-user-select:none;user-select:none}.et-grid-item:is(.et-grid-item--resizing){z-index:100;-webkit-user-select:none;user-select:none}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--nw:after{content:\"\";position:absolute;border-radius:2px;background:var(--et-grid-item-resize-handle-color, var(--et-surface-color-solid));opacity:.2}.et-grid-item:hover .et-resize-handle--e:after,.et-grid-item--resizing .et-resize-handle--e:after{right:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--w:after,.et-grid-item--resizing .et-resize-handle--w:after{left:2px;top:50%;transform:translateY(-50%);width:3px;height:24px}.et-grid-item:hover .et-resize-handle--s:after,.et-grid-item--resizing .et-resize-handle--s:after{bottom:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--n:after,.et-grid-item--resizing .et-resize-handle--n:after{top:2px;left:50%;transform:translate(-50%);height:3px;width:24px}.et-grid-item:hover .et-resize-handle--se:after,.et-grid-item--resizing .et-resize-handle--se:after{bottom:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--sw:after,.et-grid-item--resizing .et-resize-handle--sw:after{bottom:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--ne:after,.et-grid-item--resizing .et-resize-handle--ne:after{top:3px;right:3px;width:8px;height:8px;border-radius:1px}.et-grid-item:hover .et-resize-handle--nw:after,.et-grid-item--resizing .et-resize-handle--nw:after{top:3px;left:3px;width:8px;height:8px;border-radius:1px}.et-grid-item__content{flex:1;min-height:0}.et-grid:not(.et-grid--readonly) .et-grid-item__content{cursor:grab}.et-grid-item--dragging .et-grid-item__content{cursor:grabbing}.et-grid-item__actions{position:absolute;top:4px;right:4px;display:flex;gap:4px}\n"] }]
5789
+ }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }], itemContent: [{ type: i0.ViewChild, args: ['itemContent', { isSignal: true }] }] } });
5471
5790
 
5472
5791
  class GridComponent {
5473
5792
  constructor() {
5474
5793
  this.grid = inject(GridDirective);
5475
- this.ghostRef = viewChild('ghostRef', /* @ts-ignore */
5476
- ...(ngDevMode ? [{ debugName: "ghostRef" }] : /* istanbul ignore next */ []));
5477
5794
  this.gridConfig = injectGridConfig();
5478
5795
  this.locale = injectLocale();
5479
- this.isReadOnly = computed(() => this.grid.readOnly(), /* @ts-ignore */
5480
- ...(ngDevMode ? [{ debugName: "isReadOnly" }] : /* istanbul ignore next */ []));
5481
- this.dragHandleComponent = computed(() => this.gridConfig.dragHandleComponent, /* @ts-ignore */
5482
- ...(ngDevMode ? [{ debugName: "dragHandleComponent" }] : /* istanbul ignore next */ []));
5483
- this.actionsComponent = computed(() => this.gridConfig.actionsComponent, /* @ts-ignore */
5796
+ this.ghostRef = viewChild('ghostRef', /* @ts-ignore */
5797
+ ...(ngDevMode ? [{ debugName: "ghostRef" }] : /* istanbul ignore next */ []));
5798
+ this.actionsComponent = computed(() => {
5799
+ const configured = this.gridConfig.actionsComponent;
5800
+ return configured === undefined ? GridItemDefaultActionsComponent : configured;
5801
+ }, /* @ts-ignore */
5484
5802
  ...(ngDevMode ? [{ debugName: "actionsComponent" }] : /* istanbul ignore next */ []));
5485
5803
  this.registeredItems = computed(() => {
5486
5804
  const registrations = this.gridConfig.registrations;
@@ -5506,7 +5824,7 @@ class GridComponent {
5506
5824
  });
5507
5825
  }
5508
5826
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5509
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: GridComponent, isStandalone: true, selector: "et-grid, [et-grid]", host: { attributes: { "role": "region" }, properties: { "attr.aria-label": "ariaLabel()", "style.--_et-grid-columns": "gridColumns()", "style.--et-grid-gap": "gridGap()", "style.--et-grid-row-height": "gridRowHeight()" }, classAttribute: "et-grid" }, viewQueries: [{ propertyName: "ghostRef", first: true, predicate: ["ghostRef"], descendants: true, isSignal: true }], hostDirectives: [{ directive: GridDirective, inputs: ["breakpoints", "breakpoints", "rowHeight", "rowHeight", "gap", "gap", "initialItems", "initialItems", "readOnly", "readOnly"], outputs: ["layoutChange", "layoutChange"] }], ngImport: i0, template: `
5827
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: GridComponent, isStandalone: true, selector: "et-grid, [et-grid]", host: { attributes: { "role": "region" }, properties: { "class.et-grid--readonly": "grid.readOnly()", "attr.aria-label": "ariaLabel()", "style.--_et-grid-columns": "gridColumns()", "style.--et-grid-gap": "gridGap()", "style.--et-grid-row-height": "gridRowHeight()" }, classAttribute: "et-grid" }, viewQueries: [{ propertyName: "ghostRef", first: true, predicate: ["ghostRef"], descendants: true, isSignal: true }], hostDirectives: [{ directive: GridDirective, inputs: ["breakpoints", "breakpoints", "rowHeight", "rowHeight", "gap", "gap", "initialItems", "initialItems", "readOnly", "readOnly"], outputs: ["layoutChange", "layoutChange"] }], ngImport: i0, template: `
5510
5828
  @for (entry of registeredItems(); track entry.item.id) {
5511
5829
  <et-grid-item
5512
5830
  [itemId]="entry.item.id"
@@ -5515,16 +5833,6 @@ class GridComponent {
5515
5833
  [minRowSpan]="entry.reg.constraints?.minRowSpan ?? 1"
5516
5834
  [maxRowSpan]="entry.reg.constraints?.maxRowSpan ?? 4"
5517
5835
  >
5518
- @if (dragHandleComponent()) {
5519
- <div etGridItemDragHandle>
5520
- <ng-container
5521
- [ngComponentOutlet]="dragHandleComponent()!"
5522
- [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5523
- />
5524
- </div>
5525
- } @else {
5526
- <div etGridItemDragHandle></div>
5527
- }
5528
5836
  <ng-container [ngComponentOutlet]="entry.reg.component" [ngComponentOutletInputs]="{ data: entry.item.data }" />
5529
5837
  @if (actionsComponent()) {
5530
5838
  <div etGridItemAction>
@@ -5533,8 +5841,6 @@ class GridComponent {
5533
5841
  [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5534
5842
  />
5535
5843
  </div>
5536
- } @else if (!isReadOnly()) {
5537
- <button (click)="grid.removeItem(entry.item.id)" etGridItemAction>✕</button>
5538
5844
  }
5539
5845
  </et-grid-item>
5540
5846
  }
@@ -5547,7 +5853,7 @@ class GridComponent {
5547
5853
  class="et-grid-ghost"
5548
5854
  ></div>
5549
5855
  }
5550
- `, isInline: true, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__drag-handle{cursor:default;pointer-events:none}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"], dependencies: [{ kind: "component", type: GridItemComponent, selector: "et-grid-item, [et-grid-item]", inputs: ["ariaLabel"], outputs: ["removed"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5856
+ `, isInline: true, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"], dependencies: [{ kind: "component", type: GridItemComponent, selector: "et-grid-item, [et-grid-item]", inputs: ["ariaLabel"], outputs: ["removed"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5551
5857
  }
5552
5858
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GridComponent, decorators: [{
5553
5859
  type: Component,
@@ -5560,16 +5866,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5560
5866
  [minRowSpan]="entry.reg.constraints?.minRowSpan ?? 1"
5561
5867
  [maxRowSpan]="entry.reg.constraints?.maxRowSpan ?? 4"
5562
5868
  >
5563
- @if (dragHandleComponent()) {
5564
- <div etGridItemDragHandle>
5565
- <ng-container
5566
- [ngComponentOutlet]="dragHandleComponent()!"
5567
- [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5568
- />
5569
- </div>
5570
- } @else {
5571
- <div etGridItemDragHandle></div>
5572
- }
5573
5869
  <ng-container [ngComponentOutlet]="entry.reg.component" [ngComponentOutletInputs]="{ data: entry.item.data }" />
5574
5870
  @if (actionsComponent()) {
5575
5871
  <div etGridItemAction>
@@ -5578,8 +5874,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5578
5874
  [ngComponentOutletInputs]="{ data: entry.item.data, itemId: entry.item.id }"
5579
5875
  />
5580
5876
  </div>
5581
- } @else if (!isReadOnly()) {
5582
- <button (click)="grid.removeItem(entry.item.id)" etGridItemAction>✕</button>
5583
5877
  }
5584
5878
  </et-grid-item>
5585
5879
  }
@@ -5601,11 +5895,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5601
5895
  ], host: {
5602
5896
  class: 'et-grid',
5603
5897
  role: 'region',
5898
+ '[class.et-grid--readonly]': 'grid.readOnly()',
5604
5899
  '[attr.aria-label]': 'ariaLabel()',
5605
5900
  '[style.--_et-grid-columns]': 'gridColumns()',
5606
5901
  '[style.--et-grid-gap]': 'gridGap()',
5607
5902
  '[style.--et-grid-row-height]': 'gridRowHeight()',
5608
- }, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__drag-handle{cursor:default;pointer-events:none}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"] }]
5903
+ }, styles: ["@property --et-grid-gap{syntax: \"<length>\"; inherits: false; initial-value: 16px;}@property --et-grid-row-height{syntax: \"<length>\"; inherits: false; initial-value: 100px;}@property --et-grid-padding{syntax: \"<length>\"; inherits: false; initial-value: 0px;}.et-grid{display:grid;grid-template-columns:repeat(var(--_et-grid-columns, 12),1fr);grid-auto-rows:var(--et-grid-row-height);gap:var(--et-grid-gap);padding:var(--et-grid-padding);position:relative;min-height:0}.et-grid:has(.et-grid-item--dragging,.et-grid-item--resizing){-webkit-user-select:none;user-select:none;cursor:grabbing}.et-grid:has(.et-grid-item--resizing){cursor:nwse-resize}.et-grid-ghost{border-radius:8px;background:rgb(var(--et-surface-color, 23 23 23) / .08);border:2px dashed rgb(var(--et-surface-color, 23 23 23) / .2);pointer-events:none;transition:grid-column 0s,grid-row 0s}.et-grid--readonly .et-grid-item__actions{display:none}.et-grid--readonly .et-grid-item:hover .et-resize-handle--e:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--s:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--w:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--n:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--se:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--sw:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--ne:after,.et-grid--readonly .et-grid-item:hover .et-resize-handle--nw:after{content:unset}\n"] }]
5609
5904
  }], ctorParameters: () => [], propDecorators: { ghostRef: [{ type: i0.ViewChild, args: ['ghostRef', { isSignal: true }] }] } });
5610
5905
 
5611
5906
  const posEq = (a, b) => {
@@ -5947,7 +6242,13 @@ const GRID_ERROR_CODES = {
5947
6242
  INVALID_LAYOUT_STATE: 1903,
5948
6243
  };
5949
6244
 
5950
- const GridImports = [GridComponent, GridItemComponent, GridDebugComponent];
6245
+ const GridImports = [
6246
+ GridComponent,
6247
+ GridItemComponent,
6248
+ GridItemToolbarComponent,
6249
+ GridItemDefaultActionsComponent,
6250
+ GridDebugComponent,
6251
+ ];
5951
6252
 
5952
6253
  const NOTIFICATION_ERROR_CODES = {
5953
6254
  ACTION_OUTSIDE_NOTIFICATION: 1700,
@@ -6663,6 +6964,10 @@ class OverlayContainerComponent {
6663
6964
  this.destroyRef = inject(DestroyRef);
6664
6965
  this.elementRef = inject(ElementRef);
6665
6966
  this.overlayRef = inject(OVERLAY_REF);
6967
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
6968
+ this.surfaceContextTracker = injectSurfaceContextTracker();
6969
+ this.renderer = injectRenderer();
6970
+ this.rootBoundary = injectBoundaryElement();
6666
6971
  this.component = input.required(/* @ts-ignore */
6667
6972
  ...(ngDevMode ? [{ debugName: "component" }] : /* istanbul ignore next */ []));
6668
6973
  this.componentInputs = input(undefined, /* @ts-ignore */
@@ -6672,10 +6977,6 @@ class OverlayContainerComponent {
6672
6977
  this.renderArrow = input(false, /* @ts-ignore */
6673
6978
  ...(ngDevMode ? [{ debugName: "renderArrow" }] : /* istanbul ignore next */ []));
6674
6979
  this.contentOutlet = viewChild.required('contentOutlet', { read: ViewContainerRef });
6675
- this.surfaceThemes = injectSurfaceThemes({ optional: true });
6676
- this.surfaceContextTracker = injectSurfaceContextTracker();
6677
- this.renderer = injectRenderer();
6678
- this.rootBoundary = injectBoundaryElement();
6679
6980
  this.animatedLifecycle = signal(inject(ANIMATED_LIFECYCLE_TOKEN), /* @ts-ignore */
6680
6981
  ...(ngDevMode ? [{ debugName: "animatedLifecycle" }] : /* istanbul ignore next */ []));
6681
6982
  this.contentComponentRef = signal(null, /* @ts-ignore */
@@ -8464,6 +8765,7 @@ const topSheetOverlayStrategy = (config = {}) => {
8464
8765
  class OverlayDirective {
8465
8766
  constructor() {
8466
8767
  this.destroyRef = inject(DestroyRef);
8768
+ this.overlayManager = injectOverlayManager();
8467
8769
  this.mode = input('non-modal', /* @ts-ignore */
8468
8770
  ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
8469
8771
  this.role = input(undefined, /* @ts-ignore */
@@ -8508,7 +8810,6 @@ class OverlayDirective {
8508
8810
  ...(ngDevMode ? [{ debugName: "autoCloseIfReferenceHidden" }] : /* istanbul ignore next */ []));
8509
8811
  this.mirrorWidth = input(false, /* @ts-ignore */
8510
8812
  ...(ngDevMode ? [{ debugName: "mirrorWidth" }] : /* istanbul ignore next */ []));
8511
- this.overlayManager = injectOverlayManager();
8512
8813
  /** @internal */
8513
8814
  this.registeredAnchor = signal(null, /* @ts-ignore */
8514
8815
  ...(ngDevMode ? [{ debugName: "registeredAnchor" }] : /* istanbul ignore next */ []));
@@ -8778,9 +9079,9 @@ class OverlayBodyComponent {
8778
9079
  this.overlayRef = inject(OVERLAY_REF, { optional: true });
8779
9080
  this.elementRef = inject(ElementRef);
8780
9081
  this.scrollObserver = inject(ScrollObserverDirective);
9082
+ this.overlayManager = injectOverlayManager();
8781
9083
  this.dividers = input(false, /* @ts-ignore */
8782
9084
  ...(ngDevMode ? [{ debugName: "dividers" }] : /* istanbul ignore next */ []));
8783
- this.overlayManager = injectOverlayManager();
8784
9085
  this.dividersEnabled = computed(() => this.dividers() === 'dynamic' || this.dividers() === 'static', /* @ts-ignore */
8785
9086
  ...(ngDevMode ? [{ debugName: "dividersEnabled" }] : /* istanbul ignore next */ []));
8786
9087
  this.dynamicDividersEnabled = computed(() => this.dividers() === 'dynamic', /* @ts-ignore */
@@ -8868,12 +9169,12 @@ class OverlayCloseDirective {
8868
9169
  constructor() {
8869
9170
  this.overlayRef = inject(OVERLAY_REF, { optional: true });
8870
9171
  this.elementRef = inject(ElementRef);
9172
+ this.overlayManager = injectOverlayManager();
8871
9173
  this.ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
8872
9174
  this.type = input('button', /* @ts-ignore */
8873
9175
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
8874
9176
  this.closeResult = input(undefined, { ...(ngDevMode ? { debugName: "closeResult" } : /* istanbul ignore next */ {}), alias: 'etOverlayClose' });
8875
9177
  this.closeResultAlt = input(undefined, { ...(ngDevMode ? { debugName: "closeResultAlt" } : /* istanbul ignore next */ {}), alias: 'et-overlay-close' });
8876
- this.overlayManager = injectOverlayManager();
8877
9178
  applyHostListener('click', () => {
8878
9179
  const overlayRef = this.overlayRef ?? getClosestOverlay(this.elementRef, this.overlayManager.openOverlays());
8879
9180
  overlayRef?.close(this.closeResult() ?? this.closeResultAlt());
@@ -9192,8 +9493,8 @@ class OverlayMainDirective {
9192
9493
  this.parent = inject(OVERLAY_MAIN_TOKEN, { optional: true, skipSelf: true });
9193
9494
  this.elementRef = inject(ElementRef);
9194
9495
  this.overlayRef = inject(OVERLAY_REF, { optional: true });
9195
- this.enabled = input(true, { ...(ngDevMode ? { debugName: "enabled" } : /* istanbul ignore next */ {}), alias: 'etOverlayMain', transform: booleanAttribute });
9196
9496
  this.overlayManager = injectOverlayManager();
9497
+ this.enabled = input(true, { ...(ngDevMode ? { debugName: "enabled" } : /* istanbul ignore next */ {}), alias: 'etOverlayMain', transform: booleanAttribute });
9197
9498
  }
9198
9499
  ngOnInit() {
9199
9500
  this.overlayRef = resolveClosestOverlay({
@@ -9280,10 +9581,10 @@ class OverlayTitleDirective {
9280
9581
  constructor() {
9281
9582
  this.overlayRef = inject(OVERLAY_REF, { optional: true });
9282
9583
  this.elementRef = inject(ElementRef);
9283
- this.id = input(`et-overlay-title-${uniqueId++}`, /* @ts-ignore */
9284
- ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
9285
9584
  this.overlayManager = injectOverlayManager();
9286
9585
  this.renderer = injectRenderer();
9586
+ this.id = input(`et-overlay-title-${uniqueId++}`, /* @ts-ignore */
9587
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
9287
9588
  }
9288
9589
  ngOnInit() {
9289
9590
  this.overlayRef = resolveClosestOverlay({
@@ -9581,8 +9882,8 @@ class OverlayBackOrCloseDirective {
9581
9882
  constructor() {
9582
9883
  this.overlayRef = inject(OVERLAY_REF);
9583
9884
  this.elementRef = inject(ElementRef);
9584
- this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9585
9885
  this.router = injectOverlayRouter();
9886
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9586
9887
  fromEvent(this.elementRef.nativeElement, 'click')
9587
9888
  .pipe(filter(() => !this.disabled()), tap(() => {
9588
9889
  if (!this.router.back()) {
@@ -9619,8 +9920,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
9619
9920
  class OverlayRouteHeaderTemplateOutletComponent {
9620
9921
  constructor() {
9621
9922
  this.overlay = inject(OVERLAY_REF);
9622
- this.animatedLifecycle = viewChild.required(ANIMATED_LIFECYCLE_TOKEN);
9623
9923
  this.router = injectOverlayRouter();
9924
+ this.animatedLifecycle = viewChild.required(ANIMATED_LIFECYCLE_TOKEN);
9624
9925
  }
9625
9926
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: OverlayRouteHeaderTemplateOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9626
9927
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.5", type: OverlayRouteHeaderTemplateOutletComponent, isStandalone: true, selector: "et-overlay-route-header-template-outlet", host: { properties: { "class.et-overlay-router-outlet-nav-dir--backward": "router.navigationDirection() === 'backward'", "class.et-overlay-router-outlet-nav-dir--forward": "router.navigationDirection() === 'forward'" }, classAttribute: "et-overlay-route-header-template-outlet-host" }, viewQueries: [{ propertyName: "animatedLifecycle", first: true, predicate: ANIMATED_LIFECYCLE_TOKEN, descendants: true, isSignal: true }], ngImport: i0, template: `
@@ -9654,11 +9955,11 @@ const OVERLAY_ROUTER_LINK_TOKEN = new InjectionToken('OVERLAY_ROUTER_LINK_TOKEN'
9654
9955
  class OverlayRouterLinkDirective {
9655
9956
  constructor() {
9656
9957
  this.elementRef = inject(ElementRef);
9958
+ this.router = injectOverlayRouter();
9657
9959
  this.path = input.required({ ...(ngDevMode ? { debugName: "path" } : /* istanbul ignore next */ {}), alias: 'etOverlayRouterLink' });
9658
9960
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9659
9961
  this.navigationDirection = input(null, /* @ts-ignore */
9660
9962
  ...(ngDevMode ? [{ debugName: "navigationDirection" }] : /* istanbul ignore next */ []));
9661
- this.router = injectOverlayRouter();
9662
9963
  this.isActive = computed(() => this.router.resolvePath(this.path()).route === this.router.currentRoute(), /* @ts-ignore */
9663
9964
  ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
9664
9965
  fromEvent(this.elementRef.nativeElement, 'click')
@@ -9867,13 +10168,13 @@ class OverlayRouterOutletComponent {
9867
10168
  this.injector = inject(Injector);
9868
10169
  this.overlayRef = inject(OVERLAY_REF, { optional: true });
9869
10170
  this.elementRef = inject(ElementRef);
10171
+ this.router = injectOverlayRouter();
10172
+ this.renderer = injectRenderer();
9870
10173
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9871
10174
  this.sharedRouteTemplate = contentChild(OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, { ...(ngDevMode ? { debugName: "sharedRouteTemplate" } : /* istanbul ignore next */ {}), read: TemplateRef });
9872
10175
  this.outletDisabledTemplate = contentChild(OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, { ...(ngDevMode ? { debugName: "outletDisabledTemplate" } : /* istanbul ignore next */ {}), read: TemplateRef });
9873
10176
  this.pageWrappers = viewChildren('pageWrapper', /* @ts-ignore */
9874
10177
  ...(ngDevMode ? [{ debugName: "pageWrappers" }] : /* istanbul ignore next */ []));
9875
- this.router = injectOverlayRouter();
9876
- this.renderer = injectRenderer();
9877
10178
  this.hasSidebar = !!injectSidebarOverlay({ optional: true });
9878
10179
  this.wasDisabled = signal(false, /* @ts-ignore */
9879
10180
  ...(ngDevMode ? [{ debugName: "wasDisabled" }] : /* istanbul ignore next */ []));
@@ -10046,12 +10347,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
10046
10347
 
10047
10348
  class OverlaySidebarComponent {
10048
10349
  constructor() {
10350
+ this.sidebar = injectSidebarOverlay();
10049
10351
  this.pageDividers = input(false, /* @ts-ignore */
10050
10352
  ...(ngDevMode ? [{ debugName: "pageDividers" }] : /* istanbul ignore next */ []));
10051
10353
  this.sidebarContent = viewChild.required('sidebarContentTpl');
10052
10354
  this.sidebarHeaderContent = contentChild(OVERLAY_HEADER_TEMPLATE_TOKEN, /* @ts-ignore */
10053
10355
  ...(ngDevMode ? [{ debugName: "sidebarHeaderContent" }] : /* istanbul ignore next */ []));
10054
- this.sidebar = injectSidebarOverlay();
10055
10356
  syncSignal(this.sidebarContent, this.sidebar.sidebarContentTemplate, { skipSyncRead: true });
10056
10357
  syncSignal(this.sidebarHeaderContent, this.sidebar.sidebarHeaderTemplate);
10057
10358
  syncSignal(this.pageDividers, this.sidebar.sidebarPageDividers);
@@ -11532,9 +11833,9 @@ class PipBackDirective {
11532
11833
  constructor() {
11533
11834
  this.chrome = inject(PIP_CHROME_REF_TOKEN, { optional: true });
11534
11835
  this.tokenEntry = inject(PIP_ENTRY_TOKEN, { optional: true });
11836
+ this.pipManager = injectPipManager();
11535
11837
  this.entry = input(/* @ts-ignore */
11536
11838
  ...(ngDevMode ? [undefined, { debugName: "entry" }] : /* istanbul ignore next */ []));
11537
- this.pipManager = injectPipManager();
11538
11839
  }
11539
11840
  back(event) {
11540
11841
  event.stopPropagation();
@@ -12002,13 +12303,13 @@ class PipPlayerComponent {
12002
12303
  this.document = inject(DOCUMENT$1);
12003
12304
  this.el = inject(ElementRef);
12004
12305
  this.pipCell = inject(PipCellDirective, { optional: true });
12306
+ this.streamManager = injectStreamManager();
12307
+ this.pipManager = injectPipManager();
12308
+ this.renderer = injectRenderer();
12005
12309
  this.entry = input(/* @ts-ignore */
12006
12310
  ...(ngDevMode ? [undefined, { debugName: "entry" }] : /* istanbul ignore next */ []));
12007
12311
  this.showThumbnail = input(/* @ts-ignore */
12008
12312
  ...(ngDevMode ? [undefined, { debugName: "showThumbnail" }] : /* istanbul ignore next */ []));
12009
- this.streamManager = injectStreamManager();
12010
- this.pipManager = injectPipManager();
12011
- this.renderer = injectRenderer();
12012
12313
  this.isReady = signal(false, /* @ts-ignore */
12013
12314
  ...(ngDevMode ? [{ debugName: "isReady" }] : /* istanbul ignore next */ []));
12014
12315
  this.resolvedEntry = computed(() => this.entry() ?? this.pipCell?.cell().pip ?? null, /* @ts-ignore */
@@ -12104,11 +12405,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12104
12405
 
12105
12406
  class StreamPipChromeComponent {
12106
12407
  constructor() {
12408
+ this.pipManager = injectPipManager();
12107
12409
  this.stageRef = viewChild(PipStageDirective, { ...(ngDevMode ? { debugName: "stageRef" } : /* istanbul ignore next */ {}), read: ElementRef });
12108
12410
  this.pipWindowRef = viewChild(PipWindowComponent, /* @ts-ignore */
12109
12411
  ...(ngDevMode ? [{ debugName: "pipWindowRef" }] : /* istanbul ignore next */ []));
12110
12412
  this.gridBtnRef = viewChild(PipGridToggleDirective, { ...(ngDevMode ? { debugName: "gridBtnRef" } : /* istanbul ignore next */ {}), read: ElementRef });
12111
- this.pipManager = injectPipManager();
12112
12413
  this.state = createPipChromeState();
12113
12414
  this.animations = createPipChromeAnimations(this.state, {
12114
12415
  stageRef: this.stageRef,
@@ -12712,9 +13013,9 @@ class PipCloseDirective {
12712
13013
  this.chrome = inject(PIP_CHROME_REF_TOKEN, { optional: true });
12713
13014
  this.pipWindow = inject(PipWindowComponent, { optional: true });
12714
13015
  this.tokenEntry = inject(PIP_ENTRY_TOKEN, { optional: true });
13016
+ this.pipManager = injectPipManager();
12715
13017
  this.entry = input(/* @ts-ignore */
12716
13018
  ...(ngDevMode ? [undefined, { debugName: "entry" }] : /* istanbul ignore next */ []));
12717
- this.pipManager = injectPipManager();
12718
13019
  }
12719
13020
  close(event) {
12720
13021
  event.stopPropagation();
@@ -12759,12 +13060,12 @@ class PipSlotPlaceholderComponent {
12759
13060
  constructor() {
12760
13061
  this.slotPlayerId = inject(STREAM_SLOT_PLAYER_ID_TOKEN);
12761
13062
  this.parentSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
12762
- this.bringBackDir = viewChild(PipBringBackDirective, /* @ts-ignore */
12763
- ...(ngDevMode ? [{ debugName: "bringBackDir" }] : /* istanbul ignore next */ []));
12764
13063
  this.pipManager = injectPipManager();
12765
13064
  this.config = injectPipSlotPlaceholderConfig();
12766
13065
  this.locale = injectLocale();
12767
13066
  this.surfaceThemes = injectSurfaceThemes({ optional: true });
13067
+ this.bringBackDir = viewChild(PipBringBackDirective, /* @ts-ignore */
13068
+ ...(ngDevMode ? [{ debugName: "bringBackDir" }] : /* istanbul ignore next */ []));
12768
13069
  this.cardSurface = computed(() => {
12769
13070
  const themes = this.surfaceThemes;
12770
13071
  if (!themes)
@@ -13159,11 +13460,11 @@ class StreamPlayerSlotDirective {
13159
13460
  this.playerComponent = inject(STREAM_PLAYER_COMPONENT_TOKEN);
13160
13461
  this.provideSurface = inject(ProvideSurfaceDirective);
13161
13462
  this.parentSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
13463
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
13464
+ this.styleManager = injectStyleManager();
13162
13465
  this.streamSlotPriority = input(false, { ...(ngDevMode ? { debugName: "streamSlotPriority" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
13163
13466
  this.streamSlotOnPipBack = input(/* @ts-ignore */
13164
13467
  ...(ngDevMode ? [undefined, { debugName: "streamSlotOnPipBack" }] : /* istanbul ignore next */ []));
13165
- this.surfaceThemes = injectSurfaceThemes({ optional: true });
13166
- this.styleManager = injectStyleManager();
13167
13468
  this.resolvedSurface = computed(() => {
13168
13469
  const themes = this.surfaceThemes;
13169
13470
  if (!themes)
@@ -16199,6 +16500,7 @@ class ToggletipComponent {
16199
16500
  this.triggerColorProvider = inject(COLOR_PROVIDER, { optional: true, skipSelf: true });
16200
16501
  this.triggerSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
16201
16502
  this.injector = inject(Injector);
16503
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
16202
16504
  this.toggletipId = input.required(/* @ts-ignore */
16203
16505
  ...(ngDevMode ? [{ debugName: "toggletipId" }] : /* istanbul ignore next */ []));
16204
16506
  this.contentId = input.required(/* @ts-ignore */
@@ -16209,7 +16511,6 @@ class ToggletipComponent {
16209
16511
  ...(ngDevMode ? [{ debugName: "colorProvider" }] : /* istanbul ignore next */ []));
16210
16512
  this.surfaceProvider = input.required(/* @ts-ignore */
16211
16513
  ...(ngDevMode ? [{ debugName: "surfaceProvider" }] : /* istanbul ignore next */ []));
16212
- this.surfaceThemes = injectSurfaceThemes({ optional: true });
16213
16514
  this.hasTemplate = computed(() => this.content() instanceof TemplateRef, /* @ts-ignore */
16214
16515
  ...(ngDevMode ? [{ debugName: "hasTemplate" }] : /* istanbul ignore next */ []));
16215
16516
  this.contentText = computed(() => {
@@ -16270,6 +16571,7 @@ class ToggletipDirective {
16270
16571
  this.elementRef = inject(ElementRef);
16271
16572
  this.colorProvider = inject(COLOR_PROVIDER, { optional: true });
16272
16573
  this.surfaceProvider = inject(SURFACE_PROVIDER, { optional: true });
16574
+ this.overlayManager = injectOverlayManager();
16273
16575
  this.content = input(null, { ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'etToggletip' });
16274
16576
  this.ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'etToggletipAriaLabel' });
16275
16577
  this.ariaLabelledBy = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledBy" } : /* istanbul ignore next */ {}), alias: 'etToggletipAriaLabelledBy' });
@@ -16285,7 +16587,6 @@ class ToggletipDirective {
16285
16587
  ...(ngDevMode ? [{ debugName: "viewportPadding" }] : /* istanbul ignore next */ []));
16286
16588
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), alias: 'etToggletipDisabled' });
16287
16589
  this.open = model(false, { ...(ngDevMode ? { debugName: "open" } : /* istanbul ignore next */ {}), alias: 'etToggletipOpen' });
16288
- this.overlayManager = injectOverlayManager();
16289
16590
  /** @internal */
16290
16591
  this.overlayRef = signal(null, /* @ts-ignore */
16291
16592
  ...(ngDevMode ? [{ debugName: "overlayRef" }] : /* istanbul ignore next */ []));
@@ -16537,6 +16838,7 @@ class TooltipComponent {
16537
16838
  this.ownSurfaceProvider = inject(ProvideSurfaceDirective);
16538
16839
  this.triggerColorProvider = inject(COLOR_PROVIDER, { optional: true, skipSelf: true });
16539
16840
  this.triggerSurfaceProvider = inject(SURFACE_PROVIDER, { optional: true, skipSelf: true });
16841
+ this.surfaceThemes = injectSurfaceThemes({ optional: true });
16540
16842
  this.tooltipId = input.required(/* @ts-ignore */
16541
16843
  ...(ngDevMode ? [{ debugName: "tooltipId" }] : /* istanbul ignore next */ []));
16542
16844
  this.content = input.required(/* @ts-ignore */
@@ -16545,7 +16847,6 @@ class TooltipComponent {
16545
16847
  ...(ngDevMode ? [{ debugName: "colorProvider" }] : /* istanbul ignore next */ []));
16546
16848
  this.surfaceProvider = input.required(/* @ts-ignore */
16547
16849
  ...(ngDevMode ? [{ debugName: "surfaceProvider" }] : /* istanbul ignore next */ []));
16548
- this.surfaceThemes = injectSurfaceThemes({ optional: true });
16549
16850
  this.hasTemplate = computed(() => this.content() instanceof TemplateRef, /* @ts-ignore */
16550
16851
  ...(ngDevMode ? [{ debugName: "hasTemplate" }] : /* istanbul ignore next */ []));
16551
16852
  this.contentText = computed(() => {
@@ -16609,6 +16910,9 @@ class TooltipDirective {
16609
16910
  this.elementRef = inject(ElementRef);
16610
16911
  this.colorProvider = inject(COLOR_PROVIDER, { optional: true });
16611
16912
  this.surfaceProvider = inject(SURFACE_PROVIDER, { optional: true });
16913
+ this.overlayManager = injectOverlayManager();
16914
+ this.focusVisibleTracker = injectFocusVisibleTracker();
16915
+ this.renderer = injectRenderer();
16612
16916
  this.content = input(null, { ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'etTooltip' });
16613
16917
  this.ariaDescription = input(null, { ...(ngDevMode ? { debugName: "ariaDescription" } : /* istanbul ignore next */ {}), alias: 'etTooltipAriaDescription' });
16614
16918
  this.placement = input('top', /* @ts-ignore */
@@ -16624,9 +16928,6 @@ class TooltipDirective {
16624
16928
  this.showDelay = input(DEFAULT_TOOLTIP_DELAY, /* @ts-ignore */
16625
16929
  ...(ngDevMode ? [{ debugName: "showDelay" }] : /* istanbul ignore next */ []));
16626
16930
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), alias: 'etTooltipDisabled' });
16627
- this.overlayManager = injectOverlayManager();
16628
- this.focusVisibleTracker = injectFocusVisibleTracker();
16629
- this.renderer = injectRenderer();
16630
16931
  /** @internal */
16631
16932
  this.overlayRef = signal(null, /* @ts-ignore */
16632
16933
  ...(ngDevMode ? [{ debugName: "overlayRef" }] : /* istanbul ignore next */ []));
@@ -16830,5 +17131,5 @@ const TOOLTIP_IMPORTS = [TooltipDirective, TooltipComponent];
16830
17131
  * Generated bundle index. Do not edit.
16831
17132
  */
16832
17133
 
16833
- export { ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, BOLD_ICON, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BrandLoaderComponent, ButtonComponent, ButtonDirective, ButtonStylesDirective, CHECKBOX_IMPORTS, CHEVRON_ICON, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChoiceFieldComponent, DAILYMOTION_PLAYER_TOKEN, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_STREAM_PLAYER_STATE, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DescriptionComponent, FACEBOOK_PLAYER_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridImports, GridItemComponent, GridItemDirective, GridItemRef, GridResizeDirective, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, INPUT_IMPORTS, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOCK_ICON, LabelDirective, NAV_TABS_TOKEN, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NavTabImports, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHandlerLinkDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PENCIL_ICON, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLUS_ICON, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, RICH_TEXT_EDITOR_IMPORTS, RadioComponent, RadioGroupComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SOOP_PLAYER_TOKEN, STREAM_CONSENT_TOKEN, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, STRIKETHROUGH_ICON, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableErrorCode, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamImports, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_PANEL_TOKEN, TAB_SIZES, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabImports, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TextButtonComponent, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, abortFullscreenAnimation, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, bottomSheetOverlayStrategy, buildAnchoredRuntimePositionStrategy, centeredOverlayStrategy, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, createGridAdapter, createNotificationRef, createOverlayHandler, createOverlayHandlerWithQueryParamLifecycle, createOverlayRef, createOverlayStrategyController, createPipChromeAnimations, createPipChromeState, createStreamConfig, createStreamPlayerSlot, dialogOverlayStrategy, enableDragToDismiss, findNextRelevantHtmlElement, fromGridPosition, fullScreenDialogOverlayStrategy, getClosestOverlay, getOriginCoordinatesAndDimensions, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectDialogStrategy, injectDialogStrategyDefaults, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSidebarOverlay, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isHtmlElement, isPointerEvent, isTouchEvent, leftSheetOverlayStrategy, mergeOverlayBreakpointConfigs, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideDialogStrategy, provideDialogStrategyDefaults, provideFormSupport, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideIcons, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTopSheetStrategy, provideTopSheetStrategyDefaults, resolveClosestOverlay, rightSheetOverlayStrategy, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, toGridPosition, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy };
17134
+ export { ARROW_OUT_UP_RIGHT_ICON, ARROW_RIGHT_ICON, BOLD_ICON, BUTTON_ICON_ALIGNMENTS, BUTTON_IMPORTS, BUTTON_SIZES, BUTTON_SPINNER_CONFIG, BUTTON_TYPES, BUTTON_VARIANTS, BrandLoaderComponent, ButtonComponent, ButtonDirective, ButtonStylesDirective, CHECKBOX_IMPORTS, CHEVRON_ICON, CHOICE_FIELD_IMPORTS, CLIPBOARD_CHECK_ICON, CheckboxComponent, CheckboxDirective, CheckboxGroupComponent, CheckboxOptionComponent, ChoiceFieldComponent, DAILYMOTION_PLAYER_TOKEN, DEFAULT_NOTIFICATION_MANAGER_CONFIG, DEFAULT_PIP_WINDOW_CONFIG, DEFAULT_STREAM_PLAYER_STATE, DailymotionPlayerComponent, DailymotionPlayerDirective, DailymotionPlayerParamsDirective, DailymotionPlayerSlotComponent, DescriptionComponent, FACEBOOK_PLAYER_TOKEN, FLOPPY_DISK_ICON, FOCUS_FRAME_ICON, FORM_FIELD_APPEARANCES, FORM_FIELD_CONTROL_TYPES, FORM_FIELD_ERROR_CODES, FORM_FIELD_FILLS, FORM_FIELD_IMPORTS, FORM_FIELD_LABEL_MODES, FORM_FIELD_SIZES, FORM_FIELD_TOKEN, FabComponent, FacebookPlayerComponent, FacebookPlayerDirective, FacebookPlayerParamsDirective, FacebookPlayerSlotComponent, FocusRingDirective, FormErrorComponent, FormFieldComponent, FormFieldDirective, GRID_2X2_ICON, GRID_ERROR_CODES, GRID_TOKEN, GridComponent, GridDebugComponent, GridDirective, GridDragDirective, GridImports, GridItemComponent, GridItemDefaultActionsComponent, GridItemDirective, GridItemRef, GridItemToolbarComponent, GridResizeDirective, HintComponent, ICONS_TOKEN, ICON_DIRECTIVE_TOKEN, ICON_ERROR_CODES, ICON_IMPORTS, INPUT_IMPORTS, INPUT_TEXT_ALIGNMENTS, INPUT_TYPES, ITALIC_ICON, IconButtonComponent, IconDirective, InputComponent, InputDirective, InputPrefixDirective, InputSuffixDirective, KICK_PLAYER_TOKEN, KickPlayerComponent, KickPlayerDirective, KickPlayerParamsDirective, KickPlayerSlotComponent, LINK_ICON, LIST_BULLETED_ICON, LIST_NUMBERED_ICON, LOCK_ICON, LabelDirective, NAV_TABS_TOKEN, NOTIFICATION_ERROR_CODES, NOTIFICATION_IMPORTS, NOTIFICATION_STACK_CONTEXT_TOKEN, NOTIFICATION_STATUS, NavTabImports, NavTabLinkComponent, NavTabLinkDirective, NavTabsComponent, NavTabsDirective, NavTabsOutletComponent, NavTabsOutletDirective, NotificationActionDirective, NotificationComponent, NotificationDirective, NotificationDismissDirective, NotificationItemDirective, NotificationStackDirective, OVERLAY_BACK_OR_CLOSE_TOKEN, OVERLAY_BODY_TOKEN, OVERLAY_CONFIG_CLASS_KEYS, OVERLAY_CONTENT_IMPORTS, OVERLAY_ERROR_CODES, OVERLAY_FOOTER_TOKEN, OVERLAY_HEADER_TEMPLATE_TOKEN, OVERLAY_HEADER_TOKEN, OVERLAY_IMPORTS, OVERLAY_MAIN_TOKEN, OVERLAY_QUERY_PARAM_INPUT_NAME, OVERLAY_REF, OVERLAY_ROUTER_CONFIG_TOKEN, OVERLAY_ROUTER_LINK_TOKEN, OVERLAY_ROUTER_OUTLET_DISABLED_TEMPLATE_TOKEN, OVERLAY_ROUTER_OUTLET_TOKEN, OVERLAY_ROUTER_TOKEN, OVERLAY_SHARED_ROUTE_TEMPLATE_TOKEN, OverlayAnchorDirective, OverlayBackOrCloseDirective, OverlayBodyComponent, OverlayCloseDirective, OverlayContainerComponent, OverlayDirective, OverlayFooterDirective, OverlayHandlerLinkDirective, OverlayHeaderDirective, OverlayHeaderTemplateDirective, OverlayMainDirective, OverlayOriginCloneComponent, OverlayRouteHeaderTemplateOutletComponent, OverlayRouterLinkDirective, OverlayRouterOutletComponent, OverlayRouterOutletDisabledTemplateDirective, OverlaySharedRouteTemplateDirective, OverlaySharedRouteTemplateOutletComponent, OverlaySidebarComponent, OverlaySidebarPageComponent, OverlaySurfaceDirective, OverlayTitleDirective, OverlayTriggerDirective, PENCIL_ICON, PIP_CHROME_REF_TOKEN, PIP_ENTRY_TOKEN, PIP_WINDOW_ASPECT_RATIO_TOKEN, PLUS_ICON, PipBackDirective, PipBringBackDirective, PipCellDirective, PipCloseDirective, PipCollapseOverlayDirective, PipGridToggleDirective, PipPlayerComponent, PipSlotPlaceholderComponent, PipStageDirective, PipTitleBarDirective, PipTitleBarTemplateDirective, PipWindowComponent, PipWindowParamsDirective, ProgressBarComponent, RICH_TEXT_EDITOR_IMPORTS, RadioComponent, RadioGroupComponent, RichTextEditorComponent, RichTextEditorDirective, RichTextEditorFloatingToolbarComponent, SCROLLABLE_IMPORTS, SELECTION_LIST_MULTIPLE, SELECTION_LIST_TOKEN, SIDEBAR_OVERLAY_CONFIG, SIDEBAR_OVERLAY_TOKEN, SOOP_PLAYER_TOKEN, STREAM_CONSENT_TOKEN, STREAM_PLAYER_COMPONENT_TOKEN, STREAM_PLAYER_ERROR_CONTEXT_TOKEN, STREAM_PLAYER_ERROR_TOKEN, STREAM_PLAYER_PARAMS_TOKEN, STREAM_PLAYER_SLOT_TOKEN, STREAM_PLAYER_TOKEN, STREAM_SLOT_PLAYER_ID_TOKEN, STREAM_USER_CONSENT_PROVIDER_TOKEN, STRIKETHROUGH_ICON, SWITCH_IMPORTS, ScrollableActiveChildDirective, ScrollableButtonsDirective, ScrollableComponent, ScrollableDarkenDirective, ScrollableDirective, ScrollableDragDirective, ScrollableErrorCode, ScrollableIgnoreChildDirective, ScrollableLoadingTemplateDirective, ScrollableMasksDirective, ScrollableNavigationDirective, ScrollableSnapDirective, SegmentedButtonComponent, SegmentedButtonGroupComponent, SelectionListControlDirective, SelectionListDirective, SelectionOptionDirective, SoopPlayerComponent, SoopPlayerDirective, SoopPlayerParamsDirective, SoopPlayerSlotComponent, SpinnerComponent, StreamConsentAcceptDirective, StreamConsentComponent, StreamConsentDirective, StreamImports, StreamPipChromeComponent, StreamPlayerErrorComponent, StreamPlayerErrorDirective, StreamPlayerLoadingComponent, StreamPlayerSlotDirective, SwitchComponent, SwitchDirective, TAB_BAR_FITS, TAB_BAR_ORIENTATIONS, TAB_BAR_TOKEN, TAB_BAR_TRIGGER_TOKEN, TAB_BAR_VARIANTS, TAB_ERROR_CODES, TAB_GROUP_TOKEN, TAB_PANEL_TOKEN, TAB_SIZES, TIKTOK_PLAYER_TOKEN, TIMES_ICON, TOGGLETIP_ERROR_CODES, TOGGLETIP_IMPORTS, TOOLTIP_ERROR_CODES, TOOLTIP_IMPORTS, TRIANGLE_EXCLAMATION_ICON, TWITCH_PLAYER_TOKEN, TabBarDirective, TabBarTriggerDirective, TabBarUnderlineDirective, TabComponent, TabGroupComponent, TabGroupDirective, TabImports, TabLabelDirective, TabPanelDirective, TabTriggerDirective, TextButtonComponent, TikTokPlayerComponent, TikTokPlayerDirective, TikTokPlayerParamsDirective, TikTokPlayerSlotComponent, ToggletipCloseDirective, ToggletipComponent, ToggletipDirective, ToggletipTriggerDirective, TooltipComponent, TooltipDirective, TwitchPlayerComponent, TwitchPlayerDirective, TwitchPlayerParamsDirective, TwitchPlayerSlotComponent, VIMEO_PLAYER_TOKEN, VimeoPlayerComponent, VimeoPlayerDirective, VimeoPlayerParamsDirective, VimeoPlayerSlotComponent, WINDOW_CONTROL_BUTTON_KINDS, WINDOW_CONTROL_BUTTON_SIZES, WindowControlButtonComponent, YOUTUBE_PLAYER_SLOT_TOKEN, YOUTUBE_PLAYER_TOKEN, YoutubePlayerComponent, YoutubePlayerDirective, YoutubePlayerParamsDirective, YoutubePlayerSlotComponent, YoutubePlayerSlotDirective, abortFullscreenAnimation, anchoredDialogOverlayStrategy, anchoredOverlayStrategy, bottomSheetOverlayStrategy, buildAnchoredRuntimePositionStrategy, centeredOverlayStrategy, cleanupFullscreenAnimation, cleanupFullscreenAnimationStyles, createGridAdapter, createNotificationRef, createOverlayHandler, createOverlayHandlerWithQueryParamLifecycle, createOverlayRef, createOverlayStrategyController, createPipChromeAnimations, createPipChromeState, createStreamConfig, createStreamPlayerSlot, dialogOverlayStrategy, enableDragToDismiss, findNextRelevantHtmlElement, fromGridPosition, fullScreenDialogOverlayStrategy, getClosestOverlay, getOriginCoordinatesAndDimensions, injectAnchoredDialogStrategy, injectAnchoredDialogStrategyDefaults, injectBottomSheetStrategy, injectBottomSheetStrategyDefaults, injectDialogStrategy, injectDialogStrategyDefaults, injectFormSupport, injectFullscreenDialogStrategy, injectFullscreenDialogStrategyDefaults, injectGridConfig, injectLeftSheetStrategy, injectLeftSheetStrategyDefaults, injectNotificationManager, injectNotificationManagerConfig, injectOverlayManager, injectOverlayRouter, injectOverlayScrollBlocker, injectPipChromeManager, injectPipManager, injectPipSlotPlaceholderConfig, injectRightSheetStrategy, injectRightSheetStrategyDefaults, injectSidebarOverlay, injectStreamConfig, injectStreamConsentConfig, injectStreamManager, injectStreamPlayerErrorConfig, injectStreamPlayerLoadingConfig, injectStreamScriptLoader, injectStreamUserConsentProvider, injectTopSheetStrategy, injectTopSheetStrategyDefaults, isHtmlElement, isPointerEvent, isTouchEvent, leftSheetOverlayStrategy, mergeOverlayBreakpointConfigs, provideAnchoredDialogStrategy, provideAnchoredDialogStrategyDefaults, provideBottomSheetStrategy, provideBottomSheetStrategyDefaults, provideDialogStrategy, provideDialogStrategyDefaults, provideFormSupport, provideFullscreenDialogStrategy, provideFullscreenDialogStrategyDefaults, provideGridConfig, provideIcons, provideLeftSheetStrategy, provideLeftSheetStrategyDefaults, provideNotificationManager, provideNotificationManagerConfig, provideNotificationManagerInstance, provideOverlay, provideOverlayManager, provideOverlayRouter, provideOverlayRouterConfig, provideOverlayRouterService, provideOverlayScrollBlocker, providePipChromeManager, providePipManager, providePipSlotPlaceholderConfig, provideRightSheetStrategy, provideRightSheetStrategyDefaults, provideSidebarOverlay, provideSidebarOverlayConfig, provideSidebarOverlayService, provideStreamConfig, provideStreamConsentConfig, provideStreamManager, provideStreamPlayerErrorConfig, provideStreamPlayerLoadingConfig, provideTopSheetStrategy, provideTopSheetStrategyDefaults, resolveClosestOverlay, rightSheetOverlayStrategy, startFullscreenEnterAnimation, startFullscreenLeaveAnimation, toGridPosition, topSheetOverlayStrategy, transformingBottomSheetToDialogOverlayStrategy, transformingFullScreenDialogToDialogOverlayStrategy, transformingFullScreenDialogToRightSheetOverlayStrategy };
16834
17135
  //# sourceMappingURL=ethlete-components.mjs.map